Skip to content

Commit

Permalink
WIP Test la fonctionnalité de filtre des indicateurs
Browse files Browse the repository at this point in the history
  • Loading branch information
amandinejacquelin committed Nov 12, 2024
1 parent f8bb57f commit 6c958f3
Show file tree
Hide file tree
Showing 2 changed files with 387 additions and 0 deletions.
294 changes: 294 additions & 0 deletions backend/src/indicateurs/services/indicateur-filtre.service.spec.ts
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]);
});
});
});
93 changes: 93 additions & 0 deletions backend/test/indicateurs/indicateur-filtre.e2e-spec.ts
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);
});

});

0 comments on commit 6c958f3

Please sign in to comment.