Merge pull request #4744 from betagouv/add-sign-in-link-to-account-already-exists-email

Usager : dans l'email « Le compte existe déjà », ajoute un lien vers la démarche
This commit is contained in:
Paul Chavard 2020-02-12 15:09:09 +01:00 committed by GitHub
commit f2b7200edc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 87 additions and 22 deletions

View file

@ -25,7 +25,7 @@ class Users::RegistrationsController < Devise::RegistrationsController
existing_user = User.find_by(email: params[:user][:email]) existing_user = User.find_by(email: params[:user][:email])
if existing_user.present? if existing_user.present?
if existing_user.confirmed? if existing_user.confirmed?
UserMailer.new_account_warning(existing_user).deliver_later UserMailer.new_account_warning(existing_user, @procedure).deliver_later
else else
existing_user.resend_confirmation_instructions existing_user.resend_confirmation_instructions
end end

View file

@ -1,12 +1,15 @@
# Preview all emails at http://localhost:3000/rails/mailers/user_mailer # Preview all emails at http://localhost:3000/rails/mailers/user_mailer
class UserMailer < ApplicationMailer class UserMailer < ApplicationMailer
helper MailerHelper
layout 'mailers/layout' layout 'mailers/layout'
def new_account_warning(user) def new_account_warning(user, procedure = nil)
@user = user @user = user
@subject = "Demande de création de compte" @subject = "Demande de création de compte"
@procedure = procedure
mail(to: user.email, subject: @subject) mail(to: user.email, subject: @subject, procedure: @procedure)
end end
def account_already_taken(user, requested_email) def account_already_taken(user, requested_email)

View file

@ -7,9 +7,25 @@
Une demande de création de compte a été réalisée sur le site demarches-simplifiees.fr pour l'email #{@user.email}. Une demande de création de compte a été réalisée sur le site demarches-simplifiees.fr pour l'email #{@user.email}.
%p %p
Votre compte existe déjà. Si vous souhaitez changer votre mot de passe, veuillez suivre les instructions à l'adresse suivante %strong Votre compte existe déjà.
#{link_to(new_password_url(@user), new_password_url(@user))}.
- if @procedure
%p
Si vous souhaitez remplir la démarche
= surround '« ', ' »,' do
%i= @procedure.libelle
cliquez sur le bouton ci-dessous.
= round_button("Commencer la démarche « #{@procedure.libelle.truncate(60)} »", commencer_sign_in_url(path: @procedure.path), :primary)
= vertical_margin(16)
= round_button('Jai oublié mon mot de passe', new_password_url(@user), :secondary)
- else
%p
Vous n'avez rien à faire. Si vous avez oublié votre mot de passe, cliquez sur le bouton ci-dessous.
= round_button('Jai oublié mon mot de passe', new_password_url(@user), :secondary)
= vertical_margin(6)
%p %p
Si vous n'êtes pas à l'origine de cette demande, vous pouvez ignorer ce mail. Si vous n'êtes pas à l'origine de cette demande, vous pouvez ignorer ce mail.

View file

@ -91,27 +91,52 @@ feature 'Signing up:' do
end end
end end
context 'when a user is not confirmed yet' do context 'when the user is not confirmed yet' do
before do before do
visit commencer_path(path: procedure.path) create(:user, :unconfirmed, email: user_email, password: user_password)
click_on 'Créer un compte demarches-simplifiees.fr'
sign_up_with user_email, user_password
end end
# Ideally, when signing-in with an unconfirmed account, scenario 'the email confirmation page is displayed' do
# the user would be redirected to the "resend email confirmation" page. visit commencer_path(path: procedure.path)
# click_on 'Créer un compte'
# However the check for unconfirmed accounts is made by Warden every time a page is loaded 
# and much earlier than SessionsController#create.
#
# For now only test the default behavior (an error message is displayed).
scenario 'they get an error message' do
visit root_path
click_on 'Connexion'
sign_in_with user_email, user_password sign_up_with user_email, user_password
expect(page).to have_content 'Vous devez confirmer votre adresse email pour continuer'
# The same page than for initial sign-ups is displayed, to avoid leaking informations
# about the accound existence.
expect(page).to have_content "nous avons besoin de vérifier votre adresse #{user_email}"
# The confirmation email is sent again
confirmation_email = open_email(user_email)
expect(confirmation_email.body).to have_text('Pour activer votre compte')
end
end
context 'when the user already has a confirmed account' do
before do
create(:user, email: user_email, password: user_password)
end
scenario 'they get a warning email, containing a link to the procedure' do
visit commencer_path(path: procedure.path)
click_on 'Créer un compte'
sign_up_with user_email, user_password
# The same page than for initial sign-ups is displayed, to avoid leaking informations
# about the accound existence.
expect(page).to have_content "nous avons besoin de vérifier votre adresse #{user_email}"
# A warning email is sent
warning_email = open_email(user_email)
expect(warning_email.body).to have_text('Votre compte existe déjà')
# When clicking the main button, the user has a link to directly sign-in
# for the procedure they were initially starting
click_procedure_sign_in_link_for user_email
expect(page).to have_current_path new_user_session_path
expect(page).to have_procedure_description(procedure)
end end
end end
end end

View file

@ -3,6 +3,11 @@ class UserMailerPreview < ActionMailer::Preview
UserMailer.new_account_warning(user) UserMailer.new_account_warning(user)
end end
def new_account_warning___with_procedure
procedure = Procedure.new(libelle: 'Dotation dÉquipement des Territoires Ruraux - Exercice 2019', path: 'dotation-etr')
UserMailer.new_account_warning(user, procedure)
end
def account_already_taken def account_already_taken
UserMailer.account_already_taken(user, 'dircab@territoires.gouv.fr') UserMailer.account_already_taken(user, 'dircab@territoires.gouv.fr')
end end

View file

@ -8,6 +8,15 @@ RSpec.describe UserMailer, type: :mailer do
it { expect(subject.to).to eq([user.email]) } it { expect(subject.to).to eq([user.email]) }
it { expect(subject.body).to include(user.email) } it { expect(subject.body).to include(user.email) }
it { expect(subject.body).to have_link('Jai oublié mon mot de passe') }
context 'when a procedure is provided' do
let(:procedure) { build(:procedure) }
subject { described_class.new_account_warning(user, procedure) }
it { expect(subject.body).to have_link("Commencer la démarche « #{procedure.libelle} »", href: commencer_sign_in_url(path: procedure.path)) }
end
end end
describe '.account_already_taken' do describe '.account_already_taken' do

View file

@ -55,6 +55,13 @@ module FeatureHelpers
visit "/users/confirmation?#{token_params}" visit "/users/confirmation?#{token_params}"
end end
def click_procedure_sign_in_link_for(email)
confirmation_email = open_email(email)
procedure_sign_in_link = confirmation_email.body.match(/href="([^"]*\/commencer\/[^"]*)"/)[1]
visit procedure_sign_in_link
end
def click_reset_password_link_for(email) def click_reset_password_link_for(email)
reset_password_email = open_email(email) reset_password_email = open_email(email)
token_params = reset_password_email.body.match(/reset_password_token=[^"]+/) token_params = reset_password_email.body.match(/reset_password_token=[^"]+/)