91 lines
3.4 KiB
TypeScript
91 lines
3.4 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { resolveAddressCoverageEvidence } from "../src/services/addressCoverageEvidencePolicy";
|
|
|
|
describe("address coverage evidence policy", () => {
|
|
it("marks matched inventory balance replies as full confirmed-balance evidence", () => {
|
|
const contract = resolveAddressCoverageEvidence({
|
|
intent: "inventory_on_hand_as_of_date",
|
|
selectedRecipe: "address_inventory_on_hand_as_of_date_v1",
|
|
filters: {
|
|
as_of_date: "2021-03-31",
|
|
period_from: "2021-03-01",
|
|
period_to: "2021-03-31"
|
|
},
|
|
responseType: "FACTUAL_SUMMARY",
|
|
rowsMatched: 3
|
|
});
|
|
|
|
expect(contract.requested_result_mode).toBe("confirmed_balance");
|
|
expect(contract.result_mode).toBe("confirmed_balance");
|
|
expect(contract.coverage_status).toBe("full");
|
|
expect(contract.evidence_strength).toBe("strong");
|
|
expect(contract.balance_confirmed).toBe(true);
|
|
expect(contract.evidence_basis).toBe("matched_rows");
|
|
expect(contract.as_of_date_basis).toBe("explicit_as_of_date");
|
|
});
|
|
|
|
it("treats factual exact negatives as full confirmed-balance evidence instead of partial noise", () => {
|
|
const contract = resolveAddressCoverageEvidence({
|
|
intent: "payables_confirmed_as_of_date",
|
|
selectedRecipe: "address_payables_confirmed_as_of_date_v1",
|
|
filters: {
|
|
as_of_date: "2020-03-31",
|
|
period_from: "2020-03-01",
|
|
period_to: "2020-03-31"
|
|
},
|
|
responseType: "FACTUAL_SUMMARY",
|
|
rowsMatched: 0
|
|
});
|
|
|
|
expect(contract.result_mode).toBe("confirmed_balance");
|
|
expect(contract.coverage_status).toBe("full");
|
|
expect(contract.balance_confirmed).toBe(true);
|
|
expect(contract.evidence_basis).toBe("exact_negative");
|
|
expect(contract.reason_codes).toContain("evidence_basis_exact_negative");
|
|
});
|
|
|
|
it("keeps heuristic candidate answers partial even when rows exist", () => {
|
|
const contract = resolveAddressCoverageEvidence({
|
|
intent: "open_items_by_counterparty_or_contract",
|
|
selectedRecipe: "address_open_items_by_party_or_contract_v1",
|
|
filters: {
|
|
account: "60",
|
|
period_from: "2022-08-01",
|
|
period_to: "2022-08-31"
|
|
},
|
|
responseType: "FACTUAL_LIST",
|
|
rowsMatched: 4
|
|
});
|
|
|
|
expect(contract.requested_result_mode).toBe("confirmed_balance");
|
|
expect(contract.result_mode).toBe("confirmed_balance");
|
|
expect(contract.coverage_status).toBe("partial");
|
|
expect(contract.evidence_strength).toBe("medium");
|
|
expect(contract.balance_confirmed).toBe(false);
|
|
});
|
|
|
|
it("marks limited replies as blocked or partial according to the effective result mode", () => {
|
|
const confirmed = resolveAddressCoverageEvidence({
|
|
intent: "inventory_on_hand_as_of_date",
|
|
selectedRecipe: "address_inventory_on_hand_as_of_date_v1",
|
|
filters: {
|
|
as_of_date: "2021-03-31"
|
|
},
|
|
responseType: "LIMITED_WITH_REASON",
|
|
rowsMatched: 0
|
|
});
|
|
const heuristic = resolveAddressCoverageEvidence({
|
|
intent: "list_open_contracts",
|
|
selectedRecipe: "address_list_open_contracts_v1",
|
|
filters: {},
|
|
responseType: "LIMITED_WITH_REASON",
|
|
rowsMatched: 0
|
|
});
|
|
|
|
expect(confirmed.coverage_status).toBe("blocked");
|
|
expect(confirmed.evidence_basis).toBe("limited_response");
|
|
expect(heuristic.coverage_status).toBe("partial");
|
|
expect(heuristic.result_mode).toBe("heuristic_candidates");
|
|
});
|
|
});
|