-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Gateways : Visualiser la liste des membres de ma gouvernance #340
Merged
Merged
Changes from all commits
Commits
Show all changes
6 commits
Select commit
Hold shift + click to select a range
6796bed
gateways recuperer les membres
Ornella452 00939d9
retour commentaire
Ornella452 72fc829
refacto en mettant les creates pour les tests dans le testHelper
Ornella452 8e42da3
Update src/gateways/PrismaMesMembresLoader.ts
Ornella452 43ae3e9
ajout test pour le ORDER BY
Ornella452 84ba1e3
remove test inutile
Ornella452 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
import { PrismaMesMembresLoader } from './PrismaMesMembresLoader' | ||
import { ajouterUnDepartement, ajouterUneGouvernance, ajouterUneRegion, ajouterUnMembreCommune, ajouterUnMembreDepartement, ajouterUnMembreEpci, ajouterUnMembreSgar, ajouterUnMembreStructure } 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 dans l’ordre alphabétique', 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).toStrictEqual({ | ||
autorisations: { | ||
accesMembreValide: false, | ||
ajouterUnMembre: false, | ||
supprimerUnMembre: false, | ||
}, | ||
departement: 'Rhône', | ||
membres: [ | ||
{ | ||
contactReferent: { | ||
nom: 'Dupont', | ||
prenom: 'Justine', | ||
}, | ||
nom: 'Auvergne-Rhône-Alpes', | ||
roles: ['recipiendaire'], | ||
suppressionDuMembreAutorise: false, | ||
typologie: 'Collectivité', | ||
}, | ||
{ | ||
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: '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é', | ||
}, | ||
], | ||
roles: [], | ||
typologies: [], | ||
}) | ||
}) | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
import { PrismaClient } from '@prisma/client' | ||
|
||
import { MesMembresLoader, MesMembresReadModel } from '@/use-cases/queries/RecupererMesMembres' | ||
|
||
export class PrismaMesMembresLoader extends MesMembresLoader { | ||
readonly #dataResource: PrismaClient | ||
|
||
constructor(dataResource: PrismaClient) { | ||
super() | ||
this.#dataResource = dataResource | ||
} | ||
|
||
protected override async find(codeDepartementGouvernance: string): Promise<MesMembresReadModel> { | ||
const result: ReadonlyArray<Membres> = 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 | ||
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 | ||
ORDER BY "nomMembre"` | ||
|
||
const membresBouchonner = [ | ||
{ | ||
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é', | ||
}, | ||
] | ||
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, | ||
ajouterUnMembre: false, | ||
supprimerUnMembre: false, | ||
}, | ||
departement: 'Rhône', | ||
membres, | ||
roles: [], | ||
typologies: [], | ||
} | ||
} | ||
} | ||
|
||
type Membres = Readonly<{ | ||
nomMembre: string | ||
role: ReadonlyArray<string> | ||
}> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Je pense qu'il manque un
ORDER BY
et le test qui montre que l'ordre de récupération n'est pas celui d'insertion.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
AVANT ORDER BY :
AVEC ORDER BY :
c'est ajouter via ce commit : 43ae3e9
Est ce que ça répond bien à ton commentaire ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oui mais le test ne doit pas être en
not.toStrictEqual
, c'est beaucoup trop large, de même que l'intention du test ne doit pas être "sans qu'on s'attende à l'ordre d'insertion", mais révéler que l'attendu est l'ordre alphabétique de nom.