Skip to content

Commit 47ed9b0

Browse files
committed
Add method to send weekly CSV to AwsSesSubmissionBatchService
Add a method that generates the CSV(s) for the defined date range and sends the email with them attached. We haven't decided what the CSV filenames will be for weekly submissions yet, so for now keep them the same as for the daily submissions using the the end date of the range. We can update this when it's decided.
1 parent f4b0bcd commit 47ed9b0

File tree

2 files changed

+120
-12
lines changed

2 files changed

+120
-12
lines changed

app/services/aws_ses_submission_batch_service.rb

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,47 @@ def initialize(submissions_query:, form:, mode:)
66
end
77

88
def send_daily_batch(date:)
9+
files = csv_attachments(date)
10+
11+
mail = AwsSesSubmissionBatchMailer.daily_submission_batch_email(form: @form, date:, mode: @mode, files:).deliver_now
12+
13+
CurrentJobLoggingAttributes.delivery_reference = mail.message_id
14+
mail.message_id
15+
end
16+
17+
def send_weekly_batch(begin_date:, end_date:)
18+
files = csv_attachments(end_date)
19+
20+
mail = AwsSesSubmissionBatchMailer.weekly_submission_batch_email(
21+
form: @form,
22+
begin_date:,
23+
end_date:,
24+
mode: @mode,
25+
files:,
26+
).deliver_now
27+
28+
CurrentJobLoggingAttributes.delivery_reference = mail.message_id
29+
mail.message_id
30+
end
31+
32+
private
33+
34+
def csv_attachments(date_for_filename)
935
files = {}
1036

1137
csvs = CsvGenerator.generate_batched_submissions(submissions_query: @submissions_query, is_s3_submission: false)
1238
csvs.each.with_index(1) do |csv, index|
1339
csv_version = csvs.size > 1 ? index : nil
14-
filename = SubmissionFilenameGenerator.batch_csv_filename(form_name: @form.name, date:, mode: @mode, form_version: csv_version)
40+
filename = SubmissionFilenameGenerator.batch_csv_filename(
41+
form_name: @form.name,
42+
date: date_for_filename,
43+
mode: @mode,
44+
form_version: csv_version,
45+
)
46+
1547
files[filename] = csv
1648
end
1749

18-
mail = AwsSesSubmissionBatchMailer.daily_submission_batch_email(form: @form, date:, mode: @mode, files:).deliver_now
19-
20-
CurrentJobLoggingAttributes.delivery_reference = mail.message_id
21-
mail.message_id
50+
files
2251
end
2352
end

spec/services/aws_ses_submission_batch_service_spec.rb

Lines changed: 86 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
let(:form) { build(:form, submission_email:) }
66
let(:form_document) { build(:v2_form_document, :with_steps, form_id: form.id) }
77
let(:submission_email) { "submit@email.gov.uk" }
8-
let(:date) { Date.new(2024, 6, 1) }
98
let(:mode) { instance_double(Mode, preview?: false) }
109
let(:submissions_query) { Submission.all }
1110

1211
describe "#send_daily_batch" do
12+
let(:date) { Date.new(2024, 6, 1) }
13+
1314
before do
1415
allow(SubmissionFilenameGenerator).to receive(:batch_csv_filename).and_return("filename.csv")
1516
allow(CsvGenerator).to receive(:generate_batched_submissions).and_return(%w[csv-content])
@@ -28,6 +29,20 @@
2829
expect(message_id).to eq last_email.message_id
2930
end
3031

32+
context "when the csv generator returns a single csv version" do
33+
it "calls the AwsSesSubmissionBatchMailer to send the email with the generated file" do
34+
expect(AwsSesSubmissionBatchMailer).to receive(:daily_submission_batch_email)
35+
.with(
36+
form:,
37+
date:,
38+
mode:,
39+
files: { "filename.csv" => "csv-content" },
40+
).and_call_original
41+
42+
service.send_daily_batch(date:)
43+
end
44+
end
45+
3146
context "when the csv generator returns multiple csv versions" do
3247
before do
3348
allow(CsvGenerator).to receive(:generate_batched_submissions).and_return(%w[csv-content csv-content-2])
@@ -42,15 +57,79 @@
4257

4358
it "calls the AwsSesSubmissionBatchMailer to send the email with the generated files" do
4459
expect(AwsSesSubmissionBatchMailer).to receive(:daily_submission_batch_email)
45-
.with(
46-
form:,
47-
date:,
48-
mode:,
49-
files: { "filename.csv" => "csv-content", "filename-2.csv" => "csv-content-2" },
50-
).and_call_original
60+
.with(
61+
form:,
62+
date:,
63+
mode:,
64+
files: { "filename.csv" => "csv-content", "filename-2.csv" => "csv-content-2" },
65+
).and_call_original
5166

5267
service.send_daily_batch(date:)
5368
end
5469
end
5570
end
71+
72+
describe "#send_weekly_batch" do
73+
let(:begin_date) { Date.new(2024, 6, 1) }
74+
let(:end_date) { Date.new(2024, 6, 7) }
75+
76+
before do
77+
allow(SubmissionFilenameGenerator).to receive(:batch_csv_filename).and_return("filename.csv")
78+
allow(CsvGenerator).to receive(:generate_batched_submissions).and_return(%w[csv-content])
79+
create_list(:submission, 3, form_document:)
80+
end
81+
82+
it "calls the SubmissionFilenameGenerator with a nil form version" do
83+
expect(SubmissionFilenameGenerator).to receive(:batch_csv_filename).with(form_name: form.name, date: end_date, mode:, form_version: nil)
84+
service.send_weekly_batch(begin_date:, end_date:)
85+
end
86+
87+
it "returns the message id" do
88+
message_id = service.send_weekly_batch(begin_date:, end_date:)
89+
90+
last_email = ActionMailer::Base.deliveries.last
91+
expect(message_id).to eq last_email.message_id
92+
end
93+
94+
context "when the csv generator returns a single csv version" do
95+
it "calls the AwsSesSubmissionBatchMailer to send the email with the generated file" do
96+
expect(AwsSesSubmissionBatchMailer).to receive(:weekly_submission_batch_email)
97+
.with(
98+
form:,
99+
begin_date:,
100+
end_date:,
101+
mode:,
102+
files: { "filename.csv" => "csv-content" },
103+
).and_call_original
104+
105+
service.send_weekly_batch(begin_date:, end_date:)
106+
end
107+
end
108+
109+
context "when the csv generator returns multiple csv versions" do
110+
before do
111+
allow(CsvGenerator).to receive(:generate_batched_submissions).and_return(%w[csv-content csv-content-2])
112+
allow(SubmissionFilenameGenerator).to receive(:batch_csv_filename).and_return("filename.csv", "filename-2.csv")
113+
end
114+
115+
it "calls the SubmissionFilenameGenerator to generate a filename for each form version" do
116+
expect(SubmissionFilenameGenerator).to receive(:batch_csv_filename).with(form_name: form.name, date: end_date, mode:, form_version: 1)
117+
expect(SubmissionFilenameGenerator).to receive(:batch_csv_filename).with(form_name: form.name, date: end_date, mode:, form_version: 2)
118+
service.send_weekly_batch(begin_date:, end_date:)
119+
end
120+
121+
it "calls the AwsSesSubmissionBatchMailer to send the email with the generated files" do
122+
expect(AwsSesSubmissionBatchMailer).to receive(:weekly_submission_batch_email)
123+
.with(
124+
form:,
125+
begin_date:,
126+
end_date:,
127+
mode:,
128+
files: { "filename.csv" => "csv-content", "filename-2.csv" => "csv-content-2" },
129+
).and_call_original
130+
131+
service.send_weekly_batch(begin_date:, end_date:)
132+
end
133+
end
134+
end
56135
end

0 commit comments

Comments
 (0)