import { afterEach, describe, expect, it, vi } from "vitest"; const { executeAddressMcpQueryMock } = vi.hoisted(() => ({ executeAddressMcpQueryMock: vi.fn() })); vi.mock("../src/services/addressMcpClient", async () => { const actual = await vi.importActual( "../src/services/addressMcpClient" ); return { ...actual, executeAddressMcpQuery: executeAddressMcpQueryMock }; }); import { AddressQueryService } from "../src/services/addressQueryService"; afterEach(() => { executeAddressMcpQueryMock.mockReset(); vi.restoreAllMocks(); }); describe("inventory sale trace document route", () => { it("uses document sales route with native item resolution for selected-object buyer follow-up", async () => { executeAddressMcpQueryMock.mockResolvedValueOnce({ fetched_rows: 2, matched_rows: 2, raw_rows: [ { Period: "2015-02-25T12:00:00Z", Registrator: "Реализация товаров и услуг 00000000012 от 25.02.2015 12:00:00", AccountDt: "", AccountKt: "41.01", Amount: 12605435.66, Quantity: 40, Item: "Рабочая станция универсального специалиста (индивидуальное изготовление)", Counterparty: "Комитет государственных услуг г. Москвы", Contract: "Гос.контракт № 42/15 от 20.02.2015г. Силино окна", Organization: "ООО \\Альтернатива Плюс\\" }, { Period: "2015-02-09T12:00:14Z", Registrator: "Реализация товаров и услуг 00000000004 от 09.02.2015 12:00:14", AccountDt: "", AccountKt: "41.01", Amount: 16421320.17, Quantity: 51, Item: "Рабочая станция универсального специалиста (индивидуальное изготовление)", Counterparty: "Комитет государственных услуг г. Москвы", Contract: "Гос.контракт № 17/15 от 02.02.2015г.", Organization: "ООО \\Альтернатива Плюс\\" } ], rows: [], error: null }); const service = new AddressQueryService(); const result = await service.tryHandle( 'По выбранному объекту "Рабочая станция универсального специалиста (индивидуальное изготовление)": кому продали', { followupContext: { previous_intent: "inventory_on_hand_as_of_date", previous_filters: { as_of_date: "2016-06-30", period_from: "2016-06-01", period_to: "2016-06-30", organization: "ООО \\Альтернатива Плюс\\" }, previous_anchor_type: "organization", previous_anchor_value: "ООО \\Альтернатива Плюс\\" } } ); expect(result?.handled).toBe(true); expect(result?.response_type).toBe("FACTUAL_LIST"); expect(result?.debug.detected_intent).toBe("inventory_sale_trace_for_item"); expect(result?.debug.selected_recipe).toBe("address_inventory_sale_trace_for_item_v1"); expect(String(result?.reply_text ?? "")).toContain("Комитет государственных услуг г. Москвы"); expect(executeAddressMcpQueryMock).toHaveBeenCalledTimes(1); const query = String(executeAddressMcpQueryMock.mock.calls[0]?.[0]?.query ?? ""); expect(query).toContain("Документ.РеализацияТоваровУслуг.Товары КАК Товары"); expect(query).toContain("Товары.Номенклатура В (ВЫБРАТЬ Номенклатура.Ссылка"); expect(query).toContain('Номенклатура.Наименование = "Рабочая станция универсального специалиста (индивидуальное изготовление)"'); expect(query).toContain("ПРЕДСТАВЛЕНИЕ(Товары.Ссылка.Контрагент) КАК Контрагент"); expect(query).toContain("ПРЕДСТАВЛЕНИЕ(Товары.Ссылка.Организация) КАК Организация"); expect(query).not.toContain("2016-06-30"); expect(query).not.toContain("2016-06-01"); expect(query).not.toContain('ПРЕДСТАВЛЕНИЕ(Движения.Организация) = "ООО \\Альтернатива Плюс\\"'); }); });