From d7184ed537aeecd991b4017ab55d6a2abade5825 Mon Sep 17 00:00:00 2001 From: enlineawork Date: Mon, 7 Sep 2026 16:13:22 -0300 Subject: [PATCH] =?UTF-8?q?F3.2:=20fijar=20contrato=20multi-Acta=20m=C3=B3?= =?UTF-8?q?vil=20y=20cierre=20secuencial?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/unit/f3-2-mobile-multi-acta.test.ts | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 api-v3/test/unit/f3-2-mobile-multi-acta.test.ts diff --git a/api-v3/test/unit/f3-2-mobile-multi-acta.test.ts b/api-v3/test/unit/f3-2-mobile-multi-acta.test.ts new file mode 100644 index 0000000..297b136 --- /dev/null +++ b/api-v3/test/unit/f3-2-mobile-multi-acta.test.ts @@ -0,0 +1,42 @@ +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/); +});