src/features/reviews/computation-discrepancies.test.ts
Linked repository file from this build.
import { expect, test } from "bun:test";
import { renderToStaticMarkup } from "react-dom/server";
import { createSeed } from "@/programs/snap-negative/seed";
import { calculate, selectFinal } from "@/programs/snap-negative/calculation";
import { buildDiscrepancies } from "./computation-discrepancies";
import { ComputationErrorRow, finalErrorDisplay } from "./computation-final-error";
import { calcScenario } from "./computation-grid.helpers";
test("result row includes every calculated column and leaves empty or stale columns blank", () => {
const review = createSeed();
const baseline = { ...review.facts.scenarios.eligibility, income: [], populated: true };
review.facts.scenarios.eligibility = baseline;
review.facts.scenarios.compI = {
...baseline,
income: [{ ...createSeed().facts.scenarios.compI.income[0]!, amountCents: 900000 }],
};
review.facts.scenarios.compII.populated = false;
review.facts.final = selectFinal(review);
const columns = {
eligibility: calcScenario(review, baseline, "eligibility"),
compI: calcScenario(review, review.facts.scenarios.compI, "compI"),
compII: calcScenario(review, review.facts.scenarios.compII, "compII"),
final: calcScenario(review, review.facts.scenarios.compI, "final"),
"split-0": calcScenario(review, baseline, "split-0"),
};
const cells = () =>
[
...renderToStaticMarkup(ComputationErrorRow({ review, columns })).matchAll(
/<td\b[^>]*>(.*?)<\/td>/g,
),
].map((match) => match[1]!);
const shown = cells();
expect(shown).toHaveLength(5);
expect(shown[0]).toBe("");
expect(shown[1]).toContain("Overissuance");
expect(shown[2]).toBe("");
expect(shown[3]).toContain("Overissuance");
expect(shown[4]).toContain("No benefit error");
review.facts.inputsRevision++;
columns.final = calcScenario(review, review.facts.scenarios.compI, "final");
expect(cells()[3]).toBe("");
expect(cells()[1]).toContain("Overissuance");
columns.eligibility = calcScenario(review, { ...baseline, populated: false }, "eligibility");
expect(cells()).toEqual(["", "", "", "", ""]);
});
test("magnitude columns keep the six largest absolute effects with full inputs", () => {
const review = createSeed();
review.facts.scenarios.eligibility = structuredClone(review.facts.scenarios.compI);
Object.assign(review.facts.scenarios.compI, {
householdSize: 4,
rentCents: 100,
sua: "none",
dependentCareCents: 0,
medicalDeductionCents: 20000,
childSupportCents: 50000,
educationGrantCents: 100000,
taxesInsuranceCents: 150000,
homeless: true,
});
review.facts.scenarios.compI.income[0]!.amountCents += 70000;
review.facts.scenarios.compII.populated = false;
review.facts.final = selectFinal(review);
const columns = buildDiscrepancies(review);
expect(columns).toHaveLength(6);
const errors = columns.map((column) => Math.abs(column.errorCents));
expect(errors).toEqual([...errors].sort((a, b) => b - a));
expect(columns.some((column) => column.errorCents > 0)).toBe(true);
expect(columns.some((column) => column.errorCents < 0)).toBe(true);
for (const column of columns)
expect(calculate(column.scenario, review.sampleMonth).benefitCents).toBe(
column.result.benefitCents,
);
});
test("an invalid isolated discrepancy does not hide the remaining columns", () => {
const review = createSeed();
review.facts.scenarios.compII.populated = false;
review.facts.final = selectFinal(review);
review.facts.final.inputs!.householdSize = 21;
const columns = buildDiscrepancies(review);
expect(columns.length).toBeGreaterThan(0);
expect(columns.some((column) => column.label === "Household size")).toBe(false);
review.facts.inputsRevision++;
expect(buildDiscrepancies(review)).toEqual([]);
});
test("Final SAQC error uses magnitude, sign and dated threshold; Valid below threshold has no color", () => {
const review = createSeed();
review.facts.final = selectFinal(review);
review.outcome = "clean";
review.facts.final.errorCents = -5700;
expect(finalErrorDisplay(review)).toMatchObject({
amount: 5700,
label: "Underissuance",
reportable: false,
colored: false,
});
review.outcome = "error";
expect(finalErrorDisplay(review)).toMatchObject({ colored: true });
review.facts.final.errorCents = 5800;
expect(finalErrorDisplay(review)).toMatchObject({ label: "Overissuance", reportable: true });
});
test("changing an income category is one discrepancy with its full benefit effect", () => {
const review = createSeed();
review.facts.scenarios.eligibility = structuredClone(review.facts.scenarios.compI);
review.facts.scenarios.compI.income[0]!.category = "unearned";
review.facts.scenarios.compII.populated = false;
review.facts.final = selectFinal(review);
const columns = buildDiscrepancies(review);
expect(columns).toHaveLength(1);
expect(columns[0]!.errorCents).toBe(review.facts.final.errorCents);
expect(columns[0]!.scenario.income).toHaveLength(
review.facts.scenarios.eligibility.income.length,
);
});