File size: 3,665 Bytes
6778ee0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
defmodule Plausible.Workers.SendSiteSetupEmailsTest do
  use Plausible.DataCase, async: true
  use Bamboo.Test
  use Oban.Testing, repo: Plausible.Repo

  alias Plausible.Workers.SendSiteSetupEmails

  describe "when user has not managed to set up the site" do
    test "does not send an email 47 hours after site creation" do
      user = new_user()
      new_site(owner: user, inserted_at: hours_ago(47))

      perform_job(SendSiteSetupEmails, %{})

      assert_no_emails_delivered()
    end

    test "sends a setup help email 48 hours after site has been created" do
      user = new_user()
      new_site(owner: user, inserted_at: hours_ago(49))

      perform_job(SendSiteSetupEmails, %{})

      assert_email_delivered_with(
        to: [{user.name, user.email}],
        subject: "No traffic recorded yet"
      )
    end

    test "does not send an email more than 72 hours after signup" do
      user = new_user()
      new_site(owner: user, inserted_at: hours_ago(73))

      perform_job(SendSiteSetupEmails, %{})

      assert_no_emails_delivered()
    end
  end

  describe "when user has managed to set up their site" do
    test "sends the setup completed email as soon as possible" do
      user = new_user()
      site = new_site(owner: user)

      populate_stats(site, [build(:pageview)])

      perform_job(SendSiteSetupEmails, %{})

      assert_email_delivered_with(
        to: [{user.name, user.email}],
        subject: "Your first visitor just showed up"
      )
    end

    test "sends the setup completed email after the help email has been sent" do
      user = new_user()
      site = new_site(owner: user, inserted_at: hours_ago(49))

      perform_job(SendSiteSetupEmails, %{})

      assert_email_delivered_with(
        to: [{user.name, user.email}],
        subject: "No traffic recorded yet"
      )

      populate_stats(site, [
        build(:pageview)
      ])

      perform_job(SendSiteSetupEmails, %{})

      assert_email_delivered_with(
        to: [{user.name, user.email}],
        subject: "Your first visitor just showed up"
      )
    end

    test "do not send the setup help email for consolidated site" do
      user = new_user()
      site = new_site(owner: user)

      populate_stats(site, [build(:pageview)])

      perform_job(SendSiteSetupEmails, %{})

      assert_email_delivered_with(
        to: [{user.name, user.email}],
        subject: "Your first visitor just showed up"
      )

      new_site(owner: user, consolidated: true, inserted_at: hours_ago(49))

      perform_job(SendSiteSetupEmails, %{})

      assert_no_emails_delivered()
    end

    test "do not send the setup success email for consolidated website" do
      user = new_user()

      # for test purposes, set stats_start_date for a consolidated site
      new_site(owner: user, consolidated: true, stats_start_date: Date.utc_today())

      perform_job(SendSiteSetupEmails, %{})

      assert_no_emails_delivered()
    end
  end

  describe "trial user who has not set up a website" do
    test "does not send an email before 48h have passed" do
      new_user(inserted_at: hours_ago(47))

      perform_job(SendSiteSetupEmails, %{})

      assert_no_emails_delivered()
    end

    test "sends the create site email after 48h" do
      user = new_user(inserted_at: hours_ago(49))

      perform_job(SendSiteSetupEmails, %{})

      assert_email_delivered_with(
        to: [{user.name, user.email}],
        subject: "Add your first site to start tracking"
      )
    end
  end

  defp hours_ago(hours) do
    NaiveDateTime.utc_now()
    |> NaiveDateTime.truncate(:second)
    |> NaiveDateTime.shift(hour: -hours)
  end
end