From 480774440fc2c8cc1c3d40e88fde09b9c4acd8f0 Mon Sep 17 00:00:00 2001 From: Lori Bailey <44073106+elceebee@users.noreply.github.com> Date: Tue, 14 Jan 2025 14:25:54 +0000 Subject: [PATCH] Add email to candidates about login changes --- app/mailers/candidate_mailer.rb | 9 ++++ .../one_login_is_coming.text.erb | 19 +++++++++ ...didate_one_login_is_coming_email_worker.rb | 36 ++++++++++++++++ config/clock.rb | 1 + config/locales/emails/candidate_mailer.yml | 2 + .../previews/candidate_mailer_preview.rb | 5 +++ spec/system/support_interface/docs_spec.rb | 1 + ...e_one_login_is_coming_email_worker_spec.rb | 42 +++++++++++++++++++ ...login_is_coming_email_batch_worker_spec.rb | 12 ++++++ 9 files changed, 127 insertions(+) create mode 100644 app/views/candidate_mailer/one_login_is_coming.text.erb create mode 100644 app/workers/send_candidate_one_login_is_coming_email_worker.rb create mode 100644 spec/workers/send_candidate_one_login_is_coming_email_worker_spec.rb create mode 100644 spec/workers/send_one_login_is_coming_email_batch_worker_spec.rb diff --git a/app/mailers/candidate_mailer.rb b/app/mailers/candidate_mailer.rb index 6c484900bf3..7f1690af86f 100644 --- a/app/mailers/candidate_mailer.rb +++ b/app/mailers/candidate_mailer.rb @@ -517,6 +517,15 @@ def apply_to_multiple_courses_after_30_working_days(application_form) ) end + def one_login_is_coming(application_form) + @application_form = application_form + + email_for_candidate( + @application_form, + subject: I18n.t!('candidate_mailer.one_login_is_coming.subject'), + ) + end + private def email_for_candidate(application_form, args = {}) diff --git a/app/views/candidate_mailer/one_login_is_coming.text.erb b/app/views/candidate_mailer/one_login_is_coming.text.erb new file mode 100644 index 00000000000..12bfad309b5 --- /dev/null +++ b/app/views/candidate_mailer/one_login_is_coming.text.erb @@ -0,0 +1,19 @@ +<% if @application_form.first_name.present? %> + Hello <%= @application_form.first_name %>, +<% end %> + +# How you sign in to Apply for teacher training is changing + +During the week of 27 January, users will begin signing in using GOV.UK One Login. You'll be able to create a GOV.UK One Login if you do not already have one. + +You should use the same email address to create your GOV.UK One Login that you use to sign in to Apply for teacher training. This is so you keep the existing information in your account. + +If you use a different email address you’ll be able to transfer your account details after you sign in. + +# What is GOV.UK One Login? + +GOV.UK One Login allows you to sign in to some government services using the same email address and password. + +In the future you’ll be able to use your GOV.UK One Login to access all services on GOV.UK. + +<%= render 'unsubscribe_from_emails_like_this' %> diff --git a/app/workers/send_candidate_one_login_is_coming_email_worker.rb b/app/workers/send_candidate_one_login_is_coming_email_worker.rb new file mode 100644 index 00000000000..ba52438f3b6 --- /dev/null +++ b/app/workers/send_candidate_one_login_is_coming_email_worker.rb @@ -0,0 +1,36 @@ +class SendCandidateOneLoginIsComingEmailWorker + include Sidekiq::Worker + + def perform + return if should_not_perform? + + BatchDelivery.new(relation:, batch_size: 200).each do |batch_time, application_forms| + SendOneLoginIsComingEmailBatchWorker.perform_at(batch_time, application_forms.pluck(:id)) + end + end + + def relation + ApplicationForm + .current_cycle + .joins(:candidate) + .merge(Candidate.for_marketing_or_nudge_emails) + .has_not_received_email('candidate_mailer', 'one_login_is_coming') + .distinct + end + +private + + def should_not_perform? + FeatureFlag.active?(:one_login_candidate_sign_in) || OneLogin.bypass? + end +end + +class SendOneLoginIsComingEmailBatchWorker + include Sidekiq::Worker + + def perform(application_form_ids) + ApplicationForm.where(id: application_form_ids).find_each do |application_form| + CandidateMailer.one_login_is_coming(application_form).deliver_later + end + end +end diff --git a/config/clock.rb b/config/clock.rb index 948f5ed335e..64a1efe45e4 100644 --- a/config/clock.rb +++ b/config/clock.rb @@ -51,6 +51,7 @@ class Clock every(1.day, 'SendApplyToAnotherCourseWhenInactiveEmailToCandidatesWorker', at: '10:00') { SendApplyToAnotherCourseWhenInactiveEmailToCandidatesWorker.perform_async } every(1.day, 'SendApplyToMultipleCoursesWhenInactiveEmailToCandidatesWorker', at: '10:00') { SendApplyToMultipleCoursesWhenInactiveEmailToCandidatesWorker.perform_async } every(1.day, 'DfE::Analytics::EntityTableCheckJob', at: '00:30') { DfE::Analytics::EntityTableCheckJob.perform_later } + every(1.day, 'SendCandidateOneLoginIsComingEmailWorker', at: '00:31') { SendCandidateOneLoginIsComingEmailWorker.perform_async } # End of cycle application choice status jobs # Changes unsubmitted application choices to 'application_not_sent' diff --git a/config/locales/emails/candidate_mailer.yml b/config/locales/emails/candidate_mailer.yml index 0fda4d93f53..b8fa4cc01bd 100644 --- a/config/locales/emails/candidate_mailer.yml +++ b/config/locales/emails/candidate_mailer.yml @@ -95,3 +95,5 @@ en: subject: Get help with your personal statement apply_to_course_after_inactivity: subject: Increase your chances of receiving an offer for teacher training + one_login_is_coming: + subject: How you sign into Apply for teacher training is changing diff --git a/spec/mailers/previews/candidate_mailer_preview.rb b/spec/mailers/previews/candidate_mailer_preview.rb index 4d857098d18..be8c1bebe42 100644 --- a/spec/mailers/previews/candidate_mailer_preview.rb +++ b/spec/mailers/previews/candidate_mailer_preview.rb @@ -549,6 +549,11 @@ def apply_to_multiple_courses_after_30_working_days CandidateMailer.apply_to_multiple_courses_after_30_working_days(application_form) end + def one_login_is_coming + application_form = FactoryBot.build(:application_form, first_name: 'Bob') + CandidateMailer.one_login_is_coming(application_form) + end + private def candidate diff --git a/spec/system/support_interface/docs_spec.rb b/spec/system/support_interface/docs_spec.rb index b79de1e0a67..11cb221c627 100644 --- a/spec/system/support_interface/docs_spec.rb +++ b/spec/system/support_interface/docs_spec.rb @@ -42,6 +42,7 @@ def and_i_see_the_provider_flow_documentation def and_it_contains_documentation_for_all_emails emails_outside_of_states = %w[ provider_mailer-fallback_sign_in_email + candidate_mailer-one_login_is_coming candidate_mailer-eoc_first_deadline_reminder candidate_mailer-eoc_second_deadline_reminder candidate_mailer-application_deadline_has_passed diff --git a/spec/workers/send_candidate_one_login_is_coming_email_worker_spec.rb b/spec/workers/send_candidate_one_login_is_coming_email_worker_spec.rb new file mode 100644 index 00000000000..4e33927ad28 --- /dev/null +++ b/spec/workers/send_candidate_one_login_is_coming_email_worker_spec.rb @@ -0,0 +1,42 @@ +require 'rails_helper' + +RSpec.describe SendCandidateOneLoginIsComingEmailWorker do + before { allow(OneLogin).to receive(:bypass?).and_return(false) } + + describe '#perform' do + context 'feature flag is activated' do + before { FeatureFlag.activate('one_login_candidate_sign_in') } + + it 'does not enqueue the batch worker' do + create(:application_form) + + allow(SendOneLoginIsComingEmailBatchWorker).to receive(:perform_at) + described_class.new.perform + expect(SendOneLoginIsComingEmailBatchWorker).not_to have_received(:perform_at) + end + end + + context 'feature flag is deactivated' do + before { FeatureFlag.deactivate('one_login_candidate_sign_in') } + + it 'enqueues the batch worker with expected application forms' do + # Last year's application + create(:application_form, recruitment_cycle_year: RecruitmentCycle.previous_year) + # Unsubscribed candidate + create(:application_form, candidate: build(:candidate, unsubscribed_from_emails: true)) + # Candidate with submission blocked + create(:application_form, candidate: build(:candidate, submission_blocked: true)) + # Candidate with locked account + create(:application_form, candidate: build(:candidate, account_locked: true)) + # Candidate has already been sent the email + create(:email, application_form: build(:application_form), mailer: 'candidate_mailer', mail_template: 'one_login_is_coming') + + should_receive = create(:application_form) + + allow(SendOneLoginIsComingEmailBatchWorker).to receive(:perform_at) + described_class.new.perform + expect(SendOneLoginIsComingEmailBatchWorker).to have_received(:perform_at).with(kind_of(Time), [should_receive.id]) + end + end + end +end diff --git a/spec/workers/send_one_login_is_coming_email_batch_worker_spec.rb b/spec/workers/send_one_login_is_coming_email_batch_worker_spec.rb new file mode 100644 index 00000000000..b1a5fad66af --- /dev/null +++ b/spec/workers/send_one_login_is_coming_email_batch_worker_spec.rb @@ -0,0 +1,12 @@ +require 'rails_helper' + +RSpec.describe SendOneLoginIsComingEmailBatchWorker do + describe '#perform' do + it 'enqueues candidate emails' do + application_forms = create_list(:application_form, 2) + + expect { described_class.new.perform(application_forms.pluck(:id)) } + .to have_enqueued_mail(CandidateMailer, :one_login_is_coming).twice + end + end +end