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 'кто нам должен' 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("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"); }); });