# tests/test_api_entreprise.py # Copyright (C) 2019 Entr'ouvert # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU Affero General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from unittest import mock import pytest import requests import responses from django.utils import timezone from passerelle.apps.api_entreprise.models import APIEntreprise from tests.utils import FakedResponse, make_resource ETABLISSEMENTS_RESPONSE = { "data": { "siege_social": True, "siret": "41816609600051", "date_mise_a_jour": 1449183600, "tranche_effectif_salarie": { "de": 200, "a": 249, "code": "31", "date_reference": "2014", "intitule": "200 à 249 salariés", }, "date_creation": 1108594800, "region_implantation": {"code": "11", "value": "Île-de-France"}, "adresse": { "acheminement_postal": { "l1": "OCTO TECHNOLOGY", "l2": None, "l3": None, "l4": "50 AVENUE DES CHAMPS ELYSEES", "l5": None, "l6": "75008 PARIS", "l7": "FRANCE", }, "numero_voie": "50", "type_voie": "AV", "libelle_voie": "DES CHAMPS ELYSEES", "code_postal": "75008", "libelle_commune": "PARIS 8", "code_commune": "75108", }, "etat_administratif": {"value": "F", "date_fermeture": 1315173600}, "activite_principale": { "code": "62.02A", "libelle": "Conseil en systèmes et logiciels informatiques", }, }, "gateway_error": False, } ENTREPRISES_RESPONSE = { "entreprise": { "siren": "418166096", "capital_social": 459356, "numero_tva_intracommunautaire": "FR16418166096", "forme_juridique": "SA à directoire (s.a.i.)", "forme_juridique_code": "5699", "nom_commercial": "OCTO-TECHNOLOGY", "procedure_collective": False, "naf_entreprise": "6202A", "libelle_naf_entreprise": "Conseil en systèmes et logiciels informatiques", "raison_sociale": "OCTO-TECHNOLOGY", "siret_siege_social": "41816609600051", "code_effectif_entreprise": "31", "date_creation": 891381600, "categorie_entreprise": "PME", "diffusable_commercialement": True, "tranche_effectif_salarie_entreprise": { "de": 200, "a": 249, "code": "31", "date_reference": "2014", "intitule": "200 à 249 salariés", }, "mandataires_sociaux": [ { "nom": "HISQUIN", "prenom": "FRANCOIS", "fonction": "PRESIDENT DU DIRECTOIRE", "dirigeant": True, "date_naissance": "1965-01-27", "raison_sociale": "", "identifiant": "", "type": "PP", }, { "nom": "", "prenom": "", "fonction": "COMMISSAIRE AUX COMPTES SUPPLEANT", "dirigeant": True, "date_naissance": "", "date_naissance_timestamp": 0, "raison_sociale": "BCRH & ASSOCIES - SOCIETE A RESPONSABILITE LIMITEE A ASSOCIE UNIQUE", "identifiant": "490092574", "type": "PM", }, ], "etat_administratif": { "value": "C", # A (actif) ou C (cessé) "date_cessation": 1315173600, # null quand actif (A), un timestamp (un entier) quand cessé (C ) }, }, "etablissement_siege": { "siege_social": True, "siret": "41816609600051", "naf": "6202A", "libelle_naf": "Conseil en systèmes et logiciels informatiques", "date_mise_a_jour": 1449183600, "tranche_effectif_salarie_etablissement": { "de": 200, "a": 249, "code": "31", "date_reference": "2014", "intitule": "200 à 249 salariés", }, "date_creation_etablissement": 1108594800, "region_implantation": {"code": "11", "value": "Île-de-France"}, "commune_implantation": {"code": "75108", "value": "PARIS 8"}, "adresse": { "l1": "OCTO TECHNOLOGY", "l4": "50 AVENUE DES CHAMPS ELYSEES", "l6": "75008 PARIS", "l7": "FRANCE", "numero_voie": "50", "type_voie": "AV", "nom_voie": "DES CHAMPS ELYSEES", "code_postal": "75008", "localite": "PARIS 8", "code_insee_localite": "75108", }, "etat_administratif": {"value": "F", "date_fermeture": 1315173600}, }, "gateway_error": False, } UNITES_LEGALES_RESPONSE = { "data": { "siren": "418166096", "siret_siege_social": "41816609600051", "numero_tva_intracommunautaire": "FR16418166096", "forme_juridique": { "libelle": "SA à directoire (s.a.i.)", "code": "5699", }, "activite_principale": { "code": "62.02A", "libelle": "Conseil en systèmes et logiciels informatiques", }, "personne_morale_attributs": { "raison_sociale": "OCTO-TECHNOLOGY", }, "tranche_effectif_salarie": { "de": 200, "a": 249, "code": "31", "date_reference": "2014", "intitule": "200 à 249 salariés", }, "date_creation": 891381600, "categorie_entreprise": "PME", "diffusable_commercialement": True, } } UNITES_LEGALES_SIEGE_RESPONSE = { "data": { "siret": "41816609600051", "adresse": { "numero_voie": "50", "type_voie": "AV", "libelle_voie": "DES CHAMPS ELYSEES", "code_postal": "75008", "libelle_commune": "PARIS 8", "code_commune": "75108", "acheminement_postal": { "l1": "OCTO TECHNOLOGY", "l4": "50 AVENUE DES CHAMPS ELYSEES", "l6": "75008 PARIS", "l7": "FRANCE", }, }, }, "meta": { "date_derniere_mise_a_jour": 1449183600, }, } RCS_UNITES_LEGALES_MANDATAIRES_SOCIAUX_RESPONSE = { "data": [ { "nom": "HISQUIN", "prenom": "FRANCOIS", "fonction": "PRESIDENT DU DIRECTOIRE", "dirigeant": True, "date_naissance": "1965-01-27", "raison_sociale": "", "identifiant": "", "type": "PP", }, { "fonction": "COMMISSAIRE AUX COMPTES SUPPLEANT", "dirigeant": True, "date_naissance": "", "date_naissance_timestamp": 0, "raison_sociale": "BCRH & ASSOCIES - SOCIETE A RESPONSABILITE LIMITEE A ASSOCIE UNIQUE", "identifiant": "490092574", "type": "PM", }, ] } EXTRAITS_RCS_RESPONSE = { "data": { "siren": "418166096", "date_immatriculation": "1998-03-27", "date_immatriculation_timestamp": 890953200, "date_extrait": "21 AVRIL 2017", "observations": [ { "date": "2000-02-23", "date_timestamp": 951260400, "numero": "12197", "libelle": " LA SOCIETE NE CONSERVE AUCUNE ACTIVITE A SON ANCIEN SIEGE ", } ], } } ASSOCIATIONS_RESPONSE = { "data": { "rna_id": "W751135389", "titre": "ALLIANCE DU COEUR: UNION NATIONALE DES FEDERATIONS ET ASSOCIATIONS DE MALADES CARDIOVASCULAIRES", "objet": "information, soutien, solidarité et accompagnement psycho médico social des personnes malades cardiovasculaires et de leurs proches...", "siret": "42135938100025", "siret_siege_social": "42135938100033", "date_creation": "1993-02-11", "date_declaration": "2013-06-28", "date_publication": "1993-03-03", "adresse_siege": { "numero_voie": "10", "type_voie": "RUE", "libelle_voie": "Lebouis", "code_insee": "75120", "code_postal": ["75014"], "commune": "Paris", }, "groupement": "Simple", "mise_a_jour": "2013-06-28", } } DOCUMENTS_ASSOCIATION_RESPONSE = { "meta": {"nombre_documents": 2, "nombre_documents_deficients": 0}, "data": [ { "data": { "type": "Statuts", "url": "https://apientreprise.fr/attestations/40ab0b07d434d0417e8997ce7c5afbef/attestation_document_association.pdf", "timestamp": "1500660325", }, }, { "data": { "type": "Récépissé", "url": "https://apientreprise.fr/attestations/40ab0b07d434d0417e8997ce7c5afbef/recepisse_association.pdf", "timestamp": "1500667325", }, }, { "data": { "timestamp": "1337158058", "url": "https://apientreprise.fr/attestations/40ab0b07d434d0417e8997ce7c5afbef/attestation_document_association.pdf", "type": "Statuts", }, }, ], } EFFECTIFS_ANNUELS_ACOSS_COVID = {"siren": "418166096", "annee": "2019", "effectifs_annuels": 100.5} ENTREPRISE_EFFECTIFS_MENSUELS_ACOSS_COVID = { "siren": "418166096", "annee": "2019", "mois": "02", "effectifs_mensuels": 100.5, } ETABLISSEMENT_EFFECTIFS_MENSUELS_ACOSS_COVID = { "siret": "41816609600051", "annee": "2019", "mois": "02", "effectifs_mensuels": 100.5, } EXERCICES_RESPONSE = { "exercices": [ { "ca": "648374448", "date_fin_exercice": "2016-12-31T00:00:00+01:00", "date_fin_exercice_timestamp": 1483138800, }, { "ca": "491463386", "date_fin_exercice": "2015-12-31T00:00:00+01:00", "date_fin_exercice_timestamp": 1451516400, }, { "ca": "473899061", "date_fin_exercice": "2014-12-31T00:00:00+01:00", "date_fin_exercice_timestamp": 1419980400, }, ] } DOCUMENT_ASSOCIATION_RESPONSE = "binary content" REQUEST_PARAMS = {'context': 'MSP', 'object': 'demand', 'recipient': 'siret'} @pytest.fixture def resource(db): return make_resource( APIEntreprise, slug='test', title='API Entreprise', description='API Entreprise', token='83c68bf0b6013c4daf3f8213f7212aa5', recipient='recipient', ) @mock.patch('passerelle.utils.Request.get') def test_endpoint_with_no_params(mocked_get, app, resource): mocked_get.return_value = FakedResponse(content='{}', status_code=200) response = app.get('/api-entreprise/test/documents_associations/443170139/', status=400) assert response.json['err_class'] == 'passerelle.views.WrongParameter' assert response.json['err_desc'] == "missing parameters: 'context'." params = {'context': 'Custom context', 'object': 'Custom object'} response = app.get('/api-entreprise/test/documents_associations/443170139/', params=params) assert mocked_get.call_args[1]['data']['context'] == 'Custom context' assert mocked_get.call_args[1]['data']['object'] == 'Custom object' assert mocked_get.call_args[1]['data']['recipient'] == 'recipient' params['recipient'] = 'Custom recipient' response = app.get('/api-entreprise/test/documents_associations/443170139/', params=params) assert mocked_get.call_args[1]['data']['recipient'] == 'Custom recipient' def test_entreprises_endpoint(app, resource): with responses.RequestsMock() as rsps: rsps.get( 'https://entreprise.api.gouv.fr/v3/insee/sirene/unites_legales/diffusibles/443170139', json=UNITES_LEGALES_RESPONSE, ) rsps.get( 'https://entreprise.api.gouv.fr/v3/insee/sirene/unites_legales/diffusibles/443170139/siege_social', json=UNITES_LEGALES_SIEGE_RESPONSE, ) rsps.get( 'https://entreprise.api.gouv.fr/v3/infogreffe/rcs/unites_legales/443170139/mandataires_sociaux', json=RCS_UNITES_LEGALES_MANDATAIRES_SOCIAUX_RESPONSE, ) request_params = REQUEST_PARAMS.copy() request_params['mandataires'] = True response = app.get('/api-entreprise/test/entreprises/443170139/', params=request_params) data = response.json['data'] assert data['entreprise']['categorie_entreprise'] == 'PME' assert data['entreprise']['numero_tva_intracommunautaire'] == 'FR16418166096' assert data['entreprise']['siret_siege_social'] == '41816609600051' assert data['entreprise']['forme_juridique'] == 'SA à directoire (s.a.i.)' assert data['entreprise']['forme_juridique_code'] == '5699' assert data['entreprise']['siren'] == '418166096' assert data['entreprise']['date_creation'] == '1998-03-31' assert data['entreprise']['diffusable_commercialement'] is True assert data['entreprise']['naf_entreprise'] == '6202A' assert data['entreprise']['naf_point_entreprise'] == '62.02A' assert data['entreprise']['libelle_naf_entreprise'] == 'Conseil en systèmes et logiciels informatiques' assert data['entreprise']['raison_sociale'] == 'OCTO-TECHNOLOGY' assert data['entreprise']['tranche_effectif_salarie_entreprise']['intitule'] == '200 à 249 salariés' assert 'mandataires_sociaux' in data['entreprise'] mandataires_sociaux = data['entreprise']['mandataires_sociaux'] assert mandataires_sociaux[0]['date_naissance'] == '1965-01-27' assert mandataires_sociaux[0]['nom'] == 'HISQUIN' assert mandataires_sociaux[0]['prenom'] == 'FRANCOIS' assert mandataires_sociaux[0]['fonction'] == 'PRESIDENT DU DIRECTOIRE' assert mandataires_sociaux[1]['nom'] == '' assert mandataires_sociaux[1]['prenom'] == '' assert mandataires_sociaux[1]['fonction'] == 'COMMISSAIRE AUX COMPTES SUPPLEANT' assert 'etablissement_siege' in data assert data['etablissement_siege']['siret'] == '41816609600051' assert data['etablissement_siege']['adresse']['numero_voie'] == '50' assert data['etablissement_siege']['adresse']['type_voie'] == 'AV' assert data['etablissement_siege']['adresse']['nom_voie'] == 'DES CHAMPS ELYSEES' assert data['etablissement_siege']['adresse']['code_postal'] == '75008' assert data['etablissement_siege']['adresse']['localite'] == 'PARIS 8' assert data['etablissement_siege']['adresse']['code_insee_localite'] == '75108' assert data['etablissement_siege']['adresse']['l1'] == 'OCTO TECHNOLOGY' assert data['etablissement_siege']['adresse']['l4'] == '50 AVENUE DES CHAMPS ELYSEES' assert data['etablissement_siege']['adresse']['l6'] == '75008 PARIS' assert data['etablissement_siege']['adresse']['l7'] == 'FRANCE' assert data['etablissement_siege']['date_mise_a_jour'] == '2015-12-03' def test_simple_match_mandataire_social(app, resource): params = { 'first_name': 'françois', 'last_name': 'hIsQuIn', 'birthdate': '19650127', 'method': 'simple', } params.update(REQUEST_PARAMS) with responses.RequestsMock() as rsps: rsps.get('https://entreprise.api.gouv.fr/v2/entreprises/443170139/', json=ENTREPRISES_RESPONSE) url = '/api-entreprise/test/match_mandataire_social/443170139/' response = app.get(url, params=params) # successful matching data = response.json['data'] assert data['nom'] == 'HISQUIN' assert data['prenom'] == 'FRANCOIS' assert data['date_naissance'] == '1965-01-27' assert data['type'] == 'PP' params['method'] = 'unkwown' response = app.get(url, params=params) # unsupported method assert response.json['err'] assert 'data' not in response.json params['method'] = 'simple' params.pop('first_name') response = app.get(url, params=params, status=400) # missing parameter assert not response.json['data'] assert 'missing parameter' in response.json['err_desc'] params['first_name'] = 'JOHN' response = app.get(url, params=params) # matching failed assert not response.json['err'] assert not response.json['data'] def test_levenshtein_match_mandataire_social(app, resource): params = { 'first_name': 'françois', 'last_name': 'hIsQuIn', 'birthdate': '19650127', 'method': 'levenshtein', } params.update(REQUEST_PARAMS) with responses.RequestsMock() as rsps: rsps.get('https://entreprise.api.gouv.fr/v2/entreprises/443170139/', json=ENTREPRISES_RESPONSE) url = '/api-entreprise/test/match_mandataire_social/443170139/' response = app.get(url, params=params) # successful matching data = response.json['data'] assert data['nom'] == 'HISQUIN' assert data['prenom'] == 'FRANCOIS' assert data['date_naissance'] == '1965-01-27' assert data['type'] == 'PP' params['first_name'] = 'JOHN' response = app.get(url, params=params) # matching failed assert not response.json['err'] assert not response.json['data'] params['first_name'] = 'francoi' params['last_name'] = 'hisquinn' response = app.get(url, params=params) # successful matching within distance bracket data = response.json['data'] assert data['nom'] == 'HISQUIN' assert data['prenom'] == 'FRANCOIS' assert data['date_naissance'] == '1965-01-27' assert data['type'] == 'PP' def test_entreprises_endpoint_include_private(app, resource): with responses.RequestsMock() as rsps: rsps.get( 'https://entreprise.api.gouv.fr/v3/insee/sirene/unites_legales/443170139', json=UNITES_LEGALES_RESPONSE, ) rsps.get( 'https://entreprise.api.gouv.fr/v3/insee/sirene/unites_legales/443170139/siege_social', json=UNITES_LEGALES_SIEGE_RESPONSE, ) request_params = REQUEST_PARAMS.copy() request_params['include_private'] = True app.get('/api-entreprise/test/entreprises/443170139/', params=request_params) # the mocked URLS do not contain 'diffusibles' # responses would raise an error if they were not called def test_entreprises_endpoint_no_mandataires(app, resource): with responses.RequestsMock() as rsps: rsps.get( 'https://entreprise.api.gouv.fr/v3/insee/sirene/unites_legales/diffusibles/443170139', json=UNITES_LEGALES_RESPONSE, ) rsps.get( 'https://entreprise.api.gouv.fr/v3/insee/sirene/unites_legales/diffusibles/443170139/siege_social', json=UNITES_LEGALES_SIEGE_RESPONSE, ) response = app.get('/api-entreprise/test/entreprises/443170139/', params=REQUEST_PARAMS) assert response.json['data']['entreprise']['mandataires_sociaux'] == [] def test_etablissements_endpoint(app, resource): with responses.RequestsMock() as rsps: rsps.get( 'https://entreprise.api.gouv.fr/v3/insee/sirene/etablissements/diffusibles/44317013900036', json=ETABLISSEMENTS_RESPONSE, ) response = app.get('/api-entreprise/test/etablissements/44317013900036/', params=REQUEST_PARAMS) assert 'data' in response.json data = response.json['data'] assert 'etablissement' in data assert data['etablissement']['siret'] == '41816609600051' assert data['etablissement']['naf'] == '6202A' assert data['etablissement']['naf_point'] == '62.02A' assert data['etablissement']['date_mise_a_jour'] == '2015-12-03' assert data['etablissement']['date_creation_etablissement'] == '2005-02-16' assert 'adresse' in data['etablissement'] assert data['etablissement']['adresse']['code_postal'] == '75008' assert data['etablissement']['adresse']['localite'] == 'PARIS 8' assert data['etablissement']['adresse']['code_insee_localite'] == '75108' assert data['etablissement']['adresse']['nom_voie'] == 'DES CHAMPS ELYSEES' assert data['etablissement']['adresse']['libelle_voie'] == 'DES CHAMPS ELYSEES' assert data['etablissement']['adresse']['l1'] == 'OCTO TECHNOLOGY' assert data['etablissement']['adresse']['l2'] is None assert data['etablissement']['adresse']['l3'] is None assert data['etablissement']['adresse']['l4'] == '50 AVENUE DES CHAMPS ELYSEES' assert data['etablissement']['adresse']['l5'] is None assert data['etablissement']['adresse']['l6'] == '75008 PARIS' assert data['etablissement']['adresse']['l7'] == 'FRANCE' assert data['etablissement']['commune_implantation']['code'] == '75108' assert data['etablissement']['commune_implantation']['value'] == 'PARIS 8' assert data['etablissement']['tranche_effectif_salarie_etablissement']['de'] == 200 assert data['etablissement']['tranche_effectif_salarie_etablissement']['a'] == 249 assert data['etablissement']['tranche_effectif_salarie_etablissement']['code'] == '31' assert data['etablissement']['tranche_effectif_salarie_etablissement']['date_reference'] == '2014' assert data['etablissement']['tranche_effectif_salarie_etablissement']['intitule'] == '200 à 249 salariés' def test_associations_endpoint(app, resource): with responses.RequestsMock() as rsps: rsps.get( 'https://entreprise.api.gouv.fr/v3/ministere_interieur/rna/associations/443170139', json=ASSOCIATIONS_RESPONSE, ) response = app.get('/api-entreprise/test/associations/443170139/', params=REQUEST_PARAMS) assert 'data' in response.json data = response.json['data'] assert 'association' in data assert data['association']['id'] == 'W751135389' assert data['association']['siret'] == '42135938100025' assert data['association']['date_creation'] == '1993-02-11' assert data['association']['date_declaration'] == '2013-06-28' assert data['association']['date_publication'] == '1993-03-03' assert 'adresse_siege' in data['association'] assert data['association']['adresse_siege']['code_postal'] == '75014' assert data['association']['adresse_siege']['code_insee'] == '75120' def test_documents_associations_endpoint(app, resource): with responses.RequestsMock() as rsps: rsps.get( 'https://entreprise.api.gouv.fr/v3/ministere_interieur/rna/associations/443170139/documents', json=DOCUMENTS_ASSOCIATION_RESPONSE, ) response = app.get('/api-entreprise/test/documents_associations/443170139/', params=REQUEST_PARAMS) assert 'data' in response.json data = response.json['data'] assert len(data) == 3 for document in data: assert 'id' in document assert 'text' in document assert 'url' in document assert 'type' in document assert 'datetime' in document def test_associations_last_document_of_type_endpoint(app, resource): with responses.RequestsMock() as rsps: rsps.get( 'https://entreprise.api.gouv.fr/v3/ministere_interieur/rna/associations/443170139/documents', json=DOCUMENTS_ASSOCIATION_RESPONSE, ) params = REQUEST_PARAMS params['document_type'] = 'Statuts' response = app.get('/api-entreprise/test/document_association/443170139/get-last/', params=params) assert 'data' in response.json data = response.json['data'] assert data['timestamp'] == '1500660325' params['document_type'] = 'Liste des dirigeants' response = app.get('/api-entreprise/test/document_association/443170139/get-last/', params=params) assert not response.json['data'] def test_extraits_rcs(app, resource): with responses.RequestsMock() as rsps: rsps.get( 'https://entreprise.api.gouv.fr/v3/infogreffe/rcs/unites_legales/443170139/extrait_kbis', json=EXTRAITS_RCS_RESPONSE, ) response = app.get('/api-entreprise/test/extraits_rcs/443170139/', params=REQUEST_PARAMS) assert 'data' in response.json data = response.json['data'] assert data['siren'] == '418166096' assert data['date_extrait'] == '21 AVRIL 2017' assert data['date_immatriculation_timestamp'] == 890953200 assert data['date_immatriculation'] == '1998-03-27' assert data['date_immatriculation_datetime'] == '1998-03-26T23:00:00Z' def test_document_association(app, resource, freezer): with responses.RequestsMock() as rsps: rsps.get( 'https://entreprise.api.gouv.fr/v3/ministere_interieur/rna/associations/443170139/documents', json=DOCUMENTS_ASSOCIATION_RESPONSE, ) response = app.get('/api-entreprise/test/documents_associations/443170139/', params=REQUEST_PARAMS) assert 'data' in response.json data = response.json['data'] assert len(data) == 3 document = data[0] assert 'url' in document rsps.get( 'https://apientreprise.fr/attestations/40ab0b07d434d0417e8997ce7c5afbef/attestation_document_association.pdf', body='binary content', ) app.get( document['url'], params={'context': 'MSP', 'object': 'demand', 'recipient': 'siret'}, status=200 ) # try to get document with wrong signature wrong_url = document['url'] + "wrong/" app.get(wrong_url, status=404) # try expired url freezer.move_to(timezone.now() + timezone.timedelta(days=8)) app.get(document['url'], status=404) def test_effectifs_annuels_acoss_covid(app, resource): with responses.RequestsMock() as rsps: rsps.get( 'https://entreprise.api.gouv.fr/v2/effectifs_annuels_acoss_covid/418166096/', json=EFFECTIFS_ANNUELS_ACOSS_COVID, ) response = app.get( '/api-entreprise/test/effectifs_annuels_acoss_covid/418166096/', params=REQUEST_PARAMS ) data = response.json['data'] assert data['siren'] == '418166096' assert data['annee'] == '2019' assert data['effectifs_annuels'] == 100.5 def test_entreprise_effectifs_mensuels_acoss_covid(app, resource): with responses.RequestsMock() as rsps: rsps.get( 'https://entreprise.api.gouv.fr/v2/effectifs_mensuels_acoss_covid/2019/02/entreprise/418166096/', json=ENTREPRISE_EFFECTIFS_MENSUELS_ACOSS_COVID, ) response = app.get( '/api-entreprise/test/entreprise_effectifs_mensuels_acoss_covid/2019/02/418166096/', params=REQUEST_PARAMS, ) data = response.json['data'] assert data['siren'] == '418166096' assert data['annee'] == '2019' assert data['mois'] == '02' assert data['effectifs_mensuels'] == 100.5 def test_etablissment_effectifs_mensuels_acoss_covid(app, resource): with responses.RequestsMock() as rsps: rsps.get( 'https://entreprise.api.gouv.fr/v2/effectifs_mensuels_acoss_covid/2019/02/etablissement/418166096/', json=ETABLISSEMENT_EFFECTIFS_MENSUELS_ACOSS_COVID, ) response = app.get( '/api-entreprise/test/etablissement_effectifs_mensuels_acoss_covid/2019/02/418166096/', params=REQUEST_PARAMS, ) data = response.json['data'] assert data['siret'] == '41816609600051' assert data['annee'] == '2019' assert data['mois'] == '02' assert data['effectifs_mensuels'] == 100.5 def test_exercices(app, resource): with responses.RequestsMock() as rsps: rsps.get('https://entreprise.api.gouv.fr/v2/exercices/418166096/', json=EXERCICES_RESPONSE) response = app.get('/api-entreprise/test/exercices/418166096/', params=REQUEST_PARAMS) data = response.json['data'] assert len(data['exercices']) == 3 exercice = data['exercices'][0] assert exercice['ca'] == '648374448' assert exercice['date_fin_exercice'] == '2016-12-31T00:00:00+01:00' assert exercice['date_fin_exercice_timestamp'] == 1483138800 assert exercice['date_fin_exercice_datetime'] == '2016-12-30T23:00:00Z' def test_error_500(app, resource): with responses.RequestsMock() as rsps: rsps.get( 'https://entreprise.api.gouv.fr/v3/insee/sirene/unites_legales/diffusibles/443170139', body='bad error happened', status=500, ) response = app.get('/api-entreprise/test/entreprises/443170139/', params=REQUEST_PARAMS) assert response.status_code == 200 assert response.json['err'] == 1 assert response.json['data']['status_code'] == 500 assert 'error happened' in response.json['err_desc'] def test_no_json_error(app, resource): with responses.RequestsMock() as rsps: rsps.get( 'https://entreprise.api.gouv.fr/v3/insee/sirene/unites_legales/diffusibles/443170139', body='simple text', ) response = app.get('/api-entreprise/test/entreprises/443170139/', params=REQUEST_PARAMS) assert response.status_code == 200 assert response.json['err'] == 1 assert ( response.json['err_desc'] == "API-entreprise returned non-JSON content with status 200: simple text" ) def test_error_404(app, resource): with responses.RequestsMock() as rsps: rsps.get( 'https://entreprise.api.gouv.fr/v3/insee/sirene/unites_legales/diffusibles/443170139', json={'error': 'not_found', 'message': 'Page not found'}, status=404, ) response = app.get('/api-entreprise/test/entreprises/443170139/', params=REQUEST_PARAMS) assert response.status_code == 200 assert response.json['err'] == 1 assert response.json['err_desc'] == 'Page not found' def test_connection_error(app, resource): with responses.RequestsMock() as rsps: rsps.get( 'https://entreprise.api.gouv.fr/v3/insee/sirene/unites_legales/diffusibles/443170139', body=requests.RequestException('connection timed-out'), ) response = app.get('/api-entreprise/test/entreprises/443170139/', params=REQUEST_PARAMS) assert response.status_code == 200 assert response.json['err'] == 1 assert response.json['err_desc'] == 'API-entreprise connection error: connection timed-out' assert response.json['data'] == []