invite: move invites link to the after_confirmation
callback
Refactored from 6a69d958da
The `after_confirmation_path_for` isn't really made to be a callbback.
For instance, it is not executed during tests.
Moving the invitations linking to a proper documented callback allows
the linking to work in a testing environment, when invoking `user.confirm`.
This commit is contained in:
parent
cceb88539d
commit
082ef92a99
5 changed files with 31 additions and 63 deletions
|
@ -1,38 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
class Users::ConfirmationsController < Devise::ConfirmationsController
|
|
||||||
# GET /resource/confirmation/new
|
|
||||||
# def new
|
|
||||||
# super
|
|
||||||
# end
|
|
||||||
|
|
||||||
# POST /resource/confirmation
|
|
||||||
# def create
|
|
||||||
# super
|
|
||||||
# end
|
|
||||||
|
|
||||||
# GET /resource/confirmation?confirmation_token=abcdef
|
|
||||||
# def show
|
|
||||||
# super
|
|
||||||
# end
|
|
||||||
|
|
||||||
protected
|
|
||||||
|
|
||||||
# The path used after resending confirmation instructions.
|
|
||||||
# def after_resending_confirmation_instructions_path_for(resource_name)
|
|
||||||
# super(resource_name)
|
|
||||||
# end
|
|
||||||
|
|
||||||
# The path used after confirmation.
|
|
||||||
def after_confirmation_path_for(resource_name, resource)
|
|
||||||
check_invite!(resource)
|
|
||||||
|
|
||||||
super(resource_name, resource)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def check_invite!(user)
|
|
||||||
Invite.where(email: user.email).update_all user_id: user.id
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -24,6 +24,11 @@ class User < ApplicationRecord
|
||||||
|
|
||||||
before_validation -> { sanitize_email(:email) }
|
before_validation -> { sanitize_email(:email) }
|
||||||
|
|
||||||
|
# Callback provided by Devise
|
||||||
|
def after_confirmation
|
||||||
|
link_invites!
|
||||||
|
end
|
||||||
|
|
||||||
def self.find_for_france_connect(email, siret)
|
def self.find_for_france_connect(email, siret)
|
||||||
user = User.find_by(email: email)
|
user = User.find_by(email: email)
|
||||||
if user.nil?
|
if user.nil?
|
||||||
|
@ -49,4 +54,10 @@ class User < ApplicationRecord
|
||||||
def owns_or_invite?(dossier)
|
def owns_or_invite?(dossier)
|
||||||
owns?(dossier) || invite?(dossier.id)
|
owns?(dossier) || invite?(dossier.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def link_invites!
|
||||||
|
Invite.where(email: email).update_all(user_id: id)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -70,8 +70,7 @@ Rails.application.routes.draw do
|
||||||
devise_for :users, controllers: {
|
devise_for :users, controllers: {
|
||||||
sessions: 'users/sessions',
|
sessions: 'users/sessions',
|
||||||
registrations: 'users/registrations',
|
registrations: 'users/registrations',
|
||||||
passwords: 'users/passwords',
|
passwords: 'users/passwords'
|
||||||
confirmations: 'users/confirmations'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
devise_scope :user do
|
devise_scope :user do
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
describe Users::ConfirmationsController, type: :controller do
|
|
||||||
let(:email) { 'mail@beta.gouv.fr' }
|
|
||||||
let(:user) do
|
|
||||||
create(:user,
|
|
||||||
email: email,
|
|
||||||
password: 'a good password',
|
|
||||||
confirmation_token: '123',
|
|
||||||
confirmed_at: nil)
|
|
||||||
end
|
|
||||||
|
|
||||||
before { @request.env["devise.mapping"] = Devise.mappings[:user] }
|
|
||||||
|
|
||||||
describe '#check_invite!' do
|
|
||||||
let!(:invite) { create(:invite, email: email) }
|
|
||||||
let!(:invite2) { create(:invite, email: email) }
|
|
||||||
|
|
||||||
before { get :show, params: { confirmation_token: user.confirmation_token } }
|
|
||||||
|
|
||||||
it 'the new user is connect at his two invite' do
|
|
||||||
expect(User.last.invites.size).to eq(2)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,6 +1,25 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe User, type: :model do
|
describe User, type: :model do
|
||||||
|
describe '#after_confirmation' do
|
||||||
|
let(:email) { 'mail@beta.gouv.fr' }
|
||||||
|
let!(:invite) { create(:invite, email: email) }
|
||||||
|
let!(:invite2) { create(:invite, email: email) }
|
||||||
|
let(:user) do
|
||||||
|
create(:user,
|
||||||
|
email: email,
|
||||||
|
password: 'a good password',
|
||||||
|
confirmation_token: '123',
|
||||||
|
confirmed_at: nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'when confirming a user, it links the pending invitations to this user' do
|
||||||
|
expect(user.invites.size).to eq(0)
|
||||||
|
user.confirm
|
||||||
|
expect(user.reload.invites.size).to eq(2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '#find_for_france_connect' do
|
describe '#find_for_france_connect' do
|
||||||
let(:siret) { '00000000000000' }
|
let(:siret) { '00000000000000' }
|
||||||
context 'when user exist' do
|
context 'when user exist' do
|
||||||
|
|
Loading…
Reference in a new issue