feat(procedure_admins): allow self remove from procedure
This commit is contained in:
parent
7e7363c8c3
commit
30b53ec927
2 changed files with 42 additions and 26 deletions
|
@ -29,20 +29,24 @@ module Administrateurs
|
|||
end
|
||||
|
||||
def destroy
|
||||
administrateur = @procedure.administrateurs.find(params[:id])
|
||||
admin_to_delete = @procedure.administrateurs.find(params[:id])
|
||||
|
||||
# Prevent self-removal (Also enforced in the UI)
|
||||
if administrateur == current_administrateur
|
||||
flash.alert = "Vous ne pouvez pas vous retirer vous-même d’une démarche."
|
||||
return
|
||||
if (@procedure.administrateurs - [admin_to_delete]).filter(&:active?).empty?
|
||||
flash.alert = "Il doit rester au moins un administrateur actif."
|
||||
else
|
||||
begin
|
||||
# Actually remove the admin
|
||||
@procedure.administrateurs.delete(admin_to_delete)
|
||||
@administrateur = admin_to_delete
|
||||
flash.notice = "L’administrateur \« #{admin_to_delete.email} » a été retiré de la démarche « #{@procedure.libelle} »."
|
||||
|
||||
if current_administrateur == admin_to_delete
|
||||
redirect_to admin_procedures_path
|
||||
end
|
||||
rescue ActiveRecord::ActiveRecordError => e
|
||||
flash.alert = e.message
|
||||
end
|
||||
end
|
||||
|
||||
# Actually remove the admin
|
||||
@procedure.administrateurs.delete(administrateur)
|
||||
@administrateur = administrateur
|
||||
flash.notice = "L’administrateur \« #{administrateur.email} » a été retiré de la démarche « #{@procedure.libelle} »."
|
||||
rescue ActiveRecord::ActiveRecordError => e
|
||||
flash.alert = e.message
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
describe Administrateurs::ProcedureAdministrateursController, type: :controller do
|
||||
let(:signed_in_admin) { create(:administrateur) }
|
||||
let(:other_admin) { create(:administrateur) }
|
||||
let(:signed_in_admin) { create(:administrateur, active: true) }
|
||||
let(:other_admin) { create(:administrateur, active: true) }
|
||||
let!(:administrateurs_procedure) { create(:administrateurs_procedure, administrateur: signed_in_admin, procedure: procedure, manager: manager) }
|
||||
let!(:procedure) { create(:procedure, administrateurs: [other_admin]) }
|
||||
render_views
|
||||
|
@ -19,29 +19,41 @@ describe Administrateurs::ProcedureAdministrateursController, type: :controller
|
|||
|
||||
describe '#destroy' do
|
||||
let(:manager) { false }
|
||||
subject do
|
||||
|
||||
def destroy_admin(admin_to_remove)
|
||||
delete :destroy, params: { procedure_id: procedure.id, id: admin_to_remove.id }, format: :turbo_stream
|
||||
end
|
||||
|
||||
context 'when removing another admin' do
|
||||
let(:admin_to_remove) { other_admin }
|
||||
before do
|
||||
destroy_admin(other_admin)
|
||||
end
|
||||
|
||||
it 'removes the admin from the procedure' do
|
||||
subject
|
||||
expect(response).to have_http_status(:ok)
|
||||
expect(subject.body).to include('alert-success')
|
||||
expect(admin_to_remove.procedures.reload).not_to include(procedure)
|
||||
expect(response.body).to include('alert-success')
|
||||
expect(other_admin.procedures.reload).not_to include(procedure)
|
||||
end
|
||||
|
||||
context 'then removing oneself' do
|
||||
before do
|
||||
destroy_admin(signed_in_admin)
|
||||
end
|
||||
|
||||
it 'removes the admin from the procedure' do
|
||||
expect(response.body).to include('alert-danger')
|
||||
expect(signed_in_admin.procedures.reload).to include(procedure)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when removing oneself from a procedure' do
|
||||
let(:admin_to_remove) { signed_in_admin }
|
||||
before do
|
||||
destroy_admin(signed_in_admin)
|
||||
end
|
||||
|
||||
it 'denies the right for an admin to remove itself' do
|
||||
subject
|
||||
expect(response).to have_http_status(:ok)
|
||||
expect(subject.body).to include('alert-danger')
|
||||
expect(admin_to_remove.procedures.reload).to include(procedure)
|
||||
it 'removes the admin from the procedure' do
|
||||
expect(response).to redirect_to admin_procedures_path
|
||||
expect(signed_in_admin.procedures.reload).not_to include(procedure)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Reference in a new issue