From 3f1198676bf45ef046970cd6dbeefd4a2f96c3b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20Dr=C3=A9au?= Date: Thu, 5 Oct 2023 17:23:08 +0200 Subject: [PATCH] test: ajout de tests sur les nouvelles routes --- .../indicateurs/indicateurs.actions.ts | 7 ++ .../http/indicateurs.route.test.ts | 3 +- .../integration/http/organisme.routes.test.ts | 101 +++++++++++++++++- .../integration/http/rncp.routes.test.ts | 80 ++++++++++++++ 4 files changed, 188 insertions(+), 3 deletions(-) create mode 100644 server/tests/integration/http/rncp.routes.test.ts diff --git a/server/src/common/actions/indicateurs/indicateurs.actions.ts b/server/src/common/actions/indicateurs/indicateurs.actions.ts index 1a5549e0a..b401a3967 100644 --- a/server/src/common/actions/indicateurs/indicateurs.actions.ts +++ b/server/src/common/actions/indicateurs/indicateurs.actions.ts @@ -615,6 +615,13 @@ export async function getOrganismeIndicateursEffectifsParFormation( localField: "rncp_code", foreignField: "rncp", as: "rncp", + pipeline: [ + { + $project: { + _id: 0, + }, + }, + ], }, }, { diff --git a/server/tests/integration/http/indicateurs.route.test.ts b/server/tests/integration/http/indicateurs.route.test.ts index 52b50ded0..014ffee8b 100644 --- a/server/tests/integration/http/indicateurs.route.test.ts +++ b/server/tests/integration/http/indicateurs.route.test.ts @@ -1,5 +1,6 @@ import { AxiosInstance } from "axiosist"; +import { IndicateursEffectifsAvecOrganisme } from "@/common/actions/indicateurs/indicateurs"; import { Effectif } from "@/common/model/@types"; import { effectifsDb, organismesDb } from "@/common/model/collections"; import { historySequenceApprentiToAbandon, historySequenceInscritToApprenti } from "@tests/data/historySequenceSamples"; @@ -225,7 +226,7 @@ describe("Route indicateurs", () => { inscritsSansContrat: 0, rupturants: 0, abandons: 0, - }, + } satisfies IndicateursEffectifsAvecOrganisme, ] : [] ); diff --git a/server/tests/integration/http/organisme.routes.test.ts b/server/tests/integration/http/organisme.routes.test.ts index bf45996bf..13bff286e 100644 --- a/server/tests/integration/http/organisme.routes.test.ts +++ b/server/tests/integration/http/organisme.routes.test.ts @@ -4,8 +4,10 @@ import { AxiosInstance } from "axiosist"; import { ObjectId, WithId } from "mongodb"; import { PermissionsOrganisme } from "@/common/actions/helpers/permissions-organisme"; +import { IndicateursEffectifsAvecFormation } from "@/common/actions/indicateurs/indicateurs"; import { Organisme } from "@/common/model/@types"; -import { effectifsDb, organisationsDb, organismesDb, usersMigrationDb } from "@/common/model/collections"; +import { Rncp } from "@/common/model/@types/Rncp"; +import { effectifsDb, organisationsDb, organismesDb, rncpDb, usersMigrationDb } from "@/common/model/collections"; import { MapObjectIdToString } from "@/common/utils/mongoUtils"; import { getCurrentTime } from "@/common/utils/timeUtils"; import { @@ -13,6 +15,7 @@ import { historySequenceApprentiToAbandon, historySequenceApprentiToInscrit, historySequenceInscrit, + historySequenceInscritToApprenti, } from "@tests/data/historySequenceSamples"; import { createSampleEffectif } from "@tests/data/randomizedSample"; import { useMongo } from "@tests/jest/setupMongo"; @@ -623,7 +626,101 @@ describe("Routes /organismes/:id", () => { }); }); - describe("PUT /organismes/:id/configure-erp - configuration de l'ERP d'un organisme", () => { + describe("GET /organismes/:id/indicateurs/effectifs/par-formation - indicateurs effectifs d'un organisme par formation", () => { + const date = "2022-10-10T00:00:00.000Z"; + const anneeScolaire = "2022-2023"; + + const ficheRNCP: Rncp = { + rncp: "RNCP34956", + actif: true, + etat_fiche: "Publiée", + intitule: "Arts de la cuisine", + niveau: 4, + romes: ["G1602"], + }; + + beforeEach(async () => { + await Promise.all([ + effectifsDb().insertOne( + createSampleEffectif({ + ...commonEffectifsAttributes, + annee_scolaire: anneeScolaire, + apprenant: { + historique_statut: historySequenceInscritToApprenti, + }, + formation: { + rncp: ficheRNCP.rncp, + }, + }) + ), + rncpDb().insertOne({ ...ficheRNCP }), // la copie par destructuring évite à insertOne d'ajouter _id à l'objet + ]); + }); + + it("Vérifie qu'on ne peut pas accéder à la route sans être authentifié", async () => { + const response = await httpClient.get( + `/api/v1/organismes/${id(1)}/indicateurs/effectifs/par-formation?date=${date}` + ); + + expectUnauthorizedError(response); + }); + + describe("Permissions", () => { + testPermissions( + { + "OF cible": true, + "OF responsable": true, + "OF formateur": false, + "OF non lié": false, + "Tête de réseau même réseau": true, + "Tête de réseau autre réseau": false, + "DREETS même région": true, + "DREETS autre région": false, + "DRAAF même région": true, + "DRAAF autre région": false, + "Conseil Régional même région": true, + "Conseil Régional autre région": false, + "CARIF OREF régional même région": true, + "CARIF OREF régional autre région": false, + "DDETS même département": true, + "DDETS autre département": false, + "Académie même académie": true, + "Académie autre académie": false, + "Opérateur public national": true, + "CARIF OREF national": true, + Administrateur: true, + }, + async (organisation, allowed) => { + const response = await requestAsOrganisation( + organisation, + "get", + `/api/v1/organismes/${id(1)}/indicateurs/effectifs/par-formation?date=${date}` + ); + + if (allowed) { + expect(response.status).toStrictEqual(200); + expect(response.data).toStrictEqual([ + { + rncp_code: ficheRNCP.rncp, + rncp: ficheRNCP, + apprenants: 1, + apprentis: 1, + inscritsSansContrat: 0, + rupturants: 0, + abandons: 0, + } satisfies IndicateursEffectifsAvecFormation, + ]); + } else { + expectForbiddenError(response); + } + } + ); + }); + + // TODO vérifier chaque filtre + }); + + describe("PUT /organismes/:id/configure-erp - configuration du mode de transmission d'un organisme", () => { it("Erreur si non authentifié", async () => { const response = await httpClient.put(`/api/v1/organismes/${id(1)}/configure-erp`, { mode_de_transmission: "MANUEL", diff --git a/server/tests/integration/http/rncp.routes.test.ts b/server/tests/integration/http/rncp.routes.test.ts new file mode 100644 index 000000000..8d8030143 --- /dev/null +++ b/server/tests/integration/http/rncp.routes.test.ts @@ -0,0 +1,80 @@ +import { AxiosInstance } from "axiosist"; + +import { Rncp } from "@/common/model/@types/Rncp"; +import { organismesDb, rncpDb } from "@/common/model/collections"; +import { useMongo } from "@tests/jest/setupMongo"; +import { organismes, testPermissions } from "@tests/utils/permissions"; +import { RequestAsOrganisationFunc, expectUnauthorizedError, initTestApp } from "@tests/utils/testUtils"; + +// FIXME route authentifiée + +let app: Awaited>; +let httpClient: AxiosInstance; +let requestAsOrganisation: RequestAsOrganisationFunc; + +describe("GET /api/v1/rncp/:code_rncp - retourne une fiche RNCP", () => { + useMongo(); + + const ficheRNCP: Rncp = { + rncp: "RNCP34956", + actif: true, + etat_fiche: "Publiée", + intitule: "Arts de la cuisine", + niveau: 4, + romes: ["G1602"], + }; + + beforeEach(async () => { + app = await initTestApp(); + httpClient = app.httpClient; + requestAsOrganisation = app.requestAsOrganisation; + }); + beforeEach(async () => { + await Promise.all([ + organismesDb().insertMany(organismes), + rncpDb().insertOne({ ...ficheRNCP }), // la copie par destructuring évite à insertOne d'ajouter _id à l'objet + ]); + }); + + it("Vérifie qu'on ne peut pas accéder à la route sans être authentifié", async () => { + const response = await httpClient.get(`/api/v1/rncp/${ficheRNCP.rncp}`); + expectUnauthorizedError(response); + }); + + describe("Permissions", () => { + testPermissions( + { + "OF cible": true, + "OF non lié": true, + "OF formateur": true, + "OF responsable": true, + "Tête de réseau même réseau": true, + "Tête de réseau autre réseau": true, + "DREETS même région": true, + "DREETS autre région": true, + "DRAAF même région": true, + "DRAAF autre région": true, + "Conseil Régional même région": true, + "Conseil Régional autre région": true, + "CARIF OREF régional même région": true, + "CARIF OREF régional autre région": true, + "DDETS même département": true, + "DDETS autre département": true, + "Académie même académie": true, + "Académie autre académie": true, + "Opérateur public national": true, + "CARIF OREF national": true, + Administrateur: true, + }, + async (organisation, allowed) => { + const response = await requestAsOrganisation(organisation, "get", `/api/v1/rncp/${ficheRNCP.rncp}`); + + expect(response.status).toStrictEqual(allowed ? 200 : 403); + expect(response.data).toStrictEqual({ + _id: expect.any(String), + ...ficheRNCP, + }); + } + ); + }); +});