Files
dh-inspeccion-v2/api-v3/test/unit/f3-2-mobile-multi-acta.test.ts
T

50 lines
2.7 KiB
TypeScript

import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
import test from 'node:test';
const read = (path: string) => readFileSync(path, 'utf8');
test('F3.2/F4 mantiene múltiples Actas con un solo borrador simultáneo por inspección', () => {
const migration = read('src/database/migrations/1789495200000-phase-f1-1-multi-act-inspections.ts');
assert.match(migration, /DROP CONSTRAINT IF EXISTS uq_inspection_acts_visit/);
assert.match(migration, /CREATE UNIQUE INDEX uq_inspection_acts_one_draft_per_visit/);
assert.match(migration, /WHERE status = 'DRAFT'/);
});
test('F3.2/F4 exige seleccionar el Acta explícitamente al crear Hallazgos desde la APK', () => {
const controller = read('src/inspection-visits/field-findings.controller.ts');
const service = read('src/inspection-visits/field-findings.service.ts');
const dto = read('src/inspection-visits/dto/create-field-finding.dto.ts');
assert.match(controller, /FieldFindingActQueryDto/);
assert.match(controller, /query\.actId/);
assert.match(dto, /actId!: string/);
assert.match(dto, /El Acta es obligatoria/);
assert.match(service, /this\.requireDraftAct\(visitId, dto\.actId\)/);
assert.match(service, /WHERE id=\$1::uuid AND visit_id=\$2::uuid/);
assert.match(service, /FIELD_FINDING_ACT_NOT_DRAFT/);
assert.match(service, /FIELD_FINDING_ASSET_NOT_IN_ACT/);
});
test('F4 conserva el cierre documental inmutable de cada Acta como LOCKED y luego SEALED', () => {
const closing = read('src/inspection-closing/inspection-closing.service.ts');
assert.match(closing, /status='LOCKED'/);
assert.match(closing, /INSPECTION_ACT_INSPECTOR_SIGNATURE_REQUIRED/);
assert.match(closing, /INSPECTION_ACT_COMPANY_OUTCOME_REQUIRED/);
assert.match(closing, /finalSha256 = sha256CanonicalJson\(finalSnapshot\)/);
assert.match(closing, /status='SEALED'/);
assert.match(closing, /INSPECTION_ACT_LOCK_IS_IMMUTABLE/);
assert.match(closing, /ensureFrozenReport/);
assert.match(closing, /ensureWordForAct/);
});
test('F4 cierra la inspección sólo cuando todas las Actas no canceladas están selladas y las verificaciones resueltas', () => {
const lifecycle = read('src/inspection-visits/inspection-visit-lifecycle.service.ts');
const closeBody = lifecycle.slice(lifecycle.indexOf(' async close('), lifecycle.indexOf(' async cancel('));
assert.match(closeBody, /INSPECTION_REQUIRES_ACT/);
assert.match(closeBody, /INSPECTION_ACTS_NOT_SEALED/);
assert.match(closeBody, /act\.status !== 'SEALED'/);
assert.match(closeBody, /assertVerificationResultsComplete\(manager, id\)/);
assert.match(closeBody, /visit\.status = InspectionVisitStatus\.CLOSED/);
assert.doesNotMatch(closeBody, /actsMayCompleteCompanySignatureLater/);
});