diff --git a/app/jobs/consent_reminders_session_batch_job.rb b/app/jobs/consent_reminders_session_batch_job.rb index adaf5ea3d..17f0e1aad 100644 --- a/app/jobs/consent_reminders_session_batch_job.rb +++ b/app/jobs/consent_reminders_session_batch_job.rb @@ -26,6 +26,10 @@ def perform(session) end patient.update!(consent_reminder_sent_at: Time.zone.now) + + session.programmes.each do |programme| + ConsentNotification.create!(programme:, patient:, reminder: true) + end end end end diff --git a/app/jobs/consent_requests_session_batch_job.rb b/app/jobs/consent_requests_session_batch_job.rb index 18d03d6a0..9b8064aca 100644 --- a/app/jobs/consent_requests_session_batch_job.rb +++ b/app/jobs/consent_requests_session_batch_job.rb @@ -14,7 +14,7 @@ class ConsentRequestsSessionBatchJob < ApplicationJob queue_as :default def perform(session) - session.patients.consent_request_not_sent.each do |patient| + session.patients.needing_consent_request.each do |patient| patient.parents.each do |parent| ConsentMailer.with(parent:, patient:, session:).request.deliver_now TextDeliveryJob.perform_later( @@ -26,6 +26,10 @@ def perform(session) end patient.update!(consent_request_sent_at: Time.zone.now) + + session.programmes.each do |programme| + ConsentNotification.create!(programme:, patient:, reminder: false) + end end end end diff --git a/app/models/patient.rb b/app/models/patient.rb index 4ef6b6d26..22b25c41b 100644 --- a/app/models/patient.rb +++ b/app/models/patient.rb @@ -71,6 +71,9 @@ class Patient < ApplicationRecord scope :without_consent, -> { includes(:consents).where(consents: { id: nil }) } + + scope :needing_consent_request, + -> { without_consent.consent_request_not_sent } scope :needing_consent_reminder, -> { consent_request_sent.without_consent.consent_reminder_not_sent } diff --git a/spec/factories/patients.rb b/spec/factories/patients.rb index 5b1f64915..81bd7a239 100644 --- a/spec/factories/patients.rb +++ b/spec/factories/patients.rb @@ -91,6 +91,28 @@ trait :consent_request_sent do consent_request_sent_at { 1.week.ago } + + after(:create) do |patient, context| + create( + :consent_notification, + :request, + patient:, + programme: context.programme + ) + end + end + + trait :consent_reminder_sent do + consent_reminder_sent_at { 1.week.ago } + + after(:create) do |patient, context| + create( + :consent_notification, + :reminder, + patient:, + programme: context.programme + ) + end end trait :consent_given_triage_not_needed do diff --git a/spec/jobs/consent_reminders_session_batch_job_spec.rb b/spec/jobs/consent_reminders_session_batch_job_spec.rb index ffe70dd7d..ccf92ec30 100644 --- a/spec/jobs/consent_reminders_session_batch_job_spec.rb +++ b/spec/jobs/consent_reminders_session_batch_job_spec.rb @@ -10,17 +10,13 @@ let(:programme) { create(:programme) } let(:parents) { create_list(:parent, 2) } - let(:patient_with_reminder_sent) do - create( - :patient, - :consent_request_sent, - consent_reminder_sent_at: Date.current - ) + let!(:patient_with_reminder_sent) do + create(:patient, :consent_request_sent, :consent_reminder_sent, programme:) end - let(:patient_not_sent_reminder) do - create(:patient, :consent_request_sent, parents:) + let!(:patient_not_sent_reminder) do + create(:patient, :consent_request_sent, parents:, programme:) end - let(:patient_with_consent) do + let!(:patient_with_consent) do create(:patient, :consent_given_triage_not_needed, programme:) end @@ -49,4 +45,17 @@ patient_not_sent_reminder.reload.consent_reminder_sent_at }.to(today) end + + it "creates a consent notification record" do + expect { perform_now }.to change(ConsentNotification, :count).by(1) + + consent_notification = + ConsentNotification.find_by( + programme:, + patient: patient_not_sent_reminder, + reminder: true + ) + expect(consent_notification).not_to be_nil + expect(consent_notification.sent_at).to be_today + end end diff --git a/spec/jobs/consent_requests_session_batch_job_spec.rb b/spec/jobs/consent_requests_session_batch_job_spec.rb index 79d3daebe..8a60abc23 100644 --- a/spec/jobs/consent_requests_session_batch_job_spec.rb +++ b/spec/jobs/consent_requests_session_batch_job_spec.rb @@ -1,31 +1,59 @@ # frozen_string_literal: true describe ConsentRequestsSessionBatchJob do - let(:parents_of_patient_without_consent_sent) { create_list(:parent, 2) } + subject(:perform_now) do + travel_to(today) { described_class.perform_now(session) } + end - it "only sends emails to patient's parents to whom they have not been sent yet" do - patient_with_consent_sent = - create(:patient, consent_request_sent_at: Time.zone.today) - patient_not_sent_consent = - create(:patient, parents: parents_of_patient_without_consent_sent) - session = - create( - :session, - patients: [patient_with_consent_sent, patient_not_sent_consent] - ) + let(:today) { Date.new(2024, 1, 1) } - expect { described_class.perform_now(session) }.to send_email( - to: parents_of_patient_without_consent_sent.first.email - ).and send_email(to: parents_of_patient_without_consent_sent.second.email) + let(:programme) { create(:programme) } + let(:parents) { create_list(:parent, 2) } + + let!(:patient_with_consent_sent) do + create(:patient, :consent_request_sent, programme:) + end + let!(:patient_not_sent_consent) { create(:patient, parents:) } + let!(:patient_with_consent) do + create(:patient, :consent_given_triage_not_needed, programme:) + end + + let(:session) do + create( + :session, + patients: [ + patient_with_consent_sent, + patient_not_sent_consent, + patient_with_consent + ], + programmes: [programme] + ) + end + + it "only sends emails to patient's parents to whom they have not been sent yet" do + expect { perform_now }.to send_email( + to: parents.first.email + ).and send_email(to: parents.second.email) expect(ActionMailer::Base.deliveries.count).to eq(2) end it "updates the consent_request_sent_at attribute for patients" do - patient = create(:patient) - session = create(:session, patients: [patient]) + expect { perform_now }.to change { + patient_not_sent_consent.reload.consent_request_sent_at + }.to(today) + end + + it "creates a consent notification record" do + expect { perform_now }.to change(ConsentNotification, :count).by(1) - described_class.perform_now(session) - expect(patient.reload.consent_request_sent_at).to be_today + consent_notification = + ConsentNotification.find_by( + programme:, + patient: patient_not_sent_consent, + reminder: false + ) + expect(consent_notification).not_to be_nil + expect(consent_notification.sent_at).to be_today end end