Skip to content

Commit da53ef9

Browse files
octoberclubjonodrew
authored andcommitted
Add more chaser scenarios to the member selection
1 parent 086133b commit da53ef9

1 file changed

Lines changed: 144 additions & 20 deletions

File tree

spec/services/three_month_email_service_spec.rb

Lines changed: 144 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,42 +10,166 @@
1010
ActiveJob::Base.queue_adapter = original_adapter
1111
end
1212

13-
let!(:eligible_member) { Fabricate(:member) }
14-
let!(:emailed_member) { Fabricate(:member) }
15-
let!(:old_invite_member) { Fabricate(:member) }
13+
let(:chapter) { Fabricate(:chapter) }
14+
let(:students_group) { Fabricate(:group, name: "Students", chapter: chapter) }
15+
let(:coaches_group) { Fabricate(:group, name: "Coaches", chapter: chapter) }
1616

17-
before do
18-
# Eligible: recent invite, no email delivery
17+
let!(:eligible_student) do
18+
member = Fabricate(:member)
19+
Fabricate(:subscription, member: member, group: students_group)
20+
member
21+
end
22+
23+
let!(:already_emailed_student) do
24+
member = Fabricate(:member)
25+
Fabricate(:subscription, member: member, group: students_group)
26+
Fabricate(:member_email_delivery, member: member)
27+
member
28+
end
29+
30+
let!(:student_with_recent_attendance) do
31+
member = Fabricate(:member)
32+
Fabricate(:subscription, member: member, group: students_group)
1933
Fabricate(
2034
:workshop_invitation,
21-
member: eligible_member,
22-
created_at: 3.months.ago,
23-
attended: false
35+
member: member,
36+
workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 1.month.ago),
37+
role: "Student",
38+
attended: true
2439
)
40+
member
41+
end
2542

26-
# Already emailed: recent invite, but has email delivery
43+
let!(:student_with_old_attendance) do
44+
member = Fabricate(:member)
45+
Fabricate(:subscription, member: member, group: students_group)
2746
Fabricate(
2847
:workshop_invitation,
29-
member: emailed_member,
30-
created_at: 2.months.ago
48+
member: member,
49+
workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 4.months.ago),
50+
role: "Student",
51+
attended: true
3152
)
53+
member
54+
end
55+
56+
let!(:coach_member) do
57+
member = Fabricate(:member)
58+
Fabricate(:subscription, member: member, group: coaches_group)
59+
member
60+
end
61+
62+
let!(:unsubscribed_member) { Fabricate(:member) }
63+
let!(:banned_student) do
64+
member = Fabricate(:banned_member)
65+
Fabricate(:subscription, member: member, group: students_group)
66+
member
67+
end
68+
let!(:student_without_toc) do
69+
member = Fabricate(:member_without_toc)
70+
Fabricate(:subscription, member: member, group: students_group)
71+
member
72+
end
73+
74+
it "emails only students who have not attended in the last 3 months and were not emailed before" do
75+
expect { perform_enqueued_jobs { call } }.to change(MemberEmailDelivery, :count).by(2)
76+
77+
expect(MemberEmailDelivery.where(member: eligible_student)).to exist
78+
expect(MemberEmailDelivery.where(member: student_with_old_attendance)).to exist
79+
end
80+
81+
it "does not email a member already present in member_email_deliveries" do
82+
expect { perform_enqueued_jobs { call } }
83+
.not_to change { MemberEmailDelivery.where(member: already_emailed_student).count }
84+
end
85+
86+
it "does not email students with a recent attended workshop" do
87+
expect { perform_enqueued_jobs { call } }
88+
.not_to change { MemberEmailDelivery.where(member: student_with_recent_attendance).count }
89+
end
90+
91+
it "does not email members without a student subscription" do
92+
perform_enqueued_jobs { call }
93+
94+
expect(MemberEmailDelivery.where(member: coach_member)).to be_empty
95+
expect(MemberEmailDelivery.where(member: unsubscribed_member)).to be_empty
96+
end
97+
98+
it "does not email banned students or students without accepted terms" do
99+
perform_enqueued_jobs { call }
100+
101+
expect(MemberEmailDelivery.where(member: banned_student)).to be_empty
102+
expect(MemberEmailDelivery.where(member: student_without_toc)).to be_empty
103+
end
104+
105+
it "sends only one chaser for a member with multiple student subscriptions" do
106+
member = Fabricate(:member)
107+
other_chapter = Fabricate(:chapter)
108+
other_students_group = Fabricate(:group, name: "Students", chapter: other_chapter)
109+
Fabricate(:subscription, member: member, group: students_group)
110+
Fabricate(:subscription, member: member, group: other_students_group)
111+
112+
perform_enqueued_jobs { call }
113+
114+
expect(MemberEmailDelivery.where(member: member).count).to eq(1)
115+
end
116+
117+
it "sends only one chaser for a member with multiple qualifying old attendances" do
118+
member = Fabricate(:member)
119+
Fabricate(:subscription, member: member, group: students_group)
32120
Fabricate(
33-
:member_email_delivery,
34-
member: emailed_member
121+
:workshop_invitation,
122+
member: member,
123+
workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 5.months.ago),
124+
role: "Student",
125+
attended: true
35126
)
127+
Fabricate(
128+
:workshop_invitation,
129+
member: member,
130+
workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 4.months.ago),
131+
role: "Student",
132+
attended: true
133+
)
134+
135+
perform_enqueued_jobs { call }
36136

37-
# Old invite: more than 3 months ago
137+
expect(MemberEmailDelivery.where(member: member).count).to eq(1)
138+
end
139+
140+
it "does not send chasers when there are no eligible members" do
141+
Fabricate(
142+
:workshop_invitation,
143+
member: eligible_student,
144+
workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 1.month.ago),
145+
role: "Student",
146+
attended: true
147+
)
38148
Fabricate(
39149
:workshop_invitation,
40-
member: old_invite_member,
41-
created_at: 4.months.ago
150+
member: student_with_old_attendance,
151+
workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 1.month.ago),
152+
role: "Student",
153+
attended: true
42154
)
155+
156+
expect { perform_enqueued_jobs { call } }.not_to change(MemberEmailDelivery, :count)
43157
end
44158

45-
it "enqueues chaser emails only for eligible members" do
46-
expect {
47-
call
48-
}.to have_enqueued_mail(MemberMailer, :chaser).once
159+
it "emails a student member who has recent attendance only as a coach" do
160+
member = Fabricate(:member)
161+
Fabricate(:subscription, member: member, group: students_group)
162+
Fabricate(
163+
:workshop_invitation,
164+
member: member,
165+
workshop: Fabricate(:workshop, chapter: chapter, date_and_time: 1.month.ago),
166+
role: "Coach",
167+
attended: true
168+
)
169+
170+
perform_enqueued_jobs { call }
171+
172+
expect(MemberEmailDelivery.where(member: member)).to exist
49173
end
50174
end
51175
end

0 commit comments

Comments
 (0)