Browse Source

Use rake task to send onboarding emails (#566)

* Use rake task to send onboarding emails

* Wrap host lookup so it's easily stubbable

* Rake task can be called outside the rails environment so need to pass host in

* Not part of the usual app flow so contain to rake task

* Including routes helper in a rake task is a rabbit hole

* Use ENV var rather than param for host
pull/619/head
baarkerlounger 3 years ago committed by baarkerlounger
parent
commit
1b80d0f88f
  1. 2
      .env.example
  2. 22
      lib/tasks/onboarding_emails.rake
  3. 31
      spec/features/reset_password.html.erb
  4. 41
      spec/lib/tasks/onboarding_emails_spec.rb

2
.env.example

@ -3,3 +3,5 @@ DB_PASSWORD=postgres-password
GOVUK_NOTIFY_API_KEY=<notify-key-here-if-testing-emails-or-admin-users> GOVUK_NOTIFY_API_KEY=<notify-key-here-if-testing-emails-or-admin-users>
OTP_SECRET_ENCRYPTION_KEY="<Generate this using bundle exec rake secret>" OTP_SECRET_ENCRYPTION_KEY="<Generate this using bundle exec rake secret>"
APP_HOST="http://localhost:3000"

22
lib/tasks/onboarding_emails.rake

@ -0,0 +1,22 @@
namespace :onboarding_emails do
desc "Send onboarding emails to private beta users"
task :send, %i[organisation_id] => :environment do |_task, args|
organisation_id = args[:organisation_id]
host = ENV["APP_HOST"]
raise "Organisation id must be provided" unless organisation_id
raise "Host is not set" unless host
organisation = Organisation.find(organisation_id)
raise "Organisation #{organisation_id} does not exist" unless organisation
organisation.users.each do |user|
next unless URI::MailTo::EMAIL_REGEXP.match?(user.email)
onboarding_template_id = "b48bc2cd-5887-4611-8296-d0ab3ed0e7fd".freeze
token = user.send(:set_reset_password_token)
url = "#{host}/account/password/edit?reset_password_token=#{token}"
personalisation = { name: user.name || user.email, link: url }
DeviseNotifyMailer.new.send_email(user.email, onboarding_template_id, personalisation)
end
end
end

31
spec/features/reset_password.html.erb

@ -1,31 +0,0 @@
<% content_for :title, "Reset your password" %>
<% content_for :before_content do %>
<%= govuk_back_link(
text: "Back",
href: :back,
) %>
<% end %>
<%= form_for(@user, as: :user, url: password_path(User), html: { method: :put }) do |f| %>
<%= f.hidden_field :reset_password_token %>
<div class="govuk-grid-row">
<div class="govuk-grid-column-two-thirds">
<%= f.govuk_error_summary %>
<h1 class="govuk-heading-l">
<%= content_for(:title) %>
</h1>
<%= f.govuk_password_field :password,
label: { text: "New password" },
hint: @minimum_password_length ? { text: "Your password must be at least #{@minimum_password_length} characters and hard to guess." } : nil,
autocomplete: "new-password" %>
<%= f.govuk_password_field :password_confirmation,
label: { text: "Confirm new password" } %>
<%= f.govuk_submit "Update" %>
</div>
</div>
<% end %>

41
spec/lib/tasks/onboarding_emails_spec.rb

@ -0,0 +1,41 @@
require "rails_helper"
require "rake"
describe "rake onboarding_emails:send", type: task do
subject(:task) { Rake::Task["onboarding_emails:send"] }
context "when onboarding a new organisation to private beta" do
let!(:user) { FactoryBot.create(:user) }
let(:notify_client) { instance_double(Notifications::Client) }
let(:devise_notify_mailer) { DeviseNotifyMailer.new }
let(:reset_password_token) { "MCDH5y6Km-U7CFPgAMVS" }
let(:host) { "http://localhost:3000" }
before do
Rake.application.rake_require("tasks/onboarding_emails")
Rake::Task.define_task(:environment)
task.reenable
allow(DeviseNotifyMailer).to receive(:new).and_return(devise_notify_mailer)
allow(devise_notify_mailer).to receive(:notify_client).and_return(notify_client)
allow(notify_client).to receive(:send_email).and_return(true)
allow(Devise.token_generator).to receive(:generate).and_return(reset_password_token)
allow(ENV).to receive(:[])
allow(ENV).to receive(:[]).with("APP_HOST").and_return(host)
end
it "can send the onboarding emails" do
expect(notify_client).to receive(:send_email).with(
{
email_address: user.email,
template_id: "b48bc2cd-5887-4611-8296-d0ab3ed0e7fd",
personalisation: {
name: user.name,
link: "#{host}/account/password/edit?reset_password_token=#{reset_password_token}",
},
},
)
task.invoke(user.organisation.id)
end
end
end
Loading…
Cancel
Save