NODEDC_1C/llm_normalizer/backend/tests/addressIntentResolverRegres...

113 lines
6.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { describe, expect, it } from "vitest";
import { resolveAddressIntent } from "../src/services/addressIntentResolver";
describe("addressIntentResolver regression bridges", () => {
it("detects colloquial VAT liability for a month period", () => {
const result = resolveAddressIntent("прикинь какой ндс нам надо заплатить на февраль 2017");
expect(result.intent).toBe("vat_liability_confirmed_for_tax_period");
});
it("detects VAT movement inspection wording with an explicit year", () => {
const result = resolveAddressIntent(
"\u043f\u043e\u043a\u0430\u0436\u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u041d\u0414\u0421 \u0437\u0430 2020 \u043f\u043e \u041e\u041e\u041e \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u041f\u043b\u044e\u0441"
);
expect(result.intent).toBe("vat_liability_confirmed_for_tax_period");
expect(result.reasons).toContain("vat_period_inspection_bridge_signal_detected");
});
it("detects canonical VAT charged-or-paid wording with an explicit year", () => {
const result = resolveAddressIntent(
"\u041a\u0430\u043a\u043e\u0439 \u041d\u0414\u0421 \u0431\u044b\u043b \u043d\u0430\u0447\u0438\u0441\u043b\u0435\u043d \u0438\u043b\u0438 \u0443\u043f\u043b\u0430\u0447\u0435\u043d \u0432 2020 \u0433\u043e\u0434\u0443 \u043f\u043e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u041e\u041e\u041e \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u041f\u043b\u044e\u0441?"
);
expect(result.intent).toBe("vat_liability_confirmed_for_tax_period");
expect(result.reasons).toContain("vat_liability_explicit_period_bridge_signal_detected");
});
it("detects payables snapshot wording in plain human form", () => {
const result = resolveAddressIntent("мы должны комуто денег на сегодня?");
expect(result.intent).toBe("payables_confirmed_as_of_date");
});
it("detects receivables snapshot wording through light current-turn typo noise", () => {
const result = resolveAddressIntent(
"\u043a\u0442\u043e \u043d\u0430\u043c\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0434\u0435\u043d\u0435\u0433 \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f"
);
expect(result.intent).toBe("receivables_confirmed_as_of_date");
expect(result.reasons).toContain("current_turn_noise_normalized");
});
it("detects top customer all-time revenue wording", () => {
const result = resolveAddressIntent("кто у нас самый доходный клиент за все время");
expect(result.intent).toBe("customer_revenue_and_payments");
});
it("detects customer concentration wording as customer revenue ranking", () => {
const result = resolveAddressIntent(
"\u041a\u0442\u043e \u043a\u0440\u0443\u043f\u043d\u0435\u0439\u0448\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u041f\u043b\u044e\u0441 \u0438 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0438\u0437\u043d\u0435\u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u0443\u043f\u0430\u0442\u0435\u043b\u044f?"
);
expect(result.intent).toBe("customer_revenue_and_payments");
expect(result.reasons).toContain("unicode_customer_concentration_bridge_signal_detected");
});
it("routes top-year company revenue wording to exact value-flow ranking", () => {
const result = resolveAddressIntent("какой у нас самый доходный год");
expect(result.intent).toBe("customer_revenue_and_payments");
expect(result.reasons).toContain("unicode_customer_revenue_ranking_bridge_signal_detected");
});
it("defers paired receivables and payables wording to business overview instead of one debt side", () => {
const result = resolveAddressIntent(
"\u043f\u043e\u043a\u0430\u0436\u0438 \u0441\u0440\u0435\u0437 \u0434\u0435\u0431\u0438\u0442\u043e\u0440\u043a\u0438 \u0438 \u043a\u0440\u0435\u0434\u0438\u0442\u043e\u0440\u043a\u0438 \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438"
);
expect(result.intent).toBe("unknown");
expect(result.reasons).toContain("unicode_business_overview_debt_position_deferred_to_discovery");
});
it("detects specific counterparty turnover wording as revenue profile", () => {
const result = resolveAddressIntent(
"\u043a\u0430\u043a\u043e\u0439 \u043e\u0431\u043e\u0440\u043e\u0442 \u0431\u044b\u043b \u0441\u0432\u043a"
);
expect(result.intent).toBe("customer_revenue_and_payments");
expect(result.reasons).toContain("specific_counterparty_revenue_bridge_signal_detected");
});
it("keeps documents by counterparty wording out of revenue bridge", () => {
const result = resolveAddressIntent(
"\u043f\u043e\u043a\u0430\u0436\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u043e \u0441\u0432\u043a"
);
expect(result.intent).toBe("list_documents_by_counterparty");
});
it("does not treat by-these-data wording as a loose counterparty anchor", () => {
const result = resolveAddressIntent(
"\u043f\u043e\u043a\u0430\u0436\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u043e \u044d\u0442\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u043c"
);
expect(result.intent).not.toBe("list_documents_by_counterparty");
expect(result.reasons).not.toContain("generic_lookup_with_loose_anchor_fallback");
expect(result.reasons).not.toContain("unicode_documents_by_counterparty_bridge_signal_detected");
});
it("does not collapse very old stock request into generic inventory snapshot", () => {
const result = resolveAddressIntent("Есть ли остатки товара, которые закупались очень давно");
expect(result.intent).toBe("inventory_aging_by_purchase_date");
});
it("detects bare historical inventory root with explicit month-year", () => {
const result = resolveAddressIntent("остатки на март 2016");
expect(result.intent).toBe("inventory_on_hand_as_of_date");
});
});