analytics/test/workers/send_trial_notifications_test.exs
Adam Rutkowski 0fa6b688af
Google APIs integration improvements (#2358)
* Make TestUtils module available in all tests

* Add macros patching the application env in tests

Unfortunately a lot of existing functionality relies on
certain application env setup. This isn't ideal because
the app config is a shared state that prevents us from
running the tests in parallel.

Those macros encapsulate setting up new env for test purposes
and make sure the changes are reverted when the test finishes.

* Allow passing request opts to HTTPClient.post/4

We need this to swap custom request building in
Google Analytics import.

* Unify errors when listing sites

* React: propagate backend error messages if available

* React: catch API errors in Search Terms component

* Propagate google API errors on referrer drilldown

* Handle verified properties errors in SC settings

* Add missing tests for SC settings controller

* Unify errors for fetching search analytics queries (list stats)

* Unify errors refreshing Google Auth Token

* Test fetch_stats/3 errors and replace Double with Mox

* Fixup makrup

* s/class/className

* Simplify Search Terms display in case of errors

* Fix warnings
2022-10-24 09:34:02 +02:00

211 lines
6.8 KiB
Elixir

defmodule Plausible.Workers.SendTrialNotificationsTest do
use Plausible.DataCase
use Bamboo.Test
use Oban.Testing, repo: Plausible.Repo
alias Plausible.Workers.SendTrialNotifications
test "does not send a notification if user didn't create a site" do
insert(:user, trial_expiry_date: Timex.now() |> Timex.shift(days: 7))
insert(:user, trial_expiry_date: Timex.now() |> Timex.shift(days: 1))
insert(:user, trial_expiry_date: Timex.now() |> Timex.shift(days: 0))
insert(:user, trial_expiry_date: Timex.now() |> Timex.shift(days: -1))
perform_job(SendTrialNotifications, %{})
assert_no_emails_delivered()
end
test "does not send a notification if user does not have a trial" do
user = insert(:user, trial_expiry_date: nil)
insert(:site, members: [user])
perform_job(SendTrialNotifications, %{})
assert_no_emails_delivered()
end
test "does not send a notification if user created a site but there are no pageviews" do
user = insert(:user, trial_expiry_date: Timex.now() |> Timex.shift(days: 7))
insert(:site, members: [user])
perform_job(SendTrialNotifications, %{})
assert_no_emails_delivered()
end
test "does not send a notification if user is a collaborator on sites but not an owner" do
user = insert(:user, trial_expiry_date: Timex.now())
site =
insert(:site,
memberships: [
build(:site_membership, user: user, role: :admin)
]
)
populate_stats(site, [build(:pageview, domain: site.domain)])
perform_job(SendTrialNotifications, %{})
assert_no_emails_delivered()
end
describe "with site and pageviews" do
test "sends a reminder 7 days before trial ends (16 days after user signed up)" do
user = insert(:user, trial_expiry_date: Timex.now() |> Timex.shift(days: 7))
site = insert(:site, members: [user])
populate_stats(site, [build(:pageview, domain: site.domain)])
perform_job(SendTrialNotifications, %{})
assert_delivered_email(PlausibleWeb.Email.trial_one_week_reminder(user))
end
test "sends an upgrade email the day before the trial ends" do
user = insert(:user, trial_expiry_date: Timex.now() |> Timex.shift(days: 1))
site = insert(:site, members: [user])
populate_stats(site, [
build(:pageview, domain: site.domain),
build(:pageview, domain: site.domain),
build(:pageview, domain: site.domain)
])
perform_job(SendTrialNotifications, %{})
assert_delivered_email(PlausibleWeb.Email.trial_upgrade_email(user, "tomorrow", {3, 0}))
end
test "sends an upgrade email the day the trial ends" do
user = insert(:user, trial_expiry_date: Timex.today())
site = insert(:site, members: [user])
populate_stats(site, [
build(:pageview, domain: site.domain),
build(:pageview, domain: site.domain),
build(:pageview, domain: site.domain)
])
perform_job(SendTrialNotifications, %{})
assert_delivered_email(PlausibleWeb.Email.trial_upgrade_email(user, "today", {3, 0}))
end
test "does not include custom event note if user has not used custom events" do
user = insert(:user, trial_expiry_date: Timex.today())
email = PlausibleWeb.Email.trial_upgrade_email(user, "today", {9_000, 0})
assert email.html_body =~
"In the last month, your account has used 9,000 billable pageviews."
end
test "includes custom event note if user has used custom events" do
user = insert(:user, trial_expiry_date: Timex.today())
email = PlausibleWeb.Email.trial_upgrade_email(user, "today", {9_000, 100})
assert email.html_body =~
"In the last month, your account has used 9,100 billable pageviews and custom events in total."
end
test "sends a trial over email the day after the trial ends" do
user = insert(:user, trial_expiry_date: Timex.today() |> Timex.shift(days: -1))
site = insert(:site, members: [user])
populate_stats(site, [
build(:pageview, domain: site.domain),
build(:pageview, domain: site.domain),
build(:pageview, domain: site.domain)
])
perform_job(SendTrialNotifications, %{})
assert_delivered_email(PlausibleWeb.Email.trial_over_email(user))
end
test "does not send a notification if user has a subscription" do
user = insert(:user, trial_expiry_date: Timex.now() |> Timex.shift(days: 7))
site = insert(:site, members: [user])
populate_stats(site, [
build(:pageview, domain: site.domain),
build(:pageview, domain: site.domain),
build(:pageview, domain: site.domain)
])
insert(:subscription, user: user)
perform_job(SendTrialNotifications, %{})
assert_no_emails_delivered()
end
end
describe "Suggested plans" do
test "suggests 10k/mo plan" do
user = insert(:user)
email = PlausibleWeb.Email.trial_upgrade_email(user, "today", {9_000, 0})
assert email.html_body =~ "we recommend you select the 10k/mo plan."
end
test "suggests 100k/mo plan" do
user = insert(:user)
email = PlausibleWeb.Email.trial_upgrade_email(user, "today", {90_000, 0})
assert email.html_body =~ "we recommend you select the 100k/mo plan."
end
test "suggests 200k/mo plan" do
user = insert(:user)
email = PlausibleWeb.Email.trial_upgrade_email(user, "today", {180_000, 0})
assert email.html_body =~ "we recommend you select the 200k/mo plan."
end
test "suggests 500k/mo plan" do
user = insert(:user)
email = PlausibleWeb.Email.trial_upgrade_email(user, "today", {450_000, 0})
assert email.html_body =~ "we recommend you select the 500k/mo plan."
end
test "suggests 1m/mo plan" do
user = insert(:user)
email = PlausibleWeb.Email.trial_upgrade_email(user, "today", {900_000, 0})
assert email.html_body =~ "we recommend you select the 1M/mo plan."
end
test "suggests 2m/mo plan" do
user = insert(:user)
email = PlausibleWeb.Email.trial_upgrade_email(user, "today", {1_800_000, 0})
assert email.html_body =~ "we recommend you select the 2M/mo plan."
end
test "suggests 5m/mo plan" do
user = insert(:user)
email = PlausibleWeb.Email.trial_upgrade_email(user, "today", {4_500_000, 0})
assert email.html_body =~ "we recommend you select the 5M/mo plan."
end
test "suggests 10m/mo plan" do
user = insert(:user)
email = PlausibleWeb.Email.trial_upgrade_email(user, "today", {9_000_000, 0})
assert email.html_body =~ "we recommend you select the 10M/mo plan."
end
test "does not suggest a plan above that" do
user = insert(:user)
email = PlausibleWeb.Email.trial_upgrade_email(user, "today", {20_000_000, 0})
assert email.html_body =~ "please reply back to this email to get a quote for your volume"
end
end
end