Skip to content

Commit

Permalink
Trouve type justificatif depuis code démarche
Browse files Browse the repository at this point in the history
… Ce qui simplifie l'API d'appel à `requete/pieceJustificative`, où le paramètre `idTypeJustificatif`
n'est plus utile.
  • Loading branch information
egaillot committed Aug 5, 2024
1 parent a5cb943 commit dd9bcea
Show file tree
Hide file tree
Showing 8 changed files with 130 additions and 21 deletions.
12 changes: 7 additions & 5 deletions src/api/pieceJustificative.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const {
ErreurAbsenceReponseDestinataire,
ErreurCodeDemarcheIntrouvable,
ErreurDestinataireInexistant,
ErreurReponseRequete,
ErreurTypeJustificatifIntrouvable,
Expand Down Expand Up @@ -30,20 +31,19 @@ const pieceJustificative = (
const idConversation = adaptateurUUID.genereUUID();
const {
codeDemarche,
idTypeJustificatif,
nomDestinataire,
previsualisationRequise,
} = requete.query;

return Promise.all([
depotServicesCommuns.trouveTypeJustificatif(idTypeJustificatif),
depotServicesCommuns.trouveTypesJustificatifsPourDemarche(codeDemarche),
depotPointsAcces.trouvePointAcces(nomDestinataire),
])
.then(([typeJustificatif, destinataire]) => adaptateurDomibus.envoieMessageRequete({
.then(([typesJustificatifs, destinataire]) => adaptateurDomibus.envoieMessageRequete({
codeDemarche,
destinataire,
idConversation,
typeJustificatif,
typeJustificatif: typesJustificatifs[0],
previsualisationRequise: (previsualisationRequise === 'true' || previsualisationRequise === ''),
}))
.then(() => Promise.any([
Expand All @@ -60,7 +60,9 @@ const pieceJustificative = (
})
.catch((e) => {
if (
e instanceof ErreurDestinataireInexistant || e instanceof ErreurTypeJustificatifIntrouvable
e instanceof ErreurCodeDemarcheIntrouvable
|| e instanceof ErreurDestinataireInexistant
|| e instanceof ErreurTypeJustificatifIntrouvable
) {
reponse.status(422).json({ erreur: e.message });
} else if (e instanceof AggregateError) {
Expand Down
25 changes: 22 additions & 3 deletions src/depots/depotServicesCommunsLocal.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
const { ErreurTypeJustificatifIntrouvable } = require('../erreurs');
const { ErreurCodeDemarcheIntrouvable, ErreurTypeJustificatifIntrouvable } = require('../erreurs');
const TypeJustificatif = require('../ebms/typeJustificatif');

const DONNEES_DEPOT = {
demarches: [{
code: '00',
idsTypeJustificatif: ['https://sr.oots.tech.ec.europa.eu/evidencetypeclassifications/oots/00000000-0000-0000-0000-000000000000'],
}],

typesJustificatif: [{
id: '12345',
descriptions: { EN: 'someDummyType' },
id: 'https://sr.oots.tech.ec.europa.eu/evidencetypeclassifications/oots/00000000-0000-0000-0000-000000000000',
descriptions: { EN: 'System Health Check' },
formatDistribution: 'application/pdf',
}],
};
Expand All @@ -23,6 +28,20 @@ class DepotServicesCommunsLocal {
const typeJustificatif = new TypeJustificatif(donneesTypeJustificatif);
return Promise.resolve(typeJustificatif);
}

trouveTypesJustificatifsPourDemarche(code) {
const typesJustificatifs = this.donnees
?.demarches
?.find((d) => d.code === code)
?.idsTypeJustificatif
?.map((id) => this.trouveTypeJustificatif(id));

if (typeof typesJustificatifs === 'undefined') {
return Promise.reject(new ErreurCodeDemarcheIntrouvable(`Code démarche "${code}" introuvable`));
}

return Promise.all(typesJustificatifs);
}
}

module.exports = DepotServicesCommunsLocal;
2 changes: 2 additions & 0 deletions src/erreurs.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
class ErreurAbsenceReponseDestinataire extends Error {}
class ErreurAucunMessageDomibusRecu extends Error {}
class ErreurCodeDemarcheIntrouvable extends Error {}
class ErreurDestinataireInexistant extends Error {}
class ErreurEchecAuthentification extends Error {}
class ErreurInstructionSOAPInconnue extends Error {}
Expand All @@ -10,6 +11,7 @@ class ErreurTypeJustificatifIntrouvable extends Error {}
module.exports = {
ErreurAbsenceReponseDestinataire,
ErreurAucunMessageDomibusRecu,
ErreurCodeDemarcheIntrouvable,
ErreurDestinataireInexistant,
ErreurEchecAuthentification,
ErreurInstructionSOAPInconnue,
Expand Down
14 changes: 7 additions & 7 deletions test/api/pieceJustificative.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ describe('Le requêteur de pièce justificative', () => {
adaptateurDomibus.urlRedirectionDepuisReponse = () => Promise.resolve();
adaptateurUUID.genereUUID = () => '';
depotPointsAcces.trouvePointAcces = () => Promise.resolve({});
depotServicesCommuns.trouveTypeJustificatif = () => Promise.resolve({});
depotServicesCommuns.trouveTypesJustificatifsPourDemarche = () => Promise.resolve([]);

requete.query = {};
reponse.json = () => Promise.resolve();
Expand Down Expand Up @@ -70,14 +70,14 @@ describe('Le requêteur de pièce justificative', () => {
return pieceJustificative(config, requete, reponse);
});

it('interroge dépôt services communs pour récupérer infos relatives au type de justificatif', () => {
it('interroge dépôt services communs pour récupérer infos relatives au code démarche', () => {
expect.assertions(1);
requete.query.idTypeJustificatif = 'unIdentifiant';
requete.query.codeDemarche = '00';

depotServicesCommuns.trouveTypeJustificatif = (id) => {
depotServicesCommuns.trouveTypesJustificatifsPourDemarche = (code) => {
try {
expect(id).toBe('unIdentifiant');
return Promise.resolve({});
expect(code).toBe('00');
return Promise.resolve([]);
} catch (e) {
return Promise.reject(e);
}
Expand All @@ -87,7 +87,7 @@ describe('Le requêteur de pièce justificative', () => {
});

it("transmet l'identifiant de type de pièce justificative demandée", () => {
depotServicesCommuns.trouveTypeJustificatif = () => Promise.resolve({ id: 'unIdentifiant' });
depotServicesCommuns.trouveTypesJustificatifsPourDemarche = () => Promise.resolve([{ id: 'unIdentifiant' }]);

adaptateurDomibus.envoieMessageRequete = ({ typeJustificatif }) => {
try {
Expand Down
41 changes: 41 additions & 0 deletions test/constructeurs/constructeurDepotServicesCommuns.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
const DepotServicesCommuns = require('../../src/depots/depotServicesCommunsLocal');

class ConstructeurDepotServicesCommuns {
constructor() {
this.donnees = {};
this.compteur = 0;
}

avecTypeJustificatif(donnees) {
const donneesParDefaut = {
id: (this.compteur += 1),
descriptions: { EN: '' },
formatDistribution: 'application/xml',
};

this.donnees.typesJustificatif ||= [];
this.donnees.typesJustificatif.push(Object.assign(donneesParDefaut, donnees));
return this;
}

avecDemarche(code, descriptionsTypeJustificatif) {
const donneesDemarche = { code, idsTypeJustificatif: [] };
descriptionsTypeJustificatif.forEach((description) => {
const donneesTypeJustificatif = {};
this.compteur += 1;
donneesTypeJustificatif.id = this.compteur;
donneesTypeJustificatif.descriptions = { EN: description };
this.avecTypeJustificatif(donneesTypeJustificatif);
donneesDemarche.idsTypeJustificatif.push(donneesTypeJustificatif.id);
});
this.donnees.demarches ||= [];
this.donnees.demarches.push(donneesDemarche);
return this;
}

construis() {
return new DepotServicesCommuns(this.donnees);
}
}

module.exports = ConstructeurDepotServicesCommuns;
38 changes: 33 additions & 5 deletions test/depots/depotServicesCommunsLocal.spec.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
const { ErreurTypeJustificatifIntrouvable } = require('../../src/erreurs');
const ConstructeurDepotServicesCommuns = require('../constructeurs/constructeurDepotServicesCommuns');
const { ErreurCodeDemarcheIntrouvable, ErreurTypeJustificatifIntrouvable } = require('../../src/erreurs');
const DepotServicesCommuns = require('../../src/depots/depotServicesCommunsLocal');

describe('Le Dépôt (local, bouchonné) de données des services communs', () => {
it('trouve un type de justificatif à partir de son identifiant', () => {
const depot = new DepotServicesCommuns({
typesJustificatif: [{
const depot = new ConstructeurDepotServicesCommuns()
.avecTypeJustificatif({
id: '12345',
descriptions: { EN: 'someType' },
formatDistribution: 'application/pdf',
}],
});
})
.construis();

return depot.trouveTypeJustificatif('12345')
.then((typeJustificatif) => {
Expand All @@ -30,4 +31,31 @@ describe('Le Dépôt (local, bouchonné) de données des services communs', () =
expect(e.message).toBe('Type justificatif avec identifiant "12345" introuvable');
});
});

it('trouve tous les types de justificatifs liés à un code démarche', () => {
const depot = new ConstructeurDepotServicesCommuns()
.avecDemarche('00', ['tj1', 'tj2'])
.construis();

return depot.trouveTypesJustificatifsPourDemarche('00')
.then((typesJustificatifs) => {
expect(typesJustificatifs.length).toBe(2);
expect(typesJustificatifs[0].descriptions.EN).toBe('tj1');
expect(typesJustificatifs[1].descriptions.EN).toBe('tj2');
});
});

it('retourne une erreur si code démarche introuvable', () => {
expect.assertions(2);

const depot = new ConstructeurDepotServicesCommuns()
.avecDemarche('00', [])
.construis();

return depot.trouveTypesJustificatifsPourDemarche('XX')
.catch((e) => {
expect(e).toBeInstanceOf(ErreurCodeDemarcheIntrouvable);
expect(e.message).toBe('Code démarche "XX" introuvable');
});
});
});
18 changes: 17 additions & 1 deletion test/routes/routesRequete.spec.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
const axios = require('axios');

const serveurTest = require('./serveurTest');
const { ErreurAbsenceReponseDestinataire, ErreurTypeJustificatifIntrouvable } = require('../../src/erreurs');
const {
ErreurAbsenceReponseDestinataire,
ErreurCodeDemarcheIntrouvable,
ErreurTypeJustificatifIntrouvable,
} = require('../../src/erreurs');

describe('Le serveur des routes `/requete`', () => {
const serveur = serveurTest();
Expand Down Expand Up @@ -44,6 +48,18 @@ describe('Le serveur des routes `/requete`', () => {
});
});

it('retourne une erreur HTTP 422 (Unprocessable Content) si le code démarche est introuvable', () => {
serveur.depotServicesCommuns().trouveTypesJustificatifsPourDemarche = () => (
Promise.reject(new ErreurCodeDemarcheIntrouvable('oups'))
);

return axios.get(`http://localhost:${port}/requete/pieceJustificative`)
.catch(({ response }) => {
expect(response.status).toEqual(422);
expect(response.data).toEqual({ erreur: 'oups' });
});
});

it('retourne une erreur 501 quand le feature flip est désactivé', () => {
expect.assertions(2);

Expand Down
1 change: 1 addition & 0 deletions test/routes/serveurTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ const serveurTest = () => {

depotServicesCommuns = {
trouveTypeJustificatif: () => Promise.resolve({}),
trouveTypesJustificatifsPourDemarche: () => Promise.resolve([]),
};

ecouteurDomibus = {
Expand Down

0 comments on commit dd9bcea

Please sign in to comment.