RSpec.describe PrefillParams do describe "#to_a", vcr: { cassette_name: 'api_geo_all' } do let(:memory_store) { ActiveSupport::Cache.lookup_store(:memory_store) } let(:procedure) { create(:procedure, :published, types_de_champ_public:, types_de_champ_private:) } let(:dossier) { create(:dossier, :brouillon, procedure: procedure) } let(:types_de_champ_public) { [] } let(:types_de_champ_private) { [] } subject(:prefill_params_array) { described_class.new(dossier, params).to_a } before do allow(Rails).to receive(:cache).and_return(memory_store) Rails.cache.clear VCR.insert_cassette('api_geo_regions') VCR.insert_cassette('api_geo_departements') VCR.insert_cassette('api_geo_communes') VCR.insert_cassette('api_geo_epcis') end after do VCR.eject_cassette('api_geo_regions') VCR.eject_cassette('api_geo_departements') VCR.eject_cassette('api_geo_communes') VCR.eject_cassette('api_geo_epcis') end context "when the stable ids match the TypeDeChamp of the corresponding procedure" do let(:types_de_champ_public) { [{ type: :text }, { type: :textarea }] } let(:type_de_champ_1) { procedure.published_revision.types_de_champ_public.first } let(:value_1) { "any value" } let(:champ_id_1) { find_champ_by_stable_id(dossier, type_de_champ_1.stable_id).id } let(:type_de_champ_2) { procedure.published_revision.types_de_champ_public.second } let(:value_2) { "another value" } let(:champ_id_2) { find_champ_by_stable_id(dossier, type_de_champ_2.stable_id).id } let(:params) { { "champ_#{type_de_champ_1.to_typed_id_for_query}" => value_1, "champ_#{type_de_champ_2.to_typed_id_for_query}" => value_2 } } it "builds an array of hash(id, value) matching all the given params" do expect(prefill_params_array).to match([ { id: champ_id_1, value: value_1 }, { id: champ_id_2, value: value_2 } ]) end end context "when the typed id is not prefixed by 'champ_'" do let(:type_de_champ) { procedure.published_revision.types_de_champ_public.first } let(:types_de_champ_public) { [{ type: :text }] } let(:params) { { type_de_champ.to_typed_id_for_query => "value" } } it "filters out the champ" do expect(prefill_params_array).to match([]) end end context "when the typed id is unknown" do let(:params) { { "champ_jane_doe" => "value" } } it "filters out the unknown params" do expect(prefill_params_array).to match([]) end end context 'when there is no Champ that matches the TypeDeChamp with the given stable id' do let!(:type_de_champ) { create(:type_de_champ_text) } # goes to another procedure let(:params) { { "champ_#{type_de_champ.to_typed_id_for_query}" => "value" } } it "filters out the param" do expect(prefill_params_array).to match([]) end end shared_examples "a champ public value that is authorized" do |type_de_champ_type, value| context "when the type de champ is authorized (#{type_de_champ_type})" do let(:types_de_champ_public) { [{ type: type_de_champ_type }] } let(:type_de_champ) { procedure.published_revision.types_de_champ_public.first } let(:champ) { find_champ_by_stable_id(dossier, type_de_champ.stable_id) } let(:params) { { "champ_#{type_de_champ.to_typed_id_for_query}" => value } } it "builds an array of hash matching the given params" do expect(prefill_params_array).to match([{ id: champ.id }.merge(attributes(champ, value))]) end end end shared_examples "a champ private value that is authorized" do |type_de_champ_type, value| context "when the type de champ is authorized (#{type_de_champ_type})" do let(:types_de_champ_private) { [{ type: type_de_champ_type }] } let(:type_de_champ) { procedure.published_revision.types_de_champ_private.first } let(:champ) { find_champ_by_stable_id(dossier, type_de_champ.stable_id) } let(:params) { { "champ_#{type_de_champ.to_typed_id_for_query}" => value } } it "builds an array of hash matching the given params" do expect(prefill_params_array).to match([{ id: champ.id }.merge(attributes(champ, value))]) end end end shared_examples "a champ public value that is unauthorized" do |type_de_champ_type, value| let(:types_de_champ_public) { [{ type: type_de_champ_type }] } let(:type_de_champ) { procedure.published_revision.types_de_champ_public.first } let(:params) { { "champ_#{type_de_champ.to_typed_id_for_query}" => value } } context "when the type de champ is unauthorized (#{type_de_champ_type})" do it "filters out the param" do expect(prefill_params_array).to match([]) end end end it_behaves_like "a champ public value that is authorized", :text, "value" it_behaves_like "a champ public value that is authorized", :textarea, "value" it_behaves_like "a champ public value that is authorized", :decimal_number, "3.14" it_behaves_like "a champ public value that is authorized", :integer_number, "42" it_behaves_like "a champ public value that is authorized", :email, "value" it_behaves_like "a champ public value that is authorized", :phone, "value" it_behaves_like "a champ public value that is authorized", :iban, "value" it_behaves_like "a champ public value that is authorized", :civilite, "M." it_behaves_like "a champ public value that is authorized", :pays, "FR" it_behaves_like "a champ public value that is authorized", :regions, "03" it_behaves_like "a champ public value that is authorized", :date, "2022-12-22" it_behaves_like "a champ public value that is authorized", :datetime, "2022-12-22T10:30" it_behaves_like "a champ public value that is authorized", :yes_no, "true" it_behaves_like "a champ public value that is authorized", :yes_no, "false" it_behaves_like "a champ public value that is authorized", :checkbox, "true" it_behaves_like "a champ public value that is authorized", :checkbox, "false" it_behaves_like "a champ public value that is authorized", :drop_down_list, "value" it_behaves_like "a champ public value that is authorized", :departements, "03" it_behaves_like "a champ public value that is authorized", :communes, ['01', '01457'] it_behaves_like "a champ public value that is authorized", :annuaire_education, "0050009H" it_behaves_like "a champ public value that is authorized", :multiple_drop_down_list, ["val1", "val2"] it_behaves_like "a champ public value that is authorized", :dossier_link, "1" it_behaves_like "a champ public value that is authorized", :epci, ['01', '200042935'] it_behaves_like "a champ public value that is authorized", :siret, "13002526500013" it_behaves_like "a champ public value that is authorized", :rna, "value" context "when the public type de champ is authorized (repetition)" do let(:types_de_champ_public) { [{ type: :repetition, children: [{ type: :text }] }] } let(:type_de_champ) { procedure.published_revision.types_de_champ_public.first } let(:type_de_champ_child) { procedure.published_revision.children_of(type_de_champ).first } let(:type_de_champ_child_value) { "value" } let(:type_de_champ_child_value2) { "value2" } let(:params) { { "champ_#{type_de_champ.to_typed_id_for_query}" => [{ "champ_#{type_de_champ_child.to_typed_id_for_query}" => type_de_champ_child_value }, { "champ_#{type_de_champ_child.to_typed_id_for_query}" => type_de_champ_child_value2 }] } } it "builds an array of hash(id, value) matching the given params" do expect(prefill_params_array).to match([{ id: type_de_champ_child.champ.first.id, value: type_de_champ_child_value }, { id: type_de_champ_child.champ.second.id, value: type_de_champ_child_value2 }]) end end it_behaves_like "a champ private value that is authorized", :text, "value" it_behaves_like "a champ private value that is authorized", :textarea, "value" it_behaves_like "a champ private value that is authorized", :decimal_number, "3.14" it_behaves_like "a champ private value that is authorized", :integer_number, "42" it_behaves_like "a champ private value that is authorized", :email, "value" it_behaves_like "a champ private value that is authorized", :phone, "value" it_behaves_like "a champ private value that is authorized", :iban, "value" it_behaves_like "a champ private value that is authorized", :civilite, "M." it_behaves_like "a champ private value that is authorized", :pays, "FR" it_behaves_like "a champ private value that is authorized", :regions, "93" it_behaves_like "a champ private value that is authorized", :date, "2022-12-22" it_behaves_like "a champ private value that is authorized", :datetime, "2022-12-22T10:30" it_behaves_like "a champ private value that is authorized", :yes_no, "true" it_behaves_like "a champ private value that is authorized", :yes_no, "false" it_behaves_like "a champ private value that is authorized", :checkbox, "true" it_behaves_like "a champ private value that is authorized", :checkbox, "false" it_behaves_like "a champ private value that is authorized", :drop_down_list, "value" it_behaves_like "a champ private value that is authorized", :regions, "93" it_behaves_like "a champ private value that is authorized", :rna, "value" it_behaves_like "a champ private value that is authorized", :siret, "13002526500013" it_behaves_like "a champ private value that is authorized", :departements, "03" it_behaves_like "a champ private value that is authorized", :communes, ['01', '01457'] it_behaves_like "a champ private value that is authorized", :annuaire_education, "0050009H" it_behaves_like "a champ private value that is authorized", :multiple_drop_down_list, ["val1", "val2"] it_behaves_like "a champ private value that is authorized", :dossier_link, "1" it_behaves_like "a champ private value that is authorized", :epci, ['01', '200042935'] context "when the private type de champ is authorized (repetition)" do let(:types_de_champ_private) { [{ type: :repetition, children: [{ type: :text }] }] } let(:type_de_champ) { procedure.published_revision.types_de_champ_private.first } let(:type_de_champ_child) { procedure.published_revision.children_of(type_de_champ).first } let(:type_de_champ_child_value) { "value" } let(:type_de_champ_child_value2) { "value2" } let(:params) { { "champ_#{type_de_champ.to_typed_id_for_query}" => [{ "champ_#{type_de_champ_child.to_typed_id_for_query}" => type_de_champ_child_value }, { "champ_#{type_de_champ_child.to_typed_id_for_query}" => type_de_champ_child_value2 }] } } it "builds an array of hash(id, value) matching the given params" do expect(prefill_params_array).to match([{ id: type_de_champ_child.champ.first.id, value: type_de_champ_child_value }, { id: type_de_champ_child.champ.second.id, value: type_de_champ_child_value2 }]) end end it_behaves_like "a champ public value that is unauthorized", :decimal_number, "non decimal string" it_behaves_like "a champ public value that is unauthorized", :integer_number, "non integer string" it_behaves_like "a champ public value that is unauthorized", :number, "value" it_behaves_like "a champ public value that is unauthorized", :dossier_link, "value" it_behaves_like "a champ public value that is unauthorized", :titre_identite, "value" it_behaves_like "a champ public value that is unauthorized", :civilite, "value" it_behaves_like "a champ public value that is unauthorized", :date, "value" it_behaves_like "a champ public value that is unauthorized", :datetime, "value" it_behaves_like "a champ public value that is unauthorized", :datetime, "12-22-2022T10:30" it_behaves_like "a champ public value that is unauthorized", :linked_drop_down_list, "value" it_behaves_like "a champ public value that is unauthorized", :header_section, "value" it_behaves_like "a champ public value that is unauthorized", :explication, "value" it_behaves_like "a champ public value that is unauthorized", :piece_justificative, "value" it_behaves_like "a champ public value that is unauthorized", :cnaf, "value" it_behaves_like "a champ public value that is unauthorized", :dgfip, "value" it_behaves_like "a champ public value that is unauthorized", :pole_emploi, "value" it_behaves_like "a champ public value that is unauthorized", :mesri, "value" it_behaves_like "a champ public value that is unauthorized", :carte, "value" it_behaves_like "a champ public value that is unauthorized", :address, "value" it_behaves_like "a champ public value that is unauthorized", :pays, "value" it_behaves_like "a champ public value that is unauthorized", :regions, "value" it_behaves_like "a champ public value that is unauthorized", :departements, "value" it_behaves_like "a champ public value that is unauthorized", :communes, "value" it_behaves_like "a champ public value that is unauthorized", :multiple_drop_down_list, ["value"] context "when the public type de champ is unauthorized because of wrong value format (repetition)" do let(:types_de_champ_public) { [{ type: :repetition, children: [{ type: :text }] }] } let(:type_de_champ) { procedure.published_revision.types_de_champ_public.first } let(:type_de_champ_child) { procedure.published_revision.children_of(type_de_champ).first } let(:params) { { "champ_#{type_de_champ.to_typed_id_for_query}" => "value" } } it "builds an array of hash(id, value) matching the given params" do expect(prefill_params_array).to match([]) end end context "when the public type de champ is unauthorized because of wrong value typed_id (repetition)" do let(:types_de_champ_public) { [{ type: :repetition, children: [{ type: :text }] }] } let(:type_de_champ) { procedure.published_revision.types_de_champ_public.first } let(:type_de_champ_child) { procedure.published_revision.children_of(type_de_champ).first } let(:params) { { "champ_#{type_de_champ.to_typed_id_for_query}" => ["{\"wrong\":\"value\"}", "{\"wrong\":\"value2\"}"] } } it "builds an array of hash(id, value) matching the given params" do expect(prefill_params_array).to match([]) end end end 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 }) end def attributes(champ, value) TypesDeChamp::PrefillTypeDeChamp .build(champ.type_de_champ, procedure.active_revision) .to_assignable_attributes(champ, value) end end