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 }]) } 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 before do dossier.champs.second.update(data: address) end it { expect(data[:dossier][:champs][0][:__typename]).to eq "CommuneChamp" } it { expect(data[:dossier][:champs][1][:__typename]).to eq "AddressChamp" } 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) { 'on' } before do dossier.champs.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) { 'off' } 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 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_CHAMPS_QUERY = <<-GRAPHQL query($number: Int!) { dossier(number: $number) { id number champs { id label __typename ...CommuneChampFragment ... on AddressChamp { address { ...AddressFragment } } } } } fragment CommuneChampFragment on CommuneChamp { commune { ...CommuneFragment } } fragment CommuneFragment on Commune { code } fragment AddressFragment on Address { type label cityName cityCode streetName streetNumber } GRAPHQL end