48 lines
1.8 KiB
TypeScript
48 lines
1.8 KiB
TypeScript
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, []);
|
|
});
|