Files
scouthub/scouthub-attivita-be/tests/unit/autocomplete.service.test.ts
T

90 lines
3.5 KiB
TypeScript

import { prisma } from '../../src/db/prisma';
import {
getBranca,
getCategoria,
getMateriale,
getPeriodoAnno,
getSearch,
} from '../../src/modules/autocomplete/autocomplete.service';
// Questo servizio legge solo le anagrafiche di base (branca, categoria,
// periodo_anno, materiale) gia' popolate dal seed: niente resetDatabase()
// completo qui, altrimenti perderemmo quei dati. L'unica tabella che questa
// suite potrebbe "sporcare" e' `materiale` (il seed non ne inserisce
// nessuno), quindi la puliamo prima di ogni test.
beforeEach(async () => {
await prisma.materiale.deleteMany();
});
function nomi(list: { nome: string | null }[]): string[] {
return list.map((item) => item.nome ?? '').sort();
}
describe('autocomplete.service', () => {
test('getBranca è case-insensitive e restituisce il gruppo "branca"', async () => {
const risultati = await getBranca('e/g');
expect(risultati).toHaveLength(1);
expect(risultati[0]).toMatchObject({ nome: 'E/G', gruppo: 'branca' });
});
test('getCategoria("gioco") trova la categoria e le sue sotto-categorie che contengono "gioco"', async () => {
const risultati = await getCategoria('gioco');
expect(nomi(risultati)).toEqual(
['gioco', "gioco d'acqua", 'gioco giungla', 'gioco notturno', 'grande gioco'].sort(),
);
expect(risultati.every((r) => r.gruppo === 'categoria')).toBe(true);
expect(nomi(risultati)).not.toContain('torneo');
expect(nomi(risultati)).not.toContain('olimpiadi');
});
test('getPeriodoAnno("campo") trova i periodi "campo" ma non "promessa"', async () => {
const risultati = await getPeriodoAnno('campo');
expect(nomi(risultati)).toEqual(['campo estivo', 'campo invernale'].sort());
expect(risultati.every((r) => r.gruppo === 'periodoAnno')).toBe(true);
});
test('getMateriale su un database senza materiali restituisce array vuoto', async () => {
const risultati = await getMateriale('corda');
expect(risultati).toEqual([]);
});
test('getSearch(null) contiene sempre il gruppo Testo, popola Branca/Categoria/Periodo anno con tutte le righe e omette Materiale (vuoto)', async () => {
const gruppi = await getSearch(null);
expect(gruppi[0]).toEqual({
label: 'Testo',
objectsList: [{ id: null, nome: null, gruppo: 'testo' }],
});
const branca = gruppi.find((g) => g.label === 'Branca');
const categoria = gruppi.find((g) => g.label === 'Categoria');
const periodoAnno = gruppi.find((g) => g.label === 'Periodo anno');
const materiale = gruppi.find((g) => g.label === 'Materiale');
expect(branca?.objectsList).toHaveLength(await prisma.branca.count());
expect(categoria?.objectsList).toHaveLength(await prisma.categoria.count());
expect(periodoAnno?.objectsList).toHaveLength(await prisma.periodoAnno.count());
expect(materiale).toBeUndefined();
});
test('getSearch("gioco") restituisce Testo e Categoria ma non Branca, Periodo anno o Materiale', async () => {
const gruppi = await getSearch('gioco');
const labels = gruppi.map((g) => g.label);
expect(labels).toContain('Testo');
expect(labels).toContain('Categoria');
expect(labels).not.toContain('Branca');
expect(labels).not.toContain('Periodo anno');
expect(labels).not.toContain('Materiale');
const categoria = gruppi.find((g) => g.label === 'Categoria');
expect(nomi(categoria!.objectsList)).toEqual(
['gioco', "gioco d'acqua", 'gioco giungla', 'gioco notturno', 'grande gioco'].sort(),
);
});
});