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 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 permite seleccionar el Acta explícitamente al trabajar 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(service, /actSelectionMode: actId \? 'EXPLICIT' : 'LEGACY_SINGLE_DRAFT'/); 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('F3.2 conserva el cierre documental inmutable de cada Acta', () => { const closing = read('src/inspection-closing/inspection-closing.service.ts'); 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 = 'CLOSED'/); assert.match(closing, /ensureFrozenReport/); assert.match(closing, /ensureWordForAct/); }); test('F3.2 cierra la inspección sólo cuando no quedan borradores ni Actas sin firma de inspector', () => { const visits = read('src/inspection-visits/inspection-visits.service.ts'); assert.match(visits, /INSPECTION_VISIT_DRAFT_ACTS_PENDING/); assert.match(visits, /INSPECTION_VISIT_INSPECTOR_SIGNATURE_PENDING/); assert.match(visits, /actsMayCompleteCompanySignatureLater: true/); });