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(), ); }); });