defmodule Plausible.Workers.ScheduleEmailReportsTest do use Plausible.DataCase use Oban.Testing, repo: Plausible.Repo alias Plausible.Workers.{ScheduleEmailReports, SendEmailReport} describe "weekly reports" do test "schedules weekly report on Monday 9am local timezone" do site = new_site(domain: "test-site.com", timezone: "US/Eastern") insert(:weekly_report, site: site, recipients: ["user@email.com"]) perform_job(ScheduleEmailReports, %{}) assert_enqueued( worker: SendEmailReport, args: %{site_id: site.id, interval: "weekly"}, scheduled_at: ScheduleEmailReports.monday_9am(site.timezone) ) end on_ee do test "schedules weekly report for a consolidated view" do {:ok, team} = new_user() |> Plausible.Teams.get_or_create() new_site(team: team) new_site(team: team) consolidated_view = new_consolidated_view(team) insert(:weekly_report, site: consolidated_view, recipients: ["user@email.com"]) perform_job(ScheduleEmailReports, %{}) assert_enqueued( worker: SendEmailReport, args: %{site_id: consolidated_view.id, interval: "weekly"}, scheduled_at: ScheduleEmailReports.monday_9am(consolidated_view.timezone) ) end end test "does not schedule more than one weekly report at a time" do site = new_site(domain: "test-site.com", timezone: "US/Eastern") insert(:weekly_report, site: site, recipients: ["user@email.com"]) perform_job(ScheduleEmailReports, %{}) perform_job(ScheduleEmailReports, %{}) assert Enum.count(all_enqueued(worker: SendEmailReport)) == 1 end test "does not schedule a weekly report for locked site" do site = new_site(domain: "test-site.com", timezone: "US/Eastern") site.team |> Ecto.Changeset.change(locked: true) |> Repo.update!() insert(:weekly_report, site: site, recipients: ["user@email.com"]) perform_job(ScheduleEmailReports, %{}) assert Enum.empty?(all_enqueued(worker: SendEmailReport)) end test "schedules a new report as soon as a previous one is completed" do site = new_site(domain: "test-site.com", timezone: "US/Eastern") insert(:weekly_report, site: site, recipients: ["user@email.com"]) perform_job(ScheduleEmailReports, %{}) Repo.update_all("oban_jobs", set: [state: "completed"]) assert Enum.empty?(all_enqueued(worker: SendEmailReport)) perform_job(ScheduleEmailReports, %{}) assert Enum.count(all_enqueued(worker: SendEmailReport)) == 1 end end describe "monthly_reports" do test "schedules monthly report on first of the next month at 9am local timezone" do site = new_site(domain: "test-site.com", timezone: "US/Eastern") insert(:monthly_report, site: site, recipients: ["user@email.com"]) perform_job(ScheduleEmailReports, %{}) assert_enqueued( worker: SendEmailReport, args: %{site_id: site.id, interval: "monthly"}, scheduled_at: ScheduleEmailReports.first_of_month_9am(site.timezone) ) end on_ee do test "schedules monthly report for a consolidated view" do {:ok, team} = new_user() |> Plausible.Teams.get_or_create() new_site(team: team) new_site(team: team) consolidated_view = new_consolidated_view(team) insert(:monthly_report, site: consolidated_view, recipients: ["user@email.com"]) perform_job(ScheduleEmailReports, %{}) assert_enqueued( worker: SendEmailReport, args: %{site_id: consolidated_view.id, interval: "monthly"}, scheduled_at: ScheduleEmailReports.first_of_month_9am(consolidated_view.timezone) ) end end test "does not schedule more than one monthly report at a time" do site = new_site(domain: "test-site.com", timezone: "US/Eastern") insert(:monthly_report, site: site, recipients: ["user@email.com"]) perform_job(ScheduleEmailReports, %{}) perform_job(ScheduleEmailReports, %{}) assert Enum.count(all_enqueued(worker: SendEmailReport)) == 1 end test "does not schedule a monthly report for locked site" do site = new_site(domain: "test-site.com", timezone: "US/Eastern") site.team |> Ecto.Changeset.change(locked: true) |> Repo.update!() insert(:monthly_report, site: site, recipients: ["user@email.com"]) perform_job(ScheduleEmailReports, %{}) assert Enum.empty?(all_enqueued(worker: SendEmailReport)) end test "schedules a new report as soon as a previous one is completed" do site = new_site(domain: "test-site.com", timezone: "US/Eastern") insert(:monthly_report, site: site, recipients: ["user@email.com"]) perform_job(ScheduleEmailReports, %{}) Repo.update_all("oban_jobs", set: [state: "completed"]) assert Enum.empty?(all_enqueued(worker: SendEmailReport)) perform_job(ScheduleEmailReports, %{}) assert Enum.count(all_enqueued(worker: SendEmailReport)) == 1 end end end