From 6796bed3d27c10bd2d26d87f6bdbd1aace84ef77 Mon Sep 17 00:00:00 2001 From: ornella Date: Thu, 30 Jan 2025 15:38:19 +0100 Subject: [PATCH 1/6] gateways recuperer les membres --- src/gateways/PrismaMesMembresLoader.test.ts | 189 +++++++++++++++++++ src/gateways/PrismaMesMembresLoader.ts | 103 ++++++++++ src/use-cases/queries/RecupererMesMembres.ts | 2 +- 3 files changed, 293 insertions(+), 1 deletion(-) create mode 100644 src/gateways/PrismaMesMembresLoader.test.ts create mode 100644 src/gateways/PrismaMesMembresLoader.ts diff --git a/src/gateways/PrismaMesMembresLoader.test.ts b/src/gateways/PrismaMesMembresLoader.test.ts new file mode 100644 index 00000000..c5c57444 --- /dev/null +++ b/src/gateways/PrismaMesMembresLoader.test.ts @@ -0,0 +1,189 @@ + +import { PrismaMesMembresLoader } from './PrismaMesMembresLoader' +import { departementRecordFactory, regionRecordFactory } from './testHelper' +import prisma from '../../prisma/prismaClient' + +describe('mes membres loader', () => { + beforeEach(async () => prisma.$queryRaw`START TRANSACTION`) + + afterEach(async () => prisma.$queryRaw`ROLLBACK TRANSACTION`) + + it('quand les membres rattachés à une gouvernance existante sont demandés, alors elle sont renvoyée', async () => { + // GIVEN + await preRequisGouvernanceRhone() + await ajoutMembreGouvernanceCommune() + await ajoutMembreGouvernanceEpci() + await ajoutMembreGouvernanceStructure() + await ajoutMembreGouvernanceDepartement() + await ajoutMembreGouvernanceSgar() + + // WHEN + const mesMembresLoader = new PrismaMesMembresLoader(prisma) + const mesMembresReadModel = await mesMembresLoader.findMesMembres('69', (mesMembres) => mesMembres) + + // THEN + expect(mesMembresReadModel).toStrictEqual({ + autorisations: { + accesMembreValide: false, + ajouterUnMembre: false, + supprimerUnMembre: false, + }, + departement: 'Rhône', + membres: [ + { + contactReferent: { + nom: 'Henrich', + prenom: 'Laetitia', + }, + nom: 'Préfecture du Rhône', + roles: ['coporteur'], + suppressionDuMembreAutorise: false, + typologie: 'Préfecture départementale', + }, + { + contactReferent: { + nom: 'Didier', + prenom: 'Durant', + }, + nom: 'Département du Rhône', + roles: ['coporteur', 'cofinanceur'], + suppressionDuMembreAutorise: false, + typologie: 'Collectivité', + }, + { + contactReferent: { + nom: 'Dupont', + prenom: 'Valérie', + }, + nom: 'Mornant', + roles: ['cofinanceur'], + suppressionDuMembreAutorise: false, + typologie: 'Collectivité', + }, + { + contactReferent: { + nom: 'Dupont', + prenom: 'Valérie', + }, + nom: 'Métropole de Lyon', + roles: ['recipiendaire'], + suppressionDuMembreAutorise: false, + typologie: 'Collectivité, EPCI', + }, + { + contactReferent: { + nom: 'Dupont', + prenom: 'Justine', + }, + nom: 'Auvergne-Rhône-Alpes', + roles: ['recipiendaire'], + suppressionDuMembreAutorise: false, + typologie: 'Collectivité', + }, + { + contactReferent: { + nom: 'Dupont', + prenom: 'Paul', + }, + nom: 'Rhône', + roles: ['cofinanceur'], + suppressionDuMembreAutorise: false, + typologie: 'Collectivité', + }, + ], + roles: [], + typologies: [], + }) + }) +}) + +async function preRequisGouvernanceRhone(): Promise { + await prisma.regionRecord.create({ + data: regionRecordFactory({ + code: '84', + nom: 'Auvergne-Rhône-Alpes', + }), + }) + + await prisma.departementRecord.create({ + data: departementRecordFactory({ + code: '69', + nom: 'Rhône', + regionCode: '84', + }), + }) + + await prisma.gouvernanceRecord.create({ + data: { + departementCode: '69', + }, + }) +} + +async function ajoutMembreGouvernanceStructure(): Promise { + await prisma.membreGouvernanceStructureRecord.create({ + data: { + gouvernanceDepartementCode: '69', + role: 'coporteur', + structure: 'Préfecture du Rhône', + }, + }) + + await prisma.membreGouvernanceStructureRecord.create({ + data: + { + gouvernanceDepartementCode: '69', + role: 'coporteur', + structure: 'Département du Rhône', + }, + }) + + await prisma.membreGouvernanceStructureRecord.create({ + data: + { + gouvernanceDepartementCode: '69', + role: 'cofinanceur', + structure: 'Département du Rhône', + }, + }) +} + +async function ajoutMembreGouvernanceCommune(): Promise { + await prisma.membreGouvernanceCommuneRecord.create({ + data: { + commune: 'Mornant', + gouvernanceDepartementCode: '69', + role: 'cofinanceur', + }, + }) +} + +async function ajoutMembreGouvernanceEpci(): Promise { + await prisma.membreGouvernanceEpciRecord.create({ + data: { + epci: 'Métropole de Lyon', + gouvernanceDepartementCode: '69', + role: 'recipiendaire', + }, + }) +} + +async function ajoutMembreGouvernanceDepartement(): Promise { + await prisma.membreGouvernanceDepartementRecord.create({ + data: { + departementCode: '69', + gouvernanceDepartementCode: '69', + role: 'cofinanceur', + }, + }) +} + +async function ajoutMembreGouvernanceSgar(): Promise { + await prisma.membreGouvernanceSgarRecord.create({ + data: { + gouvernanceDepartementCode: '69', + role: 'recipiendaire', + sgarCode: '84', + }, + }) +} diff --git a/src/gateways/PrismaMesMembresLoader.ts b/src/gateways/PrismaMesMembresLoader.ts new file mode 100644 index 00000000..adce7b96 --- /dev/null +++ b/src/gateways/PrismaMesMembresLoader.ts @@ -0,0 +1,103 @@ +import { PrismaClient } from '@prisma/client' + +import { MesMembresLoader, MesMembresReadModel, Role } from '@/use-cases/queries/RecupererMesMembres' + +interface Membres { + nomMembre: string + role: ReadonlyArray +} +export class PrismaMesMembresLoader extends MesMembresLoader { + readonly #dataResourceGouvernance: PrismaClient + + constructor(dataResourceGouvernance: PrismaClient) { + super() + this.#dataResourceGouvernance = dataResourceGouvernance + } + + protected override async find(codeDepartementGouvernance: string): Promise { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion + const result = (await this.#dataResourceGouvernance.$queryRaw` + SELECT commune AS "nomMembre", ARRAY_AGG(role) AS role FROM membre_gouvernance_commune WHERE "gouvernanceDepartementCode" = ${codeDepartementGouvernance} GROUP BY commune + UNION ALL + SELECT epci AS "nomMembre", ARRAY_AGG(role) AS role FROM membre_gouvernance_epci WHERE "gouvernanceDepartementCode" = ${codeDepartementGouvernance} GROUP BY epci + UNION ALL + SELECT structure AS "nomMembre", ARRAY_AGG(role) AS role FROM membre_gouvernance_structure WHERE "gouvernanceDepartementCode" = ${codeDepartementGouvernance} GROUP BY structure + UNION ALL + SELECT departement.nom AS "nomMembre", ARRAY_AGG(membre_gouvernance_departement.role) AS role FROM membre_gouvernance_departement INNER JOIN departement ON membre_gouvernance_departement."departementCode" = departement.code + WHERE membre_gouvernance_departement."gouvernanceDepartementCode" = ${codeDepartementGouvernance} GROUP BY departement.nom + UNION ALL + SELECT region.nom AS "nomMembre", ARRAY_AGG(membre_gouvernance_sgar.role) AS role FROM membre_gouvernance_sgar INNER JOIN region ON membre_gouvernance_sgar."sgarCode" = region.code WHERE membre_gouvernance_sgar."gouvernanceDepartementCode" = ${codeDepartementGouvernance} GROUP BY region.nom` + ) as ReadonlyArray + + const membres: MesMembresReadModel['membres'] = [ + { + contactReferent: { + nom: 'Henrich', + prenom: 'Laetitia', + }, + nom: 'Préfecture du Rhône', + suppressionDuMembreAutorise: false, + typologie: 'Préfecture départementale', + }, + { + contactReferent: { + nom: 'Didier', + prenom: 'Durant', + }, + nom: 'Département du Rhône', + suppressionDuMembreAutorise: false, + typologie: 'Collectivité', + }, + { + contactReferent: { + nom: 'Dupont', + prenom: 'Valérie', + }, + nom: 'Mornant', + suppressionDuMembreAutorise: false, + typologie: 'Collectivité', + }, + { + contactReferent: { + nom: 'Dupont', + prenom: 'Valérie', + }, + nom: 'Métropole de Lyon', + suppressionDuMembreAutorise: false, + typologie: 'Collectivité, EPCI', + }, + { + contactReferent: { + nom: 'Dupont', + prenom: 'Justine', + }, + nom: 'Auvergne-Rhône-Alpes', + suppressionDuMembreAutorise: false, + typologie: 'Collectivité', + }, + { + contactReferent: { + nom: 'Dupont', + prenom: 'Paul', + }, + nom: 'Rhône', + suppressionDuMembreAutorise: false, + typologie: 'Collectivité', + }, + ].map((membre) => ({ + ...membre, + roles: (result.find((membreDb: Membres) => membreDb.nomMembre === membre.nom)?.role ?? []) as ReadonlyArray, + })) + return { + autorisations: { + accesMembreValide: false, + ajouterUnMembre: false, + supprimerUnMembre: false, + }, + departement: 'Rhône', + membres, + roles: [], + typologies: [], + } + } +} diff --git a/src/use-cases/queries/RecupererMesMembres.ts b/src/use-cases/queries/RecupererMesMembres.ts index 9adc647d..00f81011 100644 --- a/src/use-cases/queries/RecupererMesMembres.ts +++ b/src/use-cases/queries/RecupererMesMembres.ts @@ -66,4 +66,4 @@ type Query = Readonly<{ codeDepartement: string }> -type Role = 'coporteur' | 'cofinanceur' | 'beneficiaire' | 'recipiendaire' | 'observateur' +export type Role = 'coporteur' | 'cofinanceur' | 'beneficiaire' | 'recipiendaire' | 'observateur' From 00939d927a29469b66c7b1327ec4bff436500592 Mon Sep 17 00:00:00 2001 From: ornella Date: Thu, 30 Jan 2025 23:06:42 +0100 Subject: [PATCH 2/6] retour commentaire --- src/gateways/PrismaMesMembresLoader.test.ts | 11 ++++++--- src/gateways/PrismaMesMembresLoader.ts | 24 ++++++++++---------- src/use-cases/queries/RecupererMesMembres.ts | 2 +- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/gateways/PrismaMesMembresLoader.test.ts b/src/gateways/PrismaMesMembresLoader.test.ts index c5c57444..6a6904f0 100644 --- a/src/gateways/PrismaMesMembresLoader.test.ts +++ b/src/gateways/PrismaMesMembresLoader.test.ts @@ -1,4 +1,3 @@ - import { PrismaMesMembresLoader } from './PrismaMesMembresLoader' import { departementRecordFactory, regionRecordFactory } from './testHelper' import prisma from '../../prisma/prismaClient' @@ -10,7 +9,9 @@ describe('mes membres loader', () => { it('quand les membres rattachés à une gouvernance existante sont demandés, alors elle sont renvoyée', async () => { // GIVEN - await preRequisGouvernanceRhone() + await ajoutRegionGouvernance() + await ajoutDepartementGouvernance() + await ajoutGouvernance() await ajoutMembreGouvernanceCommune() await ajoutMembreGouvernanceEpci() await ajoutMembreGouvernanceStructure() @@ -97,14 +98,16 @@ describe('mes membres loader', () => { }) }) -async function preRequisGouvernanceRhone(): Promise { +async function ajoutRegionGouvernance(): Promise { await prisma.regionRecord.create({ data: regionRecordFactory({ code: '84', nom: 'Auvergne-Rhône-Alpes', }), }) +} +async function ajoutDepartementGouvernance(): Promise { await prisma.departementRecord.create({ data: departementRecordFactory({ code: '69', @@ -112,7 +115,9 @@ async function preRequisGouvernanceRhone(): Promise { regionCode: '84', }), }) +} +async function ajoutGouvernance(): Promise { await prisma.gouvernanceRecord.create({ data: { departementCode: '69', diff --git a/src/gateways/PrismaMesMembresLoader.ts b/src/gateways/PrismaMesMembresLoader.ts index adce7b96..74c5088e 100644 --- a/src/gateways/PrismaMesMembresLoader.ts +++ b/src/gateways/PrismaMesMembresLoader.ts @@ -1,33 +1,28 @@ import { PrismaClient } from '@prisma/client' -import { MesMembresLoader, MesMembresReadModel, Role } from '@/use-cases/queries/RecupererMesMembres' +import { MesMembresLoader, MesMembresReadModel } from '@/use-cases/queries/RecupererMesMembres' -interface Membres { - nomMembre: string - role: ReadonlyArray -} export class PrismaMesMembresLoader extends MesMembresLoader { - readonly #dataResourceGouvernance: PrismaClient + readonly #dataResource: PrismaClient - constructor(dataResourceGouvernance: PrismaClient) { + constructor(dataResource: PrismaClient) { super() - this.#dataResourceGouvernance = dataResourceGouvernance + this.#dataResource = dataResource } protected override async find(codeDepartementGouvernance: string): Promise { // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion - const result = (await this.#dataResourceGouvernance.$queryRaw` + const result: ReadonlyArray = await this.#dataResource.$queryRaw` SELECT commune AS "nomMembre", ARRAY_AGG(role) AS role FROM membre_gouvernance_commune WHERE "gouvernanceDepartementCode" = ${codeDepartementGouvernance} GROUP BY commune UNION ALL SELECT epci AS "nomMembre", ARRAY_AGG(role) AS role FROM membre_gouvernance_epci WHERE "gouvernanceDepartementCode" = ${codeDepartementGouvernance} GROUP BY epci UNION ALL SELECT structure AS "nomMembre", ARRAY_AGG(role) AS role FROM membre_gouvernance_structure WHERE "gouvernanceDepartementCode" = ${codeDepartementGouvernance} GROUP BY structure UNION ALL - SELECT departement.nom AS "nomMembre", ARRAY_AGG(membre_gouvernance_departement.role) AS role FROM membre_gouvernance_departement INNER JOIN departement ON membre_gouvernance_departement."departementCode" = departement.code + SELECT departement.nom AS "nomMembre", ARRAY_AGG(membre_gouvernance_departement.role) AS role FROM membre_gouvernance_departement INNER JOIN departement ON membre_gouvernance_departement."departementCode" = departement.code WHERE membre_gouvernance_departement."gouvernanceDepartementCode" = ${codeDepartementGouvernance} GROUP BY departement.nom UNION ALL SELECT region.nom AS "nomMembre", ARRAY_AGG(membre_gouvernance_sgar.role) AS role FROM membre_gouvernance_sgar INNER JOIN region ON membre_gouvernance_sgar."sgarCode" = region.code WHERE membre_gouvernance_sgar."gouvernanceDepartementCode" = ${codeDepartementGouvernance} GROUP BY region.nom` - ) as ReadonlyArray const membres: MesMembresReadModel['membres'] = [ { @@ -86,7 +81,7 @@ export class PrismaMesMembresLoader extends MesMembresLoader { }, ].map((membre) => ({ ...membre, - roles: (result.find((membreDb: Membres) => membreDb.nomMembre === membre.nom)?.role ?? []) as ReadonlyArray, + roles: (result.find((membreDb: Membres) => membreDb.nomMembre === membre.nom)?.role ?? []) as MesMembresReadModel['roles'], })) return { autorisations: { @@ -101,3 +96,8 @@ export class PrismaMesMembresLoader extends MesMembresLoader { } } } + +type Membres = Readonly<{ + nomMembre: string + role: ReadonlyArray +}> diff --git a/src/use-cases/queries/RecupererMesMembres.ts b/src/use-cases/queries/RecupererMesMembres.ts index 00f81011..9adc647d 100644 --- a/src/use-cases/queries/RecupererMesMembres.ts +++ b/src/use-cases/queries/RecupererMesMembres.ts @@ -66,4 +66,4 @@ type Query = Readonly<{ codeDepartement: string }> -export type Role = 'coporteur' | 'cofinanceur' | 'beneficiaire' | 'recipiendaire' | 'observateur' +type Role = 'coporteur' | 'cofinanceur' | 'beneficiaire' | 'recipiendaire' | 'observateur' From 72fc829ebaceabcae05bf0d721f4432317b8d0e2 Mon Sep 17 00:00:00 2001 From: ornella Date: Fri, 31 Jan 2025 07:50:02 +0100 Subject: [PATCH 3/6] refacto en mettant les creates pour les tests dans le testHelper --- src/gateways/PrismaMesMembresLoader.test.ts | 115 ++------------------ src/gateways/testHelper.ts | 102 +++++++++++++++++ 2 files changed, 113 insertions(+), 104 deletions(-) diff --git a/src/gateways/PrismaMesMembresLoader.test.ts b/src/gateways/PrismaMesMembresLoader.test.ts index 6a6904f0..d6706b88 100644 --- a/src/gateways/PrismaMesMembresLoader.test.ts +++ b/src/gateways/PrismaMesMembresLoader.test.ts @@ -1,5 +1,5 @@ import { PrismaMesMembresLoader } from './PrismaMesMembresLoader' -import { departementRecordFactory, regionRecordFactory } from './testHelper' +import { ajouterUnDepartement, ajouterUneGouvernance, ajouterUneRegion, ajouterUnMembreCommune, ajouterUnMembreDepartement, ajouterUnMembreEpci, ajouterUnMembreSgar, ajouterUnMembreStructure } from './testHelper' import prisma from '../../prisma/prismaClient' describe('mes membres loader', () => { @@ -9,14 +9,16 @@ describe('mes membres loader', () => { it('quand les membres rattachés à une gouvernance existante sont demandés, alors elle sont renvoyée', async () => { // GIVEN - await ajoutRegionGouvernance() - await ajoutDepartementGouvernance() - await ajoutGouvernance() - await ajoutMembreGouvernanceCommune() - await ajoutMembreGouvernanceEpci() - await ajoutMembreGouvernanceStructure() - await ajoutMembreGouvernanceDepartement() - await ajoutMembreGouvernanceSgar() + await ajouterUneRegion() + await ajouterUnDepartement() + await ajouterUneGouvernance() + await ajouterUnMembreCommune() + await ajouterUnMembreEpci() + await ajouterUnMembreStructure() + await ajouterUnMembreStructure({ structure: 'Département du Rhône' }) + await ajouterUnMembreStructure({ role: 'cofinanceur', structure: 'Département du Rhône' }) + await ajouterUnMembreDepartement() + await ajouterUnMembreSgar() // WHEN const mesMembresLoader = new PrismaMesMembresLoader(prisma) @@ -97,98 +99,3 @@ describe('mes membres loader', () => { }) }) }) - -async function ajoutRegionGouvernance(): Promise { - await prisma.regionRecord.create({ - data: regionRecordFactory({ - code: '84', - nom: 'Auvergne-Rhône-Alpes', - }), - }) -} - -async function ajoutDepartementGouvernance(): Promise { - await prisma.departementRecord.create({ - data: departementRecordFactory({ - code: '69', - nom: 'Rhône', - regionCode: '84', - }), - }) -} - -async function ajoutGouvernance(): Promise { - await prisma.gouvernanceRecord.create({ - data: { - departementCode: '69', - }, - }) -} - -async function ajoutMembreGouvernanceStructure(): Promise { - await prisma.membreGouvernanceStructureRecord.create({ - data: { - gouvernanceDepartementCode: '69', - role: 'coporteur', - structure: 'Préfecture du Rhône', - }, - }) - - await prisma.membreGouvernanceStructureRecord.create({ - data: - { - gouvernanceDepartementCode: '69', - role: 'coporteur', - structure: 'Département du Rhône', - }, - }) - - await prisma.membreGouvernanceStructureRecord.create({ - data: - { - gouvernanceDepartementCode: '69', - role: 'cofinanceur', - structure: 'Département du Rhône', - }, - }) -} - -async function ajoutMembreGouvernanceCommune(): Promise { - await prisma.membreGouvernanceCommuneRecord.create({ - data: { - commune: 'Mornant', - gouvernanceDepartementCode: '69', - role: 'cofinanceur', - }, - }) -} - -async function ajoutMembreGouvernanceEpci(): Promise { - await prisma.membreGouvernanceEpciRecord.create({ - data: { - epci: 'Métropole de Lyon', - gouvernanceDepartementCode: '69', - role: 'recipiendaire', - }, - }) -} - -async function ajoutMembreGouvernanceDepartement(): Promise { - await prisma.membreGouvernanceDepartementRecord.create({ - data: { - departementCode: '69', - gouvernanceDepartementCode: '69', - role: 'cofinanceur', - }, - }) -} - -async function ajoutMembreGouvernanceSgar(): Promise { - await prisma.membreGouvernanceSgarRecord.create({ - data: { - gouvernanceDepartementCode: '69', - role: 'recipiendaire', - sgarCode: '84', - }, - }) -} diff --git a/src/gateways/testHelper.ts b/src/gateways/testHelper.ts index b9ce7b39..a5eaec7b 100644 --- a/src/gateways/testHelper.ts +++ b/src/gateways/testHelper.ts @@ -1,6 +1,7 @@ // Stryker disable all import { Prisma } from '@prisma/client' +import prisma from '../../prisma/prismaClient' import { epochTime } from '@/shared/testHelper' export function regionRecordFactory( @@ -120,3 +121,104 @@ export function noteDeContexteRecordFactory( ...override, } } + +export async function ajouterUneRegion( + override?: Partial +): Promise { + await prisma.regionRecord.create({ + data: regionRecordFactory({ + code: '84', + nom: 'Auvergne-Rhône-Alpes', + ...override, + }), + }) +} + +export async function ajouterUnDepartement( + override?: Partial +): Promise { + await prisma.departementRecord.create({ + data: departementRecordFactory({ + code: '69', + nom: 'Rhône', + regionCode: '84', + ...override, + }), + }) +} + +export async function ajouterUneGouvernance( + override?: Partial +): Promise { + await prisma.gouvernanceRecord.create({ + data: { + departementCode: '69', + ...override, + }, + }) +} + +export async function ajouterUnMembreStructure( + override?: Partial +): Promise { + await prisma.membreGouvernanceStructureRecord.create({ + data: { + gouvernanceDepartementCode: '69', + role: 'coporteur', + structure: 'Préfecture du Rhône', + ...override, + }, + }) +} + +export async function ajouterUnMembreCommune( + override?: Partial +): Promise { + await prisma.membreGouvernanceCommuneRecord.create({ + data: { + commune: 'Mornant', + gouvernanceDepartementCode: '69', + role: 'cofinanceur', + ...override, + }, + }) +} + +export async function ajouterUnMembreEpci( + override?: Partial +): Promise { + await prisma.membreGouvernanceEpciRecord.create({ + data: { + epci: 'Métropole de Lyon', + gouvernanceDepartementCode: '69', + role: 'recipiendaire', + ...override, + }, + }) +} + +export async function ajouterUnMembreDepartement( + override?: Partial +): Promise { + await prisma.membreGouvernanceDepartementRecord.create({ + data: { + departementCode: '69', + gouvernanceDepartementCode: '69', + role: 'cofinanceur', + ...override, + }, + }) +} + +export async function ajouterUnMembreSgar( + override?: Partial +): Promise { + await prisma.membreGouvernanceSgarRecord.create({ + data: { + gouvernanceDepartementCode: '69', + role: 'recipiendaire', + sgarCode: '84', + ...override, + }, + }) +} From 8e42da39b0e885fc2907539dc7accba105269acc Mon Sep 17 00:00:00 2001 From: Ornella <68587983+Ornella452@users.noreply.github.com> Date: Fri, 31 Jan 2025 11:23:12 +0100 Subject: [PATCH 4/6] Update src/gateways/PrismaMesMembresLoader.ts Co-authored-by: Fabien --- src/gateways/PrismaMesMembresLoader.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gateways/PrismaMesMembresLoader.ts b/src/gateways/PrismaMesMembresLoader.ts index 74c5088e..781f5be7 100644 --- a/src/gateways/PrismaMesMembresLoader.ts +++ b/src/gateways/PrismaMesMembresLoader.ts @@ -11,7 +11,6 @@ export class PrismaMesMembresLoader extends MesMembresLoader { } protected override async find(codeDepartementGouvernance: string): Promise { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion const result: ReadonlyArray = await this.#dataResource.$queryRaw` SELECT commune AS "nomMembre", ARRAY_AGG(role) AS role FROM membre_gouvernance_commune WHERE "gouvernanceDepartementCode" = ${codeDepartementGouvernance} GROUP BY commune UNION ALL From 43ae3e9c16a1c4591ce1bd0e4d0ab13c386a190b Mon Sep 17 00:00:00 2001 From: ornella Date: Fri, 31 Jan 2025 12:23:56 +0100 Subject: [PATCH 5/6] ajout test pour le ORDER BY --- src/gateways/PrismaMesMembresLoader.test.ts | 106 ++++++++++++++++++-- src/gateways/PrismaMesMembresLoader.ts | 20 +++- 2 files changed, 114 insertions(+), 12 deletions(-) diff --git a/src/gateways/PrismaMesMembresLoader.test.ts b/src/gateways/PrismaMesMembresLoader.test.ts index d6706b88..482038c3 100644 --- a/src/gateways/PrismaMesMembresLoader.test.ts +++ b/src/gateways/PrismaMesMembresLoader.test.ts @@ -35,13 +35,13 @@ describe('mes membres loader', () => { membres: [ { contactReferent: { - nom: 'Henrich', - prenom: 'Laetitia', + nom: 'Dupont', + prenom: 'Justine', }, - nom: 'Préfecture du Rhône', - roles: ['coporteur'], + nom: 'Auvergne-Rhône-Alpes', + roles: ['recipiendaire'], suppressionDuMembreAutorise: false, - typologie: 'Préfecture départementale', + typologie: 'Collectivité', }, { contactReferent: { @@ -73,16 +73,98 @@ describe('mes membres loader', () => { suppressionDuMembreAutorise: false, typologie: 'Collectivité, EPCI', }, + { + contactReferent: { + nom: 'Henrich', + prenom: 'Laetitia', + }, + nom: 'Préfecture du Rhône', + roles: ['coporteur'], + suppressionDuMembreAutorise: false, + typologie: 'Préfecture départementale', + }, { contactReferent: { nom: 'Dupont', - prenom: 'Justine', + prenom: 'Paul', }, - nom: 'Auvergne-Rhône-Alpes', + nom: 'Rhône', + roles: ['cofinanceur'], + suppressionDuMembreAutorise: false, + typologie: 'Collectivité', + }, + ], + roles: [], + typologies: [], + }) + }) + + it('quand les membres rattachés à une gouvernance existante sont demandés, alors elles sont renvoyées sans qu’on s’attende à l’ordre d’insertion.', async () => { + // GIVEN + await ajouterUneRegion() + await ajouterUnDepartement() + await ajouterUneGouvernance() + await ajouterUnMembreCommune() + await ajouterUnMembreEpci() + await ajouterUnMembreStructure() + await ajouterUnMembreStructure({ structure: 'Département du Rhône' }) + await ajouterUnMembreStructure({ role: 'cofinanceur', structure: 'Département du Rhône' }) + await ajouterUnMembreDepartement() + await ajouterUnMembreSgar() + + // WHEN + const mesMembresLoader = new PrismaMesMembresLoader(prisma) + const mesMembresReadModel = await mesMembresLoader.findMesMembres('69', (mesMembres) => mesMembres) + + // THEN + expect(mesMembresReadModel).not.toStrictEqual({ + autorisations: { + accesMembreValide: false, + ajouterUnMembre: false, + supprimerUnMembre: false, + }, + departement: 'Rhône', + membres: [ + { + contactReferent: { + nom: 'Dupont', + prenom: 'Valérie', + }, + nom: 'Mornant', + roles: ['cofinanceur'], + suppressionDuMembreAutorise: false, + typologie: 'Collectivité', + }, + { + contactReferent: { + nom: 'Dupont', + prenom: 'Valérie', + }, + nom: 'Métropole de Lyon', roles: ['recipiendaire'], suppressionDuMembreAutorise: false, + typologie: 'Collectivité, EPCI', + }, + { + contactReferent: { + nom: 'Didier', + prenom: 'Durant', + }, + nom: 'Département du Rhône', + roles: ['coporteur', 'cofinanceur'], + suppressionDuMembreAutorise: false, typologie: 'Collectivité', }, + { + contactReferent: { + nom: 'Henrich', + prenom: 'Laetitia', + }, + nom: 'Préfecture du Rhône', + roles: ['coporteur'], + suppressionDuMembreAutorise: false, + typologie: 'Préfecture départementale', + }, { contactReferent: { nom: 'Dupont', @@ -93,6 +175,16 @@ describe('mes membres loader', () => { suppressionDuMembreAutorise: false, typologie: 'Collectivité', }, + { + contactReferent: { + nom: 'Dupont', + prenom: 'Justine', + }, + nom: 'Auvergne-Rhône-Alpes', + roles: ['recipiendaire'], + suppressionDuMembreAutorise: false, + typologie: 'Collectivité', + }, ], roles: [], typologies: [], diff --git a/src/gateways/PrismaMesMembresLoader.ts b/src/gateways/PrismaMesMembresLoader.ts index 781f5be7..b8857130 100644 --- a/src/gateways/PrismaMesMembresLoader.ts +++ b/src/gateways/PrismaMesMembresLoader.ts @@ -21,9 +21,10 @@ export class PrismaMesMembresLoader extends MesMembresLoader { SELECT departement.nom AS "nomMembre", ARRAY_AGG(membre_gouvernance_departement.role) AS role FROM membre_gouvernance_departement INNER JOIN departement ON membre_gouvernance_departement."departementCode" = departement.code WHERE membre_gouvernance_departement."gouvernanceDepartementCode" = ${codeDepartementGouvernance} GROUP BY departement.nom UNION ALL - SELECT region.nom AS "nomMembre", ARRAY_AGG(membre_gouvernance_sgar.role) AS role FROM membre_gouvernance_sgar INNER JOIN region ON membre_gouvernance_sgar."sgarCode" = region.code WHERE membre_gouvernance_sgar."gouvernanceDepartementCode" = ${codeDepartementGouvernance} GROUP BY region.nom` + SELECT region.nom AS "nomMembre", ARRAY_AGG(membre_gouvernance_sgar.role) AS role FROM membre_gouvernance_sgar INNER JOIN region ON membre_gouvernance_sgar."sgarCode" = region.code WHERE membre_gouvernance_sgar."gouvernanceDepartementCode" = ${codeDepartementGouvernance} GROUP BY region.nom + ORDER BY "nomMembre"` - const membres: MesMembresReadModel['membres'] = [ + const membresBouchonner = [ { contactReferent: { nom: 'Henrich', @@ -78,10 +79,19 @@ export class PrismaMesMembresLoader extends MesMembresLoader { suppressionDuMembreAutorise: false, typologie: 'Collectivité', }, - ].map((membre) => ({ - ...membre, - roles: (result.find((membreDb: Membres) => membreDb.nomMembre === membre.nom)?.role ?? []) as MesMembresReadModel['roles'], + ] + const membres: MesMembresReadModel['membres'] = result.map((membreResult) => ({ + contactReferent: { + nom: '', + prenom: '', + }, + nom: '', + roles: membreResult.role as MesMembresReadModel['roles'], + suppressionDuMembreAutorise: false, + typologie: '', + ...membresBouchonner.find((membre) => membre.nom === membreResult.nomMembre), })) + return { autorisations: { accesMembreValide: false, From 84ba1e38717b9f02ca006c071f4931793b27fec3 Mon Sep 17 00:00:00 2001 From: ornella Date: Fri, 31 Jan 2025 16:30:16 +0100 Subject: [PATCH 6/6] remove test inutile --- src/gateways/PrismaMesMembresLoader.test.ts | 94 +-------------------- 1 file changed, 1 insertion(+), 93 deletions(-) diff --git a/src/gateways/PrismaMesMembresLoader.test.ts b/src/gateways/PrismaMesMembresLoader.test.ts index 482038c3..4b9182ef 100644 --- a/src/gateways/PrismaMesMembresLoader.test.ts +++ b/src/gateways/PrismaMesMembresLoader.test.ts @@ -7,7 +7,7 @@ describe('mes membres loader', () => { afterEach(async () => prisma.$queryRaw`ROLLBACK TRANSACTION`) - it('quand les membres rattachés à une gouvernance existante sont demandés, alors elle sont renvoyée', async () => { + it('quand les membres rattachés à une gouvernance existante sont demandés, alors elle sont renvoyée dans l’ordre alphabétique', async () => { // GIVEN await ajouterUneRegion() await ajouterUnDepartement() @@ -98,96 +98,4 @@ describe('mes membres loader', () => { typologies: [], }) }) - - it('quand les membres rattachés à une gouvernance existante sont demandés, alors elles sont renvoyées sans qu’on s’attende à l’ordre d’insertion.', async () => { - // GIVEN - await ajouterUneRegion() - await ajouterUnDepartement() - await ajouterUneGouvernance() - await ajouterUnMembreCommune() - await ajouterUnMembreEpci() - await ajouterUnMembreStructure() - await ajouterUnMembreStructure({ structure: 'Département du Rhône' }) - await ajouterUnMembreStructure({ role: 'cofinanceur', structure: 'Département du Rhône' }) - await ajouterUnMembreDepartement() - await ajouterUnMembreSgar() - - // WHEN - const mesMembresLoader = new PrismaMesMembresLoader(prisma) - const mesMembresReadModel = await mesMembresLoader.findMesMembres('69', (mesMembres) => mesMembres) - - // THEN - expect(mesMembresReadModel).not.toStrictEqual({ - autorisations: { - accesMembreValide: false, - ajouterUnMembre: false, - supprimerUnMembre: false, - }, - departement: 'Rhône', - membres: [ - { - contactReferent: { - nom: 'Dupont', - prenom: 'Valérie', - }, - nom: 'Mornant', - roles: ['cofinanceur'], - suppressionDuMembreAutorise: false, - typologie: 'Collectivité', - }, - { - contactReferent: { - nom: 'Dupont', - prenom: 'Valérie', - }, - nom: 'Métropole de Lyon', - roles: ['recipiendaire'], - suppressionDuMembreAutorise: false, - typologie: 'Collectivité, EPCI', - }, - { - contactReferent: { - nom: 'Didier', - prenom: 'Durant', - }, - nom: 'Département du Rhône', - roles: ['coporteur', 'cofinanceur'], - suppressionDuMembreAutorise: false, - typologie: 'Collectivité', - }, - { - contactReferent: { - nom: 'Henrich', - prenom: 'Laetitia', - }, - nom: 'Préfecture du Rhône', - roles: ['coporteur'], - suppressionDuMembreAutorise: false, - typologie: 'Préfecture départementale', - }, - { - contactReferent: { - nom: 'Dupont', - prenom: 'Paul', - }, - nom: 'Rhône', - roles: ['cofinanceur'], - suppressionDuMembreAutorise: false, - typologie: 'Collectivité', - }, - { - contactReferent: { - nom: 'Dupont', - prenom: 'Justine', - }, - nom: 'Auvergne-Rhône-Alpes', - roles: ['recipiendaire'], - suppressionDuMembreAutorise: false, - typologie: 'Collectivité', - }, - ], - roles: [], - typologies: [], - }) - }) })