import { assertEquals } from "https://deno.land/std@0.224.0/assert/mod.ts"; import { evaluateDocumentValidity, freshnessRequired, DOCUMENT_TYPE_SEED, PROJECT_DOCUMENT_TYPE_SEED, COMPANY_DOCUMENT_TYPE_SEED, type DocTypePolicy, type WorkerImssContext, } from "./document_validity.ts"; const curpPolicy: DocTypePolicy = { code: "curp", label: "CURP", required: true, validity_mode: "freshness", freshness_days: 90, requires_issued_at: true, requires_expires_at: false, }; const inePolicy: DocTypePolicy = { code: "ine", label: "INE", required: true, validity_mode: "expiry", freshness_days: null, requires_issued_at: false, requires_expires_at: true, }; Deno.test("freshnessRequired: sin alta exige frescor", () => { assertEquals( freshnessRequired({ imss_status: "sin_alta", last_rehire_at: null, current_alta_at: null }), true, ); }); Deno.test("freshnessRequired: alta continua no exige frescor", () => { assertEquals( freshnessRequired({ imss_status: "alta", last_rehire_at: null, current_alta_at: "2024-01-01", }), false, ); }); Deno.test("freshnessRequired: rehire sin alta posterior exige frescor", () => { assertEquals( freshnessRequired({ imss_status: "alta", last_rehire_at: "2026-06-01", current_alta_at: "2025-01-01", }), true, ); }); Deno.test("freshnessRequired: rehire con alta posterior no exige frescor", () => { assertEquals( freshnessRequired({ imss_status: "alta", last_rehire_at: "2026-01-01", current_alta_at: "2026-02-01", }), false, ); }); Deno.test("CURP stale when freshness required", () => { const ctx: WorkerImssContext = { imss_status: "sin_alta", last_rehire_at: null, current_alta_at: null, }; const result = evaluateDocumentValidity( curpPolicy, { type_code: "curp", issued_at: "2025-01-01", expires_at: null, uploaded_at: "2025-01-02" }, ctx, new Date("2026-08-20T12:00:00"), ); assertEquals(result.validity_status, "stale_for_alta"); assertEquals(result.valid, false); }); Deno.test("CURP old but ok when already alta", () => { const ctx: WorkerImssContext = { imss_status: "alta", last_rehire_at: null, current_alta_at: "2025-02-01", }; const result = evaluateDocumentValidity( curpPolicy, { type_code: "curp", issued_at: "2025-01-01", expires_at: null, uploaded_at: "2025-01-02" }, ctx, new Date("2026-08-20T12:00:00"), ); assertEquals(result.validity_status, "ok"); assertEquals(result.valid, true); }); Deno.test("INE expired always invalid", () => { const ctx: WorkerImssContext = { imss_status: "alta", last_rehire_at: null, current_alta_at: "2026-01-01", }; const result = evaluateDocumentValidity( inePolicy, { type_code: "ine", issued_at: null, expires_at: "2025-12-31", uploaded_at: "2025-01-01" }, ctx, new Date("2026-08-20T12:00:00"), ); assertEquals(result.validity_status, "expired"); assertEquals(result.valid, false); }); Deno.test("missing issued_at for freshness", () => { const result = evaluateDocumentValidity( curpPolicy, { type_code: "curp", issued_at: null, expires_at: null, uploaded_at: "2026-08-01" }, { imss_status: "sin_alta", last_rehire_at: null, current_alta_at: null }, ); assertEquals(result.validity_status, "missing_dates"); }); Deno.test("nĂșcleo de persona no se agranda", () => { const required = DOCUMENT_TYPE_SEED.filter((d) => d.required).map((d) => d.code).sort(); assertEquals(required, ["curp", "domicilio", "foto", "ine", "nss", "rfc"]); }); Deno.test("nĂșcleo de obra no se agranda", () => { const required = PROJECT_DOCUMENT_TYPE_SEED.filter((d) => d.required).map((d) => d.code).sort(); assertEquals(required, ["contrato", "presupuesto"]); }); Deno.test("empresa no tiene documentos obligatorios", () => { assertEquals(COMPANY_DOCUMENT_TYPE_SEED.every((d) => d.required === 0), true); });