Files
2026-07-25 11:59:25 +02:00

64 lines
2.1 KiB
TypeScript

import { PrismaClient } from '@prisma/client';
// Test di integrazione reale (Prisma NON mockato): verifica il vincolo ON DELETE
// CASCADE definito nella migration fra evento.parent_id -> evento(id) e fra
// risorsa_collegata.evento_id -> evento(id). Un mock di Prisma non potrebbe
// verificare un comportamento che vive nel database, quindi qui si usa una
// connessione reale. Richiede un Postgres raggiungibile con lo schema di
// scouthub-eventi-be già migrato (`npx prisma migrate deploy`), es. il database
// locale di sviluppo scouthub_eventi.
process.env.DATABASE_URL =
process.env.DATABASE_URL ?? 'postgresql://postgres:postgres@localhost:5432/scouthub_eventi?schema=public';
const prisma = new PrismaClient();
afterAll(async () => {
await prisma.$disconnect();
});
describe('cascade delete evento -> figli e risorse collegate (vincolo DB)', () => {
test('eliminare il parent elimina anche i figli e le risorse collegate', async () => {
const parent = await prisma.evento.create({
data: {
orgId: 'org-cascade-test',
brancaId: 'Lupetti',
titolo: 'Campo estivo',
dataInizio: new Date('2026-08-01'),
dataFine: new Date('2026-08-10'),
tipo: 'campo',
creatoDa: 'user-test',
},
});
const figlio = await prisma.evento.create({
data: {
orgId: parent.orgId,
brancaId: parent.brancaId,
parentId: parent.id,
titolo: 'Uscita di un giorno',
dataInizio: new Date('2026-08-02'),
dataFine: new Date('2026-08-02'),
tipo: 'uscita',
creatoDa: 'user-test',
},
});
const risorsa = await prisma.risorsaCollegata.create({
data: {
eventoId: parent.id,
tipoRisorsa: 'attivita',
risorsaId: 'att-1',
servizioOrigine: 'scouthub-attivita-be',
},
});
await prisma.evento.delete({ where: { id: parent.id } });
const figlioRimasto = await prisma.evento.findUnique({ where: { id: figlio.id } });
const risorsaRimasta = await prisma.risorsaCollegata.findUnique({ where: { id: risorsa.id } });
expect(figlioRimasto).toBeNull();
expect(risorsaRimasta).toBeNull();
});
});