102 lines
4.8 KiB
TypeScript
102 lines
4.8 KiB
TypeScript
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<typeof import("../src/services/addressMcpClient")>(
|
||
"../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('ПРЕДСТАВЛЕНИЕ(Товары.Ссылка.Организация) = "ООО \\Альтернатива Плюс\\"');
|
||
});
|
||
});
|