demarches-normaliennes/spec/models/concern/dossier_prefillable_concern_spec.rb

93 lines
3.5 KiB
Ruby
Raw Normal View History

2022-11-28 15:54:14 +01:00
# frozen_string_literal: true
RSpec.describe DossierPrefillableConcern do
2022-11-28 15:54:14 +01:00
describe '.prefill!' do
let(:procedure) { create(:procedure, :published, types_de_champ_public:, types_de_champ_private:) }
2022-11-28 15:54:14 +01:00
let(:dossier) { create(:dossier, :brouillon, procedure: procedure) }
let(:types_de_champ_public) { [] }
let(:types_de_champ_private) { [] }
2022-11-28 15:54:14 +01:00
subject(:fill) do
dossier.prefill!(values)
dossier.reload
end
2022-11-28 15:54:14 +01:00
shared_examples 'a dossier marked as prefilled' do
it 'marks the dossier as prefilled' do
expect { fill }.to change { dossier.reload.prefilled }.from(nil).to(true)
end
end
context 'when champs_attributes is empty' do
2022-11-28 15:54:14 +01:00
let(:values) { [] }
it "doesn't mark the dossier as prefilled" do
expect { fill }.not_to change { dossier.reload.prefilled }.from(nil)
end
it "doesn't change champs_public" do
expect { fill }.not_to change { dossier.champs_public.to_a }
2022-11-28 15:54:14 +01:00
end
end
context 'when champs_attributes has values' do
2022-11-28 15:54:14 +01:00
context 'when the champs are valid' do
let(:types_de_champ_public) { [{ type: :text }, { type: :phone }] }
let(:types_de_champ_private) { [{ type: :text }] }
let(:type_de_champ_1) { procedure.published_revision.types_de_champ_public.first }
2022-11-28 15:54:14 +01:00
let(:value_1) { "any value" }
2022-12-01 11:17:48 +01:00
let(:champ_id_1) { find_champ_by_stable_id(dossier, type_de_champ_1.stable_id).id }
2022-11-28 15:54:14 +01:00
let(:type_de_champ_2) { procedure.published_revision.types_de_champ_public.second }
2022-11-28 15:54:14 +01:00
let(:value_2) { "33612345678" }
2022-12-01 11:17:48 +01:00
let(:champ_id_2) { find_champ_by_stable_id(dossier, type_de_champ_2.stable_id).id }
2022-11-28 15:54:14 +01:00
let(:type_de_champ_3) { procedure.published_revision.types_de_champ_private.first }
let(:value_3) { "some value" }
let(:champ_id_3) { find_champ_by_stable_id(dossier, type_de_champ_3.stable_id).id }
let(:values) { [{ id: champ_id_1, value: value_1 }, { id: champ_id_2, value: value_2 }, { id: champ_id_3, value: value_3 }] }
2022-11-28 15:54:14 +01:00
it_behaves_like 'a dossier marked as prefilled'
2022-12-01 12:00:21 +01:00
it "updates the champs with the new values and mark them as prefilled" do
2022-11-28 15:54:14 +01:00
fill
2022-12-01 12:00:21 +01:00
2022-11-28 15:54:14 +01:00
expect(dossier.champs_public.first.value).to eq(value_1)
2022-12-01 12:00:21 +01:00
expect(dossier.champs_public.first.prefilled).to eq(true)
2022-11-28 15:54:14 +01:00
expect(dossier.champs_public.last.value).to eq(value_2)
2022-12-01 12:00:21 +01:00
expect(dossier.champs_public.last.prefilled).to eq(true)
expect(dossier.champs_private.first.value).to eq(value_3)
expect(dossier.champs_private.first.prefilled).to eq(true)
2022-11-28 15:54:14 +01:00
end
end
context 'when a champ is invalid' do
let(:types_de_champ_public) { [{ type: :phone }] }
let(:type_de_champ_1) { procedure.published_revision.types_de_champ_public.first }
2022-11-28 15:54:14 +01:00
let(:value) { "a non phone value" }
let(:champ_id) { find_champ_by_stable_id(dossier, type_de_champ_1.stable_id).id }
2022-11-28 15:54:14 +01:00
let(:values) { [{ id: champ_id, value: value }] }
it_behaves_like 'a dossier marked as prefilled'
2022-11-28 15:54:14 +01:00
it "still updates the champ" do
expect { fill }.to change { dossier.champs_public.first.value }.from(nil).to(value)
end
2022-12-01 12:00:21 +01:00
it "still marks it as prefilled" do
2022-12-14 10:15:30 +01:00
expect { fill }.to change { dossier.champs_public.first.prefilled }.from(nil).to(true)
2022-12-01 12:00:21 +01:00
end
2022-11-28 15:54:14 +01:00
end
end
end
2022-12-01 11:17:48 +01:00
private
def find_champ_by_stable_id(dossier, stable_id)
dossier.champs.joins(:type_de_champ).find_by(types_de_champ: { stable_id: stable_id })
2022-12-01 11:17:48 +01:00
end
2022-11-28 15:54:14 +01:00
end