Skip to content

Commit 8c8f601

Browse files
committed
Create Job and Service for sending the chaser
This outlines a single test for sending the chaser email. It also creates the relevant Job and Service. When users haven't attended a workshop they were invited to in the last three months _and_ haven't already been chased, they'll be sent a follow up email Signed-off-by: jonathan.kerr <3410350+jonodrew@users.noreply.github.com>
1 parent cba8b9f commit 8c8f601

File tree

4 files changed

+74
-0
lines changed

4 files changed

+74
-0
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# frozen_string_literal: true
2+
3+
class SendThreeMonthEmailJob < ApplicationJob
4+
queue_as :default
5+
6+
def perform
7+
ThreeMonthEmailService.send_chaser
8+
end
9+
end
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# frozen_string_literal: true
2+
3+
class ThreeMonthEmailService
4+
def self.send_chaser
5+
members = Member.joins(:workshop_invitations)
6+
.left_joins(:member_email_deliveries)
7+
.where(workshop_invitations: { attended: false })
8+
.where("workshop_invitations.created_at >= ?", 3.months.ago.beginning_of_day)
9+
.where(member_email_deliveries: { id: nil })
10+
.distinct
11+
return if members.empty?
12+
members.each do |member|
13+
MemberMailer.with(member: member).chaser.deliver_later
14+
end
15+
end
16+
end
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Fabricator(:member_email_delivery) do
2+
member(fabricator: :member)
3+
subject("Chaser")
4+
body("Lorem ipsum")
5+
to(["test_email@address"])
6+
end
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
RSpec.describe ThreeMonthEmailService, type: :service do
2+
describe "#send_chaser" do
3+
subject(:call) { described_class.send_chaser }
4+
5+
let!(:eligible_member) { Fabricate(:member) }
6+
let!(:emailed_member) { Fabricate(:member) }
7+
let!(:old_invite_member) { Fabricate(:member) }
8+
9+
before do
10+
# Eligible: recent invite, no email delivery
11+
Fabricate(
12+
:workshop_invitation,
13+
member: eligible_member,
14+
created_at: 3.months.ago,
15+
attended: false
16+
)
17+
18+
# Already emailed: recent invite, but has email delivery
19+
Fabricate(
20+
:workshop_invitation,
21+
member: emailed_member,
22+
created_at: 2.months.ago
23+
)
24+
Fabricate(
25+
:member_email_delivery,
26+
member: emailed_member
27+
)
28+
29+
# Old invite: more than 3 months ago
30+
Fabricate(
31+
:workshop_invitation,
32+
member: old_invite_member,
33+
created_at: 4.months.ago
34+
)
35+
end
36+
37+
it "enqueues chaser emails only for eligible members" do
38+
expect {
39+
call
40+
}.to have_enqueued_mail(MemberMailer, :chaser).once
41+
end
42+
end
43+
end

0 commit comments

Comments
 (0)