+<% end %>
\ No newline at end of file
diff --git a/app/views/manager/gestionnaires/_index_header.erb b/app/views/manager/gestionnaires/_index_header.erb
new file mode 100644
index 000000000..a14a3ba93
--- /dev/null
+++ b/app/views/manager/gestionnaires/_index_header.erb
@@ -0,0 +1,27 @@
+<% content_for(:title) do %>
+ <%= display_resource_name(page.resource_name) %>
+<% end %>
+
+
+
+
\ No newline at end of file
diff --git a/app/views/manager/gestionnaires/show.html.erb b/app/views/manager/gestionnaires/show.html.erb
new file mode 100644
index 000000000..5fabd146b
--- /dev/null
+++ b/app/views/manager/gestionnaires/show.html.erb
@@ -0,0 +1,58 @@
+<%#
+# Show
+
+This view is the template for the show page.
+It renders the attributes of a resource,
+as well as a link to its edit page.
+
+## Local variables:
+
+- `page`:
+ An instance of [Administrate::Page::Show][1].
+ Contains methods for accessing the resource to be displayed on the page,
+ as well as helpers for describing how each attribute of the resource
+ should be displayed.
+
+[1]: http://www.rubydoc.info/gems/administrate/Administrate/Page/Show
+%>
+
+<% content_for(:title) { t("administrate.actions.show_resource", name: page.page_title) } %>
+
+
+
+
+<% if attribute.more_than_limit? %>
+ <%= render("pagination", resources: attribute.resources(page_number), param_name: "#{attribute.name}[page]") %>
+<% end %>
+
+<% else %>
+<%= t("administrate.fields.has_many.none", default: "–") %>
+<% end %>
+
+<%= form_tag(add_gestionnaire_manager_groupe_gestionnaire_path(page.resource), style: 'margin-top: 1rem;') do %>
+ <%= email_field_tag(:emails, '', placeholder: 'Emails', autocapitalize: 'off', autocorrect: 'off', spellcheck: 'false', style: 'margin-bottom: 1rem;width:24rem;') %>
+
+<% end %>
diff --git a/app/views/manager/groupe_gestionnaires/show.html.erb b/app/views/manager/groupe_gestionnaires/show.html.erb
new file mode 100644
index 000000000..659206d7d
--- /dev/null
+++ b/app/views/manager/groupe_gestionnaires/show.html.erb
@@ -0,0 +1,67 @@
+<%#
+# Show
+
+This view is the template for the show page.
+It renders the attributes of a resource,
+as well as a link to its edit page.
+
+## Local variables:
+
+- `page`:
+ An instance of [Administrate::Page::Show][1].
+ Contains methods for accessing the resource to be displayed on the page,
+ as well as helpers for describing how each attribute of the resource
+ should be displayed.
+
+[1]: http://www.rubydoc.info/gems/administrate/Administrate/Page/Show
+%>
+
+<% content_for(:title) { t("administrate.actions.show_resource", name: page.page_title) } %>
+
+
+
+
diff --git a/config/locales/models/groupe_gestionnaire/fr.yml b/config/locales/models/groupe_gestionnaire/fr.yml
new file mode 100644
index 000000000..ef29657cb
--- /dev/null
+++ b/config/locales/models/groupe_gestionnaire/fr.yml
@@ -0,0 +1,9 @@
+fr:
+ activerecord:
+ attributes:
+ groupe_gestionnaire:
+ gestionnaires: Gestionnaires
+ models:
+ groupe_gestionnaire:
+ one: Groupe d'administrateurs
+ other: Groupes d'administrateurs
diff --git a/config/locales/views/groupe_gestionnaire_mailer/notify_removed_gestionnaire/en.yml b/config/locales/views/groupe_gestionnaire_mailer/notify_removed_gestionnaire/en.yml
new file mode 100644
index 000000000..836737fa6
--- /dev/null
+++ b/config/locales/views/groupe_gestionnaire_mailer/notify_removed_gestionnaire/en.yml
@@ -0,0 +1,4 @@
+en:
+ groupe_gestionnaire_mailer:
+ notify_removed_gestionnaire:
+ email_body: "You were removed from the admins group %{groupe_gestionnaire_name} on %{application_name} by « %{email} »"
diff --git a/config/locales/views/groupe_gestionnaire_mailer/notify_removed_gestionnaire/fr.yml b/config/locales/views/groupe_gestionnaire_mailer/notify_removed_gestionnaire/fr.yml
new file mode 100644
index 000000000..927149552
--- /dev/null
+++ b/config/locales/views/groupe_gestionnaire_mailer/notify_removed_gestionnaire/fr.yml
@@ -0,0 +1,4 @@
+fr:
+ groupe_gestionnaire_mailer:
+ notify_removed_gestionnaire:
+ email_body: "Vous venez d’être supprimé(e) du groupe %{groupe_gestionnaire_name} sur %{application_name} par « %{email} »."
diff --git a/config/locales/views/manager/en.yml b/config/locales/views/manager/en.yml
new file mode 100644
index 000000000..4ff35c232
--- /dev/null
+++ b/config/locales/views/manager/en.yml
@@ -0,0 +1,9 @@
+en:
+ manager:
+ groupe_gestionnaires:
+ add_gestionnaire:
+ wrong_address:
+ one: "%{emails} is not a valid email address"
+ other: "%{emails} are not valid email addresses"
+ gestionnaires:
+ manage_root_groupe_gestionnaire: Root group management
diff --git a/config/locales/views/manager/fr.yml b/config/locales/views/manager/fr.yml
index 108d954bd..aea601ee2 100644
--- a/config/locales/views/manager/fr.yml
+++ b/config/locales/views/manager/fr.yml
@@ -5,3 +5,5 @@ fr:
wrong_address:
one: "%{emails} n’est pas une adresse email valide"
other: "%{emails} ne sont pas des adresses emails valides"
+ gestionnaires:
+ manage_root_groupe_gestionnaire: Gestion du groupe racine
diff --git a/config/routes.rb b/config/routes.rb
index 8404179c1..08aafd715 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -56,11 +56,12 @@ Rails.application.routes.draw do
delete 'delete', on: :member
end
- if ENV['ADMINS_GROUP_ENABLED'] == 'enabled' # can be removed if needed when EVERY PARTS of the feature will be merged / from env.example.optional
- resources :gestionnaires, only: [:index, :show, :edit, :update]
+ if ENV['ADMINS_GROUP_ENABLED'] == 'enabled' || Rails.env.test? # can be removed if needed when EVERY PARTS of the feature will be merged / from env.example.optional
+ resources :gestionnaires, only: [:index, :show, :edit, :update, :destroy]
resources :groupe_gestionnaires, path: 'groupe_administrateurs', only: [:index, :show, :new, :create, :edit, :update] do
post 'add_gestionnaire', on: :member
+ delete 'remove_gestionnaire', on: :member
end
end
@@ -473,7 +474,7 @@ Rails.application.routes.draw do
end
end
- if ENV['ADMINS_GROUP_ENABLED'] == 'enabled' # can be removed if needed when EVERY PARTS of the feature will be merged / from env.example.optional
+ if ENV['ADMINS_GROUP_ENABLED'] == 'enabled' || Rails.env.test? # can be removed if needed when EVERY PARTS of the feature will be merged / from env.example.optional
#
# Gestionnaire
diff --git a/spec/controllers/gestionnaires/gestionnaire_controller_spec.rb b/spec/controllers/gestionnaires/gestionnaire_controller_spec.rb
new file mode 100644
index 000000000..d00115cc8
--- /dev/null
+++ b/spec/controllers/gestionnaires/gestionnaire_controller_spec.rb
@@ -0,0 +1,12 @@
+describe Gestionnaires::GestionnaireController, type: :controller do
+ describe 'before actions: authenticate_gestionnaire!' do
+ it 'is present' do
+ before_actions = Gestionnaires::GestionnaireController
+ ._process_action_callbacks
+ .filter { |process_action_callbacks| process_action_callbacks.kind == :before }
+ .map(&:filter)
+
+ expect(before_actions).to include(:authenticate_gestionnaire!)
+ end
+ end
+end
diff --git a/spec/controllers/gestionnaires/groupe_gestionnaires_controller_spec.rb b/spec/controllers/gestionnaires/groupe_gestionnaires_controller_spec.rb
new file mode 100644
index 000000000..d47f467b0
--- /dev/null
+++ b/spec/controllers/gestionnaires/groupe_gestionnaires_controller_spec.rb
@@ -0,0 +1,23 @@
+describe Gestionnaires::GroupeGestionnairesController, type: :controller do
+ let(:gestionnaire) { create(:gestionnaire) }
+
+ describe "#index" do
+ subject { get :index }
+
+ context "when not logged" do
+ before { subject }
+ it { expect(response).to redirect_to(new_user_session_path) }
+ end
+
+ context "when logged in" do
+ let!(:groupe_gestionnaire) { create(:groupe_gestionnaire, gestionnaires: [gestionnaire]) }
+ before do
+ sign_in(gestionnaire.user)
+ subject
+ end
+
+ it { expect(response).to have_http_status(:ok) }
+ it { expect(assigns(:groupe_gestionnaires)).to include(groupe_gestionnaire) }
+ end
+ end
+end
diff --git a/spec/controllers/manager/gestionnaires_controller_spec.rb b/spec/controllers/manager/gestionnaires_controller_spec.rb
new file mode 100644
index 000000000..5357b6def
--- /dev/null
+++ b/spec/controllers/manager/gestionnaires_controller_spec.rb
@@ -0,0 +1,25 @@
+describe Manager::GestionnairesController, type: :controller do
+ let(:super_admin) { create(:super_admin) }
+ let(:gestionnaire) { create(:gestionnaire) }
+
+ before { sign_in super_admin }
+
+ describe '#index' do
+ render_views
+
+ it 'searches admin by email' do
+ get :index, params: { search: gestionnaire.email }
+ expect(response).to have_http_status(:success)
+ end
+ end
+
+ describe '#show' do
+ render_views
+
+ before do
+ get :show, params: { id: gestionnaire.id }
+ end
+
+ it { expect(response.body).to include(gestionnaire.email) }
+ end
+end
diff --git a/spec/controllers/manager/groupe_gestionnaires_controller_spec.rb b/spec/controllers/manager/groupe_gestionnaires_controller_spec.rb
new file mode 100644
index 000000000..ae52bd02c
--- /dev/null
+++ b/spec/controllers/manager/groupe_gestionnaires_controller_spec.rb
@@ -0,0 +1,82 @@
+describe Manager::GroupeGestionnairesController, type: :controller do
+ let(:super_admin) { create(:super_admin) }
+ let(:groupe_gestionnaire) { create(:groupe_gestionnaire) }
+
+ before { sign_in super_admin }
+
+ describe '#index' do
+ render_views
+
+ before do
+ groupe_gestionnaire
+ get :index
+ end
+
+ it { expect(response.body).to include(groupe_gestionnaire.name) }
+ end
+
+ describe '#show' do
+ render_views
+
+ before do
+ get :show, params: { id: groupe_gestionnaire.id }
+ end
+
+ it { expect(response.body).to include(groupe_gestionnaire.name) }
+ end
+
+ describe '#add_gestionnaire' do
+ before do
+ post :add_gestionnaire,
+ params: {
+ id: groupe_gestionnaire.id,
+ emails: new_gestionnaire_email
+ }
+ end
+
+ context 'of a new gestionnaire' do
+ let(:new_gestionnaire_email) { 'new_gestionnaire@mail.com' }
+
+ it { expect(groupe_gestionnaire.gestionnaires.map(&:email)).to include(new_gestionnaire_email) }
+ it { expect(flash.notice).to be_present }
+ it { expect(response).to redirect_to(manager_groupe_gestionnaire_path(groupe_gestionnaire)) }
+ end
+ end
+
+ describe '#remove_gestionnaire' do
+ let(:gestionnaire) { create(:gestionnaire) }
+ let(:new_gestionnaire) { create(:gestionnaire) }
+
+ before do
+ groupe_gestionnaire.gestionnaires << gestionnaire << new_gestionnaire
+ end
+
+ def remove_gestionnaire(gestionnaire)
+ delete :remove_gestionnaire,
+ params: {
+ id: groupe_gestionnaire.id,
+ gestionnaire: { id: gestionnaire.id }
+ }
+ end
+
+ context 'when there are many gestionnaires' do
+ before { remove_gestionnaire(new_gestionnaire) }
+
+ it { expect(groupe_gestionnaire.gestionnaires).to include(gestionnaire) }
+ it { expect(groupe_gestionnaire.reload.gestionnaires.count).to eq(1) }
+ it { expect(response).to redirect_to(manager_groupe_gestionnaire_path(groupe_gestionnaire)) }
+ end
+
+ context 'when there is only one gestionnaire' do
+ before do
+ remove_gestionnaire(new_gestionnaire)
+ remove_gestionnaire(gestionnaire)
+ end
+
+ it { expect(groupe_gestionnaire.gestionnaires).to include(gestionnaire) }
+ it { expect(groupe_gestionnaire.gestionnaires.count).to eq(1) }
+ it { expect(flash.alert).to eq('Suppression impossible : il doit y avoir au moins un gestionnaire dans le groupe racine') }
+ it { expect(response).to redirect_to(manager_groupe_gestionnaire_path(groupe_gestionnaire)) }
+ end
+ end
+end
diff --git a/spec/mailers/groupe_gestionnaire_mailer_spec.rb b/spec/mailers/groupe_gestionnaire_mailer_spec.rb
index 0efbf4c4f..1ce585f54 100644
--- a/spec/mailers/groupe_gestionnaire_mailer_spec.rb
+++ b/spec/mailers/groupe_gestionnaire_mailer_spec.rb
@@ -1,4 +1,17 @@
RSpec.describe GroupeGestionnaireMailer, type: :mailer do
+ describe '#notify_removed_gestionnaire' do
+ let(:groupe_gestionnaire) { create(:groupe_gestionnaire) }
+
+ let(:gestionnaire_to_remove) { create(:gestionnaire, email: 'int3@g') }
+
+ let(:current_super_admin_email) { 'toto@email.com' }
+
+ subject { described_class.notify_removed_gestionnaire(groupe_gestionnaire, gestionnaire_to_remove, current_super_admin_email) }
+
+ it { expect(subject.body).to include('Vous venez d’être supprimé(e) du groupe') }
+ it { expect(subject.to).to match_array(['int3@g']) }
+ end
+
describe '#notify_added_gestionnaires' do
let(:groupe_gestionnaire) { create(:groupe_gestionnaire) }
diff --git a/spec/mailers/previews/groupe_gestionnaire_mailer_preview.rb b/spec/mailers/previews/groupe_gestionnaire_mailer_preview.rb
index e522ee69d..53ce5f929 100644
--- a/spec/mailers/previews/groupe_gestionnaire_mailer_preview.rb
+++ b/spec/mailers/previews/groupe_gestionnaire_mailer_preview.rb
@@ -1,4 +1,11 @@
class GroupeGestionnaireMailerPreview < ActionMailer::Preview
+ def notify_removed_gestionnaire
+ groupe_gestionnaire = GroupeGestionnaire.new(name: 'un groupe d\'admin')
+ current_super_admin_email = 'admin@dgfip.com'
+ gestionnaire = Gestionnaire.new(user: user)
+ GroupeGestionnaireMailer.notify_removed_gestionnaire(groupe_gestionnaire, gestionnaire, current_super_admin_email)
+ end
+
def notify_added_gestionnaires
groupe_gestionnaire = GroupeGestionnaire.new(name: 'un groupe d\'admin')
current_super_admin_email = 'admin@dgfip.com'