Files
dh-inspeccion-v2/api-v3/test/unit/f6-11-report-gedo-response-workflow.test.ts
T
admin c9575cc520
DH V2 CI / WEB · typecheck, build (push) Successful in 27s
Production dependency audit / API · production dependencies (push) Successful in 15s
Production dependency audit / WEB · production dependencies (push) Successful in 15s
DH V2 CI / API · typecheck, tests, build (push) Successful in 2m3s
DH V2 CI / Docker / migrations / production images (push) Successful in 2m58s
DH V2 CI / Promote verified main to deploy (push) Successful in 3s
Android CI / RC / Android · lint, tests, debug APK, release compile (push) Successful in 5m55s
feat(informes): manage manual GEDO responses and shared due date
2026-09-15 23:35:49 -03:00

57 lines
3.6 KiB
TypeScript

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, /<option value="INTERNAL_NOTE">Nota interna<\/option>/);
assert.doesNotMatch(page.slice(page.indexOf('Agregar otro antecedente')), /option value="COMPANY_NOTE"/);
});