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 movement route", () => { it("uses 41.01 movement 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: "62.01", AccountKt: "41.01", Amount: 12605435.66, Quantity: 40, SubcontoKt1: "Рабочая станция универсального специалиста (индивидуальное изготовление)", SubcontoKt3: "Основной склад", SubcontoDt1: "Комитет государственных услуг г. Москвы", SubcontoDt2: "Гос.контракт № 42/15 от 20.02.2015 г. Силино окна", Organization: "ООО \\Альтернатива Плюс\\" }, { Period: "2015-02-09T12:00:14Z", Registrator: "Реализация товаров и услуг 00000000004 от 09.02.2015 12:00:14", AccountDt: "62.01", AccountKt: "41.01", Amount: 16421320.17, Quantity: 51, SubcontoKt1: "Рабочая станция универсального специалиста (индивидуальное изготовление)", SubcontoKt3: "Основной склад", SubcontoDt1: "Комитет государственных услуг г. Москвы", SubcontoDt2: "Гос.контракт № 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(String(result?.reply_text ?? "")).not.toMatch( /Контрагент:\s*Рабочая станция универсального специалиста/i ); expect(executeAddressMcpQueryMock).toHaveBeenCalledTimes(1); const query = String(executeAddressMcpQueryMock.mock.calls[0]?.[0]?.query ?? ""); expect(query).toContain("Документ.РеализацияТоваровУслуг.Товары КАК Товары"); expect(query).toContain('"41.01" КАК СчетКт'); 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('ПРЕДСТАВЛЕНИЕ(Товары.Ссылка.Организация) = "ООО \\Альтернатива Плюс\\"'); }); });