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