87 lines
5.1 KiB
TypeScript
87 lines
5.1 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { resolveAddressIntent } from "../src/services/addressIntentResolver";
|
|
import { extractAddressFilters } from "../src/services/addressFilterExtractor";
|
|
import { buildAddressRecipePlan, selectAddressRecipe } from "../src/services/addressRecipeCatalog";
|
|
import { resolveAddressCapabilityRouteDecision } from "../src/services/addressCapabilityPolicy";
|
|
import { evaluateAddressRouteExpectation } from "../src/services/addressRouteExpectations";
|
|
import { AddressQueryService } from "../src/services/addressQueryService";
|
|
|
|
describe("receivables confirmed as-of route", () => {
|
|
it("routes canonical debtor phrasing into exact receivables intent", () => {
|
|
const result = resolveAddressIntent("кто является дебитором компании по состоянию на июль 2020 года");
|
|
expect(result.intent).toBe("receivables_confirmed_as_of_date");
|
|
expect(result.reasons).toContain("receivables_debt_lifecycle_signal_detected");
|
|
});
|
|
|
|
it("keeps exact receivables route for canonical debtor phrasing in runtime", async () => {
|
|
const service = new AddressQueryService();
|
|
const result = await service.tryHandle("кто является дебитором компании по состоянию на июль 2020 года");
|
|
expect(result?.handled).toBe(true);
|
|
expect(result?.debug.detected_intent).toBe("receivables_confirmed_as_of_date");
|
|
expect(result?.debug.selected_recipe).toBe("address_receivables_confirmed_as_of_date_v1");
|
|
expect(result?.debug.requested_result_mode).toBe("confirmed_balance");
|
|
expect(result?.debug.limited_reason_category).not.toBe("missing_anchor");
|
|
});
|
|
|
|
it("routes 'кто нам должен' wording into exact receivables intent", () => {
|
|
const result = resolveAddressIntent("кто нам должен на июль 2020");
|
|
expect(result.intent).toBe("receivables_confirmed_as_of_date");
|
|
expect(result.reasons).toContain("receivables_debt_lifecycle_signal_detected");
|
|
});
|
|
|
|
it("routes slang 'нам торчат' wording into exact receivables intent", () => {
|
|
const result = resolveAddressIntent(
|
|
"\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u043d\u0435\u0433 \u043d\u0430\u043c \u0442\u043e\u0440\u0447\u0430\u0442 \u043d\u0430 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c 2017"
|
|
);
|
|
expect(result.intent).toBe("receivables_confirmed_as_of_date");
|
|
expect(result.intent).not.toBe("customer_revenue_and_payments");
|
|
expect(result.reasons).toContain("receivables_debt_lifecycle_signal_detected");
|
|
});
|
|
|
|
it("drops low-quality counterparty anchor from as-of debtor phrasing", () => {
|
|
const extracted = extractAddressFilters(
|
|
"кто является дебитором компании по состоянию на июль 2020 года",
|
|
"receivables_confirmed_as_of_date"
|
|
);
|
|
expect(extracted.extracted_filters.counterparty).toBeUndefined();
|
|
});
|
|
|
|
it("selects confirmed receivables recipe and builds balance query", () => {
|
|
const filters = extractAddressFilters("кто нам должен на июль 2020", "receivables_confirmed_as_of_date").extracted_filters;
|
|
const selected = selectAddressRecipe("receivables_confirmed_as_of_date", filters);
|
|
expect(selected.selected_recipe?.recipe_id).toBe("address_receivables_confirmed_as_of_date_v1");
|
|
const plan = buildAddressRecipePlan(selected.selected_recipe!, filters);
|
|
expect(plan.query).toContain("РегистрБухгалтерии.Хозрасчетный.Остатки");
|
|
expect(plan.query).toContain("СуммаРазвернутыйОстатокДт");
|
|
expect(plan.query).toContain("Остатки.Счет");
|
|
expect(plan.query).toContain("62");
|
|
expect(plan.query).toContain("76");
|
|
});
|
|
|
|
it("exposes compute exact capability and route expectation for exact receivables", () => {
|
|
const capability = resolveAddressCapabilityRouteDecision("receivables_confirmed_as_of_date");
|
|
expect(capability.capability_id).toBe("confirmed_receivables_as_of_date");
|
|
expect(capability.capability_layer).toBe("compute");
|
|
expect(capability.capability_route_mode).toBe("exact");
|
|
|
|
const expectation = evaluateAddressRouteExpectation({
|
|
intent: "receivables_confirmed_as_of_date",
|
|
selectedRecipe: "address_receivables_confirmed_as_of_date_v1",
|
|
requestedResultMode: "confirmed_balance",
|
|
resultMode: "confirmed_balance"
|
|
});
|
|
expect(expectation.status).toBe("matched");
|
|
});
|
|
|
|
it("uses exact receivables route in runtime for monthly as-of query", async () => {
|
|
const service = new AddressQueryService();
|
|
const result = await service.tryHandle("кто нам должен на июль 2020");
|
|
expect(result?.handled).toBe(true);
|
|
expect(result?.debug.detected_intent).toBe("receivables_confirmed_as_of_date");
|
|
expect(result?.debug.selected_recipe).toBe("address_receivables_confirmed_as_of_date_v1");
|
|
expect(result?.debug.requested_result_mode).toBe("confirmed_balance");
|
|
expect(result?.debug.route_expectation_status).toBe("matched");
|
|
expect(result?.debug.limited_reason_category).not.toBe("unsupported");
|
|
});
|
|
});
|