import { describe, expect, it } from "vitest"; import { extractAddressFilters } from "../src/services/addressFilterExtractor"; describe("inventory warehouse anchor extraction", () => { it("does not treat 'по состоянию ...' as warehouse name in stock snapshot questions", () => { const filters = extractAddressFilters( "Какие товары находятся на складе по состоянию на 15 марта 2020 года?", "inventory_on_hand_as_of_date" ).extracted_filters; expect(filters.as_of_date).toBe("2020-03-15"); expect(filters.warehouse).toBeUndefined(); }); it("does not treat month phrases as warehouse name in stock snapshot questions", () => { const filters = extractAddressFilters( "Какие товары лежат на складе на март 2019", "inventory_on_hand_as_of_date" ).extracted_filters; expect(filters.period_from).toBe("2019-03-01"); expect(filters.period_to).toBe("2019-03-31"); expect(filters.as_of_date).toBe("2019-03-31"); expect(filters.warehouse).toBeUndefined(); }); it("does not materialize 'за май' as warehouse in inventory balance phrasing from the run", () => { const filters = extractAddressFilters( "проверить остатки по складу за май 2020 года", "inventory_on_hand_as_of_date" ).extracted_filters; expect(filters.period_from).toBe("2020-05-01"); expect(filters.period_to).toBe("2020-05-31"); expect(filters.as_of_date).toBe("2020-05-31"); expect(filters.warehouse).toBeUndefined(); }); it("treats 'у нас' as implicit self-scope instead of literal warehouse anchor", () => { const result = extractAddressFilters("что на складе у нас", "inventory_on_hand_as_of_date"); expect(result.extracted_filters.warehouse).toBeUndefined(); expect(result.warnings).toContain("warehouse_self_scope_detected"); expect(result.semantic_frame?.scope_kind).toBe("implicit_self_scope"); expect(result.semantic_frame?.anchor_kind).toBe("self_scope"); expect(result.semantic_frame?.anchor_value).toBeNull(); expect(result.semantic_frame?.date_scope_kind).toBe("implicit_current"); expect(result.semantic_frame?.date_basis_hint).toBe("implicit_current_snapshot"); }); it("does not materialize profanity tail as warehouse anchor in slang stock query", () => { const filters = extractAddressFilters( "ассистент, рассказывай что нам на складе ебаном лежит", "inventory_on_hand_as_of_date" ).extracted_filters; expect(filters.warehouse).toBeUndefined(); }); it("does not materialize repair phrasing as warehouse anchor in stock follow-up", () => { const filters = extractAddressFilters( "остатки на складе какие имелось в виду", "inventory_on_hand_as_of_date" ).extracted_filters; expect(filters.warehouse).toBeUndefined(); }); it("does not materialize self-scope slang tail as warehouse anchor in stock snapshot wording from the run", () => { const result = extractAddressFilters("что там на складе у нас висит", "inventory_on_hand_as_of_date"); expect(result.extracted_filters.warehouse).toBeUndefined(); expect(result.warnings).toContain("warehouse_self_scope_detected"); expect(result.semantic_frame?.scope_kind).toBe("implicit_self_scope"); expect(result.semantic_frame?.anchor_kind).toBe("self_scope"); expect(result.semantic_frame?.anchor_value).toBeNull(); }); it("does not materialize same-date phrasing as warehouse anchor in stock follow-up", () => { const filters = extractAddressFilters("какие остатки по складу на эту же дату", "inventory_on_hand_as_of_date").extracted_filters; expect(filters.warehouse).toBeUndefined(); }); it("does not materialize 'РїРѕ той Р¶Рµ дате' as warehouse anchor in stock follow-up", () => { const filters = extractAddressFilters("покажи остатки РЅР° складе РїРѕ той Р¶Рµ дате", "inventory_on_hand_as_of_date").extracted_filters; expect(filters.warehouse).toBeUndefined(); }); it("does not materialize current-date phrasing as warehouse anchor in stock follow-up", () => { const filters = extractAddressFilters( "получить остатки по складу на текущую дату", "inventory_on_hand_as_of_date" ).extracted_filters; expect(filters.warehouse).toBeUndefined(); }); it("does not materialize current-moment canonical tail as warehouse anchor", () => { const filters = extractAddressFilters( "Какие товары находятся на складе в текущий момент", "inventory_on_hand_as_of_date" ).extracted_filters; expect(filters.warehouse).toBeUndefined(); }); it("does not split organization-generic stock wording into stale warehouse and counterparty anchors", () => { const filters = extractAddressFilters( "Какие товары находились на складе компании в марте 2019 года?", "inventory_on_hand_as_of_date" ).extracted_filters; expect(filters.period_from).toBe("2019-03-01"); expect(filters.period_to).toBe("2019-03-31"); expect(filters.as_of_date).toBe("2019-03-31"); expect(filters.warehouse).toBeUndefined(); expect(filters.counterparty).toBeUndefined(); }); });