| 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 |
| new_user(trial_expiry_date: Date.utc_today() |> Date.shift(day: 7)) |
| new_user(trial_expiry_date: Date.utc_today() |> Date.shift(day: 1)) |
| new_user(trial_expiry_date: Date.utc_today() |> Date.shift(day: 0)) |
| new_user(trial_expiry_date: Date.utc_today() |> Date.shift(day: -1)) |
|
|
| perform_job(SendTrialNotifications, %{}) |
|
|
| assert_no_emails_delivered() |
| end |
|
|
| test "does not send a notification if user does not have a trial" do |
| user = new_user() |
| new_site(owner: user) |
| user |> team_of() |> Ecto.Changeset.change(trial_expiry_date: nil) |> Plausible.Repo.update!() |
|
|
| 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 = new_user(trial_expiry_date: Date.utc_today() |> Date.shift(day: 7)) |
| new_site(owner: 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 = new_user(trial_expiry_date: Date.utc_today()) |
| site = new_site() |
| add_guest(site, user: user, role: :editor) |
|
|
| populate_stats(site, [build(:pageview)]) |
|
|
| 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 = new_user(trial_expiry_date: Date.utc_today() |> Date.shift(day: 7)) |
| site = new_site(owner: user) |
| populate_stats(site, [build(:pageview)]) |
|
|
| perform_job(SendTrialNotifications, %{}) |
|
|
| assert_delivered_email(PlausibleWeb.Email.trial_one_week_reminder(user, site.team)) |
| end |
|
|
| test "includes billing member in recipients" do |
| user = new_user(trial_expiry_date: Date.utc_today() |> Date.shift(day: 7)) |
| site = new_site(owner: user) |
| team = team_of(user) |
| billing_member = new_user() |
| add_member(team, user: billing_member, role: :billing) |
|
|
| populate_stats(site, [build(:pageview)]) |
|
|
| perform_job(SendTrialNotifications, %{}) |
|
|
| assert_delivered_email(PlausibleWeb.Email.trial_one_week_reminder(user, team)) |
| assert_delivered_email(PlausibleWeb.Email.trial_one_week_reminder(billing_member, team)) |
| end |
|
|
| test "sends an upgrade email the day before the trial ends" do |
| user = new_user(trial_expiry_date: Date.utc_today() |> Date.shift(day: 1)) |
| site = new_site(owner: user) |
| usage = %{total: 3, custom_events: 0} |
| suggested_volume = Plausible.Billing.Plans.suggest_volume(site.team, usage.total) |
|
|
| populate_stats(site, [ |
| build(:pageview), |
| build(:pageview), |
| build(:pageview) |
| ]) |
|
|
| perform_job(SendTrialNotifications, %{}) |
|
|
| assert_delivered_email( |
| PlausibleWeb.Email.trial_ending_tomorrow_email( |
| user, |
| site.team, |
| usage, |
| suggested_volume |
| ) |
| ) |
| end |
|
|
| test "sends an upgrade email the day the trial ends" do |
| user = new_user(trial_expiry_date: Date.utc_today()) |
| site = new_site(owner: user) |
| usage = %{total: 3, custom_events: 0} |
| suggested_volume = Plausible.Billing.Plans.suggest_volume(site.team, usage.total) |
|
|
| populate_stats(site, [ |
| build(:pageview), |
| build(:pageview), |
| build(:pageview) |
| ]) |
|
|
| perform_job(SendTrialNotifications, %{}) |
|
|
| assert_delivered_email( |
| PlausibleWeb.Email.trial_ending_today_email(user, site.team, usage, suggested_volume) |
| ) |
| end |
|
|
| test "does not include custom event note if user has not used custom events" do |
| user = new_user(trial_expiry_date: Date.utc_today()) |
| site = new_site(owner: user) |
| usage = %{total: 9_000, custom_events: 0} |
| suggested_volume = Plausible.Billing.Plans.suggest_volume(site.team, usage.total) |
|
|
| email = |
| PlausibleWeb.Email.trial_ending_today_email(user, site.team, usage, suggested_volume) |
|
|
| assert email.html_body =~ "So far, your account has used 9,000 billable pageviews." |
| end |
|
|
| test "includes custom event note if user has used custom events" do |
| user = new_user(trial_expiry_date: Date.utc_today()) |
| site = new_site(owner: user) |
| usage = %{total: 9_100, custom_events: 100} |
| suggested_volume = Plausible.Billing.Plans.suggest_volume(site.team, usage.total) |
|
|
| email = |
| PlausibleWeb.Email.trial_ending_today_email(user, site.team, usage, suggested_volume) |
|
|
| assert email.html_body =~ |
| "So far, 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 = new_user(trial_expiry_date: Date.utc_today() |> Date.shift(day: -1)) |
| site = new_site(owner: user) |
|
|
| populate_stats(site, [ |
| build(:pageview), |
| build(:pageview), |
| build(:pageview) |
| ]) |
|
|
| perform_job(SendTrialNotifications, %{}) |
|
|
| assert_delivered_email(PlausibleWeb.Email.trial_over_email(user, site.team)) |
| end |
|
|
| test "does not send a notification if user has a subscription" do |
| user = new_user(trial_expiry_date: Date.utc_today() |> Date.shift(day: 7)) |
| site = new_site(owner: user) |
|
|
| populate_stats(site, [ |
| build(:pageview), |
| build(:pageview), |
| build(:pageview) |
| ]) |
|
|
| subscribe_to_growth_plan(user) |
|
|
| perform_job(SendTrialNotifications, %{}) |
|
|
| assert_no_emails_delivered() |
| end |
| end |
|
|
| describe "Suggested plans" do |
| test "suggests 10k/mo plan" do |
| user = new_user() |
| site = new_site(owner: user) |
| usage = %{total: 9_000, custom_events: 0} |
| suggested_volume = Plausible.Billing.Plans.suggest_volume(site.team, usage.total) |
|
|
| email = |
| PlausibleWeb.Email.trial_ending_today_email(user, site.team, usage, suggested_volume) |
|
|
| assert email.html_body =~ "select the 10k pageviews/month plan." |
| end |
|
|
| test "suggests 100k/mo plan" do |
| user = new_user() |
| site = new_site(owner: user) |
| usage = %{total: 90_000, custom_events: 0} |
| suggested_volume = Plausible.Billing.Plans.suggest_volume(site.team, usage.total) |
|
|
| email = |
| PlausibleWeb.Email.trial_ending_today_email(user, site.team, usage, suggested_volume) |
|
|
| assert email.html_body =~ "select the 100k pageviews/month plan." |
| end |
|
|
| test "suggests 200k/mo plan" do |
| user = new_user() |
| site = new_site(owner: user) |
| usage = %{total: 180_000, custom_events: 0} |
| suggested_volume = Plausible.Billing.Plans.suggest_volume(site.team, usage.total) |
|
|
| email = |
| PlausibleWeb.Email.trial_ending_today_email(user, site.team, usage, suggested_volume) |
|
|
| assert email.html_body =~ "select the 200k pageviews/month plan." |
| end |
|
|
| test "suggests 500k/mo plan" do |
| user = new_user() |
| site = new_site(owner: user) |
| usage = %{total: 450_000, custom_events: 0} |
| suggested_volume = Plausible.Billing.Plans.suggest_volume(site.team, usage.total) |
|
|
| email = |
| PlausibleWeb.Email.trial_ending_today_email(user, site.team, usage, suggested_volume) |
|
|
| assert email.html_body =~ "select the 500k pageviews/month plan." |
| end |
|
|
| test "suggests 1m/mo plan" do |
| user = new_user() |
| site = new_site(owner: user) |
| usage = %{total: 900_000, custom_events: 0} |
| suggested_volume = Plausible.Billing.Plans.suggest_volume(site.team, usage.total) |
|
|
| email = |
| PlausibleWeb.Email.trial_ending_today_email(user, site.team, usage, suggested_volume) |
|
|
| assert email.html_body =~ "select the 1M pageviews/month plan." |
| end |
|
|
| test "suggests 2m/mo plan" do |
| user = new_user() |
| site = new_site(owner: user) |
| usage = %{total: 1_800_000, custom_events: 0} |
| suggested_volume = Plausible.Billing.Plans.suggest_volume(site.team, usage.total) |
|
|
| email = |
| PlausibleWeb.Email.trial_ending_today_email(user, site.team, usage, suggested_volume) |
|
|
| assert email.html_body =~ "select the 2M pageviews/month plan." |
| end |
|
|
| test "suggests 5m/mo plan" do |
| user = new_user() |
| site = new_site(owner: user) |
| usage = %{total: 4_500_000, custom_events: 0} |
| suggested_volume = Plausible.Billing.Plans.suggest_volume(site.team, usage.total) |
|
|
| email = |
| PlausibleWeb.Email.trial_ending_today_email(user, site.team, usage, suggested_volume) |
|
|
| assert email.html_body =~ "select the 5M pageviews/month plan." |
| end |
|
|
| test "suggests 10m/mo plan" do |
| user = new_user() |
| site = new_site(owner: user) |
| usage = %{total: 9_000_000, custom_events: 0} |
| suggested_volume = Plausible.Billing.Plans.suggest_volume(site.team, usage.total) |
|
|
| email = |
| PlausibleWeb.Email.trial_ending_today_email(user, site.team, usage, suggested_volume) |
|
|
| assert email.html_body =~ "select the 10M pageviews/month plan." |
| end |
|
|
| test "does not suggest a plan above that" do |
| user = new_user() |
| site = new_site(owner: user) |
| usage = %{total: 20_000_000, custom_events: 0} |
| suggested_volume = Plausible.Billing.Plans.suggest_volume(site.team, usage.total) |
|
|
| email = |
| PlausibleWeb.Email.trial_ending_today_email(user, site.team, usage, suggested_volume) |
|
|
| assert email.html_body =~ |
| "Please reply to this email and we'll prepare a custom plan for your volume" |
| end |
|
|
| test "does not suggest a plan when user is switching to an enterprise plan" do |
| user = new_user() |
| site = new_site(owner: user) |
| usage = %{total: 10_000, custom_events: 0} |
| subscribe_to_enterprise_plan(user, paddle_plan_id: "enterprise-plan-id") |
| suggested_volume = Plausible.Billing.Plans.suggest_volume(site.team, usage.total) |
|
|
| email = |
| PlausibleWeb.Email.trial_ending_today_email(user, site.team, usage, suggested_volume) |
|
|
| assert email.html_body =~ |
| "Please reply to this email and we'll prepare a custom plan for your volume" |
| end |
| end |
| end |
|
|