@yoryoboy/bi-mcp 1.14.0 → 1.14.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/index.js +3 -3
  3. package/dist/index.js.map +1 -1
  4. package/dist/mcp-use.json +2 -2
  5. package/dist/src/services/vtex/__tests__/vtex-catalog.test.js +2 -5
  6. package/dist/src/services/vtex/__tests__/vtex-catalog.test.js.map +2 -2
  7. package/dist/src/services/vtex/__tests__/vtex-payments.test.js +12 -9
  8. package/dist/src/services/vtex/__tests__/vtex-payments.test.js.map +2 -2
  9. package/dist/src/services/vtex/vtex-catalog.js +1 -1
  10. package/dist/src/services/vtex/vtex-catalog.js.map +2 -2
  11. package/dist/src/services/vtex/vtex-payments.js +11 -5
  12. package/dist/src/services/vtex/vtex-payments.js.map +2 -2
  13. package/dist/src/tools/vtex/__tests__/catalog-navigation-reads.test.js +21 -2
  14. package/dist/src/tools/vtex/__tests__/catalog-navigation-reads.test.js.map +2 -2
  15. package/dist/src/tools/vtex/__tests__/commercial-conditions.test.js +4 -173
  16. package/dist/src/tools/vtex/__tests__/commercial-conditions.test.js.map +2 -2
  17. package/dist/src/tools/vtex/__tests__/payment-rules.test.js +1 -0
  18. package/dist/src/tools/vtex/__tests__/payment-rules.test.js.map +2 -2
  19. package/dist/src/tools/vtex/catalog-admin-products-skus.js +1 -1
  20. package/dist/src/tools/vtex/catalog-admin-products-skus.js.map +1 -1
  21. package/dist/src/tools/vtex/catalog-navigation-reads.js +1 -1
  22. package/dist/src/tools/vtex/catalog-navigation-reads.js.map +2 -2
  23. package/dist/src/tools/vtex/commercial-conditions.js +35 -150
  24. package/dist/src/tools/vtex/commercial-conditions.js.map +2 -2
  25. package/dist/src/tools/vtex/create-sku.js +1 -1
  26. package/dist/src/tools/vtex/create-sku.js.map +1 -1
  27. package/dist/src/tools/vtex/payment-rules.js +81 -38
  28. package/dist/src/tools/vtex/payment-rules.js.map +2 -2
  29. package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js +12 -4
  30. package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js.map +2 -2
  31. package/dist/tests/vtex/vtex-commercial-conditions-surface.test.js +121 -12
  32. package/dist/tests/vtex/vtex-commercial-conditions-surface.test.js.map +2 -2
  33. package/dist/tests/vtex/vtex-commercial-conditions-workflow.test.js +15 -23
  34. package/dist/tests/vtex/vtex-commercial-conditions-workflow.test.js.map +2 -2
  35. package/package.json +1 -1
@@ -1,19 +1,128 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import { describe, expect, it } from "vitest";
3
3
  describe("VTEX commercial conditions server surface", () => {
4
+ it("registers and lists both tools through the MCP layer without schema compatibility failures", async () => {
5
+ const previousNodeEnv = process.env.NODE_ENV;
6
+ const previousTelemetry = process.env.MCP_USE_ANONYMIZED_TELEMETRY;
7
+ process.env.NODE_ENV = "production";
8
+ process.env.MCP_USE_ANONYMIZED_TELEMETRY = "false";
9
+ try {
10
+ const [
11
+ { MCPServer, object },
12
+ { MCPClient },
13
+ commercialConditionsModule,
14
+ paymentRulesModule
15
+ ] = await Promise.all([
16
+ import("mcp-use/server"),
17
+ import("mcp-use"),
18
+ import("../../src/tools/vtex/commercial-conditions.js"),
19
+ import("../../src/tools/vtex/payment-rules.js")
20
+ ]);
21
+ const server = new MCPServer({
22
+ name: "test-vtex-payments-server",
23
+ version: "1.0.0",
24
+ baseUrl: "http://localhost:3000"
25
+ });
26
+ server.tool(
27
+ {
28
+ name: "vtex_commercial_conditions",
29
+ description: "Read VTEX commercial conditions.",
30
+ schema: commercialConditionsModule.commercialConditionsSchema,
31
+ annotations: {
32
+ readOnlyHint: true,
33
+ destructiveHint: false,
34
+ openWorldHint: true
35
+ }
36
+ },
37
+ async (params) => commercialConditionsModule.commercialConditionsHandler(params)
38
+ );
39
+ server.tool(
40
+ {
41
+ name: "vtex_payment_rules",
42
+ description: "Manage VTEX payment rules.",
43
+ schema: paymentRulesModule.paymentRulesSchema,
44
+ annotations: {
45
+ readOnlyHint: false,
46
+ destructiveHint: true,
47
+ openWorldHint: true
48
+ }
49
+ },
50
+ async (params) => paymentRulesModule.paymentRulesHandler(params)
51
+ );
52
+ const handler = await server.getHandler();
53
+ const client = new MCPClient({
54
+ mcpServers: {
55
+ local: {
56
+ url: "http://localhost:3000/mcp",
57
+ transport: "http",
58
+ fetch: (input, init) => {
59
+ if (input instanceof Request) {
60
+ return handler(init === void 0 ? input : new Request(input, init));
61
+ }
62
+ return handler(new Request(input, init));
63
+ }
64
+ }
65
+ }
66
+ });
67
+ try {
68
+ const session = await client.createSession("local");
69
+ const tools = await session.listTools();
70
+ expect(tools).toEqual(
71
+ expect.arrayContaining([
72
+ expect.objectContaining({
73
+ name: "vtex_commercial_conditions",
74
+ inputSchema: expect.objectContaining({
75
+ properties: expect.objectContaining({
76
+ action: expect.any(Object),
77
+ profileId: expect.any(Object)
78
+ })
79
+ })
80
+ }),
81
+ expect.objectContaining({
82
+ name: "vtex_payment_rules",
83
+ inputSchema: expect.objectContaining({
84
+ properties: expect.objectContaining({
85
+ action: expect.any(Object),
86
+ profileId: expect.any(Object)
87
+ })
88
+ })
89
+ })
90
+ ])
91
+ );
92
+ } finally {
93
+ await client.closeAllSessions();
94
+ await server.close();
95
+ }
96
+ } finally {
97
+ if (previousNodeEnv === void 0) {
98
+ delete process.env.NODE_ENV;
99
+ } else {
100
+ process.env.NODE_ENV = previousNodeEnv;
101
+ }
102
+ if (previousTelemetry === void 0) {
103
+ delete process.env.MCP_USE_ANONYMIZED_TELEMETRY;
104
+ } else {
105
+ process.env.MCP_USE_ANONYMIZED_TELEMETRY = previousTelemetry;
106
+ }
107
+ }
108
+ });
4
109
  it("exports and registers both action-based payments tools", async () => {
5
110
  const serverSource = await readFile(new URL("../../index.ts", import.meta.url), "utf8");
6
111
  const exportsSource = await readFile(new URL("../../src/tools/vtex/index.ts", import.meta.url), "utf8");
7
112
  expect(exportsSource).toContain('export * from "./commercial-conditions.js"');
8
113
  expect(exportsSource).toContain('export * from "./payment-rules.js"');
9
- for (const toolName of ["vtex_commercial_conditions", "vtex_payment_rules"]) {
10
- const registrationStart = serverSource.indexOf(`name: "${toolName}"`);
11
- expect(registrationStart, `${toolName} registration exists`).toBeGreaterThan(-1);
12
- const registrationBlock = serverSource.slice(registrationStart, registrationStart + 900);
13
- expect(registrationBlock).toContain("readOnlyHint: false");
14
- expect(registrationBlock).toContain("destructiveHint: true");
15
- expect(registrationBlock).toContain("openWorldHint: true");
16
- }
114
+ const commercialConditionsStart = serverSource.indexOf('name: "vtex_commercial_conditions"');
115
+ const paymentRulesStart = serverSource.indexOf('name: "vtex_payment_rules"');
116
+ expect(commercialConditionsStart, "vtex_commercial_conditions registration exists").toBeGreaterThan(-1);
117
+ expect(paymentRulesStart, "vtex_payment_rules registration exists").toBeGreaterThan(-1);
118
+ const commercialConditionsBlock = serverSource.slice(commercialConditionsStart, commercialConditionsStart + 900);
119
+ const paymentRulesBlock = serverSource.slice(paymentRulesStart, paymentRulesStart + 900);
120
+ expect(commercialConditionsBlock).toContain("readOnlyHint: true");
121
+ expect(commercialConditionsBlock).toContain("destructiveHint: false");
122
+ expect(commercialConditionsBlock).toContain("openWorldHint: true");
123
+ expect(paymentRulesBlock).toContain("readOnlyHint: false");
124
+ expect(paymentRulesBlock).toContain("destructiveHint: true");
125
+ expect(paymentRulesBlock).toContain("openWorldHint: true");
17
126
  });
18
127
  it("keeps both tool descriptions business-safe and action-focused", async () => {
19
128
  const serverSource = await readFile(new URL("../../index.ts", import.meta.url), "utf8");
@@ -24,12 +133,12 @@ describe("VTEX commercial conditions server surface", () => {
24
133
  const commercialConditionsBlock = serverSource.slice(commercialConditionsStart, commercialConditionsStart + 900);
25
134
  const paymentRulesBlock = serverSource.slice(paymentRulesStart, paymentRulesStart + 900);
26
135
  expect(commercialConditionsBlock).toContain(
27
- "condition records used by checkout and installment strategies"
136
+ "list available condition records or get a specific condition"
28
137
  );
29
- expect(commercialConditionsBlock).toContain("Delete operations require confirmed=true");
138
+ expect(commercialConditionsBlock).toContain("cannot be created or modified through this API");
139
+ expect(commercialConditionsBlock).toContain("created manually in the VTEX admin panel");
30
140
  expect(commercialConditionsBlock).not.toContain("sandbox");
31
- expect(commercialConditionsBlock).not.toContain("production writes");
32
- expect(commercialConditionsBlock).not.toContain("legacy VTEX Payments endpoints");
141
+ expect(commercialConditionsBlock).not.toContain("Delete operations require confirmed=true");
33
142
  expect(paymentRulesBlock).toContain(
34
143
  "rules that map installments, payment systems, and optional commercial-condition restrictions"
35
144
  );
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../tests/vtex/vtex-commercial-conditions-surface.test.ts"],
4
- "sourcesContent": ["import { readFile } from \"node:fs/promises\";\nimport { describe, expect, it } from \"vitest\";\n\ndescribe(\"VTEX commercial conditions server surface\", () => {\n it(\"exports and registers both action-based payments tools\", async () => {\n const serverSource = await readFile(new URL(\"../../index.ts\", import.meta.url), \"utf8\");\n const exportsSource = await readFile(new URL(\"../../src/tools/vtex/index.ts\", import.meta.url), \"utf8\");\n\n expect(exportsSource).toContain('export * from \"./commercial-conditions.js\"');\n expect(exportsSource).toContain('export * from \"./payment-rules.js\"');\n\n for (const toolName of [\"vtex_commercial_conditions\", \"vtex_payment_rules\"]) {\n const registrationStart = serverSource.indexOf(`name: \"${toolName}\"`);\n expect(registrationStart, `${toolName} registration exists`).toBeGreaterThan(-1);\n\n const registrationBlock = serverSource.slice(registrationStart, registrationStart + 900);\n expect(registrationBlock).toContain(\"readOnlyHint: false\");\n expect(registrationBlock).toContain(\"destructiveHint: true\");\n expect(registrationBlock).toContain(\"openWorldHint: true\");\n }\n });\n\n it(\"keeps both tool descriptions business-safe and action-focused\", async () => {\n const serverSource = await readFile(new URL(\"../../index.ts\", import.meta.url), \"utf8\");\n\n const commercialConditionsStart = serverSource.indexOf('name: \"vtex_commercial_conditions\"');\n const paymentRulesStart = serverSource.indexOf('name: \"vtex_payment_rules\"');\n\n expect(commercialConditionsStart).toBeGreaterThan(-1);\n expect(paymentRulesStart).toBeGreaterThan(-1);\n\n const commercialConditionsBlock = serverSource.slice(commercialConditionsStart, commercialConditionsStart + 900);\n const paymentRulesBlock = serverSource.slice(paymentRulesStart, paymentRulesStart + 900);\n\n expect(commercialConditionsBlock).toContain(\n \"condition records used by checkout and installment strategies\"\n );\n expect(commercialConditionsBlock).toContain(\"Delete operations require confirmed=true\");\n expect(commercialConditionsBlock).not.toContain(\"sandbox\");\n expect(commercialConditionsBlock).not.toContain(\"production writes\");\n expect(commercialConditionsBlock).not.toContain(\"legacy VTEX Payments endpoints\");\n\n expect(paymentRulesBlock).toContain(\n \"rules that map installments, payment systems, and optional commercial-condition restrictions\"\n );\n expect(paymentRulesBlock).toContain(\"Delete operations require confirmed=true\");\n expect(paymentRulesBlock).not.toContain(\"sandbox\");\n expect(paymentRulesBlock).not.toContain(\"production writes\");\n expect(paymentRulesBlock).not.toContain(\"legacy VTEX Payments endpoint\");\n });\n});\n"],
5
- "mappings": "AAAA,SAAS,gBAAgB;AACzB,SAAS,UAAU,QAAQ,UAAU;AAErC,SAAS,6CAA6C,MAAM;AAC1D,KAAG,0DAA0D,YAAY;AACvE,UAAM,eAAe,MAAM,SAAS,IAAI,IAAI,kBAAkB,YAAY,GAAG,GAAG,MAAM;AACtF,UAAM,gBAAgB,MAAM,SAAS,IAAI,IAAI,iCAAiC,YAAY,GAAG,GAAG,MAAM;AAEtG,WAAO,aAAa,EAAE,UAAU,4CAA4C;AAC5E,WAAO,aAAa,EAAE,UAAU,oCAAoC;AAEpE,eAAW,YAAY,CAAC,8BAA8B,oBAAoB,GAAG;AAC3E,YAAM,oBAAoB,aAAa,QAAQ,UAAU,QAAQ,GAAG;AACpE,aAAO,mBAAmB,GAAG,QAAQ,sBAAsB,EAAE,gBAAgB,EAAE;AAE/E,YAAM,oBAAoB,aAAa,MAAM,mBAAmB,oBAAoB,GAAG;AACvF,aAAO,iBAAiB,EAAE,UAAU,qBAAqB;AACzD,aAAO,iBAAiB,EAAE,UAAU,uBAAuB;AAC3D,aAAO,iBAAiB,EAAE,UAAU,qBAAqB;AAAA,IAC3D;AAAA,EACF,CAAC;AAED,KAAG,iEAAiE,YAAY;AAC9E,UAAM,eAAe,MAAM,SAAS,IAAI,IAAI,kBAAkB,YAAY,GAAG,GAAG,MAAM;AAEtF,UAAM,4BAA4B,aAAa,QAAQ,oCAAoC;AAC3F,UAAM,oBAAoB,aAAa,QAAQ,4BAA4B;AAE3E,WAAO,yBAAyB,EAAE,gBAAgB,EAAE;AACpD,WAAO,iBAAiB,EAAE,gBAAgB,EAAE;AAE5C,UAAM,4BAA4B,aAAa,MAAM,2BAA2B,4BAA4B,GAAG;AAC/G,UAAM,oBAAoB,aAAa,MAAM,mBAAmB,oBAAoB,GAAG;AAEvF,WAAO,yBAAyB,EAAE;AAAA,MAChC;AAAA,IACF;AACA,WAAO,yBAAyB,EAAE,UAAU,0CAA0C;AACtF,WAAO,yBAAyB,EAAE,IAAI,UAAU,SAAS;AACzD,WAAO,yBAAyB,EAAE,IAAI,UAAU,mBAAmB;AACnE,WAAO,yBAAyB,EAAE,IAAI,UAAU,gCAAgC;AAEhF,WAAO,iBAAiB,EAAE;AAAA,MACxB;AAAA,IACF;AACA,WAAO,iBAAiB,EAAE,UAAU,0CAA0C;AAC9E,WAAO,iBAAiB,EAAE,IAAI,UAAU,SAAS;AACjD,WAAO,iBAAiB,EAAE,IAAI,UAAU,mBAAmB;AAC3D,WAAO,iBAAiB,EAAE,IAAI,UAAU,+BAA+B;AAAA,EACzE,CAAC;AACH,CAAC;",
4
+ "sourcesContent": ["import { readFile } from \"node:fs/promises\";\nimport { describe, expect, it } from \"vitest\";\n\ndescribe(\"VTEX commercial conditions server surface\", () => {\n it(\"registers and lists both tools through the MCP layer without schema compatibility failures\", async () => {\n const previousNodeEnv = process.env.NODE_ENV;\n const previousTelemetry = process.env.MCP_USE_ANONYMIZED_TELEMETRY;\n\n process.env.NODE_ENV = \"production\";\n process.env.MCP_USE_ANONYMIZED_TELEMETRY = \"false\";\n\n try {\n const [\n { MCPServer, object },\n { MCPClient },\n commercialConditionsModule,\n paymentRulesModule,\n ] = await Promise.all([\n import(\"mcp-use/server\"),\n import(\"mcp-use\"),\n import(\"../../src/tools/vtex/commercial-conditions.js\"),\n import(\"../../src/tools/vtex/payment-rules.js\"),\n ]);\n\n const server = new MCPServer({\n name: \"test-vtex-payments-server\",\n version: \"1.0.0\",\n baseUrl: \"http://localhost:3000\",\n });\n\n server.tool(\n {\n name: \"vtex_commercial_conditions\",\n description: \"Read VTEX commercial conditions.\",\n schema: commercialConditionsModule.commercialConditionsSchema,\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n openWorldHint: true,\n },\n },\n async (params) => commercialConditionsModule.commercialConditionsHandler(params)\n );\n\n server.tool(\n {\n name: \"vtex_payment_rules\",\n description: \"Manage VTEX payment rules.\",\n schema: paymentRulesModule.paymentRulesSchema,\n annotations: {\n readOnlyHint: false,\n destructiveHint: true,\n openWorldHint: true,\n },\n },\n async (params) => paymentRulesModule.paymentRulesHandler(params)\n );\n\n const handler = await server.getHandler();\n const client = new MCPClient({\n mcpServers: {\n local: {\n url: \"http://localhost:3000/mcp\",\n transport: \"http\",\n fetch: (input: Request | URL | string, init?: RequestInit) => {\n if (input instanceof Request) {\n return handler(init === undefined ? input : new Request(input, init));\n }\n\n return handler(new Request(input, init));\n },\n },\n },\n });\n\n try {\n const session = await client.createSession(\"local\");\n const tools = await session.listTools();\n\n expect(tools).toEqual(\n expect.arrayContaining([\n expect.objectContaining({\n name: \"vtex_commercial_conditions\",\n inputSchema: expect.objectContaining({\n properties: expect.objectContaining({\n action: expect.any(Object),\n profileId: expect.any(Object),\n }),\n }),\n }),\n expect.objectContaining({\n name: \"vtex_payment_rules\",\n inputSchema: expect.objectContaining({\n properties: expect.objectContaining({\n action: expect.any(Object),\n profileId: expect.any(Object),\n }),\n }),\n }),\n ])\n );\n } finally {\n await client.closeAllSessions();\n await server.close();\n }\n } finally {\n if (previousNodeEnv === undefined) {\n delete process.env.NODE_ENV;\n } else {\n process.env.NODE_ENV = previousNodeEnv;\n }\n\n if (previousTelemetry === undefined) {\n delete process.env.MCP_USE_ANONYMIZED_TELEMETRY;\n } else {\n process.env.MCP_USE_ANONYMIZED_TELEMETRY = previousTelemetry;\n }\n }\n });\n\n it(\"exports and registers both action-based payments tools\", async () => {\n const serverSource = await readFile(new URL(\"../../index.ts\", import.meta.url), \"utf8\");\n const exportsSource = await readFile(new URL(\"../../src/tools/vtex/index.ts\", import.meta.url), \"utf8\");\n\n expect(exportsSource).toContain('export * from \"./commercial-conditions.js\"');\n expect(exportsSource).toContain('export * from \"./payment-rules.js\"');\n\n const commercialConditionsStart = serverSource.indexOf('name: \"vtex_commercial_conditions\"');\n const paymentRulesStart = serverSource.indexOf('name: \"vtex_payment_rules\"');\n\n expect(commercialConditionsStart, \"vtex_commercial_conditions registration exists\").toBeGreaterThan(-1);\n expect(paymentRulesStart, \"vtex_payment_rules registration exists\").toBeGreaterThan(-1);\n\n const commercialConditionsBlock = serverSource.slice(commercialConditionsStart, commercialConditionsStart + 900);\n const paymentRulesBlock = serverSource.slice(paymentRulesStart, paymentRulesStart + 900);\n\n expect(commercialConditionsBlock).toContain(\"readOnlyHint: true\");\n expect(commercialConditionsBlock).toContain(\"destructiveHint: false\");\n expect(commercialConditionsBlock).toContain(\"openWorldHint: true\");\n\n expect(paymentRulesBlock).toContain(\"readOnlyHint: false\");\n expect(paymentRulesBlock).toContain(\"destructiveHint: true\");\n expect(paymentRulesBlock).toContain(\"openWorldHint: true\");\n });\n\n it(\"keeps both tool descriptions business-safe and action-focused\", async () => {\n const serverSource = await readFile(new URL(\"../../index.ts\", import.meta.url), \"utf8\");\n\n const commercialConditionsStart = serverSource.indexOf('name: \"vtex_commercial_conditions\"');\n const paymentRulesStart = serverSource.indexOf('name: \"vtex_payment_rules\"');\n\n expect(commercialConditionsStart).toBeGreaterThan(-1);\n expect(paymentRulesStart).toBeGreaterThan(-1);\n\n const commercialConditionsBlock = serverSource.slice(commercialConditionsStart, commercialConditionsStart + 900);\n const paymentRulesBlock = serverSource.slice(paymentRulesStart, paymentRulesStart + 900);\n\n expect(commercialConditionsBlock).toContain(\n \"list available condition records or get a specific condition\"\n );\n expect(commercialConditionsBlock).toContain(\"cannot be created or modified through this API\");\n expect(commercialConditionsBlock).toContain(\"created manually in the VTEX admin panel\");\n expect(commercialConditionsBlock).not.toContain(\"sandbox\");\n expect(commercialConditionsBlock).not.toContain(\"Delete operations require confirmed=true\");\n\n expect(paymentRulesBlock).toContain(\n \"rules that map installments, payment systems, and optional commercial-condition restrictions\"\n );\n expect(paymentRulesBlock).toContain(\"Delete operations require confirmed=true\");\n expect(paymentRulesBlock).not.toContain(\"sandbox\");\n expect(paymentRulesBlock).not.toContain(\"production writes\");\n expect(paymentRulesBlock).not.toContain(\"legacy VTEX Payments endpoint\");\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,7 +2,6 @@ import { z } from "zod";
2
2
  import { beforeEach, describe, expect, it, vi } from "vitest";
3
3
  const objectMock = vi.fn((value) => ({ kind: "object", value }));
4
4
  const errorMock = vi.fn((message) => ({ kind: "error", message }));
5
- const createCommercialConditionMock = vi.fn();
6
5
  const getCommercialConditionMock = vi.fn();
7
6
  const createPaymentRuleMock = vi.fn();
8
7
  const getPaymentRuleMock = vi.fn();
@@ -10,7 +9,6 @@ const updateSkuBasicFieldsServiceMock = vi.fn();
10
9
  const resolveVtexWriteProfileMock = vi.fn();
11
10
  const buildWriteSuccessResponseMock = vi.fn((value) => ({ kind: "write", value }));
12
11
  const handleVtexWriteErrorMock = vi.fn((_err, fallback) => ({ kind: "error", message: fallback }));
13
- const requireExplicitConfirmationMock = vi.fn();
14
12
  vi.mock("mcp-use/server", () => ({
15
13
  object: objectMock,
16
14
  error: errorMock
@@ -22,7 +20,7 @@ vi.mock("../../src/services/vtex/vtex-payments.js", () => ({
22
20
  listPaymentRules: vi.fn()
23
21
  }));
24
22
  vi.mock("../../src/services/vtex/vtex-payments-write.js", () => ({
25
- createCommercialCondition: createCommercialConditionMock,
23
+ createCommercialCondition: vi.fn(),
26
24
  updateCommercialCondition: vi.fn(),
27
25
  deleteCommercialCondition: vi.fn(),
28
26
  createPaymentRule: createPaymentRuleMock,
@@ -45,7 +43,7 @@ vi.mock("../../src/tools/vtex/write-helpers.js", () => ({
45
43
  resolveVtexWriteProfile: resolveVtexWriteProfileMock,
46
44
  buildWriteSuccessResponse: buildWriteSuccessResponseMock,
47
45
  handleVtexWriteError: handleVtexWriteErrorMock,
48
- requireExplicitConfirmation: requireExplicitConfirmationMock
46
+ requireExplicitConfirmation: vi.fn()
49
47
  }));
50
48
  const commercialConditionsModule = await import("../../src/tools/vtex/commercial-conditions.js");
51
49
  const paymentRulesModule = await import("../../src/tools/vtex/payment-rules.js");
@@ -57,14 +55,8 @@ describe("VTEX commercial conditions business workflow", () => {
57
55
  ok: true,
58
56
  value: { profileId: "profile-1" }
59
57
  });
60
- requireExplicitConfirmationMock.mockReturnValue(null);
61
58
  });
62
- it("supports a selective installments workflow for condition-targeted SKUs", async () => {
63
- createCommercialConditionMock.mockResolvedValue({
64
- id: 901,
65
- Name: "9-cuotas-sin-interes",
66
- IsActive: true
67
- });
59
+ it("supports a selective installments workflow after a condition is created manually in VTEX Admin", async () => {
68
60
  createPaymentRuleMock.mockResolvedValue({
69
61
  id: 902,
70
62
  commercialConditionId: 901,
@@ -94,11 +86,10 @@ describe("VTEX commercial conditions business workflow", () => {
94
86
  restrictedByCondition: true,
95
87
  installments: [{ count: 9, interest: false }]
96
88
  });
97
- const createdCondition = await commercialConditionsModule.commercialConditionsHandler({
98
- action: "create",
89
+ const inspectedCondition = await commercialConditionsModule.commercialConditionsHandler({
90
+ action: "get",
99
91
  profileId: "profile-1",
100
- name: "9-cuotas-sin-interes",
101
- isActive: true
92
+ commercialConditionId: 901
102
93
  });
103
94
  const createdRule = await paymentRulesModule.paymentRulesHandler({
104
95
  action: "create",
@@ -123,10 +114,7 @@ describe("VTEX commercial conditions business workflow", () => {
123
114
  profileId: "profile-1",
124
115
  ruleId: 902
125
116
  });
126
- expect(createCommercialConditionMock).toHaveBeenCalledWith("profile-1", {
127
- Name: "9-cuotas-sin-interes",
128
- IsActive: true
129
- });
117
+ expect(getCommercialConditionMock).toHaveBeenCalledWith("profile-1", 901);
130
118
  expect(createPaymentRuleMock).toHaveBeenCalledWith("profile-1", {
131
119
  commercialConditionId: 901,
132
120
  paymentSystem: "2",
@@ -136,11 +124,15 @@ describe("VTEX commercial conditions business workflow", () => {
136
124
  expect(updateSkuBasicFieldsServiceMock).toHaveBeenCalledWith("profile-1", "333", {
137
125
  commercialConditionId: 901
138
126
  });
139
- expect(createdCondition).toMatchObject({
140
- kind: "write",
127
+ expect(inspectedCondition).toMatchObject({
128
+ kind: "object",
141
129
  value: {
142
- operation: "commercial_conditions_create",
143
- resourceId: "901"
130
+ commercial_condition_id: 901,
131
+ condition: {
132
+ id: 901,
133
+ name: "9-cuotas-sin-interes",
134
+ is_active: true
135
+ }
144
136
  }
145
137
  });
146
138
  expect(createdRule).toMatchObject({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../tests/vtex/vtex-commercial-conditions-workflow.test.ts"],
4
- "sourcesContent": ["import { z } from \"zod\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst objectMock = vi.fn((value) => ({ kind: \"object\", value }));\nconst errorMock = vi.fn((message) => ({ kind: \"error\", message }));\n\nconst createCommercialConditionMock = vi.fn();\nconst getCommercialConditionMock = vi.fn();\nconst createPaymentRuleMock = vi.fn();\nconst getPaymentRuleMock = vi.fn();\nconst updateSkuBasicFieldsServiceMock = vi.fn();\n\nconst resolveVtexWriteProfileMock = vi.fn();\nconst buildWriteSuccessResponseMock = vi.fn((value) => ({ kind: \"write\", value }));\nconst handleVtexWriteErrorMock = vi.fn((_err, fallback) => ({ kind: \"error\", message: fallback }));\nconst requireExplicitConfirmationMock = vi.fn();\n\nvi.mock(\"mcp-use/server\", () => ({\n object: objectMock,\n error: errorMock,\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-payments.js\", () => ({\n getCommercialCondition: getCommercialConditionMock,\n listCommercialConditions: vi.fn(),\n getPaymentRule: getPaymentRuleMock,\n listPaymentRules: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-payments-write.js\", () => ({\n createCommercialCondition: createCommercialConditionMock,\n updateCommercialCondition: vi.fn(),\n deleteCommercialCondition: vi.fn(),\n createPaymentRule: createPaymentRuleMock,\n updatePaymentRule: vi.fn(),\n deletePaymentRule: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-catalog-write.js\", () => ({\n updateSkuBasicFields: updateSkuBasicFieldsServiceMock,\n replaceSkuEans: vi.fn(),\n createProduct: vi.fn(),\n createSku: vi.fn(),\n addSkuEan: vi.fn(),\n getSkuImages: vi.fn(),\n attachSkuImage: vi.fn(),\n updateSkuImage: vi.fn(),\n}));\n\nvi.mock(\"../../src/tools/vtex/write-helpers.js\", () => ({\n vtexProfileIdSchemaField: z.string().trim().min(1).optional().describe(\"profile\"),\n confirmationSchemaField: z.boolean().optional().describe(\"confirmed\"),\n resolveVtexWriteProfile: resolveVtexWriteProfileMock,\n buildWriteSuccessResponse: buildWriteSuccessResponseMock,\n handleVtexWriteError: handleVtexWriteErrorMock,\n requireExplicitConfirmation: requireExplicitConfirmationMock,\n}));\n\nconst commercialConditionsModule = await import(\"../../src/tools/vtex/commercial-conditions.js\");\nconst paymentRulesModule = await import(\"../../src/tools/vtex/payment-rules.js\");\nconst skuModule = await import(\"../../src/tools/vtex/update-sku-basic-fields.js\");\n\ndescribe(\"VTEX commercial conditions business workflow\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n resolveVtexWriteProfileMock.mockResolvedValue({\n ok: true,\n value: { profileId: \"profile-1\" },\n });\n requireExplicitConfirmationMock.mockReturnValue(null);\n });\n\n it(\"supports a selective installments workflow for condition-targeted SKUs\", async () => {\n createCommercialConditionMock.mockResolvedValue({\n id: 901,\n Name: \"9-cuotas-sin-interes\",\n IsActive: true,\n });\n createPaymentRuleMock.mockResolvedValue({\n id: 902,\n commercialConditionId: 901,\n paymentSystem: \"2\",\n restrictedByCondition: true,\n installments: [{ count: 9, interest: false }],\n });\n updateSkuBasicFieldsServiceMock.mockResolvedValue({\n before: { Id: 333, CommercialConditionId: 0 },\n after: { Id: 333, CommercialConditionId: 901 },\n });\n getCommercialConditionMock.mockResolvedValue({\n id: 901,\n name: \"9-cuotas-sin-interes\",\n isActive: true,\n });\n getPaymentRuleMock\n .mockResolvedValueOnce({\n id: 100,\n commercialConditionId: 0,\n paymentSystem: \"2\",\n restrictedByCondition: false,\n installments: [{ count: 6, interest: false }],\n })\n .mockResolvedValueOnce({\n id: 902,\n commercialConditionId: 901,\n paymentSystem: \"2\",\n restrictedByCondition: true,\n installments: [{ count: 9, interest: false }],\n });\n\n const createdCondition = await commercialConditionsModule.commercialConditionsHandler({\n action: \"create\",\n profileId: \"profile-1\",\n name: \"9-cuotas-sin-interes\",\n isActive: true,\n });\n\n const createdRule = await paymentRulesModule.paymentRulesHandler({\n action: \"create\",\n profileId: \"profile-1\",\n commercialConditionId: 901,\n paymentSystem: \"2\",\n restrictedByCondition: true,\n installments: [{ count: 9, interest: false }],\n });\n\n const assignedSku = await skuModule.updateSkuBasicFieldsHandler({\n profileId: \"profile-1\",\n skuId: \"333\",\n commercialConditionId: 901,\n });\n\n const defaultRule = await paymentRulesModule.paymentRulesHandler({\n action: \"get\",\n profileId: \"profile-1\",\n ruleId: 100,\n });\n\n const targetedRule = await paymentRulesModule.paymentRulesHandler({\n action: \"get\",\n profileId: \"profile-1\",\n ruleId: 902,\n });\n\n expect(createCommercialConditionMock).toHaveBeenCalledWith(\"profile-1\", {\n Name: \"9-cuotas-sin-interes\",\n IsActive: true,\n });\n expect(createPaymentRuleMock).toHaveBeenCalledWith(\"profile-1\", {\n commercialConditionId: 901,\n paymentSystem: \"2\",\n restrictedByCondition: true,\n installments: [{ count: 9, interest: false }],\n });\n expect(updateSkuBasicFieldsServiceMock).toHaveBeenCalledWith(\"profile-1\", \"333\", {\n commercialConditionId: 901,\n });\n\n expect(createdCondition).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"commercial_conditions_create\",\n resourceId: \"901\",\n },\n });\n expect(createdRule).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"payment_rules_create\",\n resourceId: \"902\",\n },\n });\n expect(assignedSku).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"update_sku_basic_fields\",\n resourceId: \"333\",\n },\n });\n\n expect(defaultRule).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n rule_id: 100,\n payment_rule: {\n id: 100,\n commercial_condition_id: 0,\n payment_system: \"2\",\n restricted_by_condition: false,\n installments: [{ count: 6, interest: false }],\n },\n },\n });\n expect(targetedRule).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n rule_id: 902,\n payment_rule: {\n id: 902,\n commercial_condition_id: 901,\n payment_system: \"2\",\n restricted_by_condition: true,\n installments: [{ count: 9, interest: false }],\n },\n },\n });\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { z } from \"zod\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst objectMock = vi.fn((value) => ({ kind: \"object\", value }));\nconst errorMock = vi.fn((message) => ({ kind: \"error\", message }));\n\nconst getCommercialConditionMock = vi.fn();\nconst createPaymentRuleMock = vi.fn();\nconst getPaymentRuleMock = vi.fn();\nconst updateSkuBasicFieldsServiceMock = vi.fn();\n\nconst resolveVtexWriteProfileMock = vi.fn();\nconst buildWriteSuccessResponseMock = vi.fn((value) => ({ kind: \"write\", value }));\nconst handleVtexWriteErrorMock = vi.fn((_err, fallback) => ({ kind: \"error\", message: fallback }));\n\nvi.mock(\"mcp-use/server\", () => ({\n object: objectMock,\n error: errorMock,\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-payments.js\", () => ({\n getCommercialCondition: getCommercialConditionMock,\n listCommercialConditions: vi.fn(),\n getPaymentRule: getPaymentRuleMock,\n listPaymentRules: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-payments-write.js\", () => ({\n createCommercialCondition: vi.fn(),\n updateCommercialCondition: vi.fn(),\n deleteCommercialCondition: vi.fn(),\n createPaymentRule: createPaymentRuleMock,\n updatePaymentRule: vi.fn(),\n deletePaymentRule: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-catalog-write.js\", () => ({\n updateSkuBasicFields: updateSkuBasicFieldsServiceMock,\n replaceSkuEans: vi.fn(),\n createProduct: vi.fn(),\n createSku: vi.fn(),\n addSkuEan: vi.fn(),\n getSkuImages: vi.fn(),\n attachSkuImage: vi.fn(),\n updateSkuImage: vi.fn(),\n}));\n\nvi.mock(\"../../src/tools/vtex/write-helpers.js\", () => ({\n vtexProfileIdSchemaField: z.string().trim().min(1).optional().describe(\"profile\"),\n confirmationSchemaField: z.boolean().optional().describe(\"confirmed\"),\n resolveVtexWriteProfile: resolveVtexWriteProfileMock,\n buildWriteSuccessResponse: buildWriteSuccessResponseMock,\n handleVtexWriteError: handleVtexWriteErrorMock,\n requireExplicitConfirmation: vi.fn(),\n}));\n\nconst commercialConditionsModule = await import(\"../../src/tools/vtex/commercial-conditions.js\");\nconst paymentRulesModule = await import(\"../../src/tools/vtex/payment-rules.js\");\nconst skuModule = await import(\"../../src/tools/vtex/update-sku-basic-fields.js\");\n\ndescribe(\"VTEX commercial conditions business workflow\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n resolveVtexWriteProfileMock.mockResolvedValue({\n ok: true,\n value: { profileId: \"profile-1\" },\n });\n });\n\n it(\"supports a selective installments workflow after a condition is created manually in VTEX Admin\", async () => {\n createPaymentRuleMock.mockResolvedValue({\n id: 902,\n commercialConditionId: 901,\n paymentSystem: \"2\",\n restrictedByCondition: true,\n installments: [{ count: 9, interest: false }],\n });\n updateSkuBasicFieldsServiceMock.mockResolvedValue({\n before: { Id: 333, CommercialConditionId: 0 },\n after: { Id: 333, CommercialConditionId: 901 },\n });\n getCommercialConditionMock.mockResolvedValue({\n id: 901,\n name: \"9-cuotas-sin-interes\",\n isActive: true,\n });\n getPaymentRuleMock\n .mockResolvedValueOnce({\n id: 100,\n commercialConditionId: 0,\n paymentSystem: \"2\",\n restrictedByCondition: false,\n installments: [{ count: 6, interest: false }],\n })\n .mockResolvedValueOnce({\n id: 902,\n commercialConditionId: 901,\n paymentSystem: \"2\",\n restrictedByCondition: true,\n installments: [{ count: 9, interest: false }],\n });\n\n const inspectedCondition = await commercialConditionsModule.commercialConditionsHandler({\n action: \"get\",\n profileId: \"profile-1\",\n commercialConditionId: 901,\n });\n\n const createdRule = await paymentRulesModule.paymentRulesHandler({\n action: \"create\",\n profileId: \"profile-1\",\n commercialConditionId: 901,\n paymentSystem: \"2\",\n restrictedByCondition: true,\n installments: [{ count: 9, interest: false }],\n });\n\n const assignedSku = await skuModule.updateSkuBasicFieldsHandler({\n profileId: \"profile-1\",\n skuId: \"333\",\n commercialConditionId: 901,\n });\n\n const defaultRule = await paymentRulesModule.paymentRulesHandler({\n action: \"get\",\n profileId: \"profile-1\",\n ruleId: 100,\n });\n\n const targetedRule = await paymentRulesModule.paymentRulesHandler({\n action: \"get\",\n profileId: \"profile-1\",\n ruleId: 902,\n });\n\n expect(getCommercialConditionMock).toHaveBeenCalledWith(\"profile-1\", 901);\n expect(createPaymentRuleMock).toHaveBeenCalledWith(\"profile-1\", {\n commercialConditionId: 901,\n paymentSystem: \"2\",\n restrictedByCondition: true,\n installments: [{ count: 9, interest: false }],\n });\n expect(updateSkuBasicFieldsServiceMock).toHaveBeenCalledWith(\"profile-1\", \"333\", {\n commercialConditionId: 901,\n });\n\n expect(inspectedCondition).toMatchObject({\n kind: \"object\",\n value: {\n commercial_condition_id: 901,\n condition: {\n id: 901,\n name: \"9-cuotas-sin-interes\",\n is_active: true,\n },\n },\n });\n expect(createdRule).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"payment_rules_create\",\n resourceId: \"902\",\n },\n });\n expect(assignedSku).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"update_sku_basic_fields\",\n resourceId: \"333\",\n },\n });\n\n expect(defaultRule).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n rule_id: 100,\n payment_rule: {\n id: 100,\n commercial_condition_id: 0,\n payment_system: \"2\",\n restricted_by_condition: false,\n installments: [{ count: 6, interest: false }],\n },\n },\n });\n expect(targetedRule).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n rule_id: 902,\n payment_rule: {\n id: 902,\n commercial_condition_id: 901,\n payment_system: \"2\",\n restricted_by_condition: true,\n installments: [{ count: 9, interest: false }],\n },\n },\n });\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@yoryoboy/bi-mcp",
3
3
  "type": "module",
4
- "version": "1.14.0",
4
+ "version": "1.14.3",
5
5
  "description": "MCP server: bi-mcp",
6
6
  "author": "",
7
7
  "license": "MIT",