diff --git a/package-lock.json b/package-lock.json index ddc79a2f..644eece9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,12 +53,16 @@ }, "devDependencies": { "@sinonjs/fake-timers": "^10.0.0", + "@types/chai": "^4.3.5", + "@types/chai-as-promised": "^7.1.5", "@types/mocha": "^10.0.1", "@types/sinonjs__fake-timers": "^8.1.2", "chai": "^4.3.7", + "chai-as-promised": "^7.1.1", "concurrently": "^7.6.0", "copy-and-watch": "^0.1.6", "cypress-mailslurp": "^1.7.0", + "nock": "^13.3.2", "nodemon": "^2.0.20", "prettier": "^1.19.1", "ts-mocha": "^10.0.0" @@ -338,6 +342,21 @@ "@types/responselike": "*" } }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "node_modules/@types/chai-as-promised": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", + "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, "node_modules/@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -950,6 +969,18 @@ "node": ">=4" } }, + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" + } + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -2958,6 +2989,12 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, "node_modules/keygrip": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", @@ -3575,6 +3612,44 @@ "node": ">=4.0.0" } }, + "node_modules/nock": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.2.tgz", + "integrity": "sha512-CwbljitiWJhF1gL83NbanhoKs1l23TDlRioNraPTZrzZIEooPemrHRj5m0FZCPkB1ecdYCSWWGcHysJgX/ngnQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.21", + "propagate": "^2.0.0" + }, + "engines": { + "node": ">= 10.13" + } + }, + "node_modules/nock/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nock/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/node-environment-flags": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", @@ -4196,6 +4271,15 @@ "node": ">=4" } }, + "node_modules/propagate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -5649,6 +5733,21 @@ "@types/responselike": "*" } }, + "@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "@types/chai-as-promised": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", + "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", + "dev": true, + "requires": { + "@types/chai": "*" + } + }, "@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -6171,6 +6270,15 @@ "type-detect": "^4.0.5" } }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "requires": { + "check-error": "^1.0.2" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -7644,6 +7752,12 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, "keygrip": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", @@ -8135,6 +8249,35 @@ "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==" }, + "nock": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.2.tgz", + "integrity": "sha512-CwbljitiWJhF1gL83NbanhoKs1l23TDlRioNraPTZrzZIEooPemrHRj5m0FZCPkB1ecdYCSWWGcHysJgX/ngnQ==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.21", + "propagate": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "node-environment-flags": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", @@ -8563,6 +8706,12 @@ "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true }, + "propagate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", diff --git a/package.json b/package.json index c58dc651..9a5de92b 100644 --- a/package.json +++ b/package.json @@ -68,12 +68,16 @@ }, "devDependencies": { "@sinonjs/fake-timers": "^10.0.0", + "@types/chai": "^4.3.5", + "@types/chai-as-promised": "^7.1.5", "@types/mocha": "^10.0.1", "@types/sinonjs__fake-timers": "^8.1.2", "chai": "^4.3.7", + "chai-as-promised": "^7.1.1", "concurrently": "^7.6.0", "copy-and-watch": "^0.1.6", "cypress-mailslurp": "^1.7.0", + "nock": "^13.3.2", "nodemon": "^2.0.20", "prettier": "^1.19.1", "ts-mocha": "^10.0.0" diff --git a/test/api-sirene-data/diffusible.json b/test/api-sirene-data/diffusible.json new file mode 100644 index 00000000..3358a937 --- /dev/null +++ b/test/api-sirene-data/diffusible.json @@ -0,0 +1,102 @@ +{ + "header": { + "statut": 200, + "message": "ok" + }, + "etablissement": { + "siren": "200071843", + "nic": "00060", + "siret": "20007184300060", + "statutDiffusionEtablissement": "O", + "dateCreationEtablissement": "2021-01-27", + "trancheEffectifsEtablissement": null, + "anneeEffectifsEtablissement": null, + "activitePrincipaleRegistreMetiersEtablissement": null, + "dateDernierTraitementEtablissement": "2021-02-02T09:48:38", + "etablissementSiege": true, + "nombrePeriodesEtablissement": 1, + "uniteLegale": { + "etatAdministratifUniteLegale": "A", + "statutDiffusionUniteLegale": "O", + "dateCreationUniteLegale": "2017-01-01", + "categorieJuridiqueUniteLegale": "7346", + "denominationUniteLegale": "CC DU VEXIN NORMAND", + "sigleUniteLegale": null, + "denominationUsuelle1UniteLegale": null, + "denominationUsuelle2UniteLegale": null, + "denominationUsuelle3UniteLegale": null, + "sexeUniteLegale": null, + "nomUniteLegale": null, + "nomUsageUniteLegale": null, + "prenom1UniteLegale": null, + "prenom2UniteLegale": null, + "prenom3UniteLegale": null, + "prenom4UniteLegale": null, + "prenomUsuelUniteLegale": null, + "pseudonymeUniteLegale": null, + "activitePrincipaleUniteLegale": "84.11Z", + "nomenclatureActivitePrincipaleUniteLegale": "NAFRev2", + "identifiantAssociationUniteLegale": null, + "economieSocialeSolidaireUniteLegale": "N", + "societeMissionUniteLegale": null, + "caractereEmployeurUniteLegale": "O", + "trancheEffectifsUniteLegale": "22", + "anneeEffectifsUniteLegale": "2020", + "nicSiegeUniteLegale": "00060", + "dateDernierTraitementUniteLegale": "2023-07-20T10:04:55", + "categorieEntreprise": "PME", + "anneeCategorieEntreprise": "2020" + }, + "adresseEtablissement": { + "complementAdresseEtablissement": null, + "numeroVoieEtablissement": "3", + "indiceRepetitionEtablissement": null, + "typeVoieEtablissement": "RUE", + "libelleVoieEtablissement": "MAISON DE VATIMESNIL", + "codePostalEtablissement": "27150", + "libelleCommuneEtablissement": "ETREPAGNY", + "libelleCommuneEtrangerEtablissement": null, + "distributionSpecialeEtablissement": null, + "codeCommuneEtablissement": "27226", + "codeCedexEtablissement": null, + "libelleCedexEtablissement": null, + "codePaysEtrangerEtablissement": null, + "libellePaysEtrangerEtablissement": null + }, + "adresse2Etablissement": { + "complementAdresse2Etablissement": null, + "numeroVoie2Etablissement": null, + "indiceRepetition2Etablissement": null, + "typeVoie2Etablissement": null, + "libelleVoie2Etablissement": null, + "codePostal2Etablissement": null, + "libelleCommune2Etablissement": null, + "libelleCommuneEtranger2Etablissement": null, + "distributionSpeciale2Etablissement": null, + "codeCommune2Etablissement": null, + "codeCedex2Etablissement": null, + "libelleCedex2Etablissement": null, + "codePaysEtranger2Etablissement": null, + "libellePaysEtranger2Etablissement": null + }, + "periodesEtablissement": [ + { + "dateFin": null, + "dateDebut": "2021-01-27", + "etatAdministratifEtablissement": "A", + "changementEtatAdministratifEtablissement": false, + "enseigne1Etablissement": null, + "enseigne2Etablissement": null, + "enseigne3Etablissement": null, + "changementEnseigneEtablissement": false, + "denominationUsuelleEtablissement": null, + "changementDenominationUsuelleEtablissement": false, + "activitePrincipaleEtablissement": "84.11Z", + "nomenclatureActivitePrincipaleEtablissement": "NAFRev2", + "changementActivitePrincipaleEtablissement": false, + "caractereEmployeurEtablissement": "O", + "changementCaractereEmployeurEtablissement": false + } + ] + } +} diff --git a/test/api-sirene-data/partially-non-diffusible.json b/test/api-sirene-data/partially-non-diffusible.json new file mode 100644 index 00000000..bf87f5be --- /dev/null +++ b/test/api-sirene-data/partially-non-diffusible.json @@ -0,0 +1,102 @@ +{ + "header": { + "statut": 200, + "message": "ok" + }, + "etablissement": { + "siren": "949573257", + "nic": "00019", + "siret": "94957325700019", + "statutDiffusionEtablissement": "P", + "dateCreationEtablissement": "2023-03-13", + "trancheEffectifsEtablissement": null, + "anneeEffectifsEtablissement": null, + "activitePrincipaleRegistreMetiersEtablissement": null, + "dateDernierTraitementEtablissement": "2023-03-06T10:46:30", + "etablissementSiege": true, + "nombrePeriodesEtablissement": 1, + "uniteLegale": { + "etatAdministratifUniteLegale": "A", + "statutDiffusionUniteLegale": "P", + "dateCreationUniteLegale": "2023-03-13", + "categorieJuridiqueUniteLegale": "1000", + "denominationUniteLegale": null, + "sigleUniteLegale": null, + "denominationUsuelle1UniteLegale": null, + "denominationUsuelle2UniteLegale": null, + "denominationUsuelle3UniteLegale": null, + "sexeUniteLegale": "M", + "nomUniteLegale": "SALLE", + "nomUsageUniteLegale": null, + "prenom1UniteLegale": "VICTOR", + "prenom2UniteLegale": null, + "prenom3UniteLegale": null, + "prenom4UniteLegale": null, + "prenomUsuelUniteLegale": "VICTOR", + "pseudonymeUniteLegale": null, + "activitePrincipaleUniteLegale": "62.02A", + "nomenclatureActivitePrincipaleUniteLegale": "NAFRev2", + "identifiantAssociationUniteLegale": null, + "economieSocialeSolidaireUniteLegale": null, + "societeMissionUniteLegale": null, + "caractereEmployeurUniteLegale": "N", + "trancheEffectifsUniteLegale": null, + "anneeEffectifsUniteLegale": null, + "nicSiegeUniteLegale": "00019", + "dateDernierTraitementUniteLegale": "2023-03-06T10:46:30", + "categorieEntreprise": null, + "anneeCategorieEntreprise": null + }, + "adresseEtablissement": { + "complementAdresseEtablissement": null, + "numeroVoieEtablissement": "108", + "indiceRepetitionEtablissement": null, + "typeVoieEtablissement": "AV", + "libelleVoieEtablissement": "DE LA LIBERTE", + "codePostalEtablissement": "06220", + "libelleCommuneEtablissement": "VALLAURIS", + "libelleCommuneEtrangerEtablissement": null, + "distributionSpecialeEtablissement": null, + "codeCommuneEtablissement": "06155", + "codeCedexEtablissement": null, + "libelleCedexEtablissement": null, + "codePaysEtrangerEtablissement": null, + "libellePaysEtrangerEtablissement": null + }, + "adresse2Etablissement": { + "complementAdresse2Etablissement": null, + "numeroVoie2Etablissement": null, + "indiceRepetition2Etablissement": null, + "typeVoie2Etablissement": null, + "libelleVoie2Etablissement": null, + "codePostal2Etablissement": null, + "libelleCommune2Etablissement": null, + "libelleCommuneEtranger2Etablissement": null, + "distributionSpeciale2Etablissement": null, + "codeCommune2Etablissement": null, + "codeCedex2Etablissement": null, + "libelleCedex2Etablissement": null, + "codePaysEtranger2Etablissement": null, + "libellePaysEtranger2Etablissement": null + }, + "periodesEtablissement": [ + { + "dateFin": null, + "dateDebut": "2023-03-13", + "etatAdministratifEtablissement": "A", + "changementEtatAdministratifEtablissement": false, + "enseigne1Etablissement": null, + "enseigne2Etablissement": null, + "enseigne3Etablissement": null, + "changementEnseigneEtablissement": false, + "denominationUsuelleEtablissement": null, + "changementDenominationUsuelleEtablissement": false, + "activitePrincipaleEtablissement": "62.02A", + "nomenclatureActivitePrincipaleEtablissement": "NAFRev2", + "changementActivitePrincipaleEtablissement": false, + "caractereEmployeurEtablissement": "N", + "changementCaractereEmployeurEtablissement": false + } + ] + } +} diff --git a/test/api-sirene.test.ts b/test/api-sirene.test.ts new file mode 100644 index 00000000..a5f00c65 --- /dev/null +++ b/test/api-sirene.test.ts @@ -0,0 +1,74 @@ +import chai from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import nock from 'nock'; +import diffusible from './api-sirene-data/diffusible.json'; +import partiallyNonDiffusible from './api-sirene-data/partially-non-diffusible.json'; +import { getOrganizationInfo } from '../src/connectors/api-sirene'; +import { InseeNotFoundError } from '../src/errors'; + +chai.use(chaiAsPromised); +const assert = chai.assert; + +describe('getOrganizationInfo', () => { + beforeEach(() => { + nock('https://api.insee.fr') + .post('/token') + .reply(200, { + access_token: '08e42802-9ac9-3403-a2a9-b5be11ce446c', + scope: 'am_application_scope default', + token_type: 'Bearer', + expires_in: 521596, + }); + }); + + it('should return valid payload for diffusible établissement', async () => { + nock('https://api.insee.fr') + .get('/entreprises/sirene/V3/siret/20007184300060') + .reply(200, diffusible); + assert.deepEqual(await getOrganizationInfo('20007184300060'), { + siret: '20007184300060', + libelle: 'Cc du vexin normand', + nomComplet: 'Cc du vexin normand', + enseigne: '', + trancheEffectifs: null, + trancheEffectifsUniteLegale: '22', + libelleTrancheEffectif: null, + etatAdministratif: 'A', + estActive: true, + statutDiffusion: 'O', + estDiffusible: true, + adresse: '3 rue maison de vatimesnil, 27150 Etrepagny', + codePostal: '27150', + codeOfficielGeographique: '27226', + activitePrincipale: '84.11Z', + libelleActivitePrincipale: '84.11Z - Administration publique générale', + categorieJuridique: '7346', + libelleCategorieJuridique: 'Communauté de communes', + }); + }); + + it('should throw for partially non diffusible établissement', async () => { + nock('https://api.insee.fr') + .get('/entreprises/sirene/V3/siret/94957325700019') + .reply(200, partiallyNonDiffusible); + await assert.isRejected( + getOrganizationInfo('94957325700019'), + InseeNotFoundError + ); + }); + + it('should throw for totally non diffusible établissement', async () => { + nock('https://api.insee.fr') + .get('/entreprises/sirene/V3/siret/53512638700013') + .reply(403, { + header: { + statut: 403, + message: 'Établissement non diffusable (53512638700013)', + }, + }); + await assert.isRejected( + getOrganizationInfo('53512638700013'), + InseeNotFoundError + ); + }); +});