diff --git a/app/components/groupe_gestionnaire/card/commentaires_component.rb b/app/components/groupe_gestionnaire/card/commentaires_component.rb new file mode 100644 index 00000000000..9cfd67073a0 --- /dev/null +++ b/app/components/groupe_gestionnaire/card/commentaires_component.rb @@ -0,0 +1,7 @@ +class GroupeGestionnaire::Card::CommentairesComponent < ApplicationComponent + def initialize(groupe_gestionnaire:, administrateur:, path:) + @groupe_gestionnaire = groupe_gestionnaire + @administrateur = administrateur + @path = path + end +end diff --git a/app/components/groupe_gestionnaire/card/commentaires_component/commentaires_component.fr.yml b/app/components/groupe_gestionnaire/card/commentaires_component/commentaires_component.fr.yml new file mode 100644 index 00000000000..da305477a33 --- /dev/null +++ b/app/components/groupe_gestionnaire/card/commentaires_component/commentaires_component.fr.yml @@ -0,0 +1,5 @@ +--- +fr: + title: + one: Message + other: Messages diff --git a/app/components/groupe_gestionnaire/card/commentaires_component/commentaires_component.html.haml b/app/components/groupe_gestionnaire/card/commentaires_component/commentaires_component.html.haml new file mode 100644 index 00000000000..5af78516ada --- /dev/null +++ b/app/components/groupe_gestionnaire/card/commentaires_component/commentaires_component.html.haml @@ -0,0 +1,9 @@ +.fr-col-6.fr-col-md-4.fr-col-lg-3 + = link_to @path, id: 'administrateurs', class: 'fr-tile fr-enlarge-link' do + .fr-tile__body.flex.column.align-center.justify-between + %div + .line-count.fr-my-1w + %p.fr-tag= @administrateur.commentaire_groupe_gestionnaires.size + %h3.fr-h6 + = t('.title', count: @administrateur.commentaire_groupe_gestionnaires.size) + %p.fr-btn.fr-btn--tertiary= t('views.shared.actions.see') diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component.rb b/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component.rb new file mode 100644 index 00000000000..48b2e71fc5b --- /dev/null +++ b/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component.rb @@ -0,0 +1,24 @@ +class GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent < ApplicationComponent + include ApplicationHelper + + def initialize(commentaire:, connected_user:, is_gestionnaire: true) + @commentaire = commentaire + @connected_user = connected_user + @is_gestionnaire = is_gestionnaire + end + + private + + def commentaire_issuer + if @commentaire.sent_by?(@connected_user) + t('.you') + else + (@commentaire.gestionnaire || @commentaire.sender).email + end + end + + def commentaire_date + is_current_year = (@commentaire.created_at.year == Time.zone.today.year) + l(@commentaire.created_at, format: is_current_year ? :message_date : :message_date_with_year) + end +end diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.en.yml b/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.en.yml new file mode 100644 index 00000000000..ea11da268c5 --- /dev/null +++ b/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.en.yml @@ -0,0 +1,7 @@ +--- +en: + reply: Reply + delete_button: Delete this message + confirm: Are you sure you want to delete this message ? + you: You + deleted_body: Message deleted diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.fr.yml b/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.fr.yml new file mode 100644 index 00000000000..15cfb060179 --- /dev/null +++ b/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.fr.yml @@ -0,0 +1,7 @@ +--- +fr: + reply: Répondre + delete_button: Supprimer le message + confirm: Êtes-vous sûr de vouloir supprimer ce message ? + you: Vous + deleted_body: Message supprimé diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.html.haml b/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.html.haml new file mode 100644 index 00000000000..f4881d75b7a --- /dev/null +++ b/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component/commentaire_component.html.haml @@ -0,0 +1,12 @@ +.width-100 + %h2.fr-h6 + %span.mail + = commentaire_issuer + + %span.date{ class: ["fr-text--xs", "fr-text-mention--grey", "font-weight-normal"] } + = commentaire_date + .rich-text + - if @commentaire.discarded? + %p= t('.deleted_body') + - else + = render SimpleFormatComponent.new(@commentaire.body, allow_a: false) diff --git a/app/controllers/administrateurs/groupe_gestionnaire_controller.rb b/app/controllers/administrateurs/groupe_gestionnaire_controller.rb index 641293ec8f2..f473e2c067c 100644 --- a/app/controllers/administrateurs/groupe_gestionnaire_controller.rb +++ b/app/controllers/administrateurs/groupe_gestionnaire_controller.rb @@ -1,6 +1,6 @@ module Administrateurs class GroupeGestionnaireController < AdministrateurController - before_action :retrieve_groupe_gestionnaire, only: [:show, :administrateurs, :gestionnaires] + before_action :retrieve_groupe_gestionnaire, only: [:show, :administrateurs, :gestionnaires, :commentaires, :create_commentaire] def show end @@ -11,6 +11,22 @@ def administrateurs def gestionnaires end + def commentaires + @commentaire = Commentaire.new + end + + def create_commentaire + @commentaire = @groupe_gestionnaire.commentaire_groupe_gestionnaires.create(commentaire_params.merge(sender: current_administrateur)) + + if @commentaire.errors.empty? + flash.notice = "Message envoyé" + redirect_to admin_groupe_gestionnaire_commentaires_path + else + flash.alert = @commentaire.errors.full_messages + render :commentaires + end + end + private def retrieve_groupe_gestionnaire @@ -24,5 +40,9 @@ def retrieve_groupe_gestionnaire flash.alert = 'Groupe inexistant' redirect_to admin_procedures_path, status: 404 end + + def commentaire_params + params.require(:commentaire).permit(:body) + end end end diff --git a/app/models/administrateur.rb b/app/models/administrateur.rb index ab8c30aed76..de995e2edc4 100644 --- a/app/models/administrateur.rb +++ b/app/models/administrateur.rb @@ -7,6 +7,7 @@ class Administrateur < ApplicationRecord has_many :procedures, through: :administrateurs_procedures has_many :services has_many :api_tokens, inverse_of: :administrateur, dependent: :destroy + has_many :commentaire_groupe_gestionnaires, as: :sender has_and_belongs_to_many :default_zones, class_name: 'Zone', join_table: 'default_zones_administrateurs' belongs_to :user diff --git a/app/models/commentaire_groupe_gestionnaire.rb b/app/models/commentaire_groupe_gestionnaire.rb new file mode 100644 index 00000000000..6d7c5fabacf --- /dev/null +++ b/app/models/commentaire_groupe_gestionnaire.rb @@ -0,0 +1,28 @@ +class CommentaireGroupeGestionnaire < ApplicationRecord + include Discard::Model + belongs_to :groupe_gestionnaire + belongs_to :gestionnaire, optional: true + belongs_to :sender, polymorphic: true + + validates :body, presence: { message: "ne peut être vide" } + + def soft_deletable?(connected_user) + sent_by?(connected_user) && sent_by_gestionnaire? && !discarded? + end + + def soft_delete! + discard! + end + + def sent_by_gestionnaire? + gestionnaire_id.present? + end + + def sent_by?(someone) + if gestionnaire + someone == gestionnaire + else + someone == sender + end + end +end diff --git a/app/models/gestionnaire.rb b/app/models/gestionnaire.rb index 6fa10954046..04f78964bb1 100644 --- a/app/models/gestionnaire.rb +++ b/app/models/gestionnaire.rb @@ -1,6 +1,7 @@ class Gestionnaire < ApplicationRecord include UserFindByConcern has_and_belongs_to_many :groupe_gestionnaires + has_many :commentaire_groupe_gestionnaires belongs_to :user diff --git a/app/models/groupe_gestionnaire.rb b/app/models/groupe_gestionnaire.rb index 1c719ce975c..31a30abfb5a 100644 --- a/app/models/groupe_gestionnaire.rb +++ b/app/models/groupe_gestionnaire.rb @@ -1,5 +1,6 @@ class GroupeGestionnaire < ApplicationRecord has_many :administrateurs + has_many :commentaire_groupe_gestionnaires has_and_belongs_to_many :gestionnaires has_ancestry diff --git a/app/views/administrateurs/groupe_gestionnaire/commentaires.html.haml b/app/views/administrateurs/groupe_gestionnaire/commentaires.html.haml new file mode 100644 index 00000000000..06fd6898305 --- /dev/null +++ b/app/views/administrateurs/groupe_gestionnaire/commentaires.html.haml @@ -0,0 +1,13 @@ += render partial: 'gestionnaires/breadcrumbs', + locals: { steps: [['Mon groupe gestionnaire', admin_groupe_gestionnaire_path], + ['Messagerie']], preview: false } + +.container + %h1 Messagerie de « #{@groupe_gestionnaire.name} » +.messagerie.container + - if current_administrateur.commentaire_groupe_gestionnaires.where(groupe_gestionnaire: @groupe_gestionnaire).present? + %ul.messages-list{ data: { controller: 'scroll-to' } } + - current_administrateur.commentaire_groupe_gestionnaires.where(groupe_gestionnaire: @groupe_gestionnaire).each do |commentaire| + %li.message{ class: commentaire_is_from_me_class(commentaire, current_administrateur), id: dom_id(commentaire) } + = render(GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent.new(commentaire: commentaire, connected_user: current_administrateur, is_gestionnaire: false)) + = render partial: "shared/groupe_gestionnaires/commentaires/form", locals: { commentaire: @commentaire, form_url: admin_groupe_gestionnaire_create_commentaire_path } diff --git a/app/views/administrateurs/groupe_gestionnaire/show.html.haml b/app/views/administrateurs/groupe_gestionnaire/show.html.haml index 42df76cc68c..076c24349d3 100644 --- a/app/views/administrateurs/groupe_gestionnaire/show.html.haml +++ b/app/views/administrateurs/groupe_gestionnaire/show.html.haml @@ -7,3 +7,4 @@ .fr-grid-row.fr-grid-row--gutters.fr-mb-5w = render GroupeGestionnaire::Card::GestionnairesComponent.new(groupe_gestionnaire: @groupe_gestionnaire, path: admin_groupe_gestionnaire_gestionnaires_path) = render GroupeGestionnaire::Card::AdministrateursComponent.new(groupe_gestionnaire: @groupe_gestionnaire, path: admin_groupe_gestionnaire_administrateurs_path) + = render GroupeGestionnaire::Card::CommentairesComponent.new(groupe_gestionnaire: @groupe_gestionnaire, administrateur: current_administrateur, path: admin_groupe_gestionnaire_commentaires_path) diff --git a/app/views/shared/groupe_gestionnaires/commentaires/_form.html.haml b/app/views/shared/groupe_gestionnaires/commentaires/_form.html.haml new file mode 100644 index 00000000000..625c962e32c --- /dev/null +++ b/app/views/shared/groupe_gestionnaires/commentaires/_form.html.haml @@ -0,0 +1,12 @@ += render NestedForms::FormOwnerComponent.new += form_for(commentaire, url: form_url) do |f| + - dossier = commentaire.dossier + - placeholder = t('views.shared.dossiers.messages.form.write_message_to_administration_placeholder') + - if instructeur_signed_in? || administrateur_signed_in? || expert_signed_in? + - placeholder = t('views.shared.dossiers.messages.form.write_message_placeholder') + %p.mandatory-explanation= t('asterisk_html', scope: [:utils]) + + = render Dsfr::InputComponent.new(form: f, attribute: :body, input_type: :text_area, opts: { rows: 5, placeholder: placeholder, title: placeholder, class: 'fr-input message-textarea'}) + + .fr-mt-3w + = f.submit t('views.shared.dossiers.messages.form.send_message'), class: 'fr-btn', data: { disable: true } diff --git a/config/locales/fr.yml b/config/locales/fr.yml index b3167f1af41..9a1a5401762 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -324,6 +324,7 @@ fr: actions: save: Enregistrer edit: Modifier + see: Voir greetings: hello: Bonjour, best_regards: Cordialement, diff --git a/config/locales/models/groupe_gestionnaire/fr.yml b/config/locales/models/groupe_gestionnaire/fr.yml index 6acbe89239a..aceffb8c4af 100644 --- a/config/locales/models/groupe_gestionnaire/fr.yml +++ b/config/locales/models/groupe_gestionnaire/fr.yml @@ -12,8 +12,8 @@ fr: one: "%{emails} est déjà gestionnaire de ce groupe" other: "%{emails} sont déjà gestionnaires de ce groupe" administrateurs_already_in_groupe_gestionnaire: - one: Cet administrateur est déjà dans un groupe gestionnaire dont vous n'avez pas la gestion. - other: Ces administrateurs sont déjà dans un groupe gestionnaire dont vous n'avez pas la gestion. + one: Ajout impossible. Cet administrateur fait déjà parti d'un groupe. + other: Ajout impossible. Ces administrateurs font déjà parti d'un groupe. wrong_address: one: "%{emails} n’est pas une adresse email valide" other: "%{emails} ne sont pas des adresses emails valides" diff --git a/config/routes.rb b/config/routes.rb index 79c9d740b92..de03dee2f8e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -653,6 +653,8 @@ get 'mon-groupe' => 'groupe_gestionnaire#show', as: :groupe_gestionnaire get 'mon-groupe/administrateurs' => 'groupe_gestionnaire#administrateurs', as: :groupe_gestionnaire_administrateurs get 'mon-groupe/gestionnaires' => 'groupe_gestionnaire#gestionnaires', as: :groupe_gestionnaire_gestionnaires + get 'mon-groupe/commentaires' => 'groupe_gestionnaire#commentaires', as: :groupe_gestionnaire_commentaires + post 'mon-groupe/create_commentaire' => 'groupe_gestionnaire#create_commentaire', as: :groupe_gestionnaire_create_commentaire resources :services, except: [:show] do collection do diff --git a/db/migrate/20231016134902_create_commentaire_groupe_gestionnaires.rb b/db/migrate/20231016134902_create_commentaire_groupe_gestionnaires.rb new file mode 100644 index 00000000000..6942367de2f --- /dev/null +++ b/db/migrate/20231016134902_create_commentaire_groupe_gestionnaires.rb @@ -0,0 +1,15 @@ +class CreateCommentaireGroupeGestionnaires < ActiveRecord::Migration[6.1] + disable_ddl_transaction! + + def change + create_table "commentaire_groupe_gestionnaires" do |t| + t.references :groupe_gestionnaire, index: { name: :index_commentaire_groupe_gestionnaires_on_groupe_gestionnaire } + t.references "gestionnaire", null: true + t.string "sender_type", null: false + t.bigint "sender_id", null: false + t.string "body" + t.datetime "discarded_at" + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index aca1b89aebd..236a8eb665e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -261,6 +261,19 @@ t.index ["procedure_id"], name: "index_closed_mails_on_procedure_id" end + create_table "commentaire_groupe_gestionnaires", force: :cascade do |t| + t.string "body" + t.datetime "created_at", precision: 6, null: false + t.datetime "discarded_at", precision: 6 + t.bigint "gestionnaire_id" + t.bigint "groupe_gestionnaire_id" + t.bigint "sender_id", null: false + t.string "sender_type", null: false + t.datetime "updated_at", precision: 6, null: false + t.index ["gestionnaire_id"], name: "index_commentaire_groupe_gestionnaires_on_gestionnaire_id" + t.index ["groupe_gestionnaire_id"], name: "index_commentaire_groupe_gestionnaires_on_groupe_gestionnaire" + end + create_table "commentaires", id: :serial, force: :cascade do |t| t.string "body" t.datetime "created_at", precision: nil, null: false diff --git a/spec/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component_spec.rb b/spec/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component_spec.rb new file mode 100644 index 00000000000..69b312faf72 --- /dev/null +++ b/spec/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component_spec.rb @@ -0,0 +1,56 @@ +RSpec.describe GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent, type: :component do + let(:component) do + described_class.new( + commentaire: commentaire, + connected_user: connected_user + ) + end + let(:connected_user) { create(:administrateur) } + let(:commentaire) { create(:commentaire_groupe_gestionnaire, sender: connected_user) } + + subject { render_inline(component).to_html } + + it { is_expected.to include("plop") } + + describe '#commentaire_date' do + let(:present_date) { Time.zone.local(2018, 9, 2, 10, 5, 0) } + let(:creation_date) { present_date } + let(:commentaire) do + Timecop.freeze(creation_date) { create(:commentaire_groupe_gestionnaire, sender: connected_user) } + end + + subject do + Timecop.freeze(present_date) { component.send(:commentaire_date) } + end + + it 'doesn’t include the creation year' do + expect(subject).to eq 'le 2 septembre à 10 h 05' + end + + context 'when displaying a commentaire created on a previous year' do + let(:creation_date) { present_date.prev_year } + it 'includes the creation year' do + expect(subject).to eq 'le 2 septembre 2017 à 10 h 05' + end + end + + context 'when formatting the first day of the month' do + let(:present_date) { Time.zone.local(2018, 9, 1, 10, 5, 0) } + it 'includes the ordinal' do + expect(subject).to eq 'le 1er septembre à 10 h 05' + end + end + end + + describe '#commentaire_issuer' do + let(:commentaire) { create(:commentaire_groupe_gestionnaire, sender: connected_user) } + + subject { component.send(:commentaire_issuer) } + + context 'issuer is connected_user' do + it 'returns "Vous"' do + expect(subject).to include 'Vous' + end + end + end + end diff --git a/spec/controllers/administrateurs/groupe_gestionnaire_controller_spec.rb b/spec/controllers/administrateurs/groupe_gestionnaire_controller_spec.rb index 55187a46b58..edb4839afad 100644 --- a/spec/controllers/administrateurs/groupe_gestionnaire_controller_spec.rb +++ b/spec/controllers/administrateurs/groupe_gestionnaire_controller_spec.rb @@ -63,4 +63,55 @@ it { expect(assigns(:groupe_gestionnaire)).to eq(groupe_gestionnaire) } end end + + describe '#commentaires' do + let(:gestionnaire) { create(:gestionnaire) } + let!(:groupe_gestionnaire) { create(:groupe_gestionnaire, gestionnaires: [gestionnaire], administrateurs: [admin]) } + subject { get :commentaires } + + context "when not logged" do + before { subject } + it { expect(response).to redirect_to(new_user_session_path) } + end + + context "when logged in" do + before do + sign_in(admin.user) + end + + it { expect(subject).to have_http_status(:ok) } + end + end + + describe "#create_commentaire" do + let(:gestionnaire) { create(:gestionnaire) } + let!(:groupe_gestionnaire) { create(:groupe_gestionnaire, gestionnaires: [gestionnaire], administrateurs: [admin]) } + let(:body) { "avant\napres" } + + subject { + post :create_commentaire, params: { + commentaire: { + body: body + } + } + } + + context "when not logged" do + before { subject } + it { expect(response).to redirect_to(new_user_session_path) } + end + + context "when logged in" do + before do + sign_in(admin.user) + end + + it "creates a commentaire" do + expect { subject }.to change(CommentaireGroupeGestionnaire, :count).by(1) + + expect(response).to redirect_to(admin_groupe_gestionnaire_commentaires_path) + expect(flash.notice).to be_present + end + end + end end diff --git a/spec/factories/commentaire_groupe_gestionnaire.rb b/spec/factories/commentaire_groupe_gestionnaire.rb new file mode 100644 index 00000000000..74273b9db75 --- /dev/null +++ b/spec/factories/commentaire_groupe_gestionnaire.rb @@ -0,0 +1,7 @@ +FactoryBot.define do + factory :commentaire_groupe_gestionnaire do + association :groupe_gestionnaire + + body { 'plop' } + end +end diff --git a/spec/models/administrateur_spec.rb b/spec/models/administrateur_spec.rb index 7750b59a11d..53b0ef59ffa 100644 --- a/spec/models/administrateur_spec.rb +++ b/spec/models/administrateur_spec.rb @@ -2,6 +2,7 @@ let(:administration) { create(:administration) } describe 'associations' do + it { is_expected.to have_many(:commentaire_groupe_gestionnaires) } it { is_expected.to have_and_belong_to_many(:instructeurs) } it { is_expected.to belong_to(:groupe_gestionnaire).optional } end diff --git a/spec/models/commentaire_groupe_gestionnaire_spec.rb b/spec/models/commentaire_groupe_gestionnaire_spec.rb new file mode 100644 index 00000000000..58eec17eee7 --- /dev/null +++ b/spec/models/commentaire_groupe_gestionnaire_spec.rb @@ -0,0 +1,79 @@ +describe CommentaireGroupeGestionnaire, type: :model do + describe 'associations' do + it { is_expected.to belong_to(:groupe_gestionnaire) } + it { is_expected.to belong_to(:gestionnaire).optional } + it { is_expected.to belong_to(:sender) } + end + + describe "#soft_deletable?" do + subject { commentaire_groupe_gestionnaire.soft_deletable?(user) } + + let(:commentaire_groupe_gestionnaire) { build :commentaire_groupe_gestionnaire, sender: sender, gestionnaire: gestionnaire } + + context 'with a commentaire_groupe_gestionnaire created by an administrateur deleted by administrateur' do + let(:sender) { create(:administrateur) } + let(:user) { sender } + let(:gestionnaire) { nil } + + it { is_expected.to be_falsy } + end + + context 'with a commentaire_groupe_gestionnaire created by an administrateur deleted by gestionnaire' do + let(:sender) { create(:administrateur) } + let(:user) { create(:gestionnaire) } + let(:gestionnaire) { nil } + + it { is_expected.to be_falsy } + end + + context 'with a commentaire_groupe_gestionnaire created by an gestionnaire deleted by gestionnaire' do + let(:sender) { create(:gestionnaire) } + let(:user) { sender } + let(:gestionnaire) { sender } + + it { is_expected.to be_truthy } + end + + context 'with a commentaire_groupe_gestionnaire created by an gestionnaire deleted by administrateur' do + let(:sender) { create(:gestionnaire) } + let(:user) { create(:administrateur) } + let(:gestionnaire) { sender } + + it { is_expected.to be_falsy } + end + end + + describe "#sent_by?" do + subject { commentaire_groupe_gestionnaire.sent_by?(user) } + + let(:commentaire_groupe_gestionnaire) { build :commentaire_groupe_gestionnaire, sender: sender } + + context 'with a commentaire_groupe_gestionnaire created by an administrateur so sent by administrateur' do + let(:sender) { create(:administrateur) } + let(:user) { sender } + + it { is_expected.to be_truthy } + end + + context 'with a commentaire_groupe_gestionnaire created by an administrateur so not sent by gestionnaire' do + let(:sender) { create(:administrateur) } + let(:user) { create(:gestionnaire) } + + it { is_expected.to be_falsy } + end + + context 'with a commentaire_groupe_gestionnaire created by an gestionnaire so sent by gestionnaire' do + let(:sender) { create(:gestionnaire) } + let(:user) { sender } + + it { is_expected.to be_truthy } + end + + context 'with a commentaire_groupe_gestionnaire created by an gestionnaire so not sent by administrateur' do + let(:sender) { create(:gestionnaire) } + let(:user) { create(:administrateur) } + + it { is_expected.to be_falsy } + end + end +end diff --git a/spec/models/gestionnaire_spec.rb b/spec/models/gestionnaire_spec.rb index 4226716f492..bffbc3eab57 100644 --- a/spec/models/gestionnaire_spec.rb +++ b/spec/models/gestionnaire_spec.rb @@ -1,5 +1,6 @@ describe Gestionnaire, type: :model do describe 'associations' do + it { is_expected.to have_many(:commentaire_groupe_gestionnaires) } it { is_expected.to have_and_belong_to_many(:groupe_gestionnaires) } end diff --git a/spec/models/groupe_gestionnaire_spec.rb b/spec/models/groupe_gestionnaire_spec.rb index 604ac9a293a..caf8396bf9b 100644 --- a/spec/models/groupe_gestionnaire_spec.rb +++ b/spec/models/groupe_gestionnaire_spec.rb @@ -1,6 +1,7 @@ describe GroupeGestionnaire, type: :model do describe 'associations' do it { is_expected.to have_many(:administrateurs) } + it { is_expected.to have_many(:commentaire_groupe_gestionnaires) } it { is_expected.to have_and_belong_to_many(:gestionnaires) } end