diff --git a/CHANGELOG.md b/CHANGELOG.md index e3cd89d49144..79b071abf871 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,13 @@ # Changelog All notable changes to this project will be documented in this file. -## [1.3] - Unreleased +## Unreleased + +### Fixed +- Fix weekly report time range plausible/analytics#951 + + +## [1.3] - 2021-04-14 ### Added - Stats API [currently in beta] plausible/analytics#679 diff --git a/lib/plausible_web/templates/email/weekly_report.html.eex b/lib/plausible_web/templates/email/weekly_report.html.eex index be6ae610b37d..aa4e3bf2a511 100644 --- a/lib/plausible_web/templates/email/weekly_report.html.eex +++ b/lib/plausible_web/templates/email/weekly_report.html.eex @@ -223,7 +223,7 @@ body {
-

<%= PlausibleWeb.StatsView.large_number_format(@unique_visitors) %>

+

<%= PlausibleWeb.StatsView.large_number_format(@unique_visitors) %>

diff --git a/lib/workers/send_email_report.ex b/lib/workers/send_email_report.ex index 72ee4465c3a0..3621fe1f79d3 100644 --- a/lib/workers/send_email_report.ex +++ b/lib/workers/send_email_report.ex @@ -7,7 +7,9 @@ defmodule Plausible.Workers.SendEmailReport do @impl Oban.Worker def perform(%{"interval" => "weekly", "site_id" => site_id}, _job) do site = Repo.get(Plausible.Site, site_id) |> Repo.preload(:weekly_report) - query = Query.from(site.timezone, %{"period" => "7d"}) + today = Timex.now(site.timezone) |> DateTime.to_date() + date = Timex.shift(today, weeks: -1) |> Timex.end_of_week() |> Date.to_iso8601() + query = Query.from(site.timezone, %{"period" => "7d", "date" => date}) for email <- site.weekly_report.recipients do unsubscribe_link = diff --git a/test/workers/send_email_report_test.exs b/test/workers/send_email_report_test.exs index 21c1b5c8ef33..6d13b82a0ac0 100644 --- a/test/workers/send_email_report_test.exs +++ b/test/workers/send_email_report_test.exs @@ -1,7 +1,9 @@ defmodule Plausible.Workers.SendEmailReportTest do + import Plausible.TestUtils use Plausible.DataCase use Bamboo.Test alias Plausible.Workers.SendEmailReport + alias Timex.Timezone defp perform(args) do SendEmailReport.new(args) |> Oban.insert!() @@ -25,6 +27,43 @@ defmodule Plausible.Workers.SendEmailReportTest do to: [nil: "user2@email.com"] ) end + + test "calculates timezone correctly" do + site = insert(:site, timezone: "US/Eastern") + insert(:weekly_report, site: site, recipients: ["user@email.com"]) + + now = Timex.now(site.timezone) + last_monday = Timex.shift(now, weeks: -1) |> Timex.beginning_of_week() + last_sunday = Timex.shift(now, weeks: -1) |> Timex.end_of_week() + sunday_before_last = Timex.shift(last_monday, minutes: -1) + this_monday = Timex.beginning_of_week(now) + + create_pageviews([ + # Sunday before last, not counted + %{domain: site.domain, timestamp: Timezone.convert(sunday_before_last, "UTC")}, + # Sunday before last, not counted + %{domain: site.domain, timestamp: Timezone.convert(sunday_before_last, "UTC")}, + # Last monday, counted + %{domain: site.domain, timestamp: Timezone.convert(last_monday, "UTC")}, + # Last sunday, counted + %{domain: site.domain, timestamp: Timezone.convert(last_sunday, "UTC")}, + # This monday, not counted + %{domain: site.domain, timestamp: Timezone.convert(this_monday, "UTC")}, + # This monday, not counted + %{domain: site.domain, timestamp: Timezone.convert(this_monday, "UTC")} + ]) + + perform(%{"site_id" => site.id, "interval" => "weekly"}) + + assert_delivered_email_matches(%{ + to: [nil: "user@email.com"], + html_body: html_body + }) + + # Should find 2 visiors + assert html_body =~ + ~s(2) + end end describe "monthly_reports" do