-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
WIP Test la fonctionnalité de filtre des indicateurs
- Loading branch information
1 parent
f8bb57f
commit 6c958f3
Showing
2 changed files
with
387 additions
and
0 deletions.
There are no files selected for viewing
294 changes: 294 additions & 0 deletions
294
backend/src/indicateurs/services/indicateur-filtre.service.spec.ts
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,294 @@ | ||
import { Test } from '@nestjs/testing'; | ||
|
||
import { AuthService } from '../../auth/services/auth.service'; | ||
import DatabaseService from '../../common/services/database.service'; | ||
import IndicateurFiltreService from './indicateur-filtre.service'; | ||
import { | ||
GetFilteredIndicateurRequestQueryOptionType, | ||
GetFilteredIndicateursRequestOptionType | ||
} from '../models/get-filtered-indicateurs.request'; | ||
|
||
describe('IndicateurFiltreService', () => { | ||
let indicateurFiltreService: IndicateurFiltreService; | ||
|
||
beforeEach(async () => { | ||
const moduleRef = await Test.createTestingModule({ | ||
controllers: [IndicateurFiltreService], | ||
}) | ||
.useMocker((token) => { | ||
if (token === DatabaseService || token === AuthService) { | ||
return {}; | ||
} | ||
}) | ||
.compile(); | ||
|
||
indicateurFiltreService = moduleRef.get(IndicateurFiltreService); | ||
}); | ||
|
||
describe('getQueryString', () => { | ||
it('Test la syntaxe de la requête sans filtres', async () => { | ||
const filtres: GetFilteredIndicateursRequestOptionType = {}; | ||
const toCheck = indicateurFiltreService.getQueryString(1, filtres); | ||
expect(toCheck).toContain('WITH groupements AS'); | ||
expect(toCheck).toContain('indicateurs AS'); | ||
expect(toCheck).toContain('OR collectivite_id = 1'); | ||
expect(toCheck).toContain('OR groupement_id IN'); | ||
expect(toCheck).toContain('SELECT i.id'); | ||
expect(toCheck).toContain('FROM indicateurs i'); | ||
expect(toCheck).toContain('FROM indicateur_valeur'); | ||
expect(toCheck).toContain('LEFT JOIN indicateur_groupe ig_parent'); | ||
expect(toCheck).toContain('LEFT JOIN indicateur_groupe ig_enfant'); | ||
}); | ||
it('Test la syntaxe de la requête avec un filtre sur les indicateurs perso', async () => { | ||
const filtres: GetFilteredIndicateursRequestOptionType = { | ||
estPerso : true | ||
} | ||
const toCheck = indicateurFiltreService.getQueryString(1, filtres); | ||
expect(toCheck).not.toContain('OR groupement_id IN'); | ||
}); | ||
it('Test la syntaxe de la requête avec un filtre sur les catégories', async () => { | ||
const filtres: GetFilteredIndicateursRequestOptionType = { | ||
categorieNoms : ['cae', 'clef'] | ||
} | ||
const toCheck = indicateurFiltreService.getQueryString(1, filtres); | ||
expect(toCheck).toContain('ct.nom AS "categorieNom"'); | ||
expect(toCheck).toContain('FROM categorie_tag ct'); | ||
}); | ||
it('Test la syntaxe de la requête avec un filtre sur les catégories et perso', async () => { | ||
const filtres: GetFilteredIndicateursRequestOptionType = { | ||
categorieNoms : ['cae', 'clef'], | ||
estPerso : true | ||
} | ||
const toCheck = indicateurFiltreService.getQueryString(1, filtres); | ||
expect(toCheck).toContain('ct.nom AS "categorieNom"'); | ||
expect(toCheck).toContain('FROM categorie_tag ct'); | ||
expect(toCheck).not.toContain('OR groupement_id IN'); // Filtre perso sur la jointure des catégories | ||
}); | ||
it('Test la syntaxe de la requête avec un filtre sur les plans', async () => { | ||
const filtres: GetFilteredIndicateursRequestOptionType = { | ||
planActionIds : [1, 2] | ||
} | ||
const toCheck = indicateurFiltreService.getQueryString(1, filtres); | ||
expect(toCheck).toContain('plan.id AS "planId"'); | ||
expect(toCheck).toContain('LEFT JOIN axe plan'); | ||
}); | ||
it('Test la syntaxe de la requête avec un filtre sur les fiches', async () => { | ||
const filtres: GetFilteredIndicateursRequestOptionType = { | ||
ficheActionIds : [1, 2] | ||
} | ||
const toCheck = indicateurFiltreService.getQueryString(1, filtres); | ||
expect(toCheck).toContain('fa.id AS "ficheId"'); | ||
expect(toCheck).toContain('FROM fiche_action fa'); | ||
}); | ||
it('Test la syntaxe de la requête avec un filtre sur les axes', async () => { | ||
const filtres: GetFilteredIndicateursRequestOptionType = { | ||
fichesNonClassees : true | ||
} | ||
const toCheck = indicateurFiltreService.getQueryString(1, filtres); | ||
expect(toCheck).toContain('fa.id AS "ficheId"'); | ||
expect(toCheck).toContain('FROM fiche_action fa'); | ||
expect(toCheck).toContain('faa.axe_id AS "axeId"'); | ||
expect(toCheck).toContain('LEFT JOIN fiche_action_axe faa'); | ||
}); | ||
it('Test la syntaxe de la requête avec un filtre sur les services', async () => { | ||
const filtres: GetFilteredIndicateursRequestOptionType = { | ||
servicePiloteIds : [1, 2] | ||
} | ||
const toCheck = indicateurFiltreService.getQueryString(1, filtres); | ||
expect(toCheck).toContain('st.id AS "serviceId"'); | ||
expect(toCheck).toContain('LEFT JOIN service_tag st'); | ||
}); | ||
it('Test la syntaxe de la requête avec un filtre sur les thématiques', async () => { | ||
const filtres: GetFilteredIndicateursRequestOptionType = { | ||
thematiqueIds : [1, 2] | ||
} | ||
const toCheck = indicateurFiltreService.getQueryString(1, filtres); | ||
expect(toCheck).toContain('it.thematique_id AS "thematiqueId"'); | ||
expect(toCheck).toContain('LEFT JOIN indicateur_thematique it'); | ||
}); | ||
it('Test la syntaxe de la requête avec un filtre sur les pilotes', async () => { | ||
let filtres: GetFilteredIndicateursRequestOptionType = { | ||
utilisateurPiloteIds : ['test', 'test2'] | ||
} | ||
let toCheck = indicateurFiltreService.getQueryString(1, filtres); | ||
expect(toCheck).toContain('ip.user_id AS "piloteUserId"'); | ||
expect(toCheck).toContain('LEFT JOIN indicateur_pilote ip'); | ||
|
||
filtres = { | ||
personnePiloteIds : [1, 2] | ||
} | ||
toCheck = indicateurFiltreService.getQueryString(1, filtres); | ||
expect(toCheck).toContain('ip.tag_id AS "piloteTagId"'); | ||
expect(toCheck).toContain('LEFT JOIN indicateur_pilote ip'); | ||
}); | ||
it('Test la syntaxe de la requête avec un filtre sur la confidentialié', async () => { | ||
const filtres: GetFilteredIndicateursRequestOptionType = { | ||
estConfidentiel : true | ||
} | ||
const toCheck = indicateurFiltreService.getQueryString(1, filtres); | ||
expect(toCheck).toContain('c.confidentiel AS confidentiel'); | ||
expect(toCheck).toContain('LEFT JOIN indicateur_collectivite c'); | ||
}); | ||
it('Test la syntaxe de la requête avec un filtre sur "favoris"', async () => { | ||
const filtres: GetFilteredIndicateursRequestOptionType = { | ||
estFavorisCollectivite : true | ||
} | ||
const toCheck = indicateurFiltreService.getQueryString(1, filtres); | ||
expect(toCheck).toContain('c.favoris AS favoris'); | ||
expect(toCheck).toContain('LEFT JOIN indicateur_collectivite c'); | ||
}); | ||
it('Test la syntaxe de la requête avec un filtre sur les actions', async () => { | ||
const filtres: GetFilteredIndicateursRequestOptionType = { | ||
actionId : 'eci_2.1' | ||
} | ||
const toCheck = indicateurFiltreService.getQueryString(1, filtres); | ||
expect(toCheck).toContain('ia.action_id AS "actionId"'); | ||
expect(toCheck).toContain('LEFT JOIN indicateur_action ia'); | ||
}); | ||
}); | ||
describe('groupDetailsIndicateurs', () => { | ||
it('Test le groupement sans le groupement des enfants dans les parents', async () => {}); | ||
it('Test le groupement avec le groupement des enfants dans les parents', async () => {}); | ||
}); | ||
describe('applyFilters', () => { | ||
it('Test sans aucun filtre', async () => {}); | ||
it('Test avec tous les filtre booléen', async () => {}); | ||
it('Test avec tous les filtre par identifiant des éléments liés', async () => {}); | ||
it('Test le filtre via la recherche textuelle', async () => {}); | ||
it(`Test le filtre via l'identifiant`, async () => {}); | ||
}); | ||
describe('applySorts', () => { | ||
const ind1 = { | ||
id: 1, | ||
identifiantReferentiel: '', | ||
titre: 'a', | ||
description: null, | ||
collectiviteId: null, | ||
groupementId: null, | ||
participationScore: null, | ||
confidentiel: null, | ||
favoris: null, | ||
categorieNoms: [], | ||
planIds: [], | ||
ficheIds: [], | ||
serviceIds: [], | ||
thematiqueIds: [], | ||
piloteUserIds: [], | ||
piloteTagIds: [], | ||
parents: [], | ||
enfants: [], | ||
actionIds: [], | ||
participationScoreEnfant: null, | ||
confidentielEnfant: null, | ||
favorisEnfant: null, | ||
hasFichesNonClassees: true, | ||
isCompleted: true, | ||
hasOpenData: true, | ||
categorieNomsEnfant: [], | ||
planIdsEnfant: [], | ||
ficheIdsEnfant: [], | ||
serviceIdsEnfant: [], | ||
thematiqueIdsEnfant: [], | ||
piloteUserIdsEnfant: [], | ||
piloteTagIdsEnfant: [], | ||
hasFichesNonClasseesEnfant: true, | ||
isCompletedEnfant: true, | ||
hasOpenDataEnfant: true | ||
} | ||
const ind2 = { | ||
id: 1, | ||
identifiantReferentiel: '', | ||
titre: 'z', | ||
description: null, | ||
collectiviteId: null, | ||
groupementId: null, | ||
participationScore: null, | ||
confidentiel: null, | ||
favoris: null, | ||
categorieNoms: [], | ||
planIds: [], | ||
ficheIds: [], | ||
serviceIds: [], | ||
thematiqueIds: [], | ||
piloteUserIds: [], | ||
piloteTagIds: [], | ||
parents: [], | ||
enfants: [], | ||
actionIds: [], | ||
participationScoreEnfant: null, | ||
confidentielEnfant: null, | ||
favorisEnfant: null, | ||
hasFichesNonClassees: true, | ||
isCompleted: true, | ||
hasOpenData: true, | ||
categorieNomsEnfant: [], | ||
planIdsEnfant: [], | ||
ficheIdsEnfant: [], | ||
serviceIdsEnfant: [], | ||
thematiqueIdsEnfant: [], | ||
piloteUserIdsEnfant: [], | ||
piloteTagIdsEnfant: [], | ||
hasFichesNonClasseesEnfant: true, | ||
isCompletedEnfant: false, | ||
hasOpenDataEnfant: true | ||
} | ||
const ind3 = { | ||
id: 1, | ||
identifiantReferentiel: '', | ||
titre: 'J', | ||
description: null, | ||
collectiviteId: null, | ||
groupementId: null, | ||
participationScore: null, | ||
confidentiel: null, | ||
favoris: null, | ||
categorieNoms: [], | ||
planIds: [], | ||
ficheIds: [], | ||
serviceIds: [], | ||
thematiqueIds: [], | ||
piloteUserIds: [], | ||
piloteTagIds: [], | ||
parents: [], | ||
enfants: [], | ||
actionIds: [], | ||
participationScoreEnfant: null, | ||
confidentielEnfant: null, | ||
favorisEnfant: null, | ||
hasFichesNonClassees: true, | ||
isCompleted: true, | ||
hasOpenData: true, | ||
categorieNomsEnfant: [], | ||
planIdsEnfant: [], | ||
ficheIdsEnfant: [], | ||
serviceIdsEnfant: [], | ||
thematiqueIdsEnfant: [], | ||
piloteUserIdsEnfant: [], | ||
piloteTagIdsEnfant: [], | ||
hasFichesNonClasseesEnfant: true, | ||
isCompletedEnfant: true, | ||
hasOpenDataEnfant: true | ||
} | ||
it('Applique le tri alphabétique par défaut', async () => { | ||
const queryOptions : GetFilteredIndicateurRequestQueryOptionType = { | ||
page : 1, | ||
limit : 10, | ||
sort: [] | ||
} | ||
const toCheck = indicateurFiltreService.applySorts([ind1, ind2, ind3], queryOptions); | ||
expect(toCheck).toEqual([ind1, ind3, ind2]); | ||
}); | ||
it('Applique le tri par complétude', async () => { | ||
const queryOptions : GetFilteredIndicateurRequestQueryOptionType = { | ||
page : 1, | ||
limit : 10, | ||
sort: [{ | ||
field : "estComplet", | ||
direction : "asc" | ||
}] | ||
} | ||
const toCheck = indicateurFiltreService.applySorts([ind1, ind2, ind3], queryOptions); | ||
expect(toCheck).toEqual([ind2, ind1, ind3]); | ||
}); | ||
}); | ||
}); |
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,93 @@ | ||
import { INestApplication } from '@nestjs/common'; | ||
import { createClient, SupabaseClient } from '@supabase/supabase-js'; | ||
import { Test } from '@nestjs/testing'; | ||
import { AppModule } from '../../src/app.module'; | ||
import { YOLO_DODO_CREDENTIALS } from '../auth/test-users.samples'; | ||
import { default as request } from 'supertest'; | ||
import { | ||
GetFilteredIndicateurRequestQueryOptionType, | ||
GetFilteredIndicateursRequestOptionType | ||
} from '../../src/indicateurs/models/get-filtered-indicateurs.request'; | ||
|
||
describe('Route de lecture des indicateurs filtrés', () => { | ||
let app: INestApplication; | ||
let supabase: SupabaseClient; | ||
let yoloDodoToken: string; | ||
const queryOptions : GetFilteredIndicateurRequestQueryOptionType = { | ||
page : 1, | ||
limit : 10, | ||
sort: [{ | ||
field : "estComplet", | ||
direction : "asc" | ||
}] | ||
} | ||
|
||
beforeAll(async () => { | ||
const moduleRef = await Test.createTestingModule({ | ||
imports: [AppModule], | ||
}).compile(); | ||
|
||
app = moduleRef.createNestApplication(); | ||
await app.init(); | ||
|
||
supabase = createClient( | ||
process.env.SUPABASE_URL!, | ||
process.env.SUPABASE_ANON_KEY! | ||
); | ||
const signinResponse = await supabase.auth.signInWithPassword( | ||
YOLO_DODO_CREDENTIALS | ||
); | ||
yoloDodoToken = signinResponse.data.session?.access_token || ''; | ||
}); | ||
|
||
afterAll(async () => { | ||
await app.close(); | ||
}); | ||
|
||
it(`Test que la requête s'exécute sans filtres`, async () => { | ||
const options: GetFilteredIndicateursRequestOptionType = {}; | ||
|
||
const params = new URLSearchParams(); | ||
params.append('collectiviteId', '1'); | ||
params.append('options', JSON.stringify(options)); | ||
params.append('queryOptions', JSON.stringify(queryOptions)); | ||
|
||
await request(app.getHttpServer()) | ||
.get(`/indicateurs/filtre?${params.toString()}`) | ||
.set('Authorization', `Bearer ${yoloDodoToken}`) | ||
.expect(200); | ||
}); | ||
|
||
it(`Test que la requête s'exécute avec tous les filtres`, async () => { | ||
const options: GetFilteredIndicateursRequestOptionType = { | ||
actionId : 'eci_2', | ||
participationScore : false, | ||
estComplet : false, | ||
estConfidentiel : true, | ||
estFavorisCollectivite : true, | ||
fichesNonClassees : true, | ||
text : 'de', | ||
estPerso : false, | ||
categorieNoms : ['cae'], | ||
hasOpenData : true, | ||
thematiqueIds : [1], | ||
planActionIds : [1], | ||
utilisateurPiloteIds : ['t'], | ||
personnePiloteIds : [1], | ||
servicePiloteIds : [1], | ||
ficheActionIds : [1], | ||
avecEnfants : false | ||
}; | ||
|
||
const params = new URLSearchParams(); | ||
params.append('collectiviteId', '1'); | ||
params.append('options', JSON.stringify(options)); | ||
params.append('queryOptions', JSON.stringify(queryOptions)); | ||
|
||
await request(app.getHttpServer()) | ||
.get(`/indicateurs/filtre?${params.toString()}`) | ||
.set('Authorization', `Bearer ${yoloDodoToken}`) | ||
.expect(200); | ||
}); | ||
|
||
}); |