diff --git a/api-v3/test/unit/f7-activity-dossier-regression.test.ts b/api-v3/test/unit/f7-activity-dossier-regression.test.ts new file mode 100644 index 0000000..c0cc6eb --- /dev/null +++ b/api-v3/test/unit/f7-activity-dossier-regression.test.ts @@ -0,0 +1,47 @@ +import 'reflect-metadata'; +import assert from 'node:assert/strict'; +import test from 'node:test'; +import { readFileSync } from 'node:fs'; +import { ActivityDossierService } from '../../src/asset-master/activity-dossier.service'; + +test('F7 Actividad no usa DISTINCT con ORDER BY COALESCE en visitas', () => { + const source = readFileSync('src/asset-master/activity-dossier.service.ts', 'utf8'); + assert.doesNotMatch(source, /SELECT\s+DISTINCT\s+visit\.id/i); + assert.match(source, /ORDER BY COALESCE\(visit\.actual_started_at, visit\.planned_start_at, visit\.created_at\) DESC/); + assert.match(source, /EXISTS \(\s*SELECT 1\s*FROM inspection_visit_assets/s); +}); + +test('F7 una faceta auxiliar defectuosa no derriba todo el expediente', async () => { + const dataSource = { + query: async (sql: string) => { + if (sql.includes('FROM assets\n WHERE id = $1')) { + return [{ + id: 'bcba740f-cc84-48b3-8d06-88a9c439e25c', + code: 'YAC-0005', + name: 'Agua Botada', + commonName: null, + createdAt: new Date('2026-01-01T00:00:00Z'), + }]; + } + if (sql.includes('inspection_finding_communications')) { + throw new Error('simulated optional facet failure'); + } + return []; + }, + }; + + const service = new ActivityDossierService(dataSource as never); + const dossier = await service.dossier('bcba740f-cc84-48b3-8d06-88a9c439e25c') as { + asset: { code: string; name: string }; + counters: { inspections: number; findings: number }; + warnings: string[]; + timeline: unknown[]; + }; + + assert.equal(dossier.asset.code, 'YAC-0005'); + assert.equal(dossier.asset.name, 'Agua Botada'); + assert.equal(dossier.counters.inspections, 0); + assert.equal(dossier.counters.findings, 0); + assert.deepEqual(dossier.warnings, ['communications']); + assert.deepEqual(dossier.timeline, []); +});