From fce407d48eeab6b4afc1f20cd81b93e3d9eba197 Mon Sep 17 00:00:00 2001 From: Emmanuel Gaillot Date: Thu, 12 Sep 2024 12:13:21 +0200 Subject: [PATCH 1/5] =?UTF-8?q?Remets=20trame=20requ=C3=AAte=20en=20confor?= =?UTF-8?q?mit=C3=A9=20avec=20validateur=20commission=20europ=C3=A9enne?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fabien Lamarque --- src/ebms/requeteJustificatif.js | 2 +- src/routes/routesEbms.js | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/ebms/requeteJustificatif.js b/src/ebms/requeteJustificatif.js index 934686b..9ac170a 100644 --- a/src/ebms/requeteJustificatif.js +++ b/src/ebms/requeteJustificatif.js @@ -81,7 +81,7 @@ class RequeteJustificatif extends Message { - + DK22233223 diff --git a/src/routes/routesEbms.js b/src/routes/routesEbms.js index c36e0f8..8d92a2e 100644 --- a/src/routes/routesEbms.js +++ b/src/routes/routesEbms.js @@ -2,6 +2,7 @@ const express = require('express'); const EnteteErreur = require('../ebms/enteteErreur'); const EnteteRequete = require('../ebms/enteteRequete'); +const Fournisseur = require('../ebms/fournisseur'); const PointAcces = require('../ebms/pointAcces'); const ReponseErreur = require('../ebms/reponseErreur'); const ReponseVerificationSysteme = require('../ebms/reponseVerificationSysteme'); @@ -28,7 +29,15 @@ const routesEbms = (config) => { }); routes.get('/messages/requeteJustificatif', (_requete, reponse) => { - const requeteJustificatif = new RequeteJustificatif({ adaptateurUUID, horodateur }); + const requeteJustificatif = new RequeteJustificatif( + { adaptateurUUID, horodateur }, + { + fournisseur: new Fournisseur({ + pointAcces: { id: 'unIdentifiant', typeId: 'urn:oasis:names:tc:ebcore:partyid-type:unregistered:FR' }, + descriptions: { FR: 'Un requêteur' }, + }), + }, + ); reponse.set('Content-Type', 'text/xml'); reponse.send(requeteJustificatif.corpsMessageEnXML()); From 966ef16766a23803c531689c28ab06b73af4a411 Mon Sep 17 00:00:00 2001 From: Emmanuel Gaillot Date: Thu, 12 Sep 2024 12:21:08 +0200 Subject: [PATCH 2/5] =?UTF-8?q?D=C3=A9cris=20requ=C3=AAteur=20avec=20des?= =?UTF-8?q?=20donn=C3=A9es=20plus=20plausibles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit … En préparation de l'injection de ces données depuis un annuaire de requêteurs. Co-authored-by: Fabien Lamarque --- src/ebms/requeteJustificatif.js | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/ebms/requeteJustificatif.js b/src/ebms/requeteJustificatif.js index 9ac170a..ed6f231 100644 --- a/src/ebms/requeteJustificatif.js +++ b/src/ebms/requeteJustificatif.js @@ -84,20 +84,18 @@ class RequeteJustificatif extends Message { - DK22233223 - Denmark University Portal - - Prince Street 15, 1050 Copenhagen, Denmark - 15 - 1050 - Copenhagen - Prince Street - DK - DK011 - + 123456 + Un requêteur français ER + + + OOTSFRANCE + OOTS-France Intermediary Platform + IP + + ${this.fournisseur.enXML()} From 64076de16da9a05e8914e55478c7425235dedf2e Mon Sep 17 00:00:00 2001 From: Emmanuel Gaillot Date: Thu, 12 Sep 2024 15:00:52 +0200 Subject: [PATCH 3/5] =?UTF-8?q?Introduis=20un=20d=C3=A9p=C3=B4t=20de=20req?= =?UTF-8?q?u=C3=AAteurs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fabien Lamarque --- src/depots/depotRequeteurs.js | 22 ++++++++++++++++++++++ src/ebms/requeteur.js | 9 +++++++++ src/erreurs.js | 2 ++ test/depots/depotRequeteurs.spec.js | 28 ++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+) create mode 100644 src/depots/depotRequeteurs.js create mode 100644 src/ebms/requeteur.js create mode 100644 test/depots/depotRequeteurs.spec.js diff --git a/src/depots/depotRequeteurs.js b/src/depots/depotRequeteurs.js new file mode 100644 index 0000000..a74e941 --- /dev/null +++ b/src/depots/depotRequeteurs.js @@ -0,0 +1,22 @@ +const { ErreurRequeteurInexistant } = require('../erreurs'); +const Requeteur = require('../ebms/requeteur'); + +class DepotRequeteurs { + constructor(donnees) { + this.donnees = donnees; + } + + trouveRequeteur(id) { + const donneesRequeteur = this.donnees[id]; + if (typeof donneesRequeteur === 'undefined') { + return Promise.reject( + new ErreurRequeteurInexistant(`Le requêteur avec comme identifiant "${id}" est inexistant`), + ); + } + + const resultat = new Requeteur({ id, ...donneesRequeteur }); + return Promise.resolve(resultat); + } +} + +module.exports = DepotRequeteurs; diff --git a/src/ebms/requeteur.js b/src/ebms/requeteur.js new file mode 100644 index 0000000..c5d14b1 --- /dev/null +++ b/src/ebms/requeteur.js @@ -0,0 +1,9 @@ +class Requeteur { + constructor(donnees = {}) { + this.id = donnees.id; + this.nom = donnees.nom; + this.url = donnees.url; + } +} + +module.exports = Requeteur; diff --git a/src/erreurs.js b/src/erreurs.js index 8087e21..09cc2a4 100644 --- a/src/erreurs.js +++ b/src/erreurs.js @@ -7,6 +7,7 @@ class ErreurEchecAuthentification extends Error {} class ErreurInstructionSOAPInconnue extends Error {} class ErreurJetonInvalide extends Error {} class ErreurReponseRequete extends Error {} +class ErreurRequeteurInexistant extends Error {} class ErreurTypeJustificatifIntrouvable extends Error {} module.exports = { @@ -19,5 +20,6 @@ module.exports = { ErreurInstructionSOAPInconnue, ErreurJetonInvalide, ErreurReponseRequete, + ErreurRequeteurInexistant, ErreurTypeJustificatifIntrouvable, }; diff --git a/test/depots/depotRequeteurs.spec.js b/test/depots/depotRequeteurs.spec.js new file mode 100644 index 0000000..df98e55 --- /dev/null +++ b/test/depots/depotRequeteurs.spec.js @@ -0,0 +1,28 @@ +const { ErreurRequeteurInexistant } = require('../../src/erreurs'); +const DepotRequeteurs = require('../../src/depots/depotRequeteurs'); + +describe('Le dépôt des requêteurs', () => { + it('sait retrouver un requêteur en fonction de son identifiant', () => { + const depot = new DepotRequeteurs({ + 123: { nom: 'un requêteur', url: 'http://example.com' }, + }); + + return depot.trouveRequeteur('123') + .then((requeteur) => { + expect(requeteur.id).toBe('123'); + expect(requeteur.nom).toBe('un requêteur'); + expect(requeteur.url).toBe('http://example.com'); + }); + }); + + it("retourne une exception si le requêteur n'existe pas", () => { + expect.assertions(2); + const depot = new DepotRequeteurs({}); + + return depot.trouveRequeteur('123') + .catch((e) => { + expect(e).toBeInstanceOf(ErreurRequeteurInexistant); + expect(e.message).toBe('Le requêteur avec comme identifiant "123" est inexistant'); + }); + }); +}); From ea8b75000be788ccbd0508a2a65e0bf5b342ea3a Mon Sep 17 00:00:00 2001 From: Emmanuel Gaillot Date: Thu, 12 Sep 2024 15:19:08 +0200 Subject: [PATCH 4/5] =?UTF-8?q?D=C3=A9l=C3=A8gue=20affichage=20en=20XML=20?= =?UTF-8?q?au=20requ=C3=AAteur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fabien Lamarque --- src/ebms/requeteJustificatif.js | 22 ++++------------------ src/ebms/requeteur.js | 23 +++++++++++++++++++++++ test/ebms/requeteur.spec.js | 28 ++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 18 deletions(-) create mode 100644 test/ebms/requeteur.spec.js diff --git a/src/ebms/requeteJustificatif.js b/src/ebms/requeteJustificatif.js index ed6f231..1bbfcbd 100644 --- a/src/ebms/requeteJustificatif.js +++ b/src/ebms/requeteJustificatif.js @@ -1,6 +1,7 @@ const EnteteRequete = require('./enteteRequete'); const Fournisseur = require('./fournisseur'); const Message = require('./message'); +const Requeteur = require('./requeteur'); const TypeJustificatif = require('./typeJustificatif'); class RequeteJustificatif extends Message { @@ -13,6 +14,7 @@ class RequeteJustificatif extends Message { destinataire = {}, fournisseur = new Fournisseur(), idConversation = config.adaptateurUUID.genereUUID(), + requeteur = new Requeteur(), typeJustificatif = new TypeJustificatif({}), previsualisationRequise = false, } = {}, @@ -21,6 +23,7 @@ class RequeteJustificatif extends Message { this.codeDemarche = codeDemarche; this.fournisseur = fournisseur; + this.requeteur = requeteur; this.typeJustificatif = typeJustificatif; this.previsualisationRequise = previsualisationRequise; } @@ -80,24 +83,7 @@ class RequeteJustificatif extends Message { - - - - - 123456 - Un requêteur français - ER - - - - - OOTSFRANCE - OOTS-France Intermediary Platform - IP - - - - + ${this.requeteur.enXML()} ${this.fournisseur.enXML()} diff --git a/src/ebms/requeteur.js b/src/ebms/requeteur.js index c5d14b1..af87d88 100644 --- a/src/ebms/requeteur.js +++ b/src/ebms/requeteur.js @@ -4,6 +4,29 @@ class Requeteur { this.nom = donnees.nom; this.url = donnees.url; } + + enXML() { + return ` + + + + + ${this.id} + ${this.nom} + ER + + + + + OOTSFRANCE + OOTS-France Intermediary Platform + IP + + + + + `; + } } module.exports = Requeteur; diff --git a/test/ebms/requeteur.spec.js b/test/ebms/requeteur.spec.js new file mode 100644 index 0000000..8f5b0f4 --- /dev/null +++ b/test/ebms/requeteur.spec.js @@ -0,0 +1,28 @@ +const Requeteur = require('../../src/ebms/requeteur'); + +describe('Un requêteur', () => { + it("s'affiche en XML", () => { + const requeteur = new Requeteur({ id: '123456', nom: 'Un requêteur français' }); + + expect(requeteur.enXML()).toBe(` + + + + + 123456 + Un requêteur français + ER + + + + + OOTSFRANCE + OOTS-France Intermediary Platform + IP + + + + + `); + }); +}); From 1ae1411cfc1bdbc13fe3e28a5746cbdae43f67dd Mon Sep 17 00:00:00 2001 From: Emmanuel Gaillot Date: Thu, 12 Sep 2024 16:48:52 +0200 Subject: [PATCH 5/5] =?UTF-8?q?Transmets=20requ=C3=AAteur=20de=20l'annuair?= =?UTF-8?q?e=20=C3=A0=20la=20requ=C3=AAte?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fabien Lamarque --- src/api/pieceJustificative.js | 31 +++++++++++++++---- src/ootsFrance.js | 2 ++ src/routes/routesRequete.js | 2 ++ test/api/pieceJustificative.spec.js | 48 +++++++++++++++++++++++++++-- test/routes/serveurTest.js | 8 +++++ 5 files changed, 83 insertions(+), 8 deletions(-) diff --git a/src/api/pieceJustificative.js b/src/api/pieceJustificative.js index 2824762..20416dc 100644 --- a/src/api/pieceJustificative.js +++ b/src/api/pieceJustificative.js @@ -4,6 +4,7 @@ const { ErreurCodePaysIntrouvable, ErreurDestinataireInexistant, ErreurReponseRequete, + ErreurRequeteurInexistant, ErreurTypeJustificatifIntrouvable, } = require('../erreurs'); @@ -11,15 +12,21 @@ const estErreurAbsenceReponse = (e) => e instanceof ErreurAbsenceReponseDestinat const estErreurReponseRequete = (e) => e instanceof ErreurReponseRequete; const estErreurMetier = (e) => estErreurAbsenceReponse(e) || estErreurReponseRequete(e); -const paramsRequete = (config, codeDemarche, codePays) => { - const { depotPointsAcces, depotServicesCommuns } = config; +const paramsRequete = (config, codeDemarche, codePays, idRequeteur) => { + const { depotPointsAcces, depotRequeteurs, depotServicesCommuns } = config; return depotServicesCommuns.trouveTypesJustificatifsPourDemarche(codeDemarche) .then((tjs) => tjs[0]) .then((tj) => depotServicesCommuns.trouveFournisseurs(tj.id, codePays) .then((fs) => fs[0]) .then((f) => depotPointsAcces.trouvePointAcces(f.idPointAcces()) - .then((pa) => ({ destinataire: pa, fournisseur: f, typeJustificatif: tj })))); + .then((pa) => depotRequeteurs.trouveRequeteur(idRequeteur) + .then((r) => ({ + destinataire: pa, + fournisseur: f, + requeteur: r, + typeJustificatif: tj, + }))))); }; const pieceJustificativeRecue = (idConversation, adaptateurDomibus) => adaptateurDomibus @@ -36,15 +43,26 @@ const pieceJustificative = (config, requete, reponse) => { adaptateurUUID, } = config; const idConversation = adaptateurUUID.genereUUID(); - const { codeDemarche, codePays, previsualisationRequise } = requete.query; + const { + codeDemarche, + codePays, + idRequeteur, + previsualisationRequise, + } = requete.query; - return paramsRequete(config, codeDemarche, codePays) - .then(({ destinataire, fournisseur, typeJustificatif }) => { + return paramsRequete(config, codeDemarche, codePays, idRequeteur) + .then(({ + destinataire, + fournisseur, + requeteur, + typeJustificatif, + }) => { adaptateurDomibus.envoieMessageRequete({ codeDemarche, destinataire, fournisseur, idConversation, + requeteur, typeJustificatif, previsualisationRequise: (previsualisationRequise === 'true' || previsualisationRequise === ''), }); @@ -66,6 +84,7 @@ const pieceJustificative = (config, requete, reponse) => { e instanceof ErreurCodeDemarcheIntrouvable || e instanceof ErreurCodePaysIntrouvable || e instanceof ErreurDestinataireInexistant + || e instanceof ErreurRequeteurInexistant || e instanceof ErreurTypeJustificatifIntrouvable ) { reponse.status(422).json({ erreur: e.message }); diff --git a/src/ootsFrance.js b/src/ootsFrance.js index 6d96648..2b130ce 100644 --- a/src/ootsFrance.js +++ b/src/ootsFrance.js @@ -11,6 +11,7 @@ const creeServeur = (config) => { adaptateurEnvironnement, adaptateurUUID, depotPointsAcces, + depotRequeteurs, depotServicesCommuns, ecouteurDomibus, horodateur, @@ -29,6 +30,7 @@ const creeServeur = (config) => { adaptateurEnvironnement, adaptateurUUID, depotPointsAcces, + depotRequeteurs, depotServicesCommuns, })); diff --git a/src/routes/routesRequete.js b/src/routes/routesRequete.js index 7944a16..77bbed4 100644 --- a/src/routes/routesRequete.js +++ b/src/routes/routesRequete.js @@ -8,6 +8,7 @@ const routesRequete = (config) => { adaptateurEnvironnement, adaptateurUUID, depotPointsAcces, + depotRequeteurs, depotServicesCommuns, } = config; @@ -20,6 +21,7 @@ const routesRequete = (config) => { adaptateurDomibus, adaptateurUUID, depotPointsAcces, + depotRequeteurs, depotServicesCommuns, }, requete, diff --git a/test/api/pieceJustificative.spec.js b/test/api/pieceJustificative.spec.js index 9689205..a2a8646 100644 --- a/test/api/pieceJustificative.spec.js +++ b/test/api/pieceJustificative.spec.js @@ -1,12 +1,14 @@ const pieceJustificative = require('../../src/api/pieceJustificative'); const PointAcces = require('../../src/ebms/pointAcces'); const Fournisseur = require('../../src/ebms/fournisseur'); +const Requeteur = require('../../src/ebms/requeteur'); const TypeJustificatif = require('../../src/ebms/typeJustificatif'); const { ErreurAbsenceReponseDestinataire, - ErreurReponseRequete, ErreurDestinataireInexistant, + ErreurRequeteurInexistant, + ErreurReponseRequete, } = require('../../src/erreurs'); describe('Le requêteur de pièce justificative', () => { @@ -14,6 +16,7 @@ describe('Le requêteur de pièce justificative', () => { const adaptateurEnvironnement = {}; const adaptateurUUID = {}; const depotPointsAcces = {}; + const depotRequeteurs = {}; const depotServicesCommuns = {}; const config = { @@ -21,6 +24,7 @@ describe('Le requêteur de pièce justificative', () => { adaptateurEnvironnement, adaptateurUUID, depotPointsAcces, + depotRequeteurs, depotServicesCommuns, }; const requete = {}; @@ -32,6 +36,7 @@ describe('Le requêteur de pièce justificative', () => { adaptateurDomibus.urlRedirectionDepuisReponse = () => Promise.resolve(); adaptateurUUID.genereUUID = () => ''; depotPointsAcces.trouvePointAcces = () => Promise.resolve({}); + depotRequeteurs.trouveRequeteur = () => Promise.resolve(new Requeteur()); depotServicesCommuns.trouveFournisseurs = () => Promise.resolve([new Fournisseur()]); depotServicesCommuns.trouveTypesJustificatifsPourDemarche = () => Promise.resolve( [new TypeJustificatif()], @@ -124,7 +129,7 @@ describe('Le requêteur de pièce justificative', () => { return pieceJustificative(config, requete, reponse); }); - it('transmets fournisseur à requête', () => { + it('transmet fournisseur à requête', () => { expect.assertions(1); depotServicesCommuns.trouveFournisseurs = () => ( @@ -143,6 +148,45 @@ describe('Le requêteur de pièce justificative', () => { return pieceJustificative(config, requete, reponse); }); + it('interroge le dépôt de requêteurs', () => { + expect.assertions(1); + requete.query.idRequeteur = '123456'; + + depotRequeteurs.trouveRequeteur = (id) => { + expect(id).toBe('123456'); + return Promise.resolve(new Requeteur()); + }; + + return pieceJustificative(config, requete, reponse); + }); + + it('transmet requêteur à requête', () => { + expect.assertions(1); + depotRequeteurs.trouveRequeteur = () => Promise.resolve(new Requeteur({ nom: 'Un requêteur' })); + + adaptateurDomibus.envoieMessageRequete = ({ requeteur }) => { + expect(requeteur.nom).toBe('Un requêteur'); + return Promise.resolve(); + }; + + return pieceJustificative(config, requete, reponse); + }); + + it("génère une erreur 422 lorsque le requêteur n'existe pas", () => { + requete.query.idRequeteur = 'requeteurInexistant'; + depotRequeteurs.trouveRequeteur = () => Promise.reject(new ErreurRequeteurInexistant('Oups')); + + reponse.status = (codeStatus) => { + expect(codeStatus).toEqual(422); + return reponse; + }; + reponse.json = (contenu) => { + expect(contenu).toEqual({ erreur: 'Oups' }); + }; + + return pieceJustificative(config, requete, reponse); + }); + it('utilise un identifiant de conversation', () => { adaptateurUUID.genereUUID = () => '11111111-1111-1111-1111-111111111111'; diff --git a/test/routes/serveurTest.js b/test/routes/serveurTest.js index 117cd57..3eda918 100644 --- a/test/routes/serveurTest.js +++ b/test/routes/serveurTest.js @@ -1,6 +1,7 @@ const { ErreurAbsenceReponseDestinataire } = require('../../src/erreurs'); const OOTS_FRANCE = require('../../src/ootsFrance'); const Fournisseur = require('../../src/ebms/fournisseur'); +const Requeteur = require('../../src/ebms/requeteur'); const TypeJustificatif = require('../../src/ebms/typeJustificatif'); const serveurTest = () => { @@ -8,6 +9,7 @@ const serveurTest = () => { let adaptateurEnvironnement; let adaptateurUUID; let depotPointsAcces; + let depotRequeteurs; let depotServicesCommuns; let ecouteurDomibus; let horodateur; @@ -37,6 +39,10 @@ const serveurTest = () => { trouvePointAcces: () => Promise.resolve({}), }; + depotRequeteurs = { + trouveRequeteur: () => Promise.resolve(new Requeteur()), + }; + depotServicesCommuns = { trouveFournisseurs: () => Promise.resolve([new Fournisseur()]), trouveTypeJustificatif: () => Promise.resolve({}), @@ -58,6 +64,7 @@ const serveurTest = () => { adaptateurEnvironnement, adaptateurUUID, depotPointsAcces, + depotRequeteurs, depotServicesCommuns, ecouteurDomibus, horodateur, @@ -74,6 +81,7 @@ const serveurTest = () => { adaptateurUUID: () => adaptateurUUID, arrete, depotPointsAcces: () => depotPointsAcces, + depotRequeteurs: () => depotRequeteurs, depotServicesCommuns: () => depotServicesCommuns, ecouteurDomibus: () => ecouteurDomibus, horodateur: () => horodateur,