ДОМЕНЫ - ВОПРОСЫ - кто должен нам
This commit is contained in:
@@ -15,6 +15,15 @@ describe("address capability policy", () => {
|
||||
expect(isCapabilityRouteBlocked(decision)).toBe(false);
|
||||
});
|
||||
|
||||
it("maps confirmed receivables intent to compute exact capability", () => {
|
||||
const decision = resolveAddressCapabilityRouteDecision("receivables_confirmed_as_of_date");
|
||||
expect(decision.capability_id).toBe("confirmed_receivables_as_of_date");
|
||||
expect(decision.capability_layer).toBe("compute");
|
||||
expect(decision.capability_route_mode).toBe("exact");
|
||||
expect(decision.capability_route_enabled).toBe(true);
|
||||
expect(isCapabilityRouteBlocked(decision)).toBe(false);
|
||||
});
|
||||
|
||||
it("maps document drilldown intent to navigation capability", () => {
|
||||
const decision = resolveAddressCapabilityRouteDecision("list_documents_by_contract");
|
||||
expect(decision.capability_id).toBe("documents_drilldown");
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
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");
|
||||
});
|
||||
});
|
||||
@@ -23,6 +23,17 @@ describe("address route expectations contract", () => {
|
||||
expect(audit.reason).toBe("route_expectation_matched");
|
||||
});
|
||||
|
||||
it("matches expected recipe and result mode for exact receivables route", () => {
|
||||
const audit = evaluateAddressRouteExpectation({
|
||||
intent: "receivables_confirmed_as_of_date",
|
||||
selectedRecipe: "address_receivables_confirmed_as_of_date_v1",
|
||||
requestedResultMode: "confirmed_balance",
|
||||
resultMode: "confirmed_balance"
|
||||
});
|
||||
expect(audit.status).toBe("matched");
|
||||
expect(audit.reason).toBe("route_expectation_matched");
|
||||
});
|
||||
|
||||
it("detects selected recipe mismatch", () => {
|
||||
const audit = evaluateAddressRouteExpectation({
|
||||
intent: "payables_confirmed_as_of_date",
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { sanitizeAssistantReplyForUserFacing } from "../src/services/answerComposer";
|
||||
|
||||
describe("answer composer user-facing formatting", () => {
|
||||
it("keeps intentional blank lines between semantic blocks", () => {
|
||||
const source = [
|
||||
"Блок 1. Статус результата",
|
||||
"- Дата среза: 31.07.2020.",
|
||||
"",
|
||||
"Блок 2. Что учтено",
|
||||
"- Контур: дебиторка 62/76.",
|
||||
"",
|
||||
"Блок 3. Сводка",
|
||||
"- Строк: 24."
|
||||
].join("\n");
|
||||
|
||||
const sanitized = sanitizeAssistantReplyForUserFacing(source);
|
||||
|
||||
expect(sanitized).toContain("Блок 1. Статус результата");
|
||||
expect(sanitized).toContain("\n\nБлок 2. Что учтено\n");
|
||||
expect(sanitized).toContain("\n\nБлок 3. Сводка\n");
|
||||
});
|
||||
|
||||
it("removes debug payload and still preserves block separators", () => {
|
||||
const source = [
|
||||
"Итого подтвержденная дебиторка: 1.000,00 ₽.",
|
||||
"",
|
||||
"Блок 1. Статус результата",
|
||||
"- Exact route.",
|
||||
"",
|
||||
"Блок 2. Что учтено",
|
||||
"- Дата среза: 31.07.2020.",
|
||||
"",
|
||||
"### technical_debug_payload_json",
|
||||
"```json",
|
||||
"{\"trace_id\":\"t-1\"}",
|
||||
"```"
|
||||
].join("\n");
|
||||
|
||||
const sanitized = sanitizeAssistantReplyForUserFacing(source);
|
||||
|
||||
expect(sanitized).toContain("Блок 1. Статус результата");
|
||||
expect(sanitized).toContain("\n\nБлок 2. Что учтено\n");
|
||||
expect(sanitized).not.toContain("technical_debug_payload_json");
|
||||
expect(sanitized).not.toContain("trace_id");
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user