panels-origin/api/document_validity_test.ts
2026-08-25 20:21:49 -05:00

141 lines
3.9 KiB
TypeScript

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);
});