import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; import { resolve } from 'node:path'; import test from 'node:test'; const api = (path: string) => readFileSync(resolve(process.cwd(), 'src', path), 'utf8'); const web = (path: string) => readFileSync(resolve(process.cwd(), '..', 'web-v2', 'src', path), 'utf8'); test('F6.11 keeps GEDO officialization manual and does not activate response deadlines automatically', () => { const workflow = api('inspection-reports/inspection-report-workflow.service.ts'); const page = web('pages/ReportDetailPage.tsx'); assert.match(workflow, /GEDO oficializa el INF, pero no equivale por sí solo a la notificación/); assert.doesNotMatch(workflow.slice(workflow.indexOf(' async officialize('), workflow.indexOf(' async setResponseDeadline(')), /setDeadline\(/); assert.match(page, /GEDO no se consulta automáticamente/); assert.match(page, /no crea respuestas ni vencimientos automáticamente/); }); test('F6.11 stores new deadlines and company responses with both Report and Act relation', () => { const migration = api('database/migrations/1790139000000-f6-11-report-response-workflow.ts'); const administration = api('act-administration/act-administration.service.ts'); assert.match(migration, /inspection_act_deadline_events ADD COLUMN IF NOT EXISTS report_id uuid/); assert.match(migration, /inspection_act_company_responses ADD COLUMN IF NOT EXISTS report_id uuid/); assert.match(migration, /report\.id=NEW\.report_id AND report\.act_id=NEW\.act_id/); assert.doesNotMatch(migration, /UPDATE inspection_act_deadline_events|UPDATE inspection_act_company_responses/); assert.match(administration, /INSERT INTO inspection_act_deadline_events \(id, act_id, report_id/); assert.match(administration, /INSERT INTO inspection_act_company_responses \(id, act_id, report_id/); }); test('F6.11 projects one Act response deadline to every non-voided finding', () => { const administration = api('act-administration/act-administration.service.ts'); const reports = api('inspection-reports/inspection-reports.service.ts'); assert.match(administration, /UPDATE inspection_findings[\s\S]*SET correction_due_on=\$2[\s\S]*WHERE act_id=\$1 AND status<>'VOIDED'/); assert.match(administration, /sharedDeadline: true/); assert.match(reports, /\$2::date AS "responseDueOn"/); assert.match(reports, /currentDeadline\?\.responseDueOn/); }); test('F6.11 enables formal responses only after the official GEDO PDF exists', () => { const workflow = api('inspection-reports/inspection-report-workflow.service.ts'); const controller = api('inspection-reports/inspection-reports.controller.ts'); const page = web('pages/ReportDetailPage.tsx'); assert.match(workflow, /requireOfficializedReport\(reportId\)/); assert.match(workflow, /Primero debe cargarse manualmente el PDF oficial de GEDO/); assert.match(controller, /@Post\(':id\/company-responses'\)/); assert.match(controller, /@Patch\(':id\/response-deadline'\)/); assert.match(page, /Las respuestas se habilitan después de cargar el PDF oficial de GEDO/); assert.match(page, /Vencimiento común del Acta/); }); test('F6.11 separates formal company responses from internal report follow-up notes', () => { const page = web('pages/ReportDetailPage.tsx'); assert.match(page, /RESPUESTAS DE EMPRESA/); assert.match(page, /No usar este bloque para respuestas formales de empresa/); assert.match(page, /