From fba3cbe331c893de1e04461012d5142a776b528d Mon Sep 17 00:00:00 2001 From: seb-by-ouidou Date: Sun, 10 Dec 2023 17:25:58 +0000 Subject: [PATCH] feat: as gestionnaire, contact gestionnaire of parent groupe --- .../card/commentaires_component.rb | 6 +- .../commentaire_component.rb | 5 +- .../commentaire_component.rb | 6 +- ...pe_gestionnaire_commentaires_controller.rb | 45 ++++++++-- app/models/administrateur.rb | 2 +- app/models/gestionnaire.rb | 14 ++- app/models/groupe_gestionnaire.rb | 8 ++ .../commentaires.html.haml | 2 +- .../index.html.haml | 11 ++- .../parent_groupe_gestionnaire.haml | 15 ++++ .../show.html.haml | 2 +- config/routes.rb | 7 +- db/schema.rb | 2 +- ...stionnaire_commentaires_controller_spec.rb | 90 +++++++++++++++++-- 14 files changed, 183 insertions(+), 32 deletions(-) create mode 100644 app/views/gestionnaires/groupe_gestionnaire_commentaires/parent_groupe_gestionnaire.haml diff --git a/app/components/groupe_gestionnaire/card/commentaires_component.rb b/app/components/groupe_gestionnaire/card/commentaires_component.rb index 3ec44b459..66b1b2a94 100644 --- a/app/components/groupe_gestionnaire/card/commentaires_component.rb +++ b/app/components/groupe_gestionnaire/card/commentaires_component.rb @@ -10,7 +10,11 @@ class GroupeGestionnaire::Card::CommentairesComponent < ApplicationComponent if @administrateur @administrateur.commentaire_groupe_gestionnaires.size else - @groupe_gestionnaire.commentaire_groupe_gestionnaires.select(:sender_id, :sender_type).distinct.size + commentaires = @groupe_gestionnaire.current_commentaires_groupe_and_children_commentaires_groupe + if @groupe_gestionnaire.parent_id && !current_gestionnaire.groupe_gestionnaires.exists?(id: @groupe_gestionnaire.parent_id) + commentaires = commentaires.or(CommentaireGroupeGestionnaire.where(groupe_gestionnaire_id: @groupe_gestionnaire.id, sender: current_gestionnaire)) + end + commentaires.select(:sender_id, :sender_type).distinct.size end end end diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component.rb b/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component.rb index 9729a8adc..54c0cd4dd 100644 --- a/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component.rb +++ b/app/components/groupe_gestionnaire/groupe_gestionnaire_commentaires/commentaire_component.rb @@ -1,11 +1,10 @@ class GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent < ApplicationComponent include ApplicationHelper - def initialize(commentaire:, connected_user:, commentaire_seen_at: nil, is_gestionnaire: true) + def initialize(commentaire:, connected_user:, commentaire_seen_at: nil) @commentaire = commentaire @connected_user = connected_user - @is_gestionnaire = is_gestionnaire - @groupe_gestionnaire = commentaire.groupe_gestionnaire + @groupe_gestionnaire = commentaire.sender_type == "Administrateur" ? commentaire.groupe_gestionnaire : commentaire.groupe_gestionnaire.parent @commentaire_seen_at = commentaire_seen_at end diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_list_commentaires/commentaire_component.rb b/app/components/groupe_gestionnaire/groupe_gestionnaire_list_commentaires/commentaire_component.rb index a4dcc1898..6d470f863 100644 --- a/app/components/groupe_gestionnaire/groupe_gestionnaire_list_commentaires/commentaire_component.rb +++ b/app/components/groupe_gestionnaire/groupe_gestionnaire_list_commentaires/commentaire_component.rb @@ -8,7 +8,7 @@ class GroupeGestionnaire::GroupeGestionnaireListCommentaires::CommentaireCompone def email if @commentaire.sender == current_gestionnaire - "#{current_gestionnaire.email} (C’est vous !)" + "Messages avec le groupe gestionnaire parent (#{@groupe_gestionnaire.parent.name})" else @commentaire.sender_email end @@ -20,8 +20,8 @@ class GroupeGestionnaire::GroupeGestionnaireListCommentaires::CommentaireCompone def see_button link_to 'Voir', - gestionnaire_groupe_gestionnaire_commentaire_path(@groupe_gestionnaire, @commentaire), - class: 'button' + @commentaire.sender == current_gestionnaire ? parent_groupe_gestionnaire_gestionnaire_groupe_gestionnaire_commentaires_path(@groupe_gestionnaire) : gestionnaire_groupe_gestionnaire_commentaire_path(@groupe_gestionnaire, @commentaire), + class: 'fr-btn fr-btn--sm fr-btn--tertiary' end def highlight? diff --git a/app/controllers/gestionnaires/groupe_gestionnaire_commentaires_controller.rb b/app/controllers/gestionnaires/groupe_gestionnaire_commentaires_controller.rb index 1f8c40c57..19ee90687 100644 --- a/app/controllers/gestionnaires/groupe_gestionnaire_commentaires_controller.rb +++ b/app/controllers/gestionnaires/groupe_gestionnaire_commentaires_controller.rb @@ -2,23 +2,24 @@ module Gestionnaires class GroupeGestionnaireCommentairesController < GestionnaireController before_action :retrieve_groupe_gestionnaire before_action :retrieve_last_commentaire, only: [:show, :create, :destroy] + before_action :retrieve_last_parent_groupe_gestionnaire_commentaire, only: [:index, :parent_groupe_gestionnaire, :create_parent_groupe_gestionnaire] def index end def show - @commentaire_seen_at = current_gestionnaire.commentaire_seen_at(@groupe_gestionnaire, @last_commentaire.sender_id, @last_commentaire.sender_type) + @commentaire_seen_at = current_gestionnaire.commentaire_seen_at(@last_commentaire.groupe_gestionnaire, @last_commentaire.sender_id, @last_commentaire.sender_type) @commentaire = CommentaireGroupeGestionnaire.new - current_gestionnaire.mark_commentaire_as_seen(@groupe_gestionnaire, @last_commentaire.sender_id, @last_commentaire.sender_type) + current_gestionnaire.mark_commentaire_as_seen(@last_commentaire.groupe_gestionnaire, @last_commentaire.sender_id, @last_commentaire.sender_type) end def create - @commentaire = @groupe_gestionnaire.commentaire_groupe_gestionnaires.create(commentaire_params.merge(sender_id: @last_commentaire.sender_id, sender_type: @last_commentaire.sender_type, gestionnaire: current_gestionnaire)) + @commentaire = @last_commentaire.groupe_gestionnaire.commentaire_groupe_gestionnaires.create(commentaire_params.merge(sender_id: @last_commentaire.sender_id, sender_type: @last_commentaire.sender_type, gestionnaire: current_gestionnaire)) if @commentaire.errors.empty? - GroupeGestionnaireMailer.notify_new_commentaire_groupe_gestionnaire(@groupe_gestionnaire, @commentaire, current_gestionnaire.email, @commentaire.sender_email, admin_groupe_gestionnaire_commentaires_path).deliver_later + GroupeGestionnaireMailer.notify_new_commentaire_groupe_gestionnaire(@last_commentaire.groupe_gestionnaire, @commentaire, current_gestionnaire.email, @commentaire.sender_email, @commentaire.sender_type == "Administrateur" ? admin_groupe_gestionnaire_commentaires_path : parent_groupe_gestionnaire_gestionnaire_groupe_gestionnaire_commentaires_path(@last_commentaire.groupe_gestionnaire)).deliver_later flash.notice = "Message envoyé" - current_gestionnaire.mark_commentaire_as_seen(@groupe_gestionnaire, @commentaire.sender_id, @commentaire.sender_type) + current_gestionnaire.mark_commentaire_as_seen(@last_commentaire.groupe_gestionnaire, @commentaire.sender_id, @commentaire.sender_type) redirect_to gestionnaire_groupe_gestionnaire_commentaire_path(@groupe_gestionnaire, @commentaire) else flash.alert = @commentaire.errors.full_messages @@ -26,11 +27,35 @@ module Gestionnaires end end + def parent_groupe_gestionnaire + if (@last_commentaire) + @commentaire_seen_at = current_gestionnaire.commentaire_seen_at(@groupe_gestionnaire, current_gestionnaire.id, "Gestionnaire") + current_gestionnaire.mark_commentaire_as_seen(@groupe_gestionnaire, current_gestionnaire.id, "Gestionnaire") + end + @commentaire = CommentaireGroupeGestionnaire.new + end + + def create_parent_groupe_gestionnaire + @commentaire = @groupe_gestionnaire.commentaire_groupe_gestionnaires.create(commentaire_params.merge(sender: current_gestionnaire)) + + if @commentaire.errors.empty? + commentaire_url = gestionnaire_groupe_gestionnaire_commentaire_url(@groupe_gestionnaire.parent, @commentaire) + @groupe_gestionnaire.parent.gestionnaires.each do |gestionnaire| + GroupeGestionnaireMailer.notify_new_commentaire_groupe_gestionnaire(@groupe_gestionnaire.parent, @commentaire, @commentaire.sender_email, gestionnaire.email, commentaire_url).deliver_later + end + current_gestionnaire.mark_commentaire_as_seen(@groupe_gestionnaire, @commentaire.sender_id, @commentaire.sender_type) + flash.notice = "Message envoyé" + redirect_to parent_groupe_gestionnaire_gestionnaire_groupe_gestionnaire_commentaires_path(@groupe_gestionnaire) + else + flash.alert = @commentaire.errors.full_messages + render :parent_groupe_gestionnaire + end + end + def destroy if @last_commentaire.soft_deletable?(current_gestionnaire) @last_commentaire.soft_delete! - @commentaire_seen_at = current_gestionnaire.commentaire_seen_at(@groupe_gestionnaire, @last_commentaire.sender_id, @last_commentaire.sender_type) - + @commentaire_seen_at = current_gestionnaire.commentaire_seen_at(@last_commentaire.groupe_gestionnaire, @last_commentaire.sender_id, @last_commentaire.sender_type) flash.notice = t('.notice') else flash.alert = t('.alert_acl') @@ -42,7 +67,11 @@ module Gestionnaires private def retrieve_last_commentaire - @last_commentaire = @groupe_gestionnaire.commentaire_groupe_gestionnaires.find(params[:id]) + @last_commentaire = @groupe_gestionnaire.current_commentaires_groupe_and_children_commentaires_groupe.find(params[:id]) + end + + def retrieve_last_parent_groupe_gestionnaire_commentaire + @last_commentaire = @groupe_gestionnaire.commentaire_groupe_gestionnaires&.where(sender_id: current_gestionnaire.id, sender_type: "Gestionnaire")&.last end def commentaire_params diff --git a/app/models/administrateur.rb b/app/models/administrateur.rb index 594e2b4a7..48234f03a 100644 --- a/app/models/administrateur.rb +++ b/app/models/administrateur.rb @@ -147,7 +147,7 @@ class Administrateur < ApplicationRecord end def unread_commentaires? - commentaire_seen_at.nil? || commentaire_seen_at < commentaire_groupe_gestionnaires.last.created_at + commentaire_groupe_gestionnaires.last && (commentaire_seen_at.nil? || commentaire_seen_at < commentaire_groupe_gestionnaires.last.created_at) end def mark_commentaire_as_seen diff --git a/app/models/gestionnaire.rb b/app/models/gestionnaire.rb index 6e57052f5..c0589ce4e 100644 --- a/app/models/gestionnaire.rb +++ b/app/models/gestionnaire.rb @@ -36,12 +36,18 @@ class Gestionnaire < ApplicationRecord end def unread_commentaires?(groupe_gestionnaire) - CommentaireGroupeGestionnaire + commentaires = CommentaireGroupeGestionnaire .joins(:groupe_gestionnaire) .joins("LEFT JOIN follow_commentaire_groupe_gestionnaires ON follow_commentaire_groupe_gestionnaires.groupe_gestionnaire_id = commentaire_groupe_gestionnaires.groupe_gestionnaire_id AND follow_commentaire_groupe_gestionnaires.sender_id = commentaire_groupe_gestionnaires.sender_id AND follow_commentaire_groupe_gestionnaires.sender_type = commentaire_groupe_gestionnaires.sender_type AND follow_commentaire_groupe_gestionnaires.gestionnaire_id = #{self.id}") - .where(groupe_gestionnaire: groupe_gestionnaire) - .where('follow_commentaire_groupe_gestionnaires.commentaire_seen_at IS NULL OR follow_commentaire_groupe_gestionnaires.commentaire_seen_at < commentaire_groupe_gestionnaires.created_at') - .exists? + .where(groupe_gestionnaire_id: groupe_gestionnaire.id, sender_type: "Administrateur") + unless groupe_gestionnaire.child_ids.empty? + commentaires = commentaires.or(CommentaireGroupeGestionnaire.where(groupe_gestionnaire_id: groupe_gestionnaire.child_ids, sender_type: "Gestionnaire")) + end + if groupe_gestionnaire.parent_id && !groupe_gestionnaires.exists?(id: groupe_gestionnaire.parent_id) + commentaires = commentaires.or(CommentaireGroupeGestionnaire.where(groupe_gestionnaire_id: groupe_gestionnaire.id, sender: self)) + end + commentaires = commentaires.where('follow_commentaire_groupe_gestionnaires.commentaire_seen_at IS NULL OR follow_commentaire_groupe_gestionnaires.commentaire_seen_at <= commentaire_groupe_gestionnaires.created_at') + commentaires.exists? end def commentaire_seen_at(groupe_gestionnaire, sender_id, sender_type) diff --git a/app/models/groupe_gestionnaire.rb b/app/models/groupe_gestionnaire.rb index 055b008f8..0e9f280c0 100644 --- a/app/models/groupe_gestionnaire.rb +++ b/app/models/groupe_gestionnaire.rb @@ -27,4 +27,12 @@ class GroupeGestionnaire < ApplicationRecord def parent_name parent&.name end + + def current_commentaires_groupe_and_children_commentaires_groupe + commentaires = CommentaireGroupeGestionnaire.where(groupe_gestionnaire_id: id, sender_type: "Administrateur") + unless child_ids.empty? + commentaires = commentaires.or(CommentaireGroupeGestionnaire.where(groupe_gestionnaire_id: child_ids, sender_type: "Gestionnaire")) + end + commentaires + end end diff --git a/app/views/administrateurs/groupe_gestionnaire/commentaires.html.haml b/app/views/administrateurs/groupe_gestionnaire/commentaires.html.haml index b95a9db5e..327d8ae94 100644 --- a/app/views/administrateurs/groupe_gestionnaire/commentaires.html.haml +++ b/app/views/administrateurs/groupe_gestionnaire/commentaires.html.haml @@ -9,5 +9,5 @@ %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, commentaire_seen_at: @commentaire_seen_at)) + = render(GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent.new(commentaire: commentaire, connected_user: current_administrateur, commentaire_seen_at: @commentaire_seen_at)) = render partial: "shared/groupe_gestionnaires/commentaires/form", locals: { commentaire: @commentaire, form_url: admin_groupe_gestionnaire_create_commentaire_path } diff --git a/app/views/gestionnaires/groupe_gestionnaire_commentaires/index.html.haml b/app/views/gestionnaires/groupe_gestionnaire_commentaires/index.html.haml index 1fdbb4285..be880cea7 100644 --- a/app/views/gestionnaires/groupe_gestionnaire_commentaires/index.html.haml +++ b/app/views/gestionnaires/groupe_gestionnaire_commentaires/index.html.haml @@ -13,4 +13,13 @@ %th= 'Dernier message' %th %tbody#commentaires - = render(GroupeGestionnaire::GroupeGestionnaireListCommentaires::CommentaireComponent.with_collection(@groupe_gestionnaire.commentaire_groupe_gestionnaires.select("sender_id, sender_type, sender_email, MAX(id) as id, MAX(created_at) as created_at").group(:sender_id, :sender_type, :sender_email).order("MAX(id) DESC"), groupe_gestionnaire: @groupe_gestionnaire)) + - commentaires = @groupe_gestionnaire.current_commentaires_groupe_and_children_commentaires_groupe + - if @groupe_gestionnaire.parent_id && !current_gestionnaire.groupe_gestionnaires.where(id: @groupe_gestionnaire.parent_id).exists? + - commentaires = commentaires.or(CommentaireGroupeGestionnaire.where(groupe_gestionnaire_id: @groupe_gestionnaire.id, sender: current_gestionnaire)) + = render(GroupeGestionnaire::GroupeGestionnaireListCommentaires::CommentaireComponent.with_collection(commentaires.select("sender_id, sender_type, sender_email, MAX(id) as id, MAX(created_at) as created_at").group(:sender_id, :sender_type, :sender_email).order("MAX(id) DESC"), groupe_gestionnaire: @groupe_gestionnaire)) + - if @groupe_gestionnaire.parent_id && !current_gestionnaire.groupe_gestionnaires.where(id: @groupe_gestionnaire.parent_id).exists? && @last_commentaire.nil? + %tr + %td= "Messages avec le groupe gestionnaire parent (#{@groupe_gestionnaire.parent.name})" + %td + %td + = link_to 'Voir', parent_groupe_gestionnaire_gestionnaire_groupe_gestionnaire_commentaires_path(@groupe_gestionnaire), class: 'fr-btn fr-btn--sm fr-btn--tertiary' diff --git a/app/views/gestionnaires/groupe_gestionnaire_commentaires/parent_groupe_gestionnaire.haml b/app/views/gestionnaires/groupe_gestionnaire_commentaires/parent_groupe_gestionnaire.haml new file mode 100644 index 000000000..6c0b8cd2b --- /dev/null +++ b/app/views/gestionnaires/groupe_gestionnaire_commentaires/parent_groupe_gestionnaire.haml @@ -0,0 +1,15 @@ += render partial: 'gestionnaires/breadcrumbs', + locals: { steps: [['Groupes gestionnaire', gestionnaire_groupe_gestionnaires_path], + ["#{@groupe_gestionnaire.name.truncate_words(10)}", gestionnaire_groupe_gestionnaire_path(@groupe_gestionnaire)], + ["Messagerie", gestionnaire_groupe_gestionnaire_commentaires_path(@groupe_gestionnaire)], + ["Messages avec le groupe gestionnaire parent (#{@groupe_gestionnaire.parent.name})"]], preview: false } + +.container + %h1 Messages avec le groupe gestionnaire parent « #{ "(#{@groupe_gestionnaire.parent.name})" } » +.messagerie.container + - unless (commentaires = @groupe_gestionnaire.commentaire_groupe_gestionnaires.where(sender_id: current_gestionnaire.id, sender_type: "Gestionnaire")).empty? + %ul.messages-list{ data: { controller: 'scroll-to' } } + - commentaires.each do |commentaire| + %li.message{ class: commentaire_is_from_me_class(commentaire, current_gestionnaire), id: dom_id(commentaire) } + = render(GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent.new(commentaire: commentaire, connected_user: current_gestionnaire, commentaire_seen_at: @commentaire_seen_at)) + = render partial: "shared/groupe_gestionnaires/commentaires/form", locals: { commentaire: @commentaire, form_url: create_parent_groupe_gestionnaire_gestionnaire_groupe_gestionnaire_commentaires_path(@groupe_gestionnaire) } diff --git a/app/views/gestionnaires/groupe_gestionnaire_commentaires/show.html.haml b/app/views/gestionnaires/groupe_gestionnaire_commentaires/show.html.haml index 28188e1cb..35eef1207 100644 --- a/app/views/gestionnaires/groupe_gestionnaire_commentaires/show.html.haml +++ b/app/views/gestionnaires/groupe_gestionnaire_commentaires/show.html.haml @@ -8,7 +8,7 @@ %h1 Messages de « #{ @last_commentaire.sender_email } » .messagerie.container %ul.messages-list{ data: { controller: 'scroll-to' } } - - @groupe_gestionnaire.commentaire_groupe_gestionnaires.where(sender_id: @last_commentaire.sender_id, sender_type: @last_commentaire.sender_type).each do |commentaire| + - @groupe_gestionnaire.current_commentaires_groupe_and_children_commentaires_groupe.where(sender_id: @last_commentaire.sender_id, sender_type: @last_commentaire.sender_type).each do |commentaire| %li.message{ class: commentaire_is_from_me_class(commentaire, current_gestionnaire), id: dom_id(commentaire) } = render(GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent.new(commentaire: commentaire, connected_user: current_gestionnaire, commentaire_seen_at: @commentaire_seen_at)) - if @last_commentaire.sender diff --git a/config/routes.rb b/config/routes.rb index 5c63bc447..d918962d0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -515,7 +515,12 @@ Rails.application.routes.draw do delete :remove, on: :member end resources :children, controller: 'groupe_gestionnaire_children', only: [:index, :create, :destroy] - resources :commentaires, controller: 'groupe_gestionnaire_commentaires', only: [:index, :show, :create, :destroy] + resources :commentaires, controller: 'groupe_gestionnaire_commentaires', only: [:index, :show, :create, :destroy] do + collection do + get 'parent_groupe_gestionnaire' + post 'create_parent_groupe_gestionnaire' + end + end member do get :tree_structure, path: 'arborescence' end diff --git a/db/schema.rb b/db/schema.rb index d07a0121e..a55faa01e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -98,7 +98,6 @@ ActiveRecord::Schema[7.0].define(version: 2024_01_26_071130) do t.datetime "created_at", null: false t.string "encrypted_token", null: false t.date "expiration_notices_sent_at", default: [], array: true - t.date "expires_at" t.datetime "last_v1_authenticated_at" t.datetime "last_v2_authenticated_at" t.string "name", null: false @@ -106,6 +105,7 @@ ActiveRecord::Schema[7.0].define(version: 2024_01_26_071130) do t.datetime "updated_at", null: false t.integer "version", default: 3, null: false t.boolean "write_access", default: true, null: false + t.date "expires_at" t.index ["administrateur_id"], name: "index_api_tokens_on_administrateur_id" end diff --git a/spec/controllers/gestionnaires/groupe_gestionnaire_commentaires_controller_spec.rb b/spec/controllers/gestionnaires/groupe_gestionnaire_commentaires_controller_spec.rb index e6b659598..3da31765d 100644 --- a/spec/controllers/gestionnaires/groupe_gestionnaire_commentaires_controller_spec.rb +++ b/spec/controllers/gestionnaires/groupe_gestionnaire_commentaires_controller_spec.rb @@ -5,24 +5,44 @@ describe Gestionnaires::GroupeGestionnaireCommentairesController, type: :control let!(:commentaire) { create(:commentaire_groupe_gestionnaire, groupe_gestionnaire: groupe_gestionnaire, sender: administrateur) } describe "#index" do + let(:subject_gestionnaire) { gestionnaire } + let(:subject_groupe_gestionnaire) { groupe_gestionnaire } render_views - subject { get :index, params: { groupe_gestionnaire_id: groupe_gestionnaire.id } } + subject { get :index, params: { groupe_gestionnaire_id: subject_groupe_gestionnaire.id } } context "when not logged" do before { subject } it { expect(response).to redirect_to(new_user_session_path) } end - context "when logged in" do + describe "when logged in" do before do - sign_in(gestionnaire.user) + sign_in(subject_gestionnaire.user) subject end - it do - expect(response).to have_http_status(:ok) - expect(assigns(:groupe_gestionnaire).commentaire_groupe_gestionnaires.select("sender_id, sender_type, sender_email, MAX(id) as id, MAX(created_at) as created_at").group(:sender_id, :sender_type, :sender_email).order("MAX(id) DESC")).to include(commentaire) - expect(response.body).to include(commentaire.sender_email) + context "in a root group" do + it do + expect(response).to have_http_status(:ok) + expect(assigns(:groupe_gestionnaire).current_commentaires_groupe_and_children_commentaires_groupe.select("sender_id, sender_type, sender_email, MAX(id) as id, MAX(created_at) as created_at").group(:sender_id, :sender_type, :sender_email).order("MAX(id) DESC")).to include(commentaire) + expect(response.body).to include(commentaire.sender_email) + expect(response.body).not_to include("Messages avec le groupe gestionnaire parent") + end + end + + context "in a child group" do + let(:child_gestionnaire) { create(:gestionnaire).tap { _1.user.update(last_sign_in_at: Time.zone.now) } } + let!(:child_groupe_gestionnaire) { create(:groupe_gestionnaire, ancestry: "/#{groupe_gestionnaire.id}/", gestionnaires: [child_gestionnaire]) } + let(:subject_groupe_gestionnaire) { child_groupe_gestionnaire } + let(:subject_gestionnaire) { child_gestionnaire } + let!(:commentaire_to_parent_groupe_gestionnaire) { create(:commentaire_groupe_gestionnaire, groupe_gestionnaire: child_groupe_gestionnaire, sender: child_gestionnaire) } + + it do + expect(response).to have_http_status(:ok) + expect(assigns(:groupe_gestionnaire).current_commentaires_groupe_and_children_commentaires_groupe.or(CommentaireGroupeGestionnaire.where(groupe_gestionnaire_id: child_groupe_gestionnaire.id, sender: child_gestionnaire)).select("sender_id, sender_type, sender_email, MAX(id) as id, MAX(created_at) as created_at").group(:sender_id, :sender_type, :sender_email).order("MAX(id) DESC")).to include(commentaire_to_parent_groupe_gestionnaire) + expect(response.body).to include(commentaire_to_parent_groupe_gestionnaire.sender_email) + expect(response.body).to include("Messages avec le groupe gestionnaire parent") + end end end end @@ -69,6 +89,62 @@ describe Gestionnaires::GroupeGestionnaireCommentairesController, type: :control end end + describe "#parent_groupe_gestionnaire" do + let!(:child_groupe_gestionnaire) { create(:groupe_gestionnaire, ancestry: "/#{groupe_gestionnaire.id}/", gestionnaires: [gestionnaire]) } + render_views + subject { get :parent_groupe_gestionnaire, params: { groupe_gestionnaire_id: child_groupe_gestionnaire.id } } + + context "when not logged" do + before { subject } + it { expect(response).to redirect_to(new_user_session_path) } + end + + describe "when logged in" do + before do + sign_in(gestionnaire.user) + subject + end + + context "without a commentaire to parent_group_gestionnaire" do + it do + expect(response).to have_http_status(:ok) + expect(assigns(:groupe_gestionnaire).commentaire_groupe_gestionnaires.where(sender: gestionnaire)).not_to include(commentaire) + expect(response.body).not_to include(commentaire.body) + end + end + + context "with a commentaire to parent_group_gestionnaire" do + let!(:commentaire) { create(:commentaire_groupe_gestionnaire, groupe_gestionnaire: child_groupe_gestionnaire, sender: gestionnaire) } + + it do + expect(response).to have_http_status(:ok) + expect(assigns(:groupe_gestionnaire).commentaire_groupe_gestionnaires.where(sender: gestionnaire)).to include(commentaire) + expect(response.body).to include(commentaire.body) + end + end + end + end + + describe "#create_parent_groupe_gestionnaire" do + let!(:child_groupe_gestionnaire) { create(:groupe_gestionnaire, ancestry: "/#{groupe_gestionnaire.id}/", gestionnaires: [gestionnaire]) } + before do + sign_in(gestionnaire.user) + post :create_parent_groupe_gestionnaire, + params: { + id: commentaire.id, + groupe_gestionnaire_id: child_groupe_gestionnaire.id, + commentaire_groupe_gestionnaire: { body: "avant\napres" } + } + end + + context 'of a new commentaire' do + it do + expect(child_groupe_gestionnaire.reload.commentaire_groupe_gestionnaires.map(&:body)).to include("avant\napres") + expect(flash.notice).to eq("Message envoyé") + end + end + end + describe "#destroy" do before do sign_in(gestionnaire.user)