[fix #1709] A user can change its email
This commit is contained in:
parent
0f9fdf3f75
commit
d36f6ebcd7
7 changed files with 125 additions and 7 deletions
|
@ -8,5 +8,24 @@ module Users
|
|||
flash.now.notice = 'Votre jeton a été regénéré.'
|
||||
render :show
|
||||
end
|
||||
|
||||
def update_email
|
||||
if @current_user.update(update_email_params)
|
||||
flash.notice = t('devise.registrations.update_needs_confirmation')
|
||||
# to avoid leaking who has signed in
|
||||
elsif @current_user.errors&.details&.dig(:email)&.any? { |e| e[:error] == :taken }
|
||||
flash.notice = t('devise.registrations.update_needs_confirmation')
|
||||
else
|
||||
flash.alert = @current_user.errors.full_messages
|
||||
end
|
||||
|
||||
redirect_to profil_path
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def update_email_params
|
||||
params.require(:user).permit(:email)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,10 +1,22 @@
|
|||
- content_for(:title, 'Activez votre compte')
|
||||
-# ugly hack to know if the mail is creation confirmation or a password change confirmation
|
||||
- if @user.unconfirmed_email.nil?
|
||||
- content_for(:title, 'Activez votre compte')
|
||||
|
||||
%p
|
||||
%p
|
||||
Bonjour,
|
||||
|
||||
%p
|
||||
%p
|
||||
Pour activer votre compte sur demarches-simplifiees.fr, veuillez cliquer sur le lien suivant :
|
||||
= link_to(confirmation_url(@user, confirmation_token: @token), confirmation_url(@user, confirmation_token: @token))
|
||||
|
||||
- else
|
||||
- content_for(:title, "Changement d'adresse email")
|
||||
|
||||
%p
|
||||
Bonjour,
|
||||
|
||||
%p
|
||||
Pour confirmer votre changement d'adresse email, veuillez cliquer sur le lien suivant :
|
||||
= link_to(confirmation_url(@user, confirmation_token: @token), confirmation_url(@user, confirmation_token: @token))
|
||||
|
||||
= render partial: "layouts/mailers/signature"
|
||||
|
|
|
@ -5,6 +5,19 @@
|
|||
#profil-page.container
|
||||
%h1 Profil
|
||||
|
||||
.card
|
||||
.card-title Coordonnées
|
||||
%p Votre email est actuellement #{current_user.email}
|
||||
- if current_user.unconfirmed_email.present?
|
||||
%p
|
||||
Un email a été envoyé à #{current_user.unconfirmed_email}.
|
||||
%br
|
||||
Merci de vérifier vos emails et de cliquer sur le lien d'activation pour finaliser la validation de votre nouvelle adresse.
|
||||
|
||||
= form_for @current_user, url: update_email_path, method: :patch, html: { class: 'form' } do |f|
|
||||
= f.email_field :email, value: nil, placeholder: 'Nouvelle adresse email', required: true
|
||||
= f.submit "Changer mon adresse", class: 'button primary'
|
||||
|
||||
- if current_administrateur.present?
|
||||
.card
|
||||
.card-title Jeton d'identification de l'API (token)
|
||||
|
|
|
@ -42,7 +42,7 @@ fr:
|
|||
signed_up_but_inactive: "Vous êtes bien enregistré. Vous ne pouvez cependant pas vous connecter car votre compte n'est pas encore activé."
|
||||
signed_up_but_locked: "Vous êtes bien enregistré. Vous ne pouvez cependant pas vous connecter car votre compte est verrouillé."
|
||||
signed_up_but_unconfirmed: "Nous vous avons envoyé un email contenant un lien d'activation. Ouvrez ce lien pour activer votre compte."
|
||||
update_needs_confirmation: "Votre compte a bien été mis à jour mais nous devons vérifier votre nouvelle adresse email. Merci de vérifier vos email et de cliquer sur le lien d'activation pour finaliser la validation de votre nouvelle adresse."
|
||||
update_needs_confirmation: "Votre compte a bien été mis à jour mais nous devons vérifier votre nouvelle adresse email. Merci de vérifier vos emails et de cliquer sur le lien d'activation pour finaliser la validation de votre nouvelle adresse."
|
||||
updated: "Votre compte a été modifié avec succès."
|
||||
sessions:
|
||||
signed_in: "Connecté."
|
||||
|
|
|
@ -296,6 +296,7 @@ Rails.application.routes.draw do
|
|||
post 'renew-api-token' => 'profil#renew_api_token'
|
||||
# allow refresh 'renew api token' page
|
||||
get 'renew-api-token' => redirect('/profil')
|
||||
patch 'update_email' => 'profil#update_email'
|
||||
end
|
||||
|
||||
#
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Users::ProfilController, type: :controller do
|
||||
let(:user) { create(:user) }
|
||||
|
||||
before { sign_in(user) }
|
||||
|
||||
describe 'POST #renew_api_token' do
|
||||
let(:administrateur) { create(:administrateur) }
|
||||
|
||||
|
@ -16,4 +20,41 @@ describe Users::ProfilController, type: :controller do
|
|||
it { expect(response.status).to render_template(:show) }
|
||||
it { expect(flash.notice).to eq('Votre jeton a été regénéré.') }
|
||||
end
|
||||
|
||||
describe 'PATCH #update_email' do
|
||||
context 'when everything is fine' do
|
||||
before do
|
||||
patch :update_email, params: { user: { email: 'loulou@lou.com' } }
|
||||
user.reload
|
||||
end
|
||||
|
||||
it { expect(user.unconfirmed_email).to eq('loulou@lou.com') }
|
||||
it { expect(response).to redirect_to(profil_path) }
|
||||
it { expect(flash.notice).to eq(I18n.t('devise.registrations.update_needs_confirmation')) }
|
||||
end
|
||||
|
||||
context 'when the mail is already taken' do
|
||||
let!(:user2) { create(:user) }
|
||||
|
||||
before do
|
||||
patch :update_email, params: { user: { email: user2.email } }
|
||||
user.reload
|
||||
end
|
||||
|
||||
it { expect(response).to redirect_to(profil_path) }
|
||||
it { expect(flash.notice).to eq(I18n.t('devise.registrations.update_needs_confirmation')) }
|
||||
end
|
||||
|
||||
context 'when the mail is incorrect' do
|
||||
let!(:user2) { create(:user) }
|
||||
|
||||
before do
|
||||
patch :update_email, params: { user: { email: 'incorrect' } }
|
||||
user.reload
|
||||
end
|
||||
|
||||
it { expect(response).to redirect_to(profil_path) }
|
||||
it { expect(flash.alert).to eq(['Email invalide']) }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
32
spec/features/users/change_email_spec.rb
Normal file
32
spec/features/users/change_email_spec.rb
Normal file
|
@ -0,0 +1,32 @@
|
|||
require 'spec_helper'
|
||||
|
||||
feature 'Changing an email' do
|
||||
let(:old_email) { 'old@email.com' }
|
||||
let(:user) { create(:user, email: old_email) }
|
||||
|
||||
before do
|
||||
login_as user, scope: :user
|
||||
end
|
||||
|
||||
scenario 'is easy' do
|
||||
new_email = 'new@email.com'
|
||||
|
||||
visit '/profil'
|
||||
|
||||
fill_in :user_email, with: new_email
|
||||
|
||||
perform_enqueued_jobs do
|
||||
click_button 'Changer mon adresse'
|
||||
end
|
||||
|
||||
user.reload
|
||||
expect(user.email).to eq(old_email)
|
||||
expect(user.unconfirmed_email).to eq(new_email)
|
||||
|
||||
click_confirmation_link_for(new_email)
|
||||
|
||||
user.reload
|
||||
expect(user.email).to eq(new_email)
|
||||
expect(user.unconfirmed_email).to be_nil
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue