RSpec.describe Types::DossierType, type: :graphql do let(:query) { DOSSIER_QUERY } let(:context) { { internal_use: true } } let(:variables) { {} } subject { API::V2::Schema.execute(query, variables: variables, context: context) } let(:data) { subject['data'].deep_symbolize_keys } let(:errors) { subject['errors'].deep_symbolize_keys } describe 'dossier with attestation' do let(:dossier) { create(:dossier, :accepte, :with_attestation) } let(:query) { DOSSIER_WITH_ATTESTATION_QUERY } let(:variables) { { number: dossier.id } } it { expect(data[:dossier][:attestation]).not_to be_nil } it { expect(data[:dossier][:traitements]).to eq([{ state: 'accepte' }]) } it { expect(data[:dossier][:dateExpiration]).not_to be_nil } context 'when attestation is nil' do before do dossier.update(attestation: nil) end it { expect(data[:dossier][:attestation]).to be_nil } end end describe 'dossier with champs' do let(:procedure) { create(:procedure, :published, types_de_champ_public: [{ type: :communes }, { type: :address }, { type: :siret }, { type: :rna }]) } let(:dossier) { create(:dossier, :accepte, :with_populated_champs, procedure: procedure) } let(:query) { DOSSIER_WITH_CHAMPS_QUERY } let(:variables) { { number: dossier.id } } let(:address) do { "type" => "housenumber", "label" => "33 Rue Rébeval 75019 Paris", "city_code" => "75119", "city_name" => "Paris", "postal_code" => "75019", "region_code" => "11", "region_name" => "Île-de-France", "street_name" => "Rue Rébeval", "street_number" => "33", "street_address" => "33 Rue Rébeval", "department_code" => "75", "department_name" => "Paris" } end let(:rna) do { "adresse" => { "commune" => "Paris 14e", "type_voie" => "RUE", "code_insee" => "75114", "complement" => nil, "code_postal" => "75512", "numero_voie" => "12", "distribution" => nil, "libelle_voie" => "xyz" }, "association_rna" => "W173847273", "association_objet" => "prévenir", "association_titre" => "CROIX ROUGE", "association_date_creation" => "1964-12-30", "association_date_declaration" => "2022-08-10" } end before do dossier.champs_public.find { _1.type_champ == TypeDeChamp.type_champs.fetch(:address) }.update(data: address) dossier.champs_public.find { _1.type_champ == TypeDeChamp.type_champs.fetch(:rna) }.update(data: rna) end it do expect(data[:dossier][:champs][0][:__typename]).to eq "CommuneChamp" expect(data[:dossier][:champs][1][:__typename]).to eq "AddressChamp" expect(data[:dossier][:champs][2][:__typename]).to eq "SiretChamp" expect(data[:dossier][:champs][1][:commune][:code]).to eq('75119') expect(data[:dossier][:champs][1][:commune][:postalCode]).to eq('75019') expect(data[:dossier][:champs][1][:departement][:code]).to eq('75') expect(data[:dossier][:champs][2][:etablissement][:siret]).to eq dossier.champs_public[2].etablissement.siret expect(data[:dossier][:champs][0][:id]).to eq(data[:dossier][:revision][:champDescriptors][0][:id]) expect(data[:dossier][:champs][3][:rna][:id]).to eq('W173847273') expect(data[:dossier][:champs][3][:rna][:title]).to eq('CROIX ROUGE') expect(data[:dossier][:champs][3][:rna][:address][:label]).to eq('12 RUE xyz 75512 Paris 14e') expect(data[:dossier][:champs][3][:rna][:address][:streetNumber]).to eq('12') end context 'when etablissement is in degraded mode' do let(:etablissement) { dossier.champs_public.third.etablissement } before do etablissement.update(adresse: nil) end it do expect(etablissement).to be_as_degraded_mode expect(data[:dossier][:champs][2][:__typename]).to eq "SiretChamp" expect(data[:dossier][:champs][2][:etablissement]).to be_nil end end end describe 'dossier with annotations' do let(:procedure) { create(:procedure, :published, types_de_champ_private: [{ type: :engagement_juridique }]) } let(:dossier) { create(:dossier, :accepte, :with_populated_champs, procedure: procedure) } let(:query) { DOSSIER_WITH_ANNOTATIONS_QUERY } let(:variables) { { number: dossier.id } } it do expect(data[:dossier][:annotations][0][:__typename]).to eq "EngagementJuridiqueChamp" end end describe 'dossier with selected champ' do let(:procedure) { create(:procedure, types_de_champ_public: [{ libelle: 'yolo' }, { libelle: 'toto' }]) } let(:dossier) { create(:dossier, :en_construction, :with_populated_champs, procedure:) } let(:query) { DOSSIER_WITH_SELECTED_CHAMP_QUERY } let(:variables) { { number: dossier.id, id: champ.to_typed_id } } let(:champ) { dossier.champs_public.last } context 'when champ exists' do it { expect(data[:dossier][:champs].size).to eq 1 expect(data[:dossier][:champs][0][:label]).to eq "toto" } end context "when champ dosen't exists" do let(:variables) { { number: dossier.id, id: '1234' } } it { expect(data[:dossier][:champs].size).to eq 0 } end end describe 'dossier with conditional champs' do include Logic let(:stable_id) { 1234 } let(:condition) { ds_eq(champ_value(stable_id), constant(true)) } let(:procedure) { create(:procedure, :published, types_de_champ_public: [{ type: :checkbox, stable_id: stable_id }, { type: :text, condition: condition }]) } let(:dossier) { create(:dossier, :accepte, :with_populated_champs, procedure: procedure) } let(:query) { DOSSIER_WITH_CHAMPS_QUERY } let(:variables) { { number: dossier.id } } let(:checkbox_value) { 'true' } before do dossier.champs_public.first.update(value: checkbox_value) end context 'when checkbox is true' do it { expect(data[:dossier][:champs].size).to eq 2 } it { expect(data[:dossier][:champs][0][:__typename]).to eq "CheckboxChamp" } it { expect(data[:dossier][:champs][1][:__typename]).to eq "TextChamp" } end context 'when checkbox is false' do let(:checkbox_value) { 'false' } it { expect(data[:dossier][:champs].size).to eq 1 } it { expect(data[:dossier][:champs][0][:__typename]).to eq "CheckboxChamp" } end end describe 'dossier with user' do let(:dossier) { create(:dossier, :en_construction) } let(:query) { DOSSIER_WITH_USAGER_QUERY } let(:variables) { { number: dossier.id } } it { expect(data[:dossier][:usager]).not_to be_nil } end describe 'dossier with deleted user' do let(:dossier) { create(:dossier, :en_construction) } let(:query) { DOSSIER_WITH_USAGER_QUERY } let(:variables) { { number: dossier.id } } let(:email) { dossier.user.email } before do dossier.update(user_id: nil, deleted_user_email_never_send: email) end it { expect(data[:dossier][:usager]).not_to be_nil expect(data[:dossier][:usager][:email]).to eq(email) expect(data[:dossier][:usager][:id]).to eq('') } end describe 'dossier with linked dossier' do let(:procedure) { create(:procedure, :published, types_de_champ_public: [{ type: :dossier_link }]) } let(:dossier) { create(:dossier, :en_construction, :with_populated_champs, procedure: procedure) } let(:linked_dossier) { create(:dossier, :en_construction) } let(:query) { DOSSIER_WITH_LINKED_DOSIER_QUERY } let(:variables) { { number: dossier.id } } before do dossier.champs_public.first.update(value: linked_dossier.id) end context 'en_construction' do it { expect(data[:dossier][:champs].first).not_to be_nil expect(data[:dossier][:champs].first[:dossier][:id]).to eq(linked_dossier.to_typed_id) expect(data[:dossier][:champs].first[:dossier][:state]).to eq('en_construction') } end context 'brouillon' do let(:linked_dossier) { create(:dossier, :brouillon) } it { expect(data[:dossier][:champs].first).not_to be_nil expect(data[:dossier][:champs].first[:dossier]).to be_nil } end end describe 'dossier with repetition' do let(:procedure) { create(:procedure, :published, types_de_champ_public: [{ type: :repetition, children: [{ libelle: 'Nom' }, { libelle: 'Age' }] }]) } let(:dossier) { create(:dossier, :en_construction, :with_populated_champs, procedure: procedure) } let(:linked_dossier) { create(:dossier, :en_construction) } let(:query) { DOSSIER_WITH_REPETITION_QUERY } let(:variables) { { number: dossier.id } } let(:rows) do dossier.champs_public.first.rows.map do |champs| { champs: champs.map { { id: _1.to_typed_id } } } end end it { expect(data[:dossier][:champs].first).not_to be_nil expect(data[:dossier][:champs].first[:rows]).not_to be_nil expect(data[:dossier][:champs].first[:rows].size).to eq(2) expect(data[:dossier][:champs].first[:rows]).to eq(rows) } end describe 'dossier with titre identite filled' do let(:procedure) { create(:procedure, :published, types_de_champ_public: [{ type: :titre_identite }]) } let(:dossier) { create(:dossier, :accepte, :with_populated_champs, procedure: procedure) } let(:query) { DOSSIER_WITH_TITRE_IDENTITE_QUERY } let(:variables) { { number: dossier.id } } it { expect(data[:dossier][:champs][0][:filled]).to eq(true) } end describe 'dossier with titre identite not filled' do let(:procedure) { create(:procedure, :published, types_de_champ_public: [{ type: :titre_identite }]) } let(:dossier) { create(:dossier, :accepte, procedure: procedure) } let(:query) { DOSSIER_WITH_TITRE_IDENTITE_QUERY } let(:variables) { { number: dossier.id } } it { expect(data[:dossier][:champs][0][:filled]).to eq(false) } end describe 'dossier with motivation attachment' do let(:dossier) { create(:dossier, :accepte, :with_motivation, :with_justificatif) } let(:query) { DOSSIER_WITH_MOTIVATION_QUERY } let(:variables) { { number: dossier.id } } it { expect(data[:dossier][:motivationAttachment][:url]).not_to be_nil } end describe 'dossier with message with no attachments' do let(:dossier) { create(:dossier, :en_construction) } let(:query) { DOSSIER_WITH_MESSAGE_QUERY } let(:variables) { { number: dossier.id } } before { create(:commentaire, dossier: dossier) } it { expect(data[:dossier][:messages]).not_to be_nil expect(data[:dossier][:messages][0][:correction]).to be_nil } end describe 'dossier with pending correction' do let(:dossier) { create(:dossier, :en_construction) } let!(:correction) { create(:dossier_correction, dossier:) } let(:query) { DOSSIER_WITH_CORRECTION_QUERY } let(:variables) { { number: dossier.id } } it { expect(data[:dossier][:messages][0][:correction]).to eq({ reason: "incorrect", dateResolution: nil }) expect(data[:dossier][:dateDerniereCorrectionEnAttente]).not_to be_nil } end describe 'dossier on sva procedure' do let(:procedure) { create(:procedure, :sva) } let(:query) { DOSSIER_WITH_SVA_QUERY } let(:variables) { { number: dossier.id } } context 'dossier en_instruction' do let(:dossier) { create(:dossier, :en_instruction, procedure:, sva_svr_decision_on: 3.days.from_now.to_date) } it { expect(data[:dossier][:datePrevisionnelleDecisionSVASVR]).not_to be_nil } end context 'dossier accepte' do let(:dossier) { create(:dossier, :accepte, procedure:, sva_svr_decision_triggered_at: 24.hours.ago) } it { expect(data[:dossier][:dateTraitementSVASVR]).not_to be_nil } end end DOSSIER_QUERY = <<-GRAPHQL query($number: Int!) { dossier(number: $number) { id number } } GRAPHQL DOSSIER_WITH_USAGER_QUERY = <<-GRAPHQL query($number: Int!) { dossier(number: $number) { id number usager { id email } } } GRAPHQL DOSSIER_WITH_ATTESTATION_QUERY = <<-GRAPHQL query($number: Int!) { dossier(number: $number) { attestation { url } traitements { state } dateExpiration } } GRAPHQL DOSSIER_WITH_MOTIVATION_QUERY = <<-GRAPHQL query($number: Int!) { dossier(number: $number) { motivationAttachment { url } } } GRAPHQL DOSSIER_WITH_ANNOTATIONS_QUERY = <<-GRAPHQL query($number: Int!) { dossier(number: $number) { id number revision { champDescriptors { id label } } annotations { id label __typename ... on EngagementJuridiqueChamp { engagementJuridique { ...EngagementJuridiqueFragment } } } } } fragment EngagementJuridiqueFragment on EngagementJuridique { montantEngage montantPaye } GRAPHQL DOSSIER_WITH_CHAMPS_QUERY = <<-GRAPHQL query($number: Int!) { dossier(number: $number) { id number revision { champDescriptors { id label } } champs { id label __typename ...CommuneChampFragment ... on AddressChamp { address { ...AddressFragment } commune { ...CommuneFragment } departement { name code } } ... on SiretChamp { etablissement { siret entreprise { capitalSocial } } } ...RNAChampFragment } } } fragment CommuneChampFragment on CommuneChamp { commune { ...CommuneFragment } departement { name code } } fragment CommuneFragment on Commune { name code postalCode } fragment AddressFragment on Address { type label cityName cityCode streetName streetNumber } fragment RNAChampFragment on RNAChamp { stringValue rna { id title address { ...AddressFragment } } } GRAPHQL DOSSIER_WITH_LINKED_DOSIER_QUERY = <<-GRAPHQL query($number: Int!) { dossier(number: $number) { champs { id ... on DossierLinkChamp { dossier { id state } } } } } GRAPHQL DOSSIER_WITH_REPETITION_QUERY = <<-GRAPHQL query($number: Int!) { dossier(number: $number) { champs { id ... on RepetitionChamp { rows { champs { id } } } } } } GRAPHQL DOSSIER_WITH_TITRE_IDENTITE_QUERY = <<-GRAPHQL query($number: Int!) { dossier(number: $number) { id number champs { id label __typename ... on TitreIdentiteChamp { filled } } } } GRAPHQL DOSSIER_WITH_MESSAGE_QUERY = <<-GRAPHQL query($number: Int!) { dossier(number: $number) { messages { body attachments { filename } } } } GRAPHQL DOSSIER_WITH_CORRECTION_QUERY = <<-GRAPHQL query($number: Int!) { dossier(number: $number) { dateDerniereCorrectionEnAttente messages { body correction { reason dateResolution } } } } GRAPHQL DOSSIER_WITH_SVA_QUERY = <<-GRAPHQL query($number: Int!) { dossier(number: $number) { datePrevisionnelleDecisionSVASVR dateTraitementSVASVR } } GRAPHQL DOSSIER_WITH_SELECTED_CHAMP_QUERY = <<-GRAPHQL query($number: Int!, $id: ID!) { dossier(number: $number) { champs(id: $id) { id label } } } GRAPHQL end