demarches-normaliennes/spec/system/api_particulier/api_particulier_spec.rb

542 lines
20 KiB
Ruby
Raw Normal View History

describe 'fetch API Particulier Data', js: true do
let(:administrateur) { administrateurs(:default_admin) }
2021-09-28 15:11:15 +02:00
let(:expected_token) { 'd7e9c9f4c3ca00caadde31f50fd4521a' }
let(:expected_sources) do
{
2021-11-24 17:30:35 +01:00
'cnaf' =>
2021-09-28 15:11:15 +02:00
{
2021-11-24 17:30:35 +01:00
'adresse' => ['identite', 'complementIdentite', 'complementIdentiteGeo', 'numeroRue', 'lieuDit', 'codePostalVille', 'pays'],
'allocataires' => ['nomPrenom', 'dateDeNaissance', 'sexe'],
'enfants' => ['nomPrenom', 'dateDeNaissance', 'sexe'],
'quotient_familial' => ['quotientFamilial', 'annee', 'mois']
},
'dgfip' =>
{
'declarant1' => ['dateNaissance', 'nom', 'nomNaissance', 'prenoms'],
'declarant2' => ['dateNaissance', 'nom', 'nomNaissance', 'prenoms'],
'echeance_avis' => ['dateEtablissement', 'dateRecouvrement'],
'foyer_fiscal' => ['adresse', 'annee', 'nombreParts', 'nombrePersonnesCharge', 'situationFamille'],
'agregats_fiscaux' => ['anneeImpots', 'anneeRevenus', 'impotRevenuNetAvantCorrections', 'montantImpot', 'revenuBrutGlobal', 'revenuFiscalReference', 'revenuImposable'],
'complements' => ['situationPartielle', 'erreurCorrectif']
},
'pole_emploi' => {
'identite' => ['identifiant', 'civilite', 'nom', 'nomUsage', 'prenom', 'sexe', 'dateNaissance'],
'adresse' => ['INSEECommune', 'codePostal', 'localite', 'ligneVoie', 'ligneComplementDestinataire', 'ligneComplementAdresse', 'ligneComplementDistribution', 'ligneNom'],
'contact' => ['email', 'telephone', 'telephone2'],
'inscription' => ['dateInscription', 'dateCessationInscription', 'codeCertificationCNAV', 'codeCategorieInscription', 'libelleCategorieInscription']
2021-12-15 15:25:02 +01:00
},
'mesri' => {
'identifiant' => ['ine'],
'identite' => ['nom', 'prenom', 'dateNaissance'],
'inscriptions' => ['statut', 'regime', 'dateDebutInscription', 'dateFinInscription', 'codeCommune'],
'admissions' => ['statut', 'regime', 'dateDebutAdmission', 'dateFinAdmission', 'codeCommune'],
'etablissements' => ['uai', 'nom']
2021-09-28 15:11:15 +02:00
}
}
end
before do
2021-11-24 17:30:35 +01:00
stub_const('API_PARTICULIER_URL', 'https://particulier.api.gouv.fr/api')
2021-09-28 15:11:15 +02:00
Flipper.enable(:api_particulier)
end
context 'when an administrateur is logged in' do
2021-09-28 15:11:15 +02:00
let(:procedure) do
create(:procedure, :with_service, :with_instructeur, :with_zone,
2021-09-28 15:11:15 +02:00
aasm_state: :brouillon,
administrateurs: [administrateur],
2021-11-24 17:30:35 +01:00
libelle: 'libellé de la procédure',
path: 'libelle-de-la-procedure')
2021-09-28 15:11:15 +02:00
end
before { login_as administrateur.user, scope: :user }
scenario 'it can enable api particulier' do
visit admin_procedure_path(procedure)
2021-11-24 17:30:35 +01:00
expect(page).to have_content('Configurer le jeton API particulier')
2021-09-28 15:11:15 +02:00
find('#api-particulier').click
expect(page).to have_current_path(admin_procedure_api_particulier_path(procedure))
find('#add-jeton').click
expect(page).to have_current_path(admin_procedure_api_particulier_jeton_path(procedure))
fill_in 'procedure_api_particulier_token', with: expected_token
2021-11-24 17:30:35 +01:00
VCR.use_cassette('api_particulier/success/introspect') { click_on 'Enregistrer' }
2021-09-28 15:11:15 +02:00
expect(page).to have_text('Le jeton a bien été mis à jour')
expect(page).to have_current_path(admin_procedure_api_particulier_sources_path(procedure))
['allocataires', 'enfants'].each do |scope|
within("#cnaf-#{scope}") do
2021-09-28 15:11:15 +02:00
check('noms et prénoms')
check('date de naissance')
check('sexe')
end
end
within('#cnaf-adresse') do
2021-09-28 15:11:15 +02:00
check('identité')
check('complément didentité')
check('complément didentité géographique')
check('numéro et rue')
check('lieu-dit')
check('code postal et ville')
check('pays')
end
within('#cnaf-quotient_familial') do
2021-09-28 15:11:15 +02:00
check('quotient familial')
check('année')
check('mois')
end
2021-11-24 17:30:35 +01:00
['declarant1', 'declarant2'].each do |scope|
within("#dgfip-#{scope}") do
2021-11-24 17:30:35 +01:00
check('nom')
check('nom de naissance')
check('prénoms')
check('date de naissance')
end
end
scroll_to(find('#dgfip-echeance_avis'))
within ('#dgfip-echeance_avis') do
2021-11-24 17:30:35 +01:00
check('date de recouvrement')
check("date détablissement")
end
within('#dgfip-foyer_fiscal') do
2021-11-24 17:30:35 +01:00
check('année')
check('adresse')
check('nombre de parts')
check('situation familiale')
check('nombre de personnes à charge')
end
within('#dgfip-agregats_fiscaux') do
2021-11-24 17:30:35 +01:00
check('revenu brut global')
check('revenu imposable')
check('impôt sur le revenu net avant correction')
check("montant de limpôt")
check('revenu fiscal de référence')
check("année dimposition")
check('année des revenus')
end
within('#dgfip-complements') do
2021-11-24 17:30:35 +01:00
check('erreur correctif')
check('situation partielle')
end
within('#pole_emploi-identite') do
check('identifiant')
check('civilité')
check('nom')
check("nom dusage")
check('prénom')
check('sexe')
check('date de naissance')
end
within('#pole_emploi-adresse') do
check('code INSEE de la commune')
check('code postal')
check('localité')
check('voie')
check('destinataire')
check('adresse')
check('distribution')
check('nom')
end
within('#pole_emploi-contact') do
check('email')
check('téléphone')
check('téléphone 2')
end
within('#pole_emploi-inscription') do
check("date dinscription")
check("date de cessation dinscription")
check('code de certification CNAV')
check("code de catégorie dinscription")
check("libellé de catégorie dinscription")
end
2021-12-15 15:25:02 +01:00
within('#mesri-identifiant') do
check('INE')
end
within('#mesri-identite') do
check('nom')
check('prénom')
check('date de naissance')
end
within('#mesri-inscriptions') do
check('statut')
check('régime')
2022-12-01 13:41:12 +01:00
check("date de début dinscription")
check("date de fin dinscription")
2021-12-15 15:25:02 +01:00
check("code de la commune")
end
within('#mesri-admissions') do
check('statut')
check('régime')
2022-12-01 13:41:12 +01:00
check("date de début dadmission")
check("date de fin dadmission")
2021-12-15 15:25:02 +01:00
check("code de la commune")
end
within('#mesri-etablissements') do
check('UAI')
check('nom')
end
2021-11-24 17:30:35 +01:00
click_on 'Enregistrer'
2021-09-28 15:11:15 +02:00
within('#cnaf-enfants') do
2021-09-28 15:11:15 +02:00
expect(find('input[value=nomPrenom]')).to be_checked
end
2021-11-24 17:30:35 +01:00
procedure.reload
2021-12-15 15:25:02 +01:00
expect(procedure.api_particulier_sources.keys).to contain_exactly('cnaf', 'dgfip', 'pole_emploi', 'mesri')
2021-11-24 17:30:35 +01:00
expect(procedure.api_particulier_sources['cnaf'].keys).to contain_exactly('adresse', 'allocataires', 'enfants', 'quotient_familial')
expect(procedure.api_particulier_sources['dgfip'].keys).to contain_exactly('declarant1', 'declarant2', 'echeance_avis', 'foyer_fiscal', 'agregats_fiscaux', 'complements')
expect(procedure.api_particulier_sources['pole_emploi'].keys).to contain_exactly('identite', 'adresse', 'contact', 'inscription')
2021-12-15 15:25:02 +01:00
expect(procedure.api_particulier_sources['mesri'].keys).to contain_exactly('identifiant', 'identite', 'inscriptions', 'admissions', 'etablissements')
2021-11-24 17:30:35 +01:00
procedure.api_particulier_sources.each do |provider, scopes|
scopes.each do |scope, fields|
expect(fields).to match_array(expected_sources[provider][scope])
end
end
2021-09-28 15:11:15 +02:00
visit champs_admin_procedure_path(procedure)
add_champ
select('Données de la Caisse nationale des allocations familiales', from: 'Type de champ')
fill_in 'Libellé du champ', with: 'libellé de champ'
2021-09-28 15:11:15 +02:00
blur
expect(page).to have_content('Formulaire enregistré')
visit admin_procedure_path(procedure)
find('#publish-procedure-link').click
expect(find_field('procedure_path').value).to eq procedure.path
fill_in 'lien_site_web', with: 'http://some.website'
2023-10-10 16:51:06 +02:00
within('form') { click_on 'Publier' }
2021-09-28 15:11:15 +02:00
expect(page).to have_text('Votre démarche est désormais publiée !')
2021-09-28 15:11:15 +02:00
end
end
context 'when a user is logged in' do
2021-09-28 15:11:15 +02:00
let(:user) { create(:user) }
let(:numero_allocataire) { '5843972' }
let(:code_postal) { '92110' }
2021-11-24 17:30:35 +01:00
let(:numero_fiscal) { '2097699999077' }
let(:reference_avis) { '2097699999077' }
2021-09-28 15:11:15 +02:00
let(:instructeur) { create(:instructeur) }
let(:identifiant) { 'georges_moustaki_77' }
2021-12-15 15:25:02 +01:00
let(:ine) { '090601811AB' }
let(:api_particulier_token) { '29eb50b65f64e8e00c0847a8bbcbd150e1f847' }
2021-09-28 15:11:15 +02:00
let(:procedure) do
2022-05-17 10:39:24 +02:00
create(:procedure, :for_individual, :with_service, :published,
2021-11-24 17:30:35 +01:00
libelle: 'libellé de la procédure',
path: 'libelle-de-la-procedure',
2021-09-28 15:11:15 +02:00
instructeurs: [instructeur],
api_particulier_sources: expected_sources,
2022-05-17 10:39:24 +02:00
api_particulier_token: api_particulier_token).tap do |p|
p.active_revision.add_type_de_champ(type_champ: :cnaf, libelle: 'cnaf', mandatory: false)
p.active_revision.add_type_de_champ(type_champ: :dgfip, libelle: 'dgfip', mandatory: false)
p.active_revision.add_type_de_champ(type_champ: :pole_emploi, libelle: 'pole_emploi', mandatory: false)
p.active_revision.add_type_de_champ(type_champ: :mesri, libelle: 'mesri', mandatory: false)
2022-05-17 10:39:24 +02:00
end
2021-09-28 15:11:15 +02:00
end
before { login_as user, scope: :user }
context 'CNAF' do
scenario 'it can fill an cnaf champ', vcr: { cassette_name: 'api_particulier/success/composition_familiale' } do
visit commencer_path(path: procedure.path)
click_on 'Commencer la démarche'
2021-09-28 15:11:15 +02:00
2023-09-05 14:42:56 +02:00
find('label', text: 'Monsieur').click
2023-11-28 12:43:43 +01:00
within('.individual-infos') do
fill_in('Prénom', with: 'prenom')
fill_in('Nom', with: 'nom')
end
2021-09-28 15:11:15 +02:00
2024-04-12 17:59:50 +02:00
within "#identite-form" do
click_on 'Continuer'
end
2021-09-28 15:11:15 +02:00
fill_in 'Le numéro dallocataire CAF', with: numero_allocataire
fill_in 'Le code postal', with: 'wrong_code'
dossier = Dossier.last
cnaf_champ = dossier.champs_public.find(&:cnaf?)
wait_until { cnaf_champ.reload.code_postal == 'wrong_code' }
click_on 'Déposer le dossier'
expect(page).to have_content("cnaf doit posséder 5 caractères")
fill_in 'Le code postal', with: code_postal
wait_until { cnaf_champ.reload.external_id.present? }
click_on 'Déposer le dossier'
perform_enqueued_jobs
2022-10-28 11:12:39 +02:00
expect(page).to have_current_path(merci_dossier_path(Dossier.last))
2023-05-11 16:56:43 +02:00
perform_enqueued_jobs
2023-05-10 10:41:17 +02:00
wait_until { cnaf_champ.reload.data.present? }
visit demande_dossier_path(dossier)
expect(page).to have_content(/Des données.*ont été reçues depuis la CAF/)
2021-09-28 15:11:15 +02:00
log_out
login_as instructeur.user, scope: :user
visit instructeur_dossier_path(procedure, dossier)
expect(page).to have_content('code postal et ville 92110 Clichy')
expect(page).to have_content('identité Mr SNOW Eric')
expect(page).to have_content('complément didentité ne connait rien')
expect(page).to have_content('numéro et rue 109 rue La Boétie')
expect(page).to have_content('pays FRANCE')
expect(page).to have_content('complément didentité géographique au nord de paris')
expect(page).to have_content('lieu-dit glagla')
expect(page).to have_content('ERIC SNOW masculin 07/01/1991')
expect(page).to have_content('SANSA SNOW féminin 15/01/1992')
expect(page).to have_content('PAUL SNOW masculin 04/01/2018')
expect(page).to have_content('1856 6 2021')
2021-09-28 15:11:15 +02:00
end
end
context 'Pôle emploi' do
let(:api_particulier_token) { '06fd8675601267d2988cbbdef56ecb0de1d45223' }
scenario 'it can fill a Pôle emploi field', vcr: { cassette_name: 'api_particulier/success/situation_pole_emploi' } do
visit commencer_path(path: procedure.path)
click_on 'Commencer la démarche'
2023-09-05 14:42:56 +02:00
find('label', text: 'Monsieur').click
2023-11-28 12:43:43 +01:00
within('.individual-infos') do
fill_in('Prénom', with: 'Georges')
fill_in('Nom', with: 'Moustaki')
end
2024-04-12 17:59:50 +02:00
within "#identite-form" do
click_on 'Continuer'
end
fill_in "Identifiant", with: 'wrong code'
2021-09-28 15:11:15 +02:00
dossier = Dossier.last
pole_emploi_champ = dossier.champs_public.find(&:pole_emploi?)
2021-09-28 15:11:15 +02:00
wait_until { pole_emploi_champ.reload.identifiant == 'wrong code' }
clear_enqueued_jobs
pole_emploi_champ.update(external_id: nil, identifiant: nil)
2021-09-28 15:11:15 +02:00
fill_in "Identifiant", with: identifiant
wait_until { pole_emploi_champ.reload.external_id.present? }
click_on 'Déposer le dossier'
perform_enqueued_jobs
2022-10-28 11:12:39 +02:00
expect(page).to have_current_path(merci_dossier_path(Dossier.last))
2023-05-11 16:56:43 +02:00
perform_enqueued_jobs
2023-05-10 10:41:17 +02:00
wait_until { pole_emploi_champ.reload.data.present? }
visit demande_dossier_path(dossier)
expect(page).to have_content(/Des données.*ont été reçues depuis Pôle emploi/)
log_out
login_as instructeur.user, scope: :user
visit instructeur_dossier_path(procedure, dossier)
2021-09-28 15:11:15 +02:00
expect(page).to have_content('identifiant georges_moustaki_77')
expect(page).to have_content('civilité M.')
expect(page).to have_content('nom Moustaki')
expect(page).to have_content("nom dusage Moustaki")
expect(page).to have_content('prénom Georges')
expect(page).to have_content('sexe masculin')
expect(page).to have_content('date de naissance 3 mai 1934')
expect(page).to have_content('code INSEE de la commune 75118')
expect(page).to have_content('code postal 75018')
expect(page).to have_content('localité 75018 Paris')
expect(page).to have_content('voie 3 rue des Huttes')
expect(page).to have_content('nom MOUSTAKI')
expect(page).to have_content('email georges@moustaki.fr')
expect(page).to have_content('téléphone 0629212921')
expect(page).to have_content("date dinscription 3 mai 1965")
expect(page).to have_content("date de cessation dinscription 3 mai 1966")
expect(page).to have_content('code de certification CNAV VC')
expect(page).to have_content("code de catégorie dinscription 1")
expect(page).to have_content("libellé de catégorie dinscription PERSONNE SANS EMPLOI DISPONIBLE DUREE INDETERMINEE PLEIN TPS")
expect(page).not_to have_content('téléphone 2')
expect(page).not_to have_content('destinataire')
expect(page).not_to have_content('adresse')
expect(page).not_to have_content('distribution')
end
2021-09-28 15:11:15 +02:00
end
2021-11-24 17:30:35 +01:00
2021-12-15 15:25:02 +01:00
context 'MESRI' do
let(:api_particulier_token) { 'c6d23f3900b8fb4b3586c4804c051af79062f54b' }
scenario 'it can fill a MESRI field' do
visit commencer_path(path: procedure.path)
click_on 'Commencer la démarche'
find('label', text: 'Madame').click
2023-11-28 12:43:43 +01:00
within('.individual-infos') do
fill_in('Prénom', with: 'Angela Claire Louise')
fill_in('Nom', with: 'Dubois')
end
2024-04-12 17:59:50 +02:00
within "#identite-form" do
click_on 'Continuer'
end
2021-12-15 15:25:02 +01:00
fill_in "INE", with: 'wrong code'
dossier = Dossier.last
mesri_champ = dossier.champs_public.find(&:mesri?)
2021-12-15 15:25:02 +01:00
wait_until { mesri_champ.reload.ine == 'wrong code' }
clear_enqueued_jobs
mesri_champ.update(external_id: nil, ine: nil)
2021-12-15 15:25:02 +01:00
VCR.use_cassette('api_particulier/success/etudiants') do
fill_in "INE", with: ine
wait_until { mesri_champ.reload.external_id.present? }
click_on 'Déposer le dossier'
perform_enqueued_jobs
2021-12-15 15:25:02 +01:00
end
2022-10-28 11:12:39 +02:00
expect(page).to have_current_path(merci_dossier_path(Dossier.last))
2021-12-15 15:25:02 +01:00
2023-05-11 16:56:43 +02:00
perform_enqueued_jobs
2023-05-10 10:41:17 +02:00
wait_until { mesri_champ.reload.data.present? }
2021-12-15 15:25:02 +01:00
visit demande_dossier_path(dossier)
expect(page).to have_content(/Des données.*ont été reçues depuis le MESRI/)
log_out
login_as instructeur.user, scope: :user
visit instructeur_dossier_path(procedure, dossier)
expect(page).to have_content('INE 090601811AB')
expect(page).to have_content('nom DUBOIS')
expect(page).to have_content('prénom Angela Claire Louise')
expect(page).to have_content('date de naissance 24 août 1962')
expect(page).to have_content('statut inscrit')
expect(page).to have_content('régime formation continue')
2022-12-01 13:41:12 +01:00
expect(page).to have_content("date de début dinscription 1 septembre 2022")
expect(page).to have_content("date de fin dinscription 31 août 2023")
2021-12-15 15:25:02 +01:00
expect(page).to have_content('code de la commune 75106')
expect(page).to have_content('statut admis')
expect(page).to have_content('régime formation continue')
2022-12-01 13:41:12 +01:00
expect(page).to have_content("date de début dadmission 1 septembre 2021")
expect(page).to have_content("date de fin dadmission 31 août 2022")
2021-12-15 15:25:02 +01:00
expect(page).to have_content('code de la commune 75106')
expect(page).to have_content('UAI 0751722P')
expect(page).to have_content('nom Université Pierre et Marie Curie - UPCM (Paris 6)')
end
end
context 'DGFiP' do
scenario 'it can fill a DGFiP field', vcr: { cassette_name: 'api_particulier/success/avis_imposition' } do
visit commencer_path(path: procedure.path)
click_on 'Commencer la démarche'
2021-11-24 17:30:35 +01:00
find('label', text: 'Madame').click
2023-11-28 12:43:43 +01:00
within('.individual-infos') do
fill_in('Prénom', with: 'Karine')
fill_in('Nom', with: 'FERRI')
end
2024-04-12 17:59:50 +02:00
within "#identite-form" do
click_on 'Continuer'
end
2021-11-24 17:30:35 +01:00
fill_in 'Le numéro fiscal', with: numero_fiscal
2022-12-01 13:41:12 +01:00
fill_in "La référence davis dimposition", with: 'wrong_code'
2021-11-24 17:30:35 +01:00
dossier = Dossier.last
dgfip_champ = dossier.champs_public.find(&:dgfip?)
2021-11-24 17:30:35 +01:00
wait_until { dgfip_champ.reload.reference_avis == 'wrong_code' }
2021-11-24 17:30:35 +01:00
click_on 'Déposer le dossier'
expect(page).to have_content(/dgfip doit posséder 13 ou 14 caractères/)
2021-11-24 17:30:35 +01:00
fill_in "La référence davis dimposition", with: reference_avis
wait_until { dgfip_champ.reload.external_id.present? }
click_on 'Déposer le dossier'
perform_enqueued_jobs
2022-10-28 11:12:39 +02:00
expect(page).to have_current_path(merci_dossier_path(Dossier.last))
2021-11-24 17:30:35 +01:00
2023-05-11 16:56:43 +02:00
perform_enqueued_jobs
2023-05-10 10:41:17 +02:00
wait_until { dgfip_champ.reload.data.present? }
visit demande_dossier_path(dossier)
expect(page).to have_content(/Des données.*ont été reçues depuis la DGFiP/)
2021-11-24 17:30:35 +01:00
log_out
2021-11-24 17:30:35 +01:00
login_as instructeur.user, scope: :user
visit instructeur_dossier_path(procedure, dossier)
2021-11-24 17:30:35 +01:00
expect(page).to have_content('nom FERRI')
expect(page).to have_content('nom de naissance FERRI')
expect(page).to have_content('prénoms Karine')
expect(page).to have_content('date de naissance 12/08/1978')
2021-11-24 17:30:35 +01:00
expect(page).to have_content('date de recouvrement 09/10/2020')
expect(page).to have_content("date détablissement 07/07/2020")
2021-11-24 17:30:35 +01:00
expect(page).to have_content('année 2020')
expect(page).to have_content("adresse fiscale de lannée passée 13 rue de la Plage 97615 Pamanzi")
expect(page).to have_content('nombre de parts 1')
expect(page).to have_content('situation familiale Célibataire')
expect(page).to have_content('nombre de personnes à charge 0')
2021-11-24 17:30:35 +01:00
expect(page).to have_content('revenu brut global 38814')
expect(page).to have_content('revenu imposable 38814')
expect(page).to have_content('impôt sur le revenu net avant correction 38814')
expect(page).to have_content("montant de limpôt 38814")
expect(page).to have_content('revenu fiscal de référence 38814')
expect(page).to have_content("année dimposition 2020")
expect(page).to have_content('année des revenus 2020')
2021-11-24 17:30:35 +01:00
expect(page).to have_content('situation partielle SUP DOM')
2021-11-24 17:30:35 +01:00
expect(page).not_to have_content('erreur correctif')
end
2021-11-24 17:30:35 +01:00
end
2021-09-28 15:11:15 +02:00
end
end