From 07962cc2c7ec35a00faa8a81102abedc843ffd92 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Tue, 21 Sep 2021 11:01:04 +0200 Subject: [PATCH 1/5] service: match remote keys --- .../api_particulier/services/sources_service.rb | 8 ++++---- config/locales/api_particulier.fr.yml | 16 ++++++++-------- .../jeton_particulier_controller_spec.rb | 2 +- .../sources_particulier_controller_spec.rb | 14 +++++++------- .../services/sources_service_spec.rb | 8 ++++---- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/app/lib/api_particulier/services/sources_service.rb b/app/lib/api_particulier/services/sources_service.rb index 4d923ca2e..26971ae32 100644 --- a/app/lib/api_particulier/services/sources_service.rb +++ b/app/lib/api_particulier/services/sources_service.rb @@ -52,10 +52,10 @@ module APIParticulier def providers { 'cnaf' => { - 'allocataires' => ['noms_prenoms', 'date_de_naissance', 'sexe'], - 'enfants' => ['noms_prenoms', 'date_de_naissance', 'sexe'], - 'adresse' => ['identite', 'complement_d_identite', 'complement_d_identite_geo', 'numero_et_rue', 'lieu_dit', 'code_postal_et_ville', 'pays'], - 'quotient_familial' => ['quotient_familial', 'annee', 'mois'] + 'allocataires' => ['nomPrenom', 'dateDeNaissance', 'sexe'], + 'enfants' => ['nomPrenom', 'dateDeNaissance', 'sexe'], + 'adresse' => ['identite', 'complementIdentite', 'complementIdentiteGeo', 'numeroRue', 'lieuDit', 'codePostalVille', 'pays'], + 'quotient_familial' => ['quotientFamilial', 'annee', 'mois'] } } end diff --git a/config/locales/api_particulier.fr.yml b/config/locales/api_particulier.fr.yml index 2c5a484b9..39841906f 100644 --- a/config/locales/api_particulier.fr.yml +++ b/config/locales/api_particulier.fr.yml @@ -5,8 +5,8 @@ fr: libelle: Caisse d’allocations familiales (CAF) scopes: personne: &personne - noms_prenoms: noms et prénoms - date_de_naissance: date de naissance + nomPrenom: noms et prénoms + dateDeNaissance: date de naissance sexe: genre allocataires: libelle: allocataires @@ -17,14 +17,14 @@ fr: adresse: libelle: adresse identite: identité - complement_d_identite: complément d’identité - complement_d_identite_geo: complément d’identité géographique - numero_et_rue: numéro et rue - lieu_dit: lieu-dit - code_postal_et_ville: code postal et ville + complementIdentite: complément d’identité + complementIdentiteGeo: complément d’identité géographique + numeroRue: numéro et rue + lieuDit: lieu-dit + codePostalVille: code postal et ville pays: pays quotient_familial: libelle: quotient familial - quotient_familial: quotient familial + quotientFamilial: quotient familial mois: mois annee: année diff --git a/spec/controllers/new_administrateur/jeton_particulier_controller_spec.rb b/spec/controllers/new_administrateur/jeton_particulier_controller_spec.rb index 9a7a548cf..5142c78e2 100644 --- a/spec/controllers/new_administrateur/jeton_particulier_controller_spec.rb +++ b/spec/controllers/new_administrateur/jeton_particulier_controller_spec.rb @@ -40,7 +40,7 @@ describe NewAdministrateur::JetonParticulierController, type: :controller do context "and the api response is a success" do let(:cassette) { "api_particulier/success/introspect" } - let(:procedure) { create(:procedure, administrateur: admin, api_particulier_sources: { cnaf: { allocataires: ['noms_prenoms'] } }) } + let(:procedure) { create(:procedure, administrateur: admin, api_particulier_sources: { cnaf: { allocataires: ['nomPrenom'] } }) } it 'saves the jeton' do expect(flash.alert).to be_nil diff --git a/spec/controllers/new_administrateur/sources_particulier_controller_spec.rb b/spec/controllers/new_administrateur/sources_particulier_controller_spec.rb index c2a808c8c..0834e795f 100644 --- a/spec/controllers/new_administrateur/sources_particulier_controller_spec.rb +++ b/spec/controllers/new_administrateur/sources_particulier_controller_spec.rb @@ -4,18 +4,18 @@ describe NewAdministrateur::SourcesParticulierController, type: :controller do before { sign_in(admin.user) } describe "#show" do - let(:procedure) { create(:procedure, administrateur: admin, api_particulier_scopes: ['cnaf_enfants'], api_particulier_sources: { cnaf: { enfants: ['noms_prenoms'] } }) } + let(:procedure) { create(:procedure, administrateur: admin, api_particulier_scopes: ['cnaf_enfants'], api_particulier_sources: { cnaf: { enfants: ['nomPrenom'] } }) } render_views subject { get :show, params: { procedure_id: procedure.id } } it 'renders the sources form' do - expect(subject.body).to include(I18n.t('api_particulier.providers.cnaf.scopes.enfants.date_de_naissance')) - expect(subject.body).to have_selector("input#api_particulier_sources_cnaf_enfants_[value=noms_prenoms][checked=checked]") + expect(subject.body).to include(I18n.t('api_particulier.providers.cnaf.scopes.enfants.dateDeNaissance')) + expect(subject.body).to have_selector("input#api_particulier_sources_cnaf_enfants_[value=nomPrenom][checked=checked]") - expect(subject.body).to have_selector("input#api_particulier_sources_cnaf_enfants_[value=date_de_naissance]") - expect(subject.body).not_to have_selector("input#api_particulier_sources_cnaf_enfants_[value=date_de_naissance][checked=checked]") + expect(subject.body).to have_selector("input#api_particulier_sources_cnaf_enfants_[value=dateDeNaissance]") + expect(subject.body).not_to have_selector("input#api_particulier_sources_cnaf_enfants_[value=dateDeNaissance][checked=checked]") end end @@ -47,12 +47,12 @@ describe NewAdministrateur::SourcesParticulierController, type: :controller do context 'when an authorized source is requested' do let(:requested_sources) do { - api_particulier_sources: { cnaf: { enfants: ['noms_prenoms'] } } + api_particulier_sources: { cnaf: { enfants: ['nomPrenom'] } } } end it 'saves the source' do - expect(procedure.api_particulier_sources).to eq("cnaf" => { "enfants" => ["noms_prenoms"] }) + expect(procedure.api_particulier_sources).to eq("cnaf" => { "enfants" => ["nomPrenom"] }) expect(flash.notice).to eq(I18n.t(".new_administrateur.sources_particulier.update.sources_ok")) end end diff --git a/spec/lib/api_particulier/services/sources_service_spec.rb b/spec/lib/api_particulier/services/sources_service_spec.rb index 6c02a5fa2..33e0c5208 100644 --- a/spec/lib/api_particulier/services/sources_service_spec.rb +++ b/spec/lib/api_particulier/services/sources_service_spec.rb @@ -23,8 +23,8 @@ describe APIParticulier::Services::SourcesService do let(:cnaf_allocataires_and_enfants) do { 'cnaf' => { - 'allocataires' => ['noms_prenoms', 'date_de_naissance', 'sexe'], - 'enfants' => ['noms_prenoms', 'date_de_naissance', 'sexe'] + 'allocataires' => ['nomPrenom', 'dateDeNaissance', 'sexe'], + 'enfants' => ['nomPrenom', 'dateDeNaissance', 'sexe'] } } end @@ -40,7 +40,7 @@ describe APIParticulier::Services::SourcesService do let(:requested_sources) do { 'cnaf' => { - 'allocataires' => ['noms_prenoms', 'forbidden_sources', { 'weird_object' => 1 }], + 'allocataires' => ['nomPrenom', 'forbidden_sources', { 'weird_object' => 1 }], 'forbidden_scope' => ['any_source'], 'adresse' => { 'weird_object' => 1 } }, @@ -48,6 +48,6 @@ describe APIParticulier::Services::SourcesService do } end - it { is_expected.to eq({ 'cnaf' => { 'allocataires' => ['noms_prenoms'] } }) } + it { is_expected.to eq({ 'cnaf' => { 'allocataires' => ['nomPrenom'] } }) } end end From ceb09c5967f3c01dedea381ecba8e438f210847e Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Tue, 21 Sep 2021 12:14:07 +0200 Subject: [PATCH 2/5] api remove useless symbolize --- app/lib/api_particulier/api.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/lib/api_particulier/api.rb b/app/lib/api_particulier/api.rb index 1d6665edb..22d09c00e 100644 --- a/app/lib/api_particulier/api.rb +++ b/app/lib/api_particulier/api.rb @@ -10,7 +10,7 @@ class APIParticulier::API end def scopes - get(INTROSPECT_RESOURCE_NAME)[:scopes] + get(INTROSPECT_RESOURCE_NAME)['scopes'] end private @@ -24,7 +24,7 @@ class APIParticulier::API timeout: TIMEOUT) if response.success? - JSON.parse(response.body, symbolize_names: true) + JSON.parse(response.body) elsif response.code == 401 raise Unauthorized.new(response) else From a7651e37729f613d0fff37b40ddfe06b0267d3fb Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Fri, 17 Sep 2021 20:42:02 +0200 Subject: [PATCH 3/5] add api composition_familiale --- app/lib/api_particulier/api.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/lib/api_particulier/api.rb b/app/lib/api_particulier/api.rb index 22d09c00e..536c68bb8 100644 --- a/app/lib/api_particulier/api.rb +++ b/app/lib/api_particulier/api.rb @@ -2,6 +2,7 @@ class APIParticulier::API include APIParticulier::Error INTROSPECT_RESOURCE_NAME = "introspect" + COMPOSITION_FAMILIALE_RESOURCE_NAME = "v2/composition-familiale" TIMEOUT = 20 @@ -13,6 +14,12 @@ class APIParticulier::API get(INTROSPECT_RESOURCE_NAME)['scopes'] end + def composition_familiale(numero_allocataire, code_postal) + get(COMPOSITION_FAMILIALE_RESOURCE_NAME, + numeroAllocataire: numero_allocataire, + codePostal: code_postal) + end + private def get(resource_name, params = {}) From 75043070da72dcb0281256da9cc8733a01bf9b8f Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Wed, 22 Sep 2021 11:00:03 +0200 Subject: [PATCH 4/5] add CNAFAdapter --- app/lib/api_particulier/cnaf_adapter.rb | 29 +++++++ config/initializers/inflections.rb | 1 + .../success/composition_familiale.yml | 79 +++++++++++++++++++ .../composition_familiale.json | 35 ++++++++ spec/lib/api_particulier/cnaf_adapter_spec.rb | 60 ++++++++++++++ 5 files changed, 204 insertions(+) create mode 100644 app/lib/api_particulier/cnaf_adapter.rb create mode 100644 spec/fixtures/cassettes/api_particulier/success/composition_familiale.yml create mode 100644 spec/fixtures/files/api_particulier/composition_familiale.json create mode 100644 spec/lib/api_particulier/cnaf_adapter_spec.rb diff --git a/app/lib/api_particulier/cnaf_adapter.rb b/app/lib/api_particulier/cnaf_adapter.rb new file mode 100644 index 000000000..ef92c33cc --- /dev/null +++ b/app/lib/api_particulier/cnaf_adapter.rb @@ -0,0 +1,29 @@ +class APIParticulier::CNAFAdapter + def initialize(api_particulier_token, numero_allocataire, code_postal, requested_sources) + @api = APIParticulier::API.new(api_particulier_token) + @numero_allocataire = numero_allocataire + @code_postal = code_postal + @requested_sources = requested_sources + end + + def to_params + @api.composition_familiale(@numero_allocataire, @code_postal) + .then { |d| extract_requested_sources(d) } + end + + private + + def extract_requested_sources(data) + @requested_sources['cnaf']&.map do |(scope, sources)| + case scope + when 'enfants', 'allocataires' + { scope => data[scope].map { |s| s.slice(*sources) } } + when 'quotient_familial' + { scope => data.slice(*sources) } + else + { scope => data[scope].slice(*sources) } + end + end + &.reduce(&:deep_merge) || {} + end +end diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb index c1ecd861e..1631f421b 100644 --- a/config/initializers/inflections.rb +++ b/config/initializers/inflections.rb @@ -14,6 +14,7 @@ ActiveSupport::Inflector.inflections(:en) do |inflect| inflect.acronym 'JSON' inflect.acronym 'RNA' inflect.acronym 'URL' + inflect.acronym 'CNAF' inflect.irregular 'type_de_champ', 'types_de_champ' inflect.irregular 'type_de_champ_private', 'types_de_champ_private' inflect.irregular 'procedure_revision_type_de_champ', 'procedure_revision_types_de_champ' diff --git a/spec/fixtures/cassettes/api_particulier/success/composition_familiale.yml b/spec/fixtures/cassettes/api_particulier/success/composition_familiale.yml new file mode 100644 index 000000000..7732aaf4d --- /dev/null +++ b/spec/fixtures/cassettes/api_particulier/success/composition_familiale.yml @@ -0,0 +1,79 @@ +--- +http_interactions: +- request: + method: get + uri: https://particulier-test.api.gouv.fr/api/v2/composition-familiale?codePostal=92110&numeroAllocataire=5843972 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - demarches-simplifiees.fr + Accept: + - application/json + X-Api-Key: + - 29eb50b65f64e8e00c0847a8bbcbd150e1f847 + Content-Type: + - text/html; charset=utf-8 + Expect: + - '' + response: + status: + code: 200 + message: '' + headers: + Server: + - nginx + Date: + - Mon, 20 Sep 2021 20:01:39 GMT + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '387' + X-Powered-By: + - Express + Vary: + - Origin + Etag: + - W/"183-5m9o/ng+PfdMOPeC0VBn5lqbziQ" + Strict-Transport-Security: + - max-age=15724800; includeSubdomains + body: + encoding: UTF-8 + string: ' + { + "adresse": { + "codePostalVille": "92110 Clichy", + "identite": "Mr SNOW Eric", + "complementIdentite": "ne connait rien", + "numeroRue": "109 rue La Boétie", + "pays": "FRANCE", + "complementIdentiteGeo": "au nord de paris", + "lieuDit": "glagla" + }, + "allocataires": [ + { + "nomPrenom": "ERIC SNOW", + "dateDeNaissance": "07011991", + "sexe": "M" + }, + { + "nomPrenom": "SANSA SNOW", + "dateDeNaissance": "15011992", + "sexe": "F" + } + ], + "enfants": [ + { + "nomPrenom": "PAUL SNOW", + "dateDeNaissance": "04012018", + "sexe": "M" + } + ], + "quotientFamilial": 1856, + "annee": 2021, + "mois": 6 +} +' + recorded_at: Mon, 20 Sep 2021 20:01:39 GMT +recorded_with: VCR 6.0.0 diff --git a/spec/fixtures/files/api_particulier/composition_familiale.json b/spec/fixtures/files/api_particulier/composition_familiale.json new file mode 100644 index 000000000..08d2458ad --- /dev/null +++ b/spec/fixtures/files/api_particulier/composition_familiale.json @@ -0,0 +1,35 @@ +{ + "allocataires": [ + { + "dateDeNaissance": "07011991", + "nomPrenom": "ERIC SNOW", + "sexe": "M" + }, + { + "dateDeNaissance": "15011992", + "nomPrenom": "SANSA SNOW", + "sexe": "F" + } + ], + "enfants": [ + { + "nomPrenom": "PAUL SNOW", + "dateDeNaissance": "04012018", + "sexe": "M" + } + ], + "quotient_familial" : { + "quotientFamilial": 1856, + "annee": 2021, + "mois": 6 + }, + "adresse": { + "codePostalVille": "92110 Clichy", + "identite": "Mr SNOW Eric", + "complementIdentite": "ne connait rien", + "numeroRue": "109 rue La Boétie", + "pays": "FRANCE", + "complementIdentiteGeo": "au nord de paris", + "lieuDit": "glagla" + } +} diff --git a/spec/lib/api_particulier/cnaf_adapter_spec.rb b/spec/lib/api_particulier/cnaf_adapter_spec.rb new file mode 100644 index 000000000..b9438ff72 --- /dev/null +++ b/spec/lib/api_particulier/cnaf_adapter_spec.rb @@ -0,0 +1,60 @@ +describe APIParticulier::CNAFAdapter do + let(:adapter) { described_class.new(api_particulier_token, numero_allocataire, code_postal, requested_sources) } + + before { stub_const("API_PARTICULIER_URL", "https://particulier-test.api.gouv.fr/api") } + + describe '#to_params' do + subject do + VCR.use_cassette("api_particulier/success/composition_familiale") do + adapter.to_params + end + end + + context 'when the token has all the cnaf scopes' do + let(:api_particulier_token) { '29eb50b65f64e8e00c0847a8bbcbd150e1f847' } + let(:numero_allocataire) { '5843972' } + let(:code_postal) { '92110' } + + context 'and all the sources are requested' do + let(:requested_sources) do + { + 'cnaf' => { + 'allocataires' => ['nomPrenom', 'dateDeNaissance', 'sexe'], + 'enfants' => ['nomPrenom', 'dateDeNaissance', 'sexe'], + 'adresse' => ['identite', 'complementIdentite', 'complementIdentiteGeo', 'numeroRue', 'lieuDit', 'codePostalVille', 'pays'], + 'quotient_familial' => ['quotientFamilial', 'annee', 'mois'] + } + } + end + + let(:result) { JSON.parse(File.read('spec/fixtures/files/api_particulier/composition_familiale.json')) } + + it { is_expected.to eq(result) } + end + + context 'when no sources is requested' do + let(:requested_sources) { {} } + + it { is_expected.to eq({}) } + end + + context 'when a scalar is requested' do + let(:requested_sources) { { 'cnaf' => { 'adresse' => ['pays'] } } } + + it { is_expected.to eq({ "adresse" => { "pays" => "FRANCE" } }) } + end + + context 'when a quotient_familial is requested' do + let(:requested_sources) { { 'cnaf' => { 'quotient_familial' => ['annee'] } } } + + it { is_expected.to eq({ "quotient_familial" => { "annee" => 2021 } }) } + end + + context 'when a vector is requested' do + let(:requested_sources) { { 'cnaf' => { 'allocataires' => ['nomPrenom'] } } } + + it { is_expected.to eq({ "allocataires" => [{ "nomPrenom" => "ERIC SNOW" }, { "nomPrenom" => "SANSA SNOW" }] }) } + end + end + end +end From 57604b9c896504f73038cba0ae674663f673ee13 Mon Sep 17 00:00:00 2001 From: simon lehericey Date: Tue, 21 Sep 2021 11:46:40 +0200 Subject: [PATCH 5/5] add schema validations --- app/lib/api_particulier/cnaf_adapter.rb | 18 ++++ app/schemas/composition-familiale.json | 70 ++++++++++++++ .../success/composition_familiale_invalid.yml | 79 +++++++++++++++ spec/lib/api_particulier/cnaf_adapter_spec.rb | 96 ++++++++++--------- 4 files changed, 220 insertions(+), 43 deletions(-) create mode 100644 app/schemas/composition-familiale.json create mode 100644 spec/fixtures/cassettes/api_particulier/success/composition_familiale_invalid.yml diff --git a/app/lib/api_particulier/cnaf_adapter.rb b/app/lib/api_particulier/cnaf_adapter.rb index ef92c33cc..7a2412d82 100644 --- a/app/lib/api_particulier/cnaf_adapter.rb +++ b/app/lib/api_particulier/cnaf_adapter.rb @@ -1,4 +1,10 @@ class APIParticulier::CNAFAdapter + class InvalidSchemaError < ::StandardError + def initialize(errors) + super(errors.map(&:to_json).join("\n")) + end + end + def initialize(api_particulier_token, numero_allocataire, code_postal, requested_sources) @api = APIParticulier::API.new(api_particulier_token) @numero_allocataire = numero_allocataire @@ -8,11 +14,23 @@ class APIParticulier::CNAFAdapter def to_params @api.composition_familiale(@numero_allocataire, @code_postal) + .tap { |d| ensure_valid_schema!(d) } .then { |d| extract_requested_sources(d) } end private + def ensure_valid_schema!(data) + if !schemer.valid?(data) + errors = schemer.validate(data).to_a + raise InvalidSchemaError.new(errors) + end + end + + def schemer + @schemer ||= JSONSchemer.schema(Rails.root.join('app/schemas/composition-familiale.json')) + end + def extract_requested_sources(data) @requested_sources['cnaf']&.map do |(scope, sources)| case scope diff --git a/app/schemas/composition-familiale.json b/app/schemas/composition-familiale.json new file mode 100644 index 000000000..3ecba6ad3 --- /dev/null +++ b/app/schemas/composition-familiale.json @@ -0,0 +1,70 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://demarches-simplifiees.fr/composition-familiale.schema.json", + "title": "composition familiale", + "type": "object", + "properties": { + "adresse": { + "type": "object", + "properties": { + "codePostalVille": { + "type": "string" + }, + "identite": { + "type": "string" + }, + "complementIdentite": { + "type": "string" + }, + "numeroRue": { + "type": "string" + }, + "pays": { + "type": "string" + }, + "complementIdentiteGeo": { + "type": "string" + }, + "lieuDit": { + "type": "string" + } + } + }, + "allocataires": { + "type": "array", + "items": { "$ref": "#/$defs/person" } + }, + "enfants": { + "type": "array", + "items": { "$ref": "#/$defs/person" } + }, + "quotientFamilial": { + "type": "integer" + }, + "annee": { + "type": "integer" + }, + "mois": { + "type": "integer", + "minimum": 1, + "maximum": 12 + } + }, + "$defs": { + "person": { + "type": "object", + "properties": { + "nomPrenom": { + "type": "string" + }, + "dateDeNaissance": { + "type": "string", + "pattern": "^[0-9]{8}$" + }, + "sexe": { + "enum": ["F", "M"] + } + } + } + } +} diff --git a/spec/fixtures/cassettes/api_particulier/success/composition_familiale_invalid.yml b/spec/fixtures/cassettes/api_particulier/success/composition_familiale_invalid.yml new file mode 100644 index 000000000..e562a0871 --- /dev/null +++ b/spec/fixtures/cassettes/api_particulier/success/composition_familiale_invalid.yml @@ -0,0 +1,79 @@ +--- +http_interactions: +- request: + method: get + uri: https://particulier-test.api.gouv.fr/api/v2/composition-familiale?codePostal=92110&numeroAllocataire=5843972 + body: + encoding: US-ASCII + string: '' + headers: + User-Agent: + - demarches-simplifiees.fr + Accept: + - application/json + X-Api-Key: + - 29eb50b65f64e8e00c0847a8bbcbd150e1f847 + Content-Type: + - text/html; charset=utf-8 + Expect: + - '' + response: + status: + code: 200 + message: '' + headers: + Server: + - nginx + Date: + - Mon, 20 Sep 2021 20:01:39 GMT + Content-Type: + - application/json; charset=utf-8 + Content-Length: + - '387' + X-Powered-By: + - Express + Vary: + - Origin + Etag: + - W/"183-5m9o/ng+PfdMOPeC0VBn5lqbziQ" + Strict-Transport-Security: + - max-age=15724800; includeSubdomains + body: + encoding: UTF-8 + string: ' + { + "adresse": { + "codePostalVille": "92110 Clichy", + "identite": "Mr SNOW Eric", + "complementIdentite": "ne connait rien", + "numeroRue": "109 rue La Boétie", + "pays": "FRANCE", + "complementIdentiteGeo": "au nord de paris", + "lieuDit": "glagla" + }, + "allocataires": [ + { + "nomPrenom": "ERIC SNOW", + "dateDeNaissance": "07011991", + "sexe": "M" + }, + { + "nomPrenom": "SANSA SNOW", + "dateDeNaissance": "15011992", + "sexe": "F" + } + ], + "enfants": [ + { + "nomPrenom": "PAUL SNOW", + "dateDeNaissance": "04012018", + "sexe": "M" + } + ], + "quotientFamilial": 1856, + "annee": 2021, + "mois": 13 +} +' + recorded_at: Mon, 20 Sep 2021 20:01:39 GMT +recorded_with: VCR 6.0.0 diff --git a/spec/lib/api_particulier/cnaf_adapter_spec.rb b/spec/lib/api_particulier/cnaf_adapter_spec.rb index b9438ff72..362a0c5f5 100644 --- a/spec/lib/api_particulier/cnaf_adapter_spec.rb +++ b/spec/lib/api_particulier/cnaf_adapter_spec.rb @@ -4,56 +4,66 @@ describe APIParticulier::CNAFAdapter do before { stub_const("API_PARTICULIER_URL", "https://particulier-test.api.gouv.fr/api") } describe '#to_params' do - subject do - VCR.use_cassette("api_particulier/success/composition_familiale") do - adapter.to_params + let(:api_particulier_token) { '29eb50b65f64e8e00c0847a8bbcbd150e1f847' } + let(:numero_allocataire) { '5843972' } + let(:code_postal) { '92110' } + + subject { VCR.use_cassette(cassette) { adapter.to_params } } + + context 'when the api answer is valid' do + let(:cassette) { "api_particulier/success/composition_familiale" } + + context 'when the token has all the cnaf scopes' do + context 'and all the sources are requested' do + let(:requested_sources) do + { + 'cnaf' => { + 'allocataires' => ['nomPrenom', 'dateDeNaissance', 'sexe'], + 'enfants' => ['nomPrenom', 'dateDeNaissance', 'sexe'], + 'adresse' => ['identite', 'complementIdentite', 'complementIdentiteGeo', 'numeroRue', 'lieuDit', 'codePostalVille', 'pays'], + 'quotient_familial' => ['quotientFamilial', 'annee', 'mois'] + } + } + end + + let(:result) { JSON.parse(File.read('spec/fixtures/files/api_particulier/composition_familiale.json')) } + + it { is_expected.to eq(result) } + end + + context 'when no sources is requested' do + let(:requested_sources) { {} } + + it { is_expected.to eq({}) } + end + + context 'when a scalar is requested' do + let(:requested_sources) { { 'cnaf' => { 'adresse' => ['pays'] } } } + + it { is_expected.to eq({ "adresse" => { "pays" => "FRANCE" } }) } + end + + context 'when a quotient_familial is requested' do + let(:requested_sources) { { 'cnaf' => { 'quotient_familial' => ['annee'] } } } + + it { is_expected.to eq({ "quotient_familial" => { "annee" => 2021 } }) } + end + + context 'when a vector is requested' do + let(:requested_sources) { { 'cnaf' => { 'allocataires' => ['nomPrenom'] } } } + + it { is_expected.to eq({ "allocataires" => [{ "nomPrenom" => "ERIC SNOW" }, { "nomPrenom" => "SANSA SNOW" }] }) } + end end end - context 'when the token has all the cnaf scopes' do - let(:api_particulier_token) { '29eb50b65f64e8e00c0847a8bbcbd150e1f847' } - let(:numero_allocataire) { '5843972' } - let(:code_postal) { '92110' } - - context 'and all the sources are requested' do - let(:requested_sources) do - { - 'cnaf' => { - 'allocataires' => ['nomPrenom', 'dateDeNaissance', 'sexe'], - 'enfants' => ['nomPrenom', 'dateDeNaissance', 'sexe'], - 'adresse' => ['identite', 'complementIdentite', 'complementIdentiteGeo', 'numeroRue', 'lieuDit', 'codePostalVille', 'pays'], - 'quotient_familial' => ['quotientFamilial', 'annee', 'mois'] - } - } - end - - let(:result) { JSON.parse(File.read('spec/fixtures/files/api_particulier/composition_familiale.json')) } - - it { is_expected.to eq(result) } - end + context 'when the api answer is valid' do + let(:cassette) { "api_particulier/success/composition_familiale_invalid" } context 'when no sources is requested' do let(:requested_sources) { {} } - it { is_expected.to eq({}) } - end - - context 'when a scalar is requested' do - let(:requested_sources) { { 'cnaf' => { 'adresse' => ['pays'] } } } - - it { is_expected.to eq({ "adresse" => { "pays" => "FRANCE" } }) } - end - - context 'when a quotient_familial is requested' do - let(:requested_sources) { { 'cnaf' => { 'quotient_familial' => ['annee'] } } } - - it { is_expected.to eq({ "quotient_familial" => { "annee" => 2021 } }) } - end - - context 'when a vector is requested' do - let(:requested_sources) { { 'cnaf' => { 'allocataires' => ['nomPrenom'] } } } - - it { is_expected.to eq({ "allocataires" => [{ "nomPrenom" => "ERIC SNOW" }, { "nomPrenom" => "SANSA SNOW" }] }) } + it { expect { subject }.to raise_error(APIParticulier::CNAFAdapter::InvalidSchemaError) } end end end