From 04e9f7be3ef669ff2008f5839930c027c1c52b35 Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Fri, 22 Dec 2017 17:34:58 +0100 Subject: [PATCH] [Fix #1149] Move avis actions to new gestionnaire controller --- app/controllers/backoffice/avis_controller.rb | 48 +------- .../new_gestionnaire/avis_controller.rb | 47 ++++++++ .../avis_mailer/avis_invitation.html.haml | 4 +- .../avis/sign_up.html.haml | 2 +- config/routes.rb | 6 +- .../backoffice/avis_controller_spec.rb | 112 ----------------- .../new_gestionnaire/avis_controller_spec.rb | 114 ++++++++++++++++++ .../new_gestionnaire/gestionnaire_spec.rb | 4 +- 8 files changed, 170 insertions(+), 167 deletions(-) rename app/views/{backoffice => new_gestionnaire}/avis/sign_up.html.haml (77%) diff --git a/app/controllers/backoffice/avis_controller.rb b/app/controllers/backoffice/avis_controller.rb index f524fd4a8..888cd888d 100644 --- a/app/controllers/backoffice/avis_controller.rb +++ b/app/controllers/backoffice/avis_controller.rb @@ -1,7 +1,5 @@ class Backoffice::AvisController < ApplicationController - before_action :authenticate_gestionnaire!, except: [:sign_up, :create_gestionnaire] - before_action :redirect_if_no_sign_up_needed, only: [:sign_up] - before_action :check_avis_exists_and_email_belongs_to_avis, only: [:sign_up, :create_gestionnaire] + before_action :authenticate_gestionnaire! def create avis = Avis.new(create_params.merge(claimant: current_gestionnaire, dossier: dossier, confidentiel: true)) @@ -22,30 +20,6 @@ class Backoffice::AvisController < ApplicationController redirect_to backoffice_dossier_path(avis.dossier_id) end - def sign_up - @email = params[:email] - @dossier = Avis.includes(:dossier).find(params[:id]).dossier - - render layout: 'new_application' - end - - def create_gestionnaire - email = params[:email] - password = params['gestionnaire']['password'] - - gestionnaire = Gestionnaire.new(email: email, password: password) - - if gestionnaire.save - sign_in(gestionnaire, scope: :gestionnaire) - Avis.link_avis_to_gestionnaire(gestionnaire) - avis = Avis.find(params[:id]) - redirect_to url_for(avis_index_path) - else - flash[:alert] = gestionnaire.errors.full_messages - redirect_to url_for(avis_sign_up_path(params[:id], email)) - end - end - private def dossier @@ -63,24 +37,4 @@ class Backoffice::AvisController < ApplicationController def update_params params.require(:avis).permit(:answer) end - - def redirect_if_no_sign_up_needed - avis = Avis.find(params[:id]) - - if current_gestionnaire.present? - # a gestionnaire is authenticated ... lets see if it can view the dossier - - redirect_to backoffice_dossier_url(avis.dossier) - elsif avis.gestionnaire.present? && avis.gestionnaire.email == params[:email] - # the avis gestionnaire has already signed up and it sould sign in - - redirect_to new_gestionnaire_session_url - end - end - - def check_avis_exists_and_email_belongs_to_avis - if !Avis.avis_exists_and_email_belongs_to_avis?(params[:id], params[:email]) - redirect_to url_for(root_path) - end - end end diff --git a/app/controllers/new_gestionnaire/avis_controller.rb b/app/controllers/new_gestionnaire/avis_controller.rb index b0d98b588..9bb562ba5 100644 --- a/app/controllers/new_gestionnaire/avis_controller.rb +++ b/app/controllers/new_gestionnaire/avis_controller.rb @@ -1,5 +1,8 @@ module NewGestionnaire class AvisController < GestionnaireController + before_action :authenticate_gestionnaire!, except: [:sign_up, :create_gestionnaire] + before_action :redirect_if_no_sign_up_needed, only: [:sign_up] + before_action :check_avis_exists_and_email_belongs_to_avis, only: [:sign_up, :create_gestionnaire] before_action :set_avis_and_dossier, only: [:show, :instruction, :messagerie, :create_commentaire] A_DONNER_STATUS = 'a-donner' @@ -56,6 +59,30 @@ module NewGestionnaire redirect_to instruction_avis_path(avis) end + def sign_up + @email = params[:email] + @dossier = Avis.includes(:dossier).find(params[:id]).dossier + + render layout: 'new_application' + end + + def create_gestionnaire + email = params[:email] + password = params['gestionnaire']['password'] + + gestionnaire = Gestionnaire.new(email: email, password: password) + + if gestionnaire.save + sign_in(gestionnaire, scope: :gestionnaire) + Avis.link_avis_to_gestionnaire(gestionnaire) + avis = Avis.find(params[:id]) + redirect_to url_for(avis_index_path) + else + flash[:alert] = gestionnaire.errors.full_messages + redirect_to url_for(sign_up_avis_path(params[:id], email)) + end + end + private def set_avis_and_dossier @@ -63,6 +90,26 @@ module NewGestionnaire @dossier = avis.dossier end + def redirect_if_no_sign_up_needed + avis = Avis.find(params[:id]) + + if current_gestionnaire.present? + # a gestionnaire is authenticated ... lets see if it can view the dossier + + redirect_to avis_url(avis) + elsif avis.gestionnaire.present? && avis.gestionnaire.email == params[:email] + # the avis gestionnaire has already signed up and it sould sign in + + redirect_to new_gestionnaire_session_url + end + end + + def check_avis_exists_and_email_belongs_to_avis + if !Avis.avis_exists_and_email_belongs_to_avis?(params[:id], params[:email]) + redirect_to url_for(root_path) + end + end + def avis current_gestionnaire.avis.includes(dossier: [:avis, :commentaires]).find(params[:id]) end diff --git a/app/views/avis_mailer/avis_invitation.html.haml b/app/views/avis_mailer/avis_invitation.html.haml index 78added0b..046076949 100644 --- a/app/views/avis_mailer/avis_invitation.html.haml +++ b/app/views/avis_mailer/avis_invitation.html.haml @@ -12,10 +12,10 @@ - if @avis.gestionnaire.present? %p - = link_to "Connectez-vous pour donner votre avis", backoffice_dossier_url(@avis.dossier) + = link_to "Connectez-vous pour donner votre avis", dossier_url(@avis.dossier.procedure, @avis.dossier) - else %p - = link_to "Inscrivez-vous pour donner votre avis", avis_sign_up_url(@avis.id, @avis.email) + = link_to "Inscrivez-vous pour donner votre avis", sign_up_avis_url(@avis.id, @avis.email) Bonne journée, %br diff --git a/app/views/backoffice/avis/sign_up.html.haml b/app/views/new_gestionnaire/avis/sign_up.html.haml similarity index 77% rename from app/views/backoffice/avis/sign_up.html.haml rename to app/views/new_gestionnaire/avis/sign_up.html.haml index c14b92040..0b7fa17e8 100644 --- a/app/views/backoffice/avis/sign_up.html.haml +++ b/app/views/new_gestionnaire/avis/sign_up.html.haml @@ -4,7 +4,7 @@ %p.description= @dossier.procedure.libelle %p.dossier Dossier nº #{@dossier.id} .column - = form_for(Gestionnaire.new, url: { controller: "backoffice/avis", action: :create_gestionnaire }, method: :post, html: { class: "form" }) do |f| + = form_for(Gestionnaire.new, url: { controller: "new_gestionnaire/avis", action: :create_gestionnaire }, method: :post, html: { class: "form" }) do |f| %h1 Créez-vous un compte = f.label :email, "Email" diff --git a/config/routes.rb b/config/routes.rb index bd968f6aa..455e99de3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -33,9 +33,6 @@ Rails.application.routes.draw do put '/gestionnaires' => 'gestionnaires/registrations#update', :as => 'gestionnaires_registration' end - get 'avis/:id/sign_up/email/:email' => 'backoffice/avis#sign_up', constraints: { email: /.*/ }, as: 'avis_sign_up' - post 'avis/:id/sign_up/email/:email' => 'backoffice/avis#create_gestionnaire', constraints: { email: /.*/ } - devise_scope :administrateur do get '/administrateurs/sign_in/demo' => redirect("/users/sign_in") end @@ -283,6 +280,9 @@ Rails.application.routes.draw do get 'messagerie' post 'commentaire' => 'avis#create_commentaire' post 'avis' => 'avis#create_avis' + + get 'sign_up/email/:email' => 'avis#sign_up', constraints: { email: /.*/ }, as: 'sign_up' + post 'sign_up/email/:email' => 'avis#create_gestionnaire', constraints: { email: /.*/ } end end get "recherche" => "recherche#index" diff --git a/spec/controllers/backoffice/avis_controller_spec.rb b/spec/controllers/backoffice/avis_controller_spec.rb index 15ce93bc6..3f0c3167e 100644 --- a/spec/controllers/backoffice/avis_controller_spec.rb +++ b/spec/controllers/backoffice/avis_controller_spec.rb @@ -77,116 +77,4 @@ describe Backoffice::AvisController, type: :controller do end end end - - describe '.sign_up' do - let(:invited_email) { 'invited@avis.com' } - let(:dossier) { create(:dossier) } - let!(:avis) { create(:avis, email: invited_email, dossier: dossier) } - let(:invitations_email) { true } - - context 'when the new gestionnaire has never signed up' do - before do - expect(Avis).to receive(:avis_exists_and_email_belongs_to_avis?) - .with(avis.id.to_s, invited_email) - .and_return(invitations_email) - get :sign_up, params: { id: avis.id, email: invited_email } - end - - context 'when the email belongs to the invitation' do - it { expect(subject.status).to eq(200) } - it { expect(assigns(:email)).to eq(invited_email) } - it { expect(assigns(:dossier)).to eq(dossier) } - end - - context 'when the email does not belong to the invitation' do - let(:invitations_email) { false } - - it { is_expected.to redirect_to root_path } - end - end - - context 'when the gestionnaire has already signed up and belongs to the invitation' do - let(:gestionnaire) { create(:gestionnaire, email: invited_email) } - let!(:avis) { create(:avis, dossier: dossier, gestionnaire: gestionnaire) } - - context 'when the gestionnaire is authenticated' do - before do - sign_in gestionnaire - get :sign_up, params: { id: avis.id, email: invited_email } - end - - it { is_expected.to redirect_to backoffice_dossier_url(avis.dossier) } - end - - context 'when the gestionnaire is not authenticated' do - before do - get :sign_up, params: { id: avis.id, email: invited_email } - end - - it { is_expected.to redirect_to new_gestionnaire_session_url } - end - end - - context 'when the gestionnaire has already signed up / is authenticated and does not belong to the invitation' do - let(:gestionnaire) { create(:gestionnaire, email: 'other@gmail.com') } - let!(:avis) { create(:avis, email: invited_email, dossier: dossier) } - - before do - sign_in gestionnaire - get :sign_up, params: { id: avis.id, email: invited_email } - end - - # redirected to dossier but then the gestionnaire gonna be banished ! - it { is_expected.to redirect_to backoffice_dossier_url(avis.dossier) } - end - end - - describe '.create_gestionnaire' do - let(:invited_email) { 'invited@avis.com' } - let(:dossier) { create(:dossier) } - let!(:avis) { create(:avis, email: invited_email, dossier: dossier) } - let(:avis_id) { avis.id } - let(:password) { '12345678' } - let(:created_gestionnaire) { Gestionnaire.find_by(email: invited_email) } - let(:invitations_email) { true } - - before do - allow(Avis).to receive(:link_avis_to_gestionnaire) - expect(Avis).to receive(:avis_exists_and_email_belongs_to_avis?) - .with(avis_id.to_s, invited_email) - .and_return(invitations_email) - - post :create_gestionnaire, params: { id: avis_id, - email: invited_email, - gestionnaire: { - password: password - } } - end - - context 'when the email does not belong to the invitation' do - let(:invitations_email) { false } - - it { is_expected.to redirect_to root_path } - end - - context 'when the email belongs to the invitation' do - context 'when the gestionnaire creation succeeds' do - it { expect(created_gestionnaire).to be_present } - it { expect(created_gestionnaire.valid_password?(password)).to be true } - - it { expect(Avis).to have_received(:link_avis_to_gestionnaire) } - - it { expect(subject.current_gestionnaire).to eq(created_gestionnaire) } - it { is_expected.to redirect_to avis_index_path } - end - - context 'when the gestionnaire creation fails' do - let(:password) { '' } - - it { expect(created_gestionnaire).to be_nil } - it { is_expected.to redirect_to avis_sign_up_path(avis_id, invited_email) } - it { expect(flash.alert).to eq(['Password : Le mot de passe est vide']) } - end - end - end end diff --git a/spec/controllers/new_gestionnaire/avis_controller_spec.rb b/spec/controllers/new_gestionnaire/avis_controller_spec.rb index c968e70e9..5c63450d2 100644 --- a/spec/controllers/new_gestionnaire/avis_controller_spec.rb +++ b/spec/controllers/new_gestionnaire/avis_controller_spec.rb @@ -140,4 +140,118 @@ describe NewGestionnaire::AvisController, type: :controller do end end end + + context 'without a gestionnaire signed in' do + describe '.sign_up' do + let(:invited_email) { 'invited@avis.com' } + let(:dossier) { create(:dossier) } + let!(:avis) { create(:avis, email: invited_email, dossier: dossier) } + let(:invitations_email) { true } + + context 'when the new gestionnaire has never signed up' do + before do + expect(Avis).to receive(:avis_exists_and_email_belongs_to_avis?) + .with(avis.id.to_s, invited_email) + .and_return(invitations_email) + get :sign_up, params: { id: avis.id, email: invited_email } + end + + context 'when the email belongs to the invitation' do + it { expect(subject.status).to eq(200) } + it { expect(assigns(:email)).to eq(invited_email) } + it { expect(assigns(:dossier)).to eq(dossier) } + end + + context 'when the email does not belong to the invitation' do + let(:invitations_email) { false } + + it { is_expected.to redirect_to root_path } + end + end + + context 'when the gestionnaire has already signed up and belongs to the invitation' do + let(:gestionnaire) { create(:gestionnaire, email: invited_email) } + let!(:avis) { create(:avis, dossier: dossier, gestionnaire: gestionnaire) } + + context 'when the gestionnaire is authenticated' do + before do + sign_in gestionnaire + get :sign_up, params: { id: avis.id, email: invited_email } + end + + it { is_expected.to redirect_to avis_url(avis) } + end + + context 'when the gestionnaire is not authenticated' do + before do + get :sign_up, params: { id: avis.id, email: invited_email } + end + + it { is_expected.to redirect_to new_gestionnaire_session_url } + end + end + + context 'when the gestionnaire has already signed up / is authenticated and does not belong to the invitation' do + let(:gestionnaire) { create(:gestionnaire, email: 'other@gmail.com') } + let!(:avis) { create(:avis, email: invited_email, dossier: dossier) } + + before do + sign_in gestionnaire + get :sign_up, params: { id: avis.id, email: invited_email } + end + + # redirected to dossier but then the gestionnaire gonna be banished ! + it { is_expected.to redirect_to avis_url(avis) } + end + end + + describe '.create_gestionnaire' do + let(:invited_email) { 'invited@avis.com' } + let(:dossier) { create(:dossier) } + let!(:avis) { create(:avis, email: invited_email, dossier: dossier) } + let(:avis_id) { avis.id } + let(:password) { '12345678' } + let(:created_gestionnaire) { Gestionnaire.find_by(email: invited_email) } + let(:invitations_email) { true } + + before do + allow(Avis).to receive(:link_avis_to_gestionnaire) + expect(Avis).to receive(:avis_exists_and_email_belongs_to_avis?) + .with(avis_id.to_s, invited_email) + .and_return(invitations_email) + + post :create_gestionnaire, params: { id: avis_id, + email: invited_email, + gestionnaire: { + password: password + } } + end + + context 'when the email does not belong to the invitation' do + let(:invitations_email) { false } + + it { is_expected.to redirect_to root_path } + end + + context 'when the email belongs to the invitation' do + context 'when the gestionnaire creation succeeds' do + it { expect(created_gestionnaire).to be_present } + it { expect(created_gestionnaire.valid_password?(password)).to be true } + + it { expect(Avis).to have_received(:link_avis_to_gestionnaire) } + + it { expect(subject.current_gestionnaire).to eq(created_gestionnaire) } + it { is_expected.to redirect_to avis_index_path } + end + + context 'when the gestionnaire creation fails' do + let(:password) { '' } + + it { expect(created_gestionnaire).to be_nil } + it { is_expected.to redirect_to sign_up_avis_path(avis_id, invited_email) } + it { expect(flash.alert).to eq(['Password : Le mot de passe est vide']) } + end + end + end + end end diff --git a/spec/features/new_gestionnaire/gestionnaire_spec.rb b/spec/features/new_gestionnaire/gestionnaire_spec.rb index af836ab79..d858ca41e 100644 --- a/spec/features/new_gestionnaire/gestionnaire_spec.rb +++ b/spec/features/new_gestionnaire/gestionnaire_spec.rb @@ -71,7 +71,7 @@ feature 'The gestionnaire part' do log_out avis = dossier.avis.first - test_mail(expert_email, avis_sign_up_path(avis, expert_email)) + test_mail(expert_email, sign_up_avis_path(avis, expert_email)) avis_sign_up(avis, expert_email, 'a good password') @@ -168,7 +168,7 @@ feature 'The gestionnaire part' do end def avis_sign_up(avis, email, password) - visit avis_sign_up_path(avis, email) + visit sign_up_avis_path(avis, email) fill_in 'gestionnaire_password', with: 'a good password' click_on 'Créer un compte' expect(page).to have_current_path(avis_index_path)