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("vat payable confirmed as-of route", () => { it("routes VAT payable question into exact confirmed intent", () => { const result = resolveAddressIntent("сколько НДС к уплате на март 2020"); expect(result.intent).toBe("vat_liability_confirmed_for_tax_period"); expect( result.reasons.includes("vat_liability_confirmed_tax_period_signal_detected") || result.reasons.includes("vat_liability_colloquial_bridge_signal_detected") ).toBe(true); }); it("treats colloquial 'сгрузить' wording as confirmed VAT payable intent", () => { const result = resolveAddressIntent("какой НДС мы должны сгрузить на март 2020"); expect(result.intent).toBe("vat_liability_confirmed_for_tax_period"); expect(result.reasons).toContain("vat_liability_colloquial_bridge_signal_detected"); }); it("treats colloquial VAT wording with month in prepositional case as confirmed intent", () => { const result = resolveAddressIntent("Какой НДС необходимо сгрузить в марте 2020 года?"); expect(result.intent).toBe("vat_liability_confirmed_for_tax_period"); expect(result.reasons).toContain("vat_liability_colloquial_bridge_signal_detected"); }); it("keeps VAT forecast intent when explicit forecast wording is used", () => { const result = resolveAddressIntent("мож прикинусь плиз скока ндс надо заплатить на 15 марта 2020 года"); expect(result.intent).toBe("vat_payable_forecast"); expect(result.reasons).toContain("forecast_tax_signal_detected"); }); it("derives as_of_date for confirmed VAT route from period boundary", () => { const extracted = extractAddressFilters("сколько НДС к уплате на март 2020", "vat_payable_confirmed_as_of_date"); expect(extracted.extracted_filters.period_from).toBe("2020-03-01"); expect(extracted.extracted_filters.period_to).toBe("2020-03-31"); expect(extracted.extracted_filters.as_of_date).toBe("2020-03-31"); }); it("selects confirmed VAT recipe and builds balance query", () => { const filters = extractAddressFilters("сколько НДС к уплате на март 2020", "vat_payable_confirmed_as_of_date").extracted_filters; const selected = selectAddressRecipe("vat_payable_confirmed_as_of_date", filters); expect(selected.selected_recipe?.recipe_id).toBe("address_vat_payable_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("68.02"); }); it("exposes compute exact capability and route expectation for confirmed VAT route", () => { const capability = resolveAddressCapabilityRouteDecision("vat_payable_confirmed_as_of_date"); expect(capability.capability_id).toBe("confirmed_vat_payable_as_of_date"); expect(capability.capability_layer).toBe("compute"); expect(capability.capability_route_mode).toBe("exact"); const expectation = evaluateAddressRouteExpectation({ intent: "vat_payable_confirmed_as_of_date", selectedRecipe: "address_vat_payable_confirmed_as_of_date_v1", requestedResultMode: "confirmed_balance", resultMode: "confirmed_balance" }); expect(expectation.status).toBe("matched"); }); it("uses exact VAT 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("vat_liability_confirmed_for_tax_period"); expect(result?.debug.selected_recipe).toBe("address_vat_liability_confirmed_tax_period_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"); }, 15000); });