gestionnaire: move commentaire creation into a service
This commit is contained in:
parent
d31cc04b23
commit
750e1e0c83
4 changed files with 79 additions and 34 deletions
|
@ -113,15 +113,7 @@ module NewGestionnaire
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_commentaire
|
def create_commentaire
|
||||||
commentaire_hash = commentaire_params.merge(email: current_gestionnaire.email, dossier: dossier)
|
@commentaire = CommentaireService.create(current_gestionnaire, dossier, commentaire_params)
|
||||||
|
|
||||||
# avoid simple_format replacing '' by '<p></p>'
|
|
||||||
# and thus skipping the not empty constraint on commentaire's body
|
|
||||||
if commentaire_hash[:body].present?
|
|
||||||
commentaire_hash[:body] = simple_format(commentaire_hash[:body])
|
|
||||||
end
|
|
||||||
|
|
||||||
@commentaire = Commentaire.new(commentaire_hash)
|
|
||||||
|
|
||||||
if @commentaire.save
|
if @commentaire.save
|
||||||
current_gestionnaire.follow(dossier)
|
current_gestionnaire.follow(dossier)
|
||||||
|
|
17
app/services/commentaire_service.rb
Normal file
17
app/services/commentaire_service.rb
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
class CommentaireService
|
||||||
|
class << self
|
||||||
|
def create(sender, dossier, params)
|
||||||
|
attributes = params.merge(email: sender.email, dossier: dossier)
|
||||||
|
|
||||||
|
# If the user submits a empty message, simple_format will replace '' by '<p></p>',
|
||||||
|
# and thus bypass the not-empty constraint on commentaire's body.
|
||||||
|
#
|
||||||
|
# To avoid this, format the message only if a body is present in the first place.
|
||||||
|
if attributes[:body].present?
|
||||||
|
attributes[:body] = ActionController::Base.helpers.simple_format(attributes[:body])
|
||||||
|
end
|
||||||
|
|
||||||
|
Commentaire.new(attributes)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -269,7 +269,7 @@ describe NewGestionnaire::DossiersController, type: :controller do
|
||||||
describe "#create_commentaire" do
|
describe "#create_commentaire" do
|
||||||
let(:saved_commentaire) { dossier.commentaires.first }
|
let(:saved_commentaire) { dossier.commentaires.first }
|
||||||
let(:body) { "avant\napres" }
|
let(:body) { "avant\napres" }
|
||||||
let(:file) { nil }
|
let(:file) { Rack::Test::UploadedFile.new("./spec/support/files/piece_justificative_0.pdf", 'application/pdf') }
|
||||||
let(:scan_result) { true }
|
let(:scan_result) { true }
|
||||||
|
|
||||||
subject {
|
subject {
|
||||||
|
@ -287,35 +287,23 @@ describe NewGestionnaire::DossiersController, type: :controller do
|
||||||
allow(ClamavService).to receive(:safe_file?).and_return(scan_result)
|
allow(ClamavService).to receive(:safe_file?).and_return(scan_result)
|
||||||
end
|
end
|
||||||
|
|
||||||
it do
|
it "creates a commentaire" do
|
||||||
subject
|
expect { subject }.to change(Commentaire, :count).by(1)
|
||||||
|
|
||||||
expect(saved_commentaire.body).to eq("<p>avant\n<br />apres</p>")
|
|
||||||
expect(saved_commentaire.email).to eq(gestionnaire.email)
|
|
||||||
expect(saved_commentaire.dossier).to eq(dossier)
|
|
||||||
expect(response).to redirect_to(messagerie_gestionnaire_dossier_path(dossier.procedure, dossier))
|
|
||||||
expect(gestionnaire.followed_dossiers).to include(dossier)
|
expect(gestionnaire.followed_dossiers).to include(dossier)
|
||||||
expect(saved_commentaire.file.present?).to eq(false)
|
|
||||||
|
expect(response).to redirect_to(messagerie_gestionnaire_dossier_path(dossier.procedure, dossier))
|
||||||
|
expect(flash.notice).to be_present
|
||||||
end
|
end
|
||||||
|
|
||||||
it { expect { subject }.to change(Commentaire, :count).by(1) }
|
context "when the commentaire creation fails" do
|
||||||
|
|
||||||
context "without a body" do
|
|
||||||
let(:body) { nil }
|
|
||||||
|
|
||||||
it { expect { subject }.not_to change(Commentaire, :count) }
|
|
||||||
end
|
|
||||||
|
|
||||||
context "with a file" do
|
|
||||||
let(:file) { Rack::Test::UploadedFile.new("./spec/support/files/piece_justificative_0.pdf", 'application/pdf') }
|
|
||||||
|
|
||||||
it { subject; expect(saved_commentaire.file.present?).to eq(true) }
|
|
||||||
it { expect { subject }.to change(Commentaire, :count).by(1) }
|
|
||||||
|
|
||||||
context "and a virus" do
|
|
||||||
let(:scan_result) { false }
|
let(:scan_result) { false }
|
||||||
|
|
||||||
it { expect { subject }.not_to change(Commentaire, :count) }
|
it "renders the messagerie page with the invalid commentaire" do
|
||||||
|
expect { subject }.not_to change(Commentaire, :count)
|
||||||
|
|
||||||
|
expect(response).to render_template :messagerie
|
||||||
|
expect(flash.alert).to be_present
|
||||||
|
expect(assigns(:commentaire).body).to eq("<p>avant\n<br />apres</p>")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
48
spec/services/commentaire_service_spec.rb
Normal file
48
spec/services/commentaire_service_spec.rb
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe CommentaireService do
|
||||||
|
describe '.create' do
|
||||||
|
let(:dossier) { create :dossier }
|
||||||
|
let(:sender) { dossier.user }
|
||||||
|
let(:body) { 'Contenu du message.' }
|
||||||
|
let(:file) { nil }
|
||||||
|
let(:scan_result) { true }
|
||||||
|
|
||||||
|
subject(:commentaire) { CommentaireService.create(sender, dossier, { body: body, file: file }) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(ClamavService).to receive(:safe_file?).and_return(scan_result)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'creates a new valid commentaire' do
|
||||||
|
expect(commentaire.email).to eq sender.email
|
||||||
|
expect(commentaire.dossier).to eq dossier
|
||||||
|
expect(commentaire.body).to eq '<p>Contenu du message.</p>'
|
||||||
|
expect(commentaire.file).to be_blank
|
||||||
|
expect(commentaire).to be_valid
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the body is empty' do
|
||||||
|
let(:body) { nil }
|
||||||
|
|
||||||
|
it 'creates an invalid comment' do
|
||||||
|
expect(commentaire.body).to be nil
|
||||||
|
expect(commentaire.valid?).to be false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when it has a file' do
|
||||||
|
let(:file) { Rack::Test::UploadedFile.new("./spec/support/files/piece_justificative_0.pdf", 'application/pdf') }
|
||||||
|
|
||||||
|
it 'saves the attached file' do
|
||||||
|
expect(commentaire.file).to be_present
|
||||||
|
expect(commentaire).to be_valid
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'and a virus' do
|
||||||
|
let(:scan_result) { false }
|
||||||
|
it { expect(commentaire).not_to be_valid }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue