44c410d40d
In production some pieces justificatives don't have an order place. In this case, insert the champs after the ones that have an order place.
138 lines
4.3 KiB
Ruby
138 lines
4.3 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe PiecesJustificativesService do
|
|
let(:user) { create(:user) }
|
|
let(:safe_file) { true }
|
|
|
|
before :each do
|
|
allow(ClamavService).to receive(:safe_file?).and_return(safe_file)
|
|
end
|
|
|
|
let(:hash) { {} }
|
|
let!(:tpj_not_mandatory) do
|
|
TypeDePieceJustificative.create(libelle: 'not mandatory', mandatory: false)
|
|
end
|
|
let!(:tpj_mandatory) do
|
|
TypeDePieceJustificative.create(libelle: 'justificatif', mandatory: true)
|
|
end
|
|
let(:procedure) { Procedure.create(types_de_piece_justificative: tpjs) }
|
|
let(:dossier) { Dossier.create(procedure: procedure) }
|
|
let(:errors) { PiecesJustificativesService.upload!(dossier, user, hash) }
|
|
let(:tpjs) { [tpj_not_mandatory] }
|
|
|
|
describe 'self.upload!' do
|
|
context 'when no params are given' do
|
|
it { expect(errors).to eq([]) }
|
|
end
|
|
|
|
context 'when there is something wrong with file save' do
|
|
let(:hash) do
|
|
{
|
|
"piece_justificative_#{tpj_not_mandatory.id}" =>
|
|
double(path: '', original_filename: 'filename')
|
|
}
|
|
end
|
|
|
|
it { expect(errors).to match(["le fichier filename (not mandatory) n'a pas pu être sauvegardé"]) }
|
|
end
|
|
|
|
context 'when a virus is provided' do
|
|
let(:safe_file) { false }
|
|
let(:hash) do
|
|
{
|
|
"piece_justificative_#{tpj_not_mandatory.id}" =>
|
|
double(path: '', original_filename: 'bad_file')
|
|
}
|
|
end
|
|
|
|
it { expect(errors).to match(['bad_file : virus détecté']) }
|
|
end
|
|
|
|
context 'when a regular file is provided' do
|
|
let(:content) { double(path: '', original_filename: 'filename') }
|
|
let(:hash) do
|
|
{
|
|
"piece_justificative_#{tpj_not_mandatory.id}" =>
|
|
content
|
|
}
|
|
end
|
|
|
|
before :each do
|
|
expect(PiecesJustificativesService).to receive(:save_pj)
|
|
.with(content, dossier, tpj_not_mandatory, user)
|
|
.and_return(nil)
|
|
end
|
|
|
|
it 'is saved' do
|
|
expect(errors).to match([])
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'missing_pj_error_messages' do
|
|
let(:errors) { PiecesJustificativesService.missing_pj_error_messages(dossier) }
|
|
let(:tpjs) { [tpj_mandatory] }
|
|
|
|
context 'when no params are given' do
|
|
it { expect(errors).to match(['La pièce jointe justificatif doit être fournie.']) }
|
|
end
|
|
|
|
context 'when the piece justificative is provided' do
|
|
before :each do
|
|
# we are messing around piece_justificative
|
|
# because directly doubling carrierwave params seems complicated
|
|
|
|
piece_justificative_double = double(type_de_piece_justificative: tpj_mandatory)
|
|
expect(dossier).to receive(:pieces_justificatives).and_return([piece_justificative_double])
|
|
end
|
|
|
|
it { expect(errors).to match([]) }
|
|
end
|
|
end
|
|
|
|
describe 'types_pj_as_types_de_champ' do
|
|
subject { PiecesJustificativesService.types_pj_as_types_de_champ(procedure) }
|
|
|
|
it 'generates one header champ, plus one champ per PJ' do
|
|
expect(subject.pluck(:libelle)).to contain_exactly("Pièces jointes", "not mandatory")
|
|
end
|
|
|
|
it 'remembers the id of the PJ that got converted into a champ' do
|
|
expect(subject.map(&:old_pj)).to include({ 'stable_id' => tpj_not_mandatory.id })
|
|
end
|
|
|
|
context 'without pre-existing champs' do
|
|
it 'generates a sequence of order_places incrementing from zero' do
|
|
expect(subject.pluck(:order_place)).to contain_exactly(0, 1)
|
|
end
|
|
end
|
|
|
|
context 'with pre-existing champs' do
|
|
let(:procedure) do
|
|
create(
|
|
:procedure,
|
|
types_de_piece_justificative: tpjs,
|
|
types_de_champ: [build(:type_de_champ, order_place: 0), build(:type_de_champ, order_place: 1)]
|
|
)
|
|
end
|
|
|
|
it 'generates a sequence of incrementing order_places that continues where the last type de champ left off' do
|
|
expect(subject.pluck(:order_place)).to contain_exactly(2, 3)
|
|
end
|
|
end
|
|
|
|
context 'with pre-existing champs without an order place' do
|
|
let(:procedure) do
|
|
create(
|
|
:procedure,
|
|
types_de_piece_justificative: tpjs,
|
|
types_de_champ: [build(:type_de_champ, order_place: 0), build(:type_de_champ, order_place: nil)]
|
|
)
|
|
end
|
|
|
|
it 'ignores champs without an order place' do
|
|
expect(subject.pluck(:order_place)).to contain_exactly(1, 2)
|
|
end
|
|
end
|
|
end
|
|
end
|