@yoryoboy/bi-mcp 1.16.0 → 1.19.0
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.
- package/README.md +12 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.js +179 -6
- package/dist/index.js.map +2 -2
- package/dist/mcp-use.json +3 -6
- package/dist/src/config/__tests__/google-store.test.js +30 -0
- package/dist/src/config/__tests__/google-store.test.js.map +7 -0
- package/dist/src/config/__tests__/mcp-tool-deadline.test.js +64 -0
- package/dist/src/config/__tests__/mcp-tool-deadline.test.js.map +7 -0
- package/dist/src/config/google-store.js +18 -0
- package/dist/src/config/google-store.js.map +2 -2
- package/dist/src/config/mcp-tool-deadline-context.js +34 -0
- package/dist/src/config/mcp-tool-deadline-context.js.map +7 -0
- package/dist/src/config/mcp-tool-deadline.js +67 -0
- package/dist/src/config/mcp-tool-deadline.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-api.test.js +38 -3
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-api.test.js.map +2 -2
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-buyer-reconciliation.test.js +226 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-buyer-reconciliation.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-claim-reconciliation.test.js +127 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-claim-reconciliation.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-kits.test.js +103 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-kits.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-order-billing-info.test.js +582 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-order-billing-info.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-orders.test.js +10 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-orders.test.js.map +2 -2
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-packs.test.js +36 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-packs.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-payments.test.js +137 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-payments.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-group-ads.test.js +105 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-group-ads.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-groups.test.js +143 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-ad-groups.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-campaigns.test.js +100 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads-campaigns.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads.test.js +350 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-product-ads.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-return-reconciliation.test.js +228 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-return-reconciliation.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-shipping.test.js +58 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-shipping.test.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-api.js +15 -3
- package/dist/src/services/mercadolibre/mercadolibre-api.js.map +2 -2
- package/dist/src/services/mercadolibre/mercadolibre-billing.js +110 -3
- package/dist/src/services/mercadolibre/mercadolibre-billing.js.map +2 -2
- package/dist/src/services/mercadolibre/mercadolibre-buyer-reconciliation.js +368 -0
- package/dist/src/services/mercadolibre/mercadolibre-buyer-reconciliation.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-claim-reconciliation.js +399 -0
- package/dist/src/services/mercadolibre/mercadolibre-claim-reconciliation.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-kits.js +55 -0
- package/dist/src/services/mercadolibre/mercadolibre-kits.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-order-billing-info.js +392 -0
- package/dist/src/services/mercadolibre/mercadolibre-order-billing-info.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-orders.js +8 -8
- package/dist/src/services/mercadolibre/mercadolibre-orders.js.map +2 -2
- package/dist/src/services/mercadolibre/mercadolibre-packs.js +21 -0
- package/dist/src/services/mercadolibre/mercadolibre-packs.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-payments.js +60 -0
- package/dist/src/services/mercadolibre/mercadolibre-payments.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-product-ads.js +429 -0
- package/dist/src/services/mercadolibre/mercadolibre-product-ads.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-return-reconciliation.js +436 -0
- package/dist/src/services/mercadolibre/mercadolibre-return-reconciliation.js.map +7 -0
- package/dist/src/services/mercadolibre/mercadolibre-shipping.js +35 -0
- package/dist/src/services/mercadolibre/mercadolibre-shipping.js.map +7 -0
- package/dist/src/services/vtex/__tests__/vtex-api.test.js +67 -0
- package/dist/src/services/vtex/__tests__/vtex-api.test.js.map +7 -0
- package/dist/src/services/vtex/vtex-api.js +6 -0
- package/dist/src/services/vtex/vtex-api.js.map +2 -2
- package/dist/src/tools/config/__tests__/list-profiles.test.js +154 -0
- package/dist/src/tools/config/__tests__/list-profiles.test.js.map +7 -0
- package/dist/src/tools/config/list-profiles.js +39 -3
- package/dist/src/tools/config/list-profiles.js.map +2 -2
- package/dist/src/tools/mercadolibre/__tests__/get-order-billing-info.test.js +339 -0
- package/dist/src/tools/mercadolibre/__tests__/get-order-billing-info.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-group-ads.test.js +225 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-group-ads.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-groups.test.js +148 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-ad-groups.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-campaigns.test.js +60 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-campaigns.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-helpers.test.js +128 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-helpers.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-tools.test.js +435 -0
- package/dist/src/tools/mercadolibre/__tests__/product-ads-tools.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/reconcile-buyer-data.test.js +31 -0
- package/dist/src/tools/mercadolibre/__tests__/reconcile-buyer-data.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/reconcile-claim-data.test.js +36 -0
- package/dist/src/tools/mercadolibre/__tests__/reconcile-claim-data.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/validate-connection.test.js +205 -0
- package/dist/src/tools/mercadolibre/__tests__/validate-connection.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-billing-provisions-by-order.js +313 -0
- package/dist/src/tools/mercadolibre/get-billing-provisions-by-order.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-bundle-context-by-item.js +176 -0
- package/dist/src/tools/mercadolibre/get-bundle-context-by-item.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-full-storage-charges.js +183 -0
- package/dist/src/tools/mercadolibre/get-full-storage-charges.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-order-billing-info.js +189 -0
- package/dist/src/tools/mercadolibre/get-order-billing-info.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-pack-context-by-order.js +150 -0
- package/dist/src/tools/mercadolibre/get-pack-context-by-order.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-payment-details.js +322 -0
- package/dist/src/tools/mercadolibre/get-payment-details.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-product-ads-ad-group-ads.js +144 -0
- package/dist/src/tools/mercadolibre/get-product-ads-ad-group-ads.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-product-ads-advertisers.js +59 -0
- package/dist/src/tools/mercadolibre/get-product-ads-advertisers.js.map +7 -0
- package/dist/src/tools/mercadolibre/get-shipping-quote-by-declared-dimensions.js +104 -0
- package/dist/src/tools/mercadolibre/get-shipping-quote-by-declared-dimensions.js.map +7 -0
- package/dist/src/tools/mercadolibre/index.js +32 -0
- package/dist/src/tools/mercadolibre/index.js.map +2 -2
- package/dist/src/tools/mercadolibre/product-ads-helpers.js +130 -0
- package/dist/src/tools/mercadolibre/product-ads-helpers.js.map +7 -0
- package/dist/src/tools/mercadolibre/reconcile-buyer-data.js +27 -0
- package/dist/src/tools/mercadolibre/reconcile-buyer-data.js.map +7 -0
- package/dist/src/tools/mercadolibre/reconcile-claim-data.js +46 -0
- package/dist/src/tools/mercadolibre/reconcile-claim-data.js.map +7 -0
- package/dist/src/tools/mercadolibre/reconcile-return-data.js +25 -0
- package/dist/src/tools/mercadolibre/reconcile-return-data.js.map +7 -0
- package/dist/src/tools/mercadolibre/search-product-ads-ad-groups.js +162 -0
- package/dist/src/tools/mercadolibre/search-product-ads-ad-groups.js.map +7 -0
- package/dist/src/tools/mercadolibre/search-product-ads-ads.js +216 -0
- package/dist/src/tools/mercadolibre/search-product-ads-ads.js.map +7 -0
- package/dist/src/tools/mercadolibre/search-product-ads-campaigns.js +116 -0
- package/dist/src/tools/mercadolibre/search-product-ads-campaigns.js.map +7 -0
- package/dist/src/tools/mercadolibre/validate-connection.js +40 -12
- package/dist/src/tools/mercadolibre/validate-connection.js.map +2 -2
- package/dist/tests/meli/mercadolibre-billing-provisions.test.js +378 -0
- package/dist/tests/meli/mercadolibre-billing-provisions.test.js.map +2 -2
- package/dist/tests/meli/mercadolibre-order-billing-info-surface.test.js +123 -0
- package/dist/tests/meli/mercadolibre-order-billing-info-surface.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-payment-details.test.js +356 -0
- package/dist/tests/meli/mercadolibre-payment-details.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-payments.test.js +62 -0
- package/dist/tests/meli/mercadolibre-payments.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-product-ads-ad-groups-surface.test.js +90 -0
- package/dist/tests/meli/mercadolibre-product-ads-ad-groups-surface.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-product-ads-campaigns-surface.test.js +72 -0
- package/dist/tests/meli/mercadolibre-product-ads-campaigns-surface.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-pack-kit-shipping.test.js +400 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-pack-kit-shipping.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-small.test.js +31 -12
- package/dist/tests/meli/mercadolibre-tool-handlers-small.test.js.map +2 -2
- package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js +1 -1
- package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/src/google-ads/report-utils.js +0 -78
- package/dist/src/google-ads/report-utils.js.map +0 -7
- package/dist/src/search-console/search-console-utils.js +0 -275
- package/dist/src/search-console/search-console-utils.js.map +0 -7
- package/dist/src/services/vtex/__tests__/vtex-catalog-write-batch.test.js +0 -165
- package/dist/src/services/vtex/__tests__/vtex-catalog-write-batch.test.js.map +0 -7
- package/dist/src/tools/vtex/__tests__/catalog-admin-batch.test.js +0 -233
- package/dist/src/tools/vtex/__tests__/catalog-admin-batch.test.js.map +0 -7
- package/dist/src/tools/vtex/catalog-admin-batch.js +0 -298
- package/dist/src/tools/vtex/catalog-admin-batch.js.map +0 -7
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
describe("MercadoLibre Product Ads campaigns MCP surface", () => {
|
|
3
|
+
it("registers the actual index tool and rejects invalid calendar dates through MCP tools/call", async () => {
|
|
4
|
+
const previousNodeEnv = process.env.NODE_ENV;
|
|
5
|
+
const previousTelemetry = process.env.MCP_USE_ANONYMIZED_TELEMETRY;
|
|
6
|
+
const previousGoogleOAuthClientId = process.env.GOOGLE_OAUTH_CLIENT_ID;
|
|
7
|
+
const previousGoogleOAuthClientSecret = process.env.GOOGLE_OAUTH_CLIENT_SECRET;
|
|
8
|
+
process.env.NODE_ENV = "test";
|
|
9
|
+
process.env.MCP_USE_ANONYMIZED_TELEMETRY = "false";
|
|
10
|
+
process.env.GOOGLE_OAUTH_CLIENT_ID = "safe-test-google-client-id";
|
|
11
|
+
process.env.GOOGLE_OAUTH_CLIENT_SECRET = "safe-test-google-client-secret";
|
|
12
|
+
try {
|
|
13
|
+
const [{ MCPClient }, { server }] = await Promise.all([
|
|
14
|
+
import("mcp-use"),
|
|
15
|
+
import("../../index.js")
|
|
16
|
+
]);
|
|
17
|
+
const handler = await server.getHandler();
|
|
18
|
+
const client = new MCPClient({
|
|
19
|
+
mcpServers: {
|
|
20
|
+
local: {
|
|
21
|
+
url: "http://localhost:3000/mcp",
|
|
22
|
+
transport: "http",
|
|
23
|
+
fetch: (input, init) => handler(input instanceof Request ? init === void 0 ? input : new Request(input, init) : new Request(input, init))
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
try {
|
|
28
|
+
const session = await client.createSession("local");
|
|
29
|
+
const tools = await session.listTools();
|
|
30
|
+
const tool = tools.find((candidate) => candidate.name === "meli_search_product_ads_campaigns");
|
|
31
|
+
expect(tool).toEqual(
|
|
32
|
+
expect.objectContaining({
|
|
33
|
+
name: "meli_search_product_ads_campaigns",
|
|
34
|
+
inputSchema: expect.objectContaining({
|
|
35
|
+
properties: expect.objectContaining({
|
|
36
|
+
profileId: expect.any(Object),
|
|
37
|
+
siteId: expect.any(Object),
|
|
38
|
+
advertiserId: expect.any(Object),
|
|
39
|
+
dateFrom: expect.any(Object),
|
|
40
|
+
dateTo: expect.any(Object),
|
|
41
|
+
mode: expect.any(Object),
|
|
42
|
+
limit: expect.any(Object),
|
|
43
|
+
offset: expect.any(Object)
|
|
44
|
+
})
|
|
45
|
+
})
|
|
46
|
+
})
|
|
47
|
+
);
|
|
48
|
+
const result = await session.callTool("meli_search_product_ads_campaigns", {
|
|
49
|
+
profileId: "safe-test-profile",
|
|
50
|
+
siteId: "MLA",
|
|
51
|
+
advertiserId: "safe-test-advertiser",
|
|
52
|
+
dateFrom: "2026-02-30",
|
|
53
|
+
dateTo: "2026-03-01"
|
|
54
|
+
});
|
|
55
|
+
expect(result.isError).toBe(true);
|
|
56
|
+
expect(JSON.stringify(result.content)).toContain("valid calendar date");
|
|
57
|
+
} finally {
|
|
58
|
+
await client.closeAllSessions();
|
|
59
|
+
}
|
|
60
|
+
} finally {
|
|
61
|
+
if (previousNodeEnv === void 0) delete process.env.NODE_ENV;
|
|
62
|
+
else process.env.NODE_ENV = previousNodeEnv;
|
|
63
|
+
if (previousTelemetry === void 0) delete process.env.MCP_USE_ANONYMIZED_TELEMETRY;
|
|
64
|
+
else process.env.MCP_USE_ANONYMIZED_TELEMETRY = previousTelemetry;
|
|
65
|
+
if (previousGoogleOAuthClientId === void 0) delete process.env.GOOGLE_OAUTH_CLIENT_ID;
|
|
66
|
+
else process.env.GOOGLE_OAUTH_CLIENT_ID = previousGoogleOAuthClientId;
|
|
67
|
+
if (previousGoogleOAuthClientSecret === void 0) delete process.env.GOOGLE_OAUTH_CLIENT_SECRET;
|
|
68
|
+
else process.env.GOOGLE_OAUTH_CLIENT_SECRET = previousGoogleOAuthClientSecret;
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=mercadolibre-product-ads-campaigns-surface.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../tests/meli/mercadolibre-product-ads-campaigns-surface.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { describe, expect, it } from \"vitest\";\n\ndescribe(\"MercadoLibre Product Ads campaigns MCP surface\", () => {\n it(\"registers the actual index tool and rejects invalid calendar dates through MCP tools/call\", async () => {\n const previousNodeEnv = process.env.NODE_ENV;\n const previousTelemetry = process.env.MCP_USE_ANONYMIZED_TELEMETRY;\n const previousGoogleOAuthClientId = process.env.GOOGLE_OAUTH_CLIENT_ID;\n const previousGoogleOAuthClientSecret = process.env.GOOGLE_OAUTH_CLIENT_SECRET;\n\n process.env.NODE_ENV = \"test\";\n process.env.MCP_USE_ANONYMIZED_TELEMETRY = \"false\";\n process.env.GOOGLE_OAUTH_CLIENT_ID = \"safe-test-google-client-id\";\n process.env.GOOGLE_OAUTH_CLIENT_SECRET = \"safe-test-google-client-secret\";\n\n try {\n const [{ MCPClient }, { server }] = await Promise.all([\n import(\"mcp-use\"),\n import(\"../../index.js\"),\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 handler(input instanceof Request ? (init === undefined ? input : new Request(input, init)) : new Request(input, init)),\n },\n },\n });\n\n try {\n const session = await client.createSession(\"local\");\n const tools = await session.listTools();\n const tool = tools.find((candidate) => candidate.name === \"meli_search_product_ads_campaigns\");\n\n expect(tool).toEqual(\n expect.objectContaining({\n name: \"meli_search_product_ads_campaigns\",\n inputSchema: expect.objectContaining({\n properties: expect.objectContaining({\n profileId: expect.any(Object),\n siteId: expect.any(Object),\n advertiserId: expect.any(Object),\n dateFrom: expect.any(Object),\n dateTo: expect.any(Object),\n mode: expect.any(Object),\n limit: expect.any(Object),\n offset: expect.any(Object),\n }),\n }),\n })\n );\n\n const result = await session.callTool(\"meli_search_product_ads_campaigns\", {\n profileId: \"safe-test-profile\",\n siteId: \"MLA\",\n advertiserId: \"safe-test-advertiser\",\n dateFrom: \"2026-02-30\",\n dateTo: \"2026-03-01\",\n });\n\n expect(result.isError).toBe(true);\n expect(JSON.stringify(result.content)).toContain(\"valid calendar date\");\n } finally {\n await client.closeAllSessions();\n }\n } finally {\n if (previousNodeEnv === undefined) delete process.env.NODE_ENV;\n else process.env.NODE_ENV = previousNodeEnv;\n\n if (previousTelemetry === undefined) delete process.env.MCP_USE_ANONYMIZED_TELEMETRY;\n else process.env.MCP_USE_ANONYMIZED_TELEMETRY = previousTelemetry;\n\n if (previousGoogleOAuthClientId === undefined) delete process.env.GOOGLE_OAUTH_CLIENT_ID;\n else process.env.GOOGLE_OAUTH_CLIENT_ID = previousGoogleOAuthClientId;\n\n if (previousGoogleOAuthClientSecret === undefined) delete process.env.GOOGLE_OAUTH_CLIENT_SECRET;\n else process.env.GOOGLE_OAUTH_CLIENT_SECRET = previousGoogleOAuthClientSecret;\n }\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,UAAU,QAAQ,UAAU;AAErC,SAAS,kDAAkD,MAAM;AAC/D,KAAG,6FAA6F,YAAY;AAC1G,UAAM,kBAAkB,QAAQ,IAAI;AACpC,UAAM,oBAAoB,QAAQ,IAAI;AACtC,UAAM,8BAA8B,QAAQ,IAAI;AAChD,UAAM,kCAAkC,QAAQ,IAAI;AAEpD,YAAQ,IAAI,WAAW;AACvB,YAAQ,IAAI,+BAA+B;AAC3C,YAAQ,IAAI,yBAAyB;AACrC,YAAQ,IAAI,6BAA6B;AAEzC,QAAI;AACF,YAAM,CAAC,EAAE,UAAU,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,QAAQ,IAAI;AAAA,QACpD,OAAO,SAAS;AAAA,QAChB,OAAO,gBAAgB;AAAA,MACzB,CAAC;AACD,YAAM,UAAU,MAAM,OAAO,WAAW;AACxC,YAAM,SAAS,IAAI,UAAU;AAAA,QAC3B,YAAY;AAAA,UACV,OAAO;AAAA,YACL,KAAK;AAAA,YACL,WAAW;AAAA,YACX,OAAO,CAAC,OAA+B,SACrC,QAAQ,iBAAiB,UAAW,SAAS,SAAY,QAAQ,IAAI,QAAQ,OAAO,IAAI,IAAK,IAAI,QAAQ,OAAO,IAAI,CAAC;AAAA,UACzH;AAAA,QACF;AAAA,MACF,CAAC;AAED,UAAI;AACF,cAAM,UAAU,MAAM,OAAO,cAAc,OAAO;AAClD,cAAM,QAAQ,MAAM,QAAQ,UAAU;AACtC,cAAM,OAAO,MAAM,KAAK,CAAC,cAAc,UAAU,SAAS,mCAAmC;AAE7F,eAAO,IAAI,EAAE;AAAA,UACX,OAAO,iBAAiB;AAAA,YACtB,MAAM;AAAA,YACN,aAAa,OAAO,iBAAiB;AAAA,cACnC,YAAY,OAAO,iBAAiB;AAAA,gBAClC,WAAW,OAAO,IAAI,MAAM;AAAA,gBAC5B,QAAQ,OAAO,IAAI,MAAM;AAAA,gBACzB,cAAc,OAAO,IAAI,MAAM;AAAA,gBAC/B,UAAU,OAAO,IAAI,MAAM;AAAA,gBAC3B,QAAQ,OAAO,IAAI,MAAM;AAAA,gBACzB,MAAM,OAAO,IAAI,MAAM;AAAA,gBACvB,OAAO,OAAO,IAAI,MAAM;AAAA,gBACxB,QAAQ,OAAO,IAAI,MAAM;AAAA,cAC3B,CAAC;AAAA,YACH,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAEA,cAAM,SAAS,MAAM,QAAQ,SAAS,qCAAqC;AAAA,UACzE,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,QAAQ;AAAA,QACV,CAAC;AAED,eAAO,OAAO,OAAO,EAAE,KAAK,IAAI;AAChC,eAAO,KAAK,UAAU,OAAO,OAAO,CAAC,EAAE,UAAU,qBAAqB;AAAA,MACxE,UAAE;AACA,cAAM,OAAO,iBAAiB;AAAA,MAChC;AAAA,IACF,UAAE;AACA,UAAI,oBAAoB,OAAW,QAAO,QAAQ,IAAI;AAAA,UACjD,SAAQ,IAAI,WAAW;AAE5B,UAAI,sBAAsB,OAAW,QAAO,QAAQ,IAAI;AAAA,UACnD,SAAQ,IAAI,+BAA+B;AAEhD,UAAI,gCAAgC,OAAW,QAAO,QAAQ,IAAI;AAAA,UAC7D,SAAQ,IAAI,yBAAyB;AAE1C,UAAI,oCAAoC,OAAW,QAAO,QAAQ,IAAI;AAAA,UACjE,SAAQ,IAAI,6BAA6B;AAAA,IAChD;AAAA,EACF,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { meliGetBundleContextByItemHandler } from "../../src/tools/mercadolibre/get-bundle-context-by-item.js";
|
|
3
|
+
import { meliGetPackContextByOrderHandler } from "../../src/tools/mercadolibre/get-pack-context-by-order.js";
|
|
4
|
+
import {
|
|
5
|
+
meliGetShippingQuoteByDeclaredDimensionsHandler
|
|
6
|
+
} from "../../src/tools/mercadolibre/get-shipping-quote-by-declared-dimensions.js";
|
|
7
|
+
import { resolveMercadoLibreProfileOrSelection } from "../../src/tools/mercadolibre/profile-resolution.js";
|
|
8
|
+
import {
|
|
9
|
+
getMercadoLibreOrderDetailsBatch
|
|
10
|
+
} from "../../src/services/mercadolibre/mercadolibre-orders.js";
|
|
11
|
+
import { getMercadoLibrePackBatch } from "../../src/services/mercadolibre/mercadolibre-packs.js";
|
|
12
|
+
import {
|
|
13
|
+
getMercadoLibreDeclaredDimensionsShippingQuote
|
|
14
|
+
} from "../../src/services/mercadolibre/mercadolibre-shipping.js";
|
|
15
|
+
import {
|
|
16
|
+
getMercadoLibreUserProductBundlesBatch,
|
|
17
|
+
getMercadoLibreUserProductsBatch,
|
|
18
|
+
resolveMercadoLibreUserProductsFromItems
|
|
19
|
+
} from "../../src/services/mercadolibre/mercadolibre-kits.js";
|
|
20
|
+
import { getMercadoLibreItem } from "../../src/services/mercadolibre/mercadolibre-items.js";
|
|
21
|
+
vi.mock("mcp-use/server", () => ({
|
|
22
|
+
object: vi.fn((payload) => ({ kind: "object", payload })),
|
|
23
|
+
error: vi.fn((message) => ({ kind: "error", message }))
|
|
24
|
+
}));
|
|
25
|
+
vi.mock("../../src/tools/mercadolibre/profile-resolution.js", () => ({
|
|
26
|
+
resolveMercadoLibreProfileOrSelection: vi.fn()
|
|
27
|
+
}));
|
|
28
|
+
vi.mock("../../src/services/mercadolibre/mercadolibre-orders.js", () => ({
|
|
29
|
+
getMercadoLibreOrderDetailsBatch: vi.fn()
|
|
30
|
+
}));
|
|
31
|
+
vi.mock("../../src/services/mercadolibre/mercadolibre-packs.js", () => ({
|
|
32
|
+
getMercadoLibrePackBatch: vi.fn()
|
|
33
|
+
}));
|
|
34
|
+
vi.mock("../../src/services/mercadolibre/mercadolibre-kits.js", () => ({
|
|
35
|
+
resolveMercadoLibreUserProductsFromItems: vi.fn(),
|
|
36
|
+
getMercadoLibreUserProductsBatch: vi.fn(),
|
|
37
|
+
getMercadoLibreUserProductBundlesBatch: vi.fn()
|
|
38
|
+
}));
|
|
39
|
+
vi.mock("../../src/services/mercadolibre/mercadolibre-items.js", () => ({
|
|
40
|
+
getMercadoLibreItem: vi.fn()
|
|
41
|
+
}));
|
|
42
|
+
vi.mock("../../src/services/mercadolibre/mercadolibre-shipping.js", () => ({
|
|
43
|
+
getMercadoLibreDeclaredDimensionsShippingQuote: vi.fn()
|
|
44
|
+
}));
|
|
45
|
+
describe("MercadoLibre pack/kit/shipping handlers", () => {
|
|
46
|
+
beforeEach(() => {
|
|
47
|
+
vi.clearAllMocks();
|
|
48
|
+
vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({
|
|
49
|
+
ok: true,
|
|
50
|
+
value: { profileId: "meli-profile-1" }
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
it("reconstructs pack context by order and flags multi-order packs", async () => {
|
|
54
|
+
vi.mocked(getMercadoLibreOrderDetailsBatch).mockResolvedValue({
|
|
55
|
+
successful: [
|
|
56
|
+
{
|
|
57
|
+
id: "ORD-1",
|
|
58
|
+
document: {
|
|
59
|
+
id: "ORD-1",
|
|
60
|
+
pack_id: "PACK-1",
|
|
61
|
+
status: "paid",
|
|
62
|
+
status_detail: null,
|
|
63
|
+
buyer: { id: 111 },
|
|
64
|
+
date_created: "2026-06-01T10:00:00Z",
|
|
65
|
+
last_updated: "2026-06-01T10:01:00Z"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
id: "ORD-2",
|
|
70
|
+
document: {
|
|
71
|
+
id: "ORD-2",
|
|
72
|
+
pack_id: "PACK-1",
|
|
73
|
+
status: "paid",
|
|
74
|
+
status_detail: null,
|
|
75
|
+
buyer: { id: 111 },
|
|
76
|
+
date_created: "2026-06-01T10:00:00Z",
|
|
77
|
+
last_updated: "2026-06-01T10:01:00Z"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
],
|
|
81
|
+
failed: []
|
|
82
|
+
});
|
|
83
|
+
vi.mocked(getMercadoLibrePackBatch).mockResolvedValue({
|
|
84
|
+
successful: [
|
|
85
|
+
{
|
|
86
|
+
id: "PACK-1",
|
|
87
|
+
document: {
|
|
88
|
+
id: "PACK-1",
|
|
89
|
+
status: "released",
|
|
90
|
+
shipment: { id: 222 },
|
|
91
|
+
buyer: { id: 111 },
|
|
92
|
+
date_created: "2026-06-01T10:00:00Z",
|
|
93
|
+
last_updated: "2026-06-01T10:02:00Z",
|
|
94
|
+
orders: [{ id: "ORD-1" }, { id: "ORD-2" }]
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
],
|
|
98
|
+
failed: []
|
|
99
|
+
});
|
|
100
|
+
const result = await meliGetPackContextByOrderHandler({
|
|
101
|
+
profileId: "meli-profile-1",
|
|
102
|
+
orderIds: ["ORD-1", "ORD-2", "ORD-2"]
|
|
103
|
+
});
|
|
104
|
+
expect(getMercadoLibreOrderDetailsBatch).toHaveBeenCalledWith("meli-profile-1", ["ORD-1", "ORD-2"], {
|
|
105
|
+
maxConcurrency: 10,
|
|
106
|
+
maxRetries: 2
|
|
107
|
+
});
|
|
108
|
+
expect(getMercadoLibrePackBatch).toHaveBeenCalledWith("meli-profile-1", ["PACK-1"], {
|
|
109
|
+
maxConcurrency: 10,
|
|
110
|
+
maxRetries: 2
|
|
111
|
+
});
|
|
112
|
+
expect(result).toEqual({
|
|
113
|
+
kind: "object",
|
|
114
|
+
payload: {
|
|
115
|
+
profile_id: "meli-profile-1",
|
|
116
|
+
metadata: {
|
|
117
|
+
requested: 2,
|
|
118
|
+
successful: 2,
|
|
119
|
+
failed: 0,
|
|
120
|
+
multi_order_packs: 2,
|
|
121
|
+
single_order_packs: 0,
|
|
122
|
+
packless_orders: 0,
|
|
123
|
+
has_failures: false
|
|
124
|
+
},
|
|
125
|
+
pack_contexts_schema: [
|
|
126
|
+
"order_id",
|
|
127
|
+
"requested_pack_id",
|
|
128
|
+
"resolved_pack_id",
|
|
129
|
+
"pack_status",
|
|
130
|
+
"shipment_id",
|
|
131
|
+
"orders_in_pack_count",
|
|
132
|
+
"is_multi_order_pack",
|
|
133
|
+
"buyer_id",
|
|
134
|
+
"pack_created_at",
|
|
135
|
+
"pack_last_updated",
|
|
136
|
+
"order_status",
|
|
137
|
+
"order_status_detail",
|
|
138
|
+
"pack_order_ids"
|
|
139
|
+
],
|
|
140
|
+
pack_contexts: [
|
|
141
|
+
["ORD-1", "PACK-1", "PACK-1", "released", "222", 2, true, "111", "2026-06-01T10:00:00Z", "2026-06-01T10:02:00Z", "paid", "", "ORD-1 | ORD-2"],
|
|
142
|
+
["ORD-2", "PACK-1", "PACK-1", "released", "222", 2, true, "111", "2026-06-01T10:00:00Z", "2026-06-01T10:02:00Z", "paid", "", "ORD-1 | ORD-2"]
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
it("keeps numeric pack ids attached to multi-order packs", async () => {
|
|
148
|
+
vi.mocked(getMercadoLibreOrderDetailsBatch).mockResolvedValue({
|
|
149
|
+
successful: [
|
|
150
|
+
{
|
|
151
|
+
id: "ORD-10",
|
|
152
|
+
document: {
|
|
153
|
+
id: "ORD-10",
|
|
154
|
+
pack_id: 987654,
|
|
155
|
+
status: "paid",
|
|
156
|
+
status_detail: null,
|
|
157
|
+
buyer: { id: 222 },
|
|
158
|
+
date_created: "2026-06-02T10:00:00Z",
|
|
159
|
+
last_updated: "2026-06-02T10:01:00Z"
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
id: "ORD-11",
|
|
164
|
+
document: {
|
|
165
|
+
id: "ORD-11",
|
|
166
|
+
pack_id: 987654,
|
|
167
|
+
status: "paid",
|
|
168
|
+
status_detail: null,
|
|
169
|
+
buyer: { id: 222 },
|
|
170
|
+
date_created: "2026-06-02T10:00:00Z",
|
|
171
|
+
last_updated: "2026-06-02T10:01:00Z"
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
],
|
|
175
|
+
failed: []
|
|
176
|
+
});
|
|
177
|
+
vi.mocked(getMercadoLibrePackBatch).mockResolvedValue({
|
|
178
|
+
successful: [
|
|
179
|
+
{
|
|
180
|
+
id: "987654",
|
|
181
|
+
document: {
|
|
182
|
+
id: "987654",
|
|
183
|
+
status: "packed",
|
|
184
|
+
shipment: { id: 333 },
|
|
185
|
+
buyer: { id: 222 },
|
|
186
|
+
date_created: "2026-06-02T10:00:00Z",
|
|
187
|
+
last_updated: "2026-06-02T10:02:00Z",
|
|
188
|
+
orders: [{ id: "ORD-10" }, { id: "ORD-11" }]
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
],
|
|
192
|
+
failed: []
|
|
193
|
+
});
|
|
194
|
+
const result = await meliGetPackContextByOrderHandler({
|
|
195
|
+
profileId: "meli-profile-1",
|
|
196
|
+
orderIds: ["ORD-10", "ORD-11"]
|
|
197
|
+
});
|
|
198
|
+
expect(getMercadoLibrePackBatch).toHaveBeenCalledWith("meli-profile-1", ["987654"], {
|
|
199
|
+
maxConcurrency: 10,
|
|
200
|
+
maxRetries: 2
|
|
201
|
+
});
|
|
202
|
+
expect(result).toEqual({
|
|
203
|
+
kind: "object",
|
|
204
|
+
payload: {
|
|
205
|
+
profile_id: "meli-profile-1",
|
|
206
|
+
metadata: {
|
|
207
|
+
requested: 2,
|
|
208
|
+
successful: 2,
|
|
209
|
+
failed: 0,
|
|
210
|
+
multi_order_packs: 2,
|
|
211
|
+
single_order_packs: 0,
|
|
212
|
+
packless_orders: 0,
|
|
213
|
+
has_failures: false
|
|
214
|
+
},
|
|
215
|
+
pack_contexts_schema: [
|
|
216
|
+
"order_id",
|
|
217
|
+
"requested_pack_id",
|
|
218
|
+
"resolved_pack_id",
|
|
219
|
+
"pack_status",
|
|
220
|
+
"shipment_id",
|
|
221
|
+
"orders_in_pack_count",
|
|
222
|
+
"is_multi_order_pack",
|
|
223
|
+
"buyer_id",
|
|
224
|
+
"pack_created_at",
|
|
225
|
+
"pack_last_updated",
|
|
226
|
+
"order_status",
|
|
227
|
+
"order_status_detail",
|
|
228
|
+
"pack_order_ids"
|
|
229
|
+
],
|
|
230
|
+
pack_contexts: [
|
|
231
|
+
["ORD-10", "987654", "987654", "packed", "333", 2, true, "222", "2026-06-02T10:00:00Z", "2026-06-02T10:02:00Z", "paid", "", "ORD-10 | ORD-11"],
|
|
232
|
+
["ORD-11", "987654", "987654", "packed", "333", 2, true, "222", "2026-06-02T10:00:00Z", "2026-06-02T10:02:00Z", "paid", "", "ORD-10 | ORD-11"]
|
|
233
|
+
]
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
it("resolves bundle context from items and user products", async () => {
|
|
238
|
+
vi.mocked(resolveMercadoLibreUserProductsFromItems).mockResolvedValue([
|
|
239
|
+
{ itemId: "MLA1", userProductId: "MLAU1", title: "Kit" },
|
|
240
|
+
{ itemId: "MLA2", userProductId: "MLAU2", title: "Component" }
|
|
241
|
+
]);
|
|
242
|
+
vi.mocked(getMercadoLibreUserProductsBatch).mockResolvedValue({
|
|
243
|
+
successful: [
|
|
244
|
+
{
|
|
245
|
+
id: "MLAU1",
|
|
246
|
+
document: {
|
|
247
|
+
id: "MLAU1",
|
|
248
|
+
name: "Kit",
|
|
249
|
+
domain_id: "MLA-DOM",
|
|
250
|
+
last_updated: "2026-06-01T10:00:00Z",
|
|
251
|
+
tags: ["bundle"],
|
|
252
|
+
bundle: {
|
|
253
|
+
type: "kit",
|
|
254
|
+
components: [{ type: "user_product", user_product_id: "MLAU2", quantity: 1 }]
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
id: "MLAU2",
|
|
260
|
+
document: {
|
|
261
|
+
id: "MLAU2",
|
|
262
|
+
name: "Component",
|
|
263
|
+
domain_id: "MLA-DOM",
|
|
264
|
+
last_updated: "2026-06-01T10:00:00Z",
|
|
265
|
+
tags: ["kit_component"]
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
],
|
|
269
|
+
failed: []
|
|
270
|
+
});
|
|
271
|
+
vi.mocked(getMercadoLibreUserProductBundlesBatch).mockResolvedValue({
|
|
272
|
+
successful: [
|
|
273
|
+
{
|
|
274
|
+
id: "MLAU1",
|
|
275
|
+
document: { user_product_id: "MLAU1", bundles: [] }
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
id: "MLAU2",
|
|
279
|
+
document: { user_product_id: "MLAU2", bundles: ["MLAU1"] }
|
|
280
|
+
}
|
|
281
|
+
],
|
|
282
|
+
failed: []
|
|
283
|
+
});
|
|
284
|
+
const result = await meliGetBundleContextByItemHandler({
|
|
285
|
+
profileId: "meli-profile-1",
|
|
286
|
+
itemIds: ["MLA1", "MLA2"]
|
|
287
|
+
});
|
|
288
|
+
expect(resolveMercadoLibreUserProductsFromItems).toHaveBeenCalledWith("meli-profile-1", ["MLA1", "MLA2"]);
|
|
289
|
+
expect(getMercadoLibreUserProductsBatch).toHaveBeenCalledWith("meli-profile-1", ["MLAU1", "MLAU2"], {
|
|
290
|
+
maxConcurrency: 10,
|
|
291
|
+
maxRetries: 2
|
|
292
|
+
});
|
|
293
|
+
expect(getMercadoLibreUserProductBundlesBatch).toHaveBeenCalledWith("meli-profile-1", ["MLAU1", "MLAU2"], {
|
|
294
|
+
maxConcurrency: 10,
|
|
295
|
+
maxRetries: 2
|
|
296
|
+
});
|
|
297
|
+
expect(result).toEqual({
|
|
298
|
+
kind: "object",
|
|
299
|
+
payload: {
|
|
300
|
+
profile_id: "meli-profile-1",
|
|
301
|
+
metadata: {
|
|
302
|
+
requested_items: 2,
|
|
303
|
+
requested_user_products: 0,
|
|
304
|
+
resolved_user_products: 2,
|
|
305
|
+
kits_found: 1,
|
|
306
|
+
components_found: 1,
|
|
307
|
+
failed: 0,
|
|
308
|
+
has_failures: false
|
|
309
|
+
},
|
|
310
|
+
bundle_contexts_schema: [
|
|
311
|
+
"user_product_id",
|
|
312
|
+
"name",
|
|
313
|
+
"domain_id",
|
|
314
|
+
"input_refs",
|
|
315
|
+
"is_kit",
|
|
316
|
+
"bundle_type",
|
|
317
|
+
"kit_component_count",
|
|
318
|
+
"kit_components",
|
|
319
|
+
"bundle_membership_count",
|
|
320
|
+
"bundle_ids",
|
|
321
|
+
"last_updated"
|
|
322
|
+
],
|
|
323
|
+
bundle_contexts: [
|
|
324
|
+
["MLAU1", "Kit", "MLA-DOM", "item:MLA1", true, "kit", 1, "MLAU2 x1", 0, "", "2026-06-01T10:00:00Z"],
|
|
325
|
+
["MLAU2", "Component", "MLA-DOM", "item:MLA2", false, "", 0, "", 1, "MLAU1", "2026-06-01T10:00:00Z"]
|
|
326
|
+
]
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
it("hydrates shipping quotes from a real item snapshot when itemId is provided", async () => {
|
|
331
|
+
vi.mocked(getMercadoLibreItem).mockResolvedValue({
|
|
332
|
+
id: "MLA1",
|
|
333
|
+
price: 5e3,
|
|
334
|
+
listing_type_id: "gold_special",
|
|
335
|
+
category_id: "MLA123",
|
|
336
|
+
currency_id: "ARS",
|
|
337
|
+
condition: "new",
|
|
338
|
+
shipping: {
|
|
339
|
+
mode: "me2",
|
|
340
|
+
logistic_type: "drop_off",
|
|
341
|
+
free_shipping: true
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
vi.mocked(getMercadoLibreDeclaredDimensionsShippingQuote).mockResolvedValue({
|
|
345
|
+
coverage: { all_country: { list_cost: 8106.49, currency_id: "ARS", billable_weight: 462 } },
|
|
346
|
+
custom_message: { display_mode: null, reason: "" }
|
|
347
|
+
});
|
|
348
|
+
const result = await meliGetShippingQuoteByDeclaredDimensionsHandler({
|
|
349
|
+
profileId: "meli-profile-1",
|
|
350
|
+
itemId: "MLA1",
|
|
351
|
+
heightCm: 9,
|
|
352
|
+
widthCm: 17,
|
|
353
|
+
lengthCm: 22,
|
|
354
|
+
weightGrams: 462,
|
|
355
|
+
verbose: true
|
|
356
|
+
});
|
|
357
|
+
expect(getMercadoLibreItem).toHaveBeenCalledWith("meli-profile-1", "MLA1");
|
|
358
|
+
expect(getMercadoLibreDeclaredDimensionsShippingQuote).toHaveBeenCalledWith("meli-profile-1", {
|
|
359
|
+
dimensions: "9x17x22,462",
|
|
360
|
+
verbose: true,
|
|
361
|
+
itemId: "MLA1",
|
|
362
|
+
itemPrice: 5e3,
|
|
363
|
+
listingTypeId: "gold_special",
|
|
364
|
+
mode: "me2",
|
|
365
|
+
condition: "new",
|
|
366
|
+
logisticType: "drop_off",
|
|
367
|
+
freeShipping: true,
|
|
368
|
+
currencyId: "ARS",
|
|
369
|
+
categoryId: "MLA123",
|
|
370
|
+
tags: void 0
|
|
371
|
+
});
|
|
372
|
+
expect(result).toEqual({
|
|
373
|
+
kind: "object",
|
|
374
|
+
payload: {
|
|
375
|
+
profile_id: "meli-profile-1",
|
|
376
|
+
metadata: {
|
|
377
|
+
source: "item_hydrated",
|
|
378
|
+
item_id: "MLA1",
|
|
379
|
+
dimensions: "9x17x22,462",
|
|
380
|
+
height_cm: 9,
|
|
381
|
+
width_cm: 17,
|
|
382
|
+
length_cm: 22,
|
|
383
|
+
weight_grams: 462,
|
|
384
|
+
item_price: 5e3,
|
|
385
|
+
listing_type_id: "gold_special",
|
|
386
|
+
mode: "me2",
|
|
387
|
+
logistic_type: "drop_off",
|
|
388
|
+
free_shipping: true,
|
|
389
|
+
currency_id: "ARS",
|
|
390
|
+
condition: "new",
|
|
391
|
+
category_id: "MLA123",
|
|
392
|
+
verbose: true
|
|
393
|
+
},
|
|
394
|
+
coverage: { all_country: { list_cost: 8106.49, currency_id: "ARS", billable_weight: 462 } },
|
|
395
|
+
custom_message: { reason: "" }
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
});
|
|
399
|
+
});
|
|
400
|
+
//# sourceMappingURL=mercadolibre-tool-handlers-pack-kit-shipping.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../tests/meli/mercadolibre-tool-handlers-pack-kit-shipping.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { meliGetBundleContextByItemHandler } from \"../../src/tools/mercadolibre/get-bundle-context-by-item.js\";\nimport { meliGetPackContextByOrderHandler } from \"../../src/tools/mercadolibre/get-pack-context-by-order.js\";\nimport {\n meliGetShippingQuoteByDeclaredDimensionsHandler,\n meliGetShippingQuoteByDeclaredDimensionsSchema,\n} from \"../../src/tools/mercadolibre/get-shipping-quote-by-declared-dimensions.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"../../src/tools/mercadolibre/profile-resolution.js\";\nimport {\n getMercadoLibreOrderDetailsBatch,\n} from \"../../src/services/mercadolibre/mercadolibre-orders.js\";\nimport { getMercadoLibrePackBatch } from \"../../src/services/mercadolibre/mercadolibre-packs.js\";\nimport {\n getMercadoLibreDeclaredDimensionsShippingQuote,\n} from \"../../src/services/mercadolibre/mercadolibre-shipping.js\";\nimport {\n getMercadoLibreUserProductBundlesBatch,\n getMercadoLibreUserProductsBatch,\n resolveMercadoLibreUserProductsFromItems,\n} from \"../../src/services/mercadolibre/mercadolibre-kits.js\";\nimport { getMercadoLibreItem } from \"../../src/services/mercadolibre/mercadolibre-items.js\";\n\nvi.mock(\"mcp-use/server\", () => ({\n object: vi.fn((payload: unknown) => ({ kind: \"object\", payload })),\n error: vi.fn((message: string) => ({ kind: \"error\", message })),\n}));\n\nvi.mock(\"../../src/tools/mercadolibre/profile-resolution.js\", () => ({\n resolveMercadoLibreProfileOrSelection: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-orders.js\", () => ({\n getMercadoLibreOrderDetailsBatch: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-packs.js\", () => ({\n getMercadoLibrePackBatch: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-kits.js\", () => ({\n resolveMercadoLibreUserProductsFromItems: vi.fn(),\n getMercadoLibreUserProductsBatch: vi.fn(),\n getMercadoLibreUserProductBundlesBatch: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-items.js\", () => ({\n getMercadoLibreItem: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-shipping.js\", () => ({\n getMercadoLibreDeclaredDimensionsShippingQuote: vi.fn(),\n}));\n\ndescribe(\"MercadoLibre pack/kit/shipping handlers\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({\n ok: true,\n value: { profileId: \"meli-profile-1\" },\n });\n });\n\n it(\"reconstructs pack context by order and flags multi-order packs\", async () => {\n vi.mocked(getMercadoLibreOrderDetailsBatch).mockResolvedValue({\n successful: [\n {\n id: \"ORD-1\",\n document: {\n id: \"ORD-1\",\n pack_id: \"PACK-1\",\n status: \"paid\",\n status_detail: null,\n buyer: { id: 111 },\n date_created: \"2026-06-01T10:00:00Z\",\n last_updated: \"2026-06-01T10:01:00Z\",\n },\n },\n {\n id: \"ORD-2\",\n document: {\n id: \"ORD-2\",\n pack_id: \"PACK-1\",\n status: \"paid\",\n status_detail: null,\n buyer: { id: 111 },\n date_created: \"2026-06-01T10:00:00Z\",\n last_updated: \"2026-06-01T10:01:00Z\",\n },\n },\n ],\n failed: [],\n } as never);\n vi.mocked(getMercadoLibrePackBatch).mockResolvedValue({\n successful: [\n {\n id: \"PACK-1\",\n document: {\n id: \"PACK-1\",\n status: \"released\",\n shipment: { id: 222 },\n buyer: { id: 111 },\n date_created: \"2026-06-01T10:00:00Z\",\n last_updated: \"2026-06-01T10:02:00Z\",\n orders: [{ id: \"ORD-1\" }, { id: \"ORD-2\" }],\n },\n },\n ],\n failed: [],\n } as never);\n\n const result = await meliGetPackContextByOrderHandler({\n profileId: \"meli-profile-1\",\n orderIds: [\"ORD-1\", \"ORD-2\", \"ORD-2\"],\n });\n\n expect(getMercadoLibreOrderDetailsBatch).toHaveBeenCalledWith(\"meli-profile-1\", [\"ORD-1\", \"ORD-2\"], {\n maxConcurrency: 10,\n maxRetries: 2,\n });\n expect(getMercadoLibrePackBatch).toHaveBeenCalledWith(\"meli-profile-1\", [\"PACK-1\"], {\n maxConcurrency: 10,\n maxRetries: 2,\n });\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n metadata: {\n requested: 2,\n successful: 2,\n failed: 0,\n multi_order_packs: 2,\n single_order_packs: 0,\n packless_orders: 0,\n has_failures: false,\n },\n pack_contexts_schema: [\n \"order_id\",\n \"requested_pack_id\",\n \"resolved_pack_id\",\n \"pack_status\",\n \"shipment_id\",\n \"orders_in_pack_count\",\n \"is_multi_order_pack\",\n \"buyer_id\",\n \"pack_created_at\",\n \"pack_last_updated\",\n \"order_status\",\n \"order_status_detail\",\n \"pack_order_ids\",\n ],\n pack_contexts: [\n [\"ORD-1\", \"PACK-1\", \"PACK-1\", \"released\", \"222\", 2, true, \"111\", \"2026-06-01T10:00:00Z\", \"2026-06-01T10:02:00Z\", \"paid\", \"\", \"ORD-1 | ORD-2\"],\n [\"ORD-2\", \"PACK-1\", \"PACK-1\", \"released\", \"222\", 2, true, \"111\", \"2026-06-01T10:00:00Z\", \"2026-06-01T10:02:00Z\", \"paid\", \"\", \"ORD-1 | ORD-2\"],\n ],\n },\n });\n });\n\n it(\"keeps numeric pack ids attached to multi-order packs\", async () => {\n vi.mocked(getMercadoLibreOrderDetailsBatch).mockResolvedValue({\n successful: [\n {\n id: \"ORD-10\",\n document: {\n id: \"ORD-10\",\n pack_id: 987654,\n status: \"paid\",\n status_detail: null,\n buyer: { id: 222 },\n date_created: \"2026-06-02T10:00:00Z\",\n last_updated: \"2026-06-02T10:01:00Z\",\n },\n },\n {\n id: \"ORD-11\",\n document: {\n id: \"ORD-11\",\n pack_id: 987654,\n status: \"paid\",\n status_detail: null,\n buyer: { id: 222 },\n date_created: \"2026-06-02T10:00:00Z\",\n last_updated: \"2026-06-02T10:01:00Z\",\n },\n },\n ],\n failed: [],\n } as never);\n vi.mocked(getMercadoLibrePackBatch).mockResolvedValue({\n successful: [\n {\n id: \"987654\",\n document: {\n id: \"987654\",\n status: \"packed\",\n shipment: { id: 333 },\n buyer: { id: 222 },\n date_created: \"2026-06-02T10:00:00Z\",\n last_updated: \"2026-06-02T10:02:00Z\",\n orders: [{ id: \"ORD-10\" }, { id: \"ORD-11\" }],\n },\n },\n ],\n failed: [],\n } as never);\n\n const result = await meliGetPackContextByOrderHandler({\n profileId: \"meli-profile-1\",\n orderIds: [\"ORD-10\", \"ORD-11\"],\n });\n\n expect(getMercadoLibrePackBatch).toHaveBeenCalledWith(\"meli-profile-1\", [\"987654\"], {\n maxConcurrency: 10,\n maxRetries: 2,\n });\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n metadata: {\n requested: 2,\n successful: 2,\n failed: 0,\n multi_order_packs: 2,\n single_order_packs: 0,\n packless_orders: 0,\n has_failures: false,\n },\n pack_contexts_schema: [\n \"order_id\",\n \"requested_pack_id\",\n \"resolved_pack_id\",\n \"pack_status\",\n \"shipment_id\",\n \"orders_in_pack_count\",\n \"is_multi_order_pack\",\n \"buyer_id\",\n \"pack_created_at\",\n \"pack_last_updated\",\n \"order_status\",\n \"order_status_detail\",\n \"pack_order_ids\",\n ],\n pack_contexts: [\n [\"ORD-10\", \"987654\", \"987654\", \"packed\", \"333\", 2, true, \"222\", \"2026-06-02T10:00:00Z\", \"2026-06-02T10:02:00Z\", \"paid\", \"\", \"ORD-10 | ORD-11\"],\n [\"ORD-11\", \"987654\", \"987654\", \"packed\", \"333\", 2, true, \"222\", \"2026-06-02T10:00:00Z\", \"2026-06-02T10:02:00Z\", \"paid\", \"\", \"ORD-10 | ORD-11\"],\n ],\n },\n });\n });\n\n it(\"resolves bundle context from items and user products\", async () => {\n vi.mocked(resolveMercadoLibreUserProductsFromItems).mockResolvedValue([\n { itemId: \"MLA1\", userProductId: \"MLAU1\", title: \"Kit\" },\n { itemId: \"MLA2\", userProductId: \"MLAU2\", title: \"Component\" },\n ] as never);\n vi.mocked(getMercadoLibreUserProductsBatch).mockResolvedValue({\n successful: [\n {\n id: \"MLAU1\",\n document: {\n id: \"MLAU1\",\n name: \"Kit\",\n domain_id: \"MLA-DOM\",\n last_updated: \"2026-06-01T10:00:00Z\",\n tags: [\"bundle\"],\n bundle: {\n type: \"kit\",\n components: [{ type: \"user_product\", user_product_id: \"MLAU2\", quantity: 1 }],\n },\n },\n },\n {\n id: \"MLAU2\",\n document: {\n id: \"MLAU2\",\n name: \"Component\",\n domain_id: \"MLA-DOM\",\n last_updated: \"2026-06-01T10:00:00Z\",\n tags: [\"kit_component\"],\n },\n },\n ],\n failed: [],\n } as never);\n vi.mocked(getMercadoLibreUserProductBundlesBatch).mockResolvedValue({\n successful: [\n {\n id: \"MLAU1\",\n document: { user_product_id: \"MLAU1\", bundles: [] },\n },\n {\n id: \"MLAU2\",\n document: { user_product_id: \"MLAU2\", bundles: [\"MLAU1\"] },\n },\n ],\n failed: [],\n } as never);\n\n const result = await meliGetBundleContextByItemHandler({\n profileId: \"meli-profile-1\",\n itemIds: [\"MLA1\", \"MLA2\"],\n });\n\n expect(resolveMercadoLibreUserProductsFromItems).toHaveBeenCalledWith(\"meli-profile-1\", [\"MLA1\", \"MLA2\"]);\n expect(getMercadoLibreUserProductsBatch).toHaveBeenCalledWith(\"meli-profile-1\", [\"MLAU1\", \"MLAU2\"], {\n maxConcurrency: 10,\n maxRetries: 2,\n });\n expect(getMercadoLibreUserProductBundlesBatch).toHaveBeenCalledWith(\"meli-profile-1\", [\"MLAU1\", \"MLAU2\"], {\n maxConcurrency: 10,\n maxRetries: 2,\n });\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n metadata: {\n requested_items: 2,\n requested_user_products: 0,\n resolved_user_products: 2,\n kits_found: 1,\n components_found: 1,\n failed: 0,\n has_failures: false,\n },\n bundle_contexts_schema: [\n \"user_product_id\",\n \"name\",\n \"domain_id\",\n \"input_refs\",\n \"is_kit\",\n \"bundle_type\",\n \"kit_component_count\",\n \"kit_components\",\n \"bundle_membership_count\",\n \"bundle_ids\",\n \"last_updated\",\n ],\n bundle_contexts: [\n [\"MLAU1\", \"Kit\", \"MLA-DOM\", \"item:MLA1\", true, \"kit\", 1, \"MLAU2 x1\", 0, \"\", \"2026-06-01T10:00:00Z\"],\n [\"MLAU2\", \"Component\", \"MLA-DOM\", \"item:MLA2\", false, \"\", 0, \"\", 1, \"MLAU1\", \"2026-06-01T10:00:00Z\"],\n ],\n },\n });\n });\n\n it(\"hydrates shipping quotes from a real item snapshot when itemId is provided\", async () => {\n vi.mocked(getMercadoLibreItem).mockResolvedValue({\n id: \"MLA1\",\n price: 5000,\n listing_type_id: \"gold_special\",\n category_id: \"MLA123\",\n currency_id: \"ARS\",\n condition: \"new\",\n shipping: {\n mode: \"me2\",\n logistic_type: \"drop_off\",\n free_shipping: true,\n },\n } as never);\n vi.mocked(getMercadoLibreDeclaredDimensionsShippingQuote).mockResolvedValue({\n coverage: { all_country: { list_cost: 8106.49, currency_id: \"ARS\", billable_weight: 462 } },\n custom_message: { display_mode: null, reason: \"\" },\n } as never);\n\n const result = await meliGetShippingQuoteByDeclaredDimensionsHandler({\n profileId: \"meli-profile-1\",\n itemId: \"MLA1\",\n heightCm: 9,\n widthCm: 17,\n lengthCm: 22,\n weightGrams: 462,\n verbose: true,\n });\n\n expect(getMercadoLibreItem).toHaveBeenCalledWith(\"meli-profile-1\", \"MLA1\");\n expect(getMercadoLibreDeclaredDimensionsShippingQuote).toHaveBeenCalledWith(\"meli-profile-1\", {\n dimensions: \"9x17x22,462\",\n verbose: true,\n itemId: \"MLA1\",\n itemPrice: 5000,\n listingTypeId: \"gold_special\",\n mode: \"me2\",\n condition: \"new\",\n logisticType: \"drop_off\",\n freeShipping: true,\n currencyId: \"ARS\",\n categoryId: \"MLA123\",\n tags: undefined,\n });\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n metadata: {\n source: \"item_hydrated\",\n item_id: \"MLA1\",\n dimensions: \"9x17x22,462\",\n height_cm: 9,\n width_cm: 17,\n length_cm: 22,\n weight_grams: 462,\n item_price: 5000,\n listing_type_id: \"gold_special\",\n mode: \"me2\",\n logistic_type: \"drop_off\",\n free_shipping: true,\n currency_id: \"ARS\",\n condition: \"new\",\n category_id: \"MLA123\",\n verbose: true,\n },\n coverage: { all_country: { list_cost: 8106.49, currency_id: \"ARS\", billable_weight: 462 } },\n custom_message: { reason: \"\" },\n },\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,YAAY,UAAU,QAAQ,IAAI,UAAU;AAErD,SAAS,yCAAyC;AAClD,SAAS,wCAAwC;AACjD;AAAA,EACE;AAAA,OAEK;AACP,SAAS,6CAA6C;AACtD;AAAA,EACE;AAAA,OACK;AACP,SAAS,gCAAgC;AACzC;AAAA,EACE;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,2BAA2B;AAEpC,GAAG,KAAK,kBAAkB,OAAO;AAAA,EAC/B,QAAQ,GAAG,GAAG,CAAC,aAAsB,EAAE,MAAM,UAAU,QAAQ,EAAE;AAAA,EACjE,OAAO,GAAG,GAAG,CAAC,aAAqB,EAAE,MAAM,SAAS,QAAQ,EAAE;AAChE,EAAE;AAEF,GAAG,KAAK,sDAAsD,OAAO;AAAA,EACnE,uCAAuC,GAAG,GAAG;AAC/C,EAAE;AAEF,GAAG,KAAK,0DAA0D,OAAO;AAAA,EACvE,kCAAkC,GAAG,GAAG;AAC1C,EAAE;AAEF,GAAG,KAAK,yDAAyD,OAAO;AAAA,EACtE,0BAA0B,GAAG,GAAG;AAClC,EAAE;AAEF,GAAG,KAAK,wDAAwD,OAAO;AAAA,EACrE,0CAA0C,GAAG,GAAG;AAAA,EAChD,kCAAkC,GAAG,GAAG;AAAA,EACxC,wCAAwC,GAAG,GAAG;AAChD,EAAE;AAEF,GAAG,KAAK,yDAAyD,OAAO;AAAA,EACtE,qBAAqB,GAAG,GAAG;AAC7B,EAAE;AAEF,GAAG,KAAK,4DAA4D,OAAO;AAAA,EACzE,gDAAgD,GAAG,GAAG;AACxD,EAAE;AAEF,SAAS,2CAA2C,MAAM;AACxD,aAAW,MAAM;AACf,OAAG,cAAc;AACjB,OAAG,OAAO,qCAAqC,EAAE,kBAAkB;AAAA,MACjE,IAAI;AAAA,MACJ,OAAO,EAAE,WAAW,iBAAiB;AAAA,IACvC,CAAC;AAAA,EACH,CAAC;AAED,KAAG,kEAAkE,YAAY;AAC/E,OAAG,OAAO,gCAAgC,EAAE,kBAAkB;AAAA,MAC5D,YAAY;AAAA,QACV;AAAA,UACE,IAAI;AAAA,UACJ,UAAU;AAAA,YACR,IAAI;AAAA,YACJ,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,eAAe;AAAA,YACf,OAAO,EAAE,IAAI,IAAI;AAAA,YACjB,cAAc;AAAA,YACd,cAAc;AAAA,UAChB;AAAA,QACF;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,UAAU;AAAA,YACR,IAAI;AAAA,YACJ,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,eAAe;AAAA,YACf,OAAO,EAAE,IAAI,IAAI;AAAA,YACjB,cAAc;AAAA,YACd,cAAc;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,MACA,QAAQ,CAAC;AAAA,IACX,CAAU;AACV,OAAG,OAAO,wBAAwB,EAAE,kBAAkB;AAAA,MACpD,YAAY;AAAA,QACV;AAAA,UACE,IAAI;AAAA,UACJ,UAAU;AAAA,YACR,IAAI;AAAA,YACJ,QAAQ;AAAA,YACR,UAAU,EAAE,IAAI,IAAI;AAAA,YACpB,OAAO,EAAE,IAAI,IAAI;AAAA,YACjB,cAAc;AAAA,YACd,cAAc;AAAA,YACd,QAAQ,CAAC,EAAE,IAAI,QAAQ,GAAG,EAAE,IAAI,QAAQ,CAAC;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAAA,MACA,QAAQ,CAAC;AAAA,IACX,CAAU;AAEV,UAAM,SAAS,MAAM,iCAAiC;AAAA,MACpD,WAAW;AAAA,MACX,UAAU,CAAC,SAAS,SAAS,OAAO;AAAA,IACtC,CAAC;AAED,WAAO,gCAAgC,EAAE,qBAAqB,kBAAkB,CAAC,SAAS,OAAO,GAAG;AAAA,MAClG,gBAAgB;AAAA,MAChB,YAAY;AAAA,IACd,CAAC;AACD,WAAO,wBAAwB,EAAE,qBAAqB,kBAAkB,CAAC,QAAQ,GAAG;AAAA,MAClF,gBAAgB;AAAA,MAChB,YAAY;AAAA,IACd,CAAC;AACD,WAAO,MAAM,EAAE,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,SAAS;AAAA,QACP,YAAY;AAAA,QACZ,UAAU;AAAA,UACR,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,mBAAmB;AAAA,UACnB,oBAAoB;AAAA,UACpB,iBAAiB;AAAA,UACjB,cAAc;AAAA,QAChB;AAAA,QACA,sBAAsB;AAAA,UACpB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,eAAe;AAAA,UACb,CAAC,SAAS,UAAU,UAAU,YAAY,OAAO,GAAG,MAAM,OAAO,wBAAwB,wBAAwB,QAAQ,IAAI,eAAe;AAAA,UAC5I,CAAC,SAAS,UAAU,UAAU,YAAY,OAAO,GAAG,MAAM,OAAO,wBAAwB,wBAAwB,QAAQ,IAAI,eAAe;AAAA,QAC9I;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,KAAG,wDAAwD,YAAY;AACrE,OAAG,OAAO,gCAAgC,EAAE,kBAAkB;AAAA,MAC5D,YAAY;AAAA,QACV;AAAA,UACE,IAAI;AAAA,UACJ,UAAU;AAAA,YACR,IAAI;AAAA,YACJ,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,eAAe;AAAA,YACf,OAAO,EAAE,IAAI,IAAI;AAAA,YACjB,cAAc;AAAA,YACd,cAAc;AAAA,UAChB;AAAA,QACF;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,UAAU;AAAA,YACR,IAAI;AAAA,YACJ,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,eAAe;AAAA,YACf,OAAO,EAAE,IAAI,IAAI;AAAA,YACjB,cAAc;AAAA,YACd,cAAc;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,MACA,QAAQ,CAAC;AAAA,IACX,CAAU;AACV,OAAG,OAAO,wBAAwB,EAAE,kBAAkB;AAAA,MACpD,YAAY;AAAA,QACV;AAAA,UACE,IAAI;AAAA,UACJ,UAAU;AAAA,YACR,IAAI;AAAA,YACJ,QAAQ;AAAA,YACR,UAAU,EAAE,IAAI,IAAI;AAAA,YACpB,OAAO,EAAE,IAAI,IAAI;AAAA,YACjB,cAAc;AAAA,YACd,cAAc;AAAA,YACd,QAAQ,CAAC,EAAE,IAAI,SAAS,GAAG,EAAE,IAAI,SAAS,CAAC;AAAA,UAC7C;AAAA,QACF;AAAA,MACF;AAAA,MACA,QAAQ,CAAC;AAAA,IACX,CAAU;AAEV,UAAM,SAAS,MAAM,iCAAiC;AAAA,MACpD,WAAW;AAAA,MACX,UAAU,CAAC,UAAU,QAAQ;AAAA,IAC/B,CAAC;AAED,WAAO,wBAAwB,EAAE,qBAAqB,kBAAkB,CAAC,QAAQ,GAAG;AAAA,MAClF,gBAAgB;AAAA,MAChB,YAAY;AAAA,IACd,CAAC;AACD,WAAO,MAAM,EAAE,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,SAAS;AAAA,QACP,YAAY;AAAA,QACZ,UAAU;AAAA,UACR,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,mBAAmB;AAAA,UACnB,oBAAoB;AAAA,UACpB,iBAAiB;AAAA,UACjB,cAAc;AAAA,QAChB;AAAA,QACA,sBAAsB;AAAA,UACpB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,eAAe;AAAA,UACb,CAAC,UAAU,UAAU,UAAU,UAAU,OAAO,GAAG,MAAM,OAAO,wBAAwB,wBAAwB,QAAQ,IAAI,iBAAiB;AAAA,UAC7I,CAAC,UAAU,UAAU,UAAU,UAAU,OAAO,GAAG,MAAM,OAAO,wBAAwB,wBAAwB,QAAQ,IAAI,iBAAiB;AAAA,QAC/I;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,KAAG,wDAAwD,YAAY;AACrE,OAAG,OAAO,wCAAwC,EAAE,kBAAkB;AAAA,MACpE,EAAE,QAAQ,QAAQ,eAAe,SAAS,OAAO,MAAM;AAAA,MACvD,EAAE,QAAQ,QAAQ,eAAe,SAAS,OAAO,YAAY;AAAA,IAC/D,CAAU;AACV,OAAG,OAAO,gCAAgC,EAAE,kBAAkB;AAAA,MAC5D,YAAY;AAAA,QACV;AAAA,UACE,IAAI;AAAA,UACJ,UAAU;AAAA,YACR,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,WAAW;AAAA,YACX,cAAc;AAAA,YACd,MAAM,CAAC,QAAQ;AAAA,YACf,QAAQ;AAAA,cACN,MAAM;AAAA,cACN,YAAY,CAAC,EAAE,MAAM,gBAAgB,iBAAiB,SAAS,UAAU,EAAE,CAAC;AAAA,YAC9E;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,UAAU;AAAA,YACR,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,WAAW;AAAA,YACX,cAAc;AAAA,YACd,MAAM,CAAC,eAAe;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,QAAQ,CAAC;AAAA,IACX,CAAU;AACV,OAAG,OAAO,sCAAsC,EAAE,kBAAkB;AAAA,MAClE,YAAY;AAAA,QACV;AAAA,UACE,IAAI;AAAA,UACJ,UAAU,EAAE,iBAAiB,SAAS,SAAS,CAAC,EAAE;AAAA,QACpD;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,UAAU,EAAE,iBAAiB,SAAS,SAAS,CAAC,OAAO,EAAE;AAAA,QAC3D;AAAA,MACF;AAAA,MACA,QAAQ,CAAC;AAAA,IACX,CAAU;AAEV,UAAM,SAAS,MAAM,kCAAkC;AAAA,MACrD,WAAW;AAAA,MACX,SAAS,CAAC,QAAQ,MAAM;AAAA,IAC1B,CAAC;AAED,WAAO,wCAAwC,EAAE,qBAAqB,kBAAkB,CAAC,QAAQ,MAAM,CAAC;AACxG,WAAO,gCAAgC,EAAE,qBAAqB,kBAAkB,CAAC,SAAS,OAAO,GAAG;AAAA,MAClG,gBAAgB;AAAA,MAChB,YAAY;AAAA,IACd,CAAC;AACD,WAAO,sCAAsC,EAAE,qBAAqB,kBAAkB,CAAC,SAAS,OAAO,GAAG;AAAA,MACxG,gBAAgB;AAAA,MAChB,YAAY;AAAA,IACd,CAAC;AACD,WAAO,MAAM,EAAE,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,SAAS;AAAA,QACP,YAAY;AAAA,QACZ,UAAU;AAAA,UACR,iBAAiB;AAAA,UACjB,yBAAyB;AAAA,UACzB,wBAAwB;AAAA,UACxB,YAAY;AAAA,UACZ,kBAAkB;AAAA,UAClB,QAAQ;AAAA,UACR,cAAc;AAAA,QAChB;AAAA,QACA,wBAAwB;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,iBAAiB;AAAA,UACf,CAAC,SAAS,OAAO,WAAW,aAAa,MAAM,OAAO,GAAG,YAAY,GAAG,IAAI,sBAAsB;AAAA,UAClG,CAAC,SAAS,aAAa,WAAW,aAAa,OAAO,IAAI,GAAG,IAAI,GAAG,SAAS,sBAAsB;AAAA,QACrG;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,KAAG,8EAA8E,YAAY;AAC3F,OAAG,OAAO,mBAAmB,EAAE,kBAAkB;AAAA,MAC/C,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,aAAa;AAAA,MACb,aAAa;AAAA,MACb,WAAW;AAAA,MACX,UAAU;AAAA,QACR,MAAM;AAAA,QACN,eAAe;AAAA,QACf,eAAe;AAAA,MACjB;AAAA,IACF,CAAU;AACV,OAAG,OAAO,8CAA8C,EAAE,kBAAkB;AAAA,MAC1E,UAAU,EAAE,aAAa,EAAE,WAAW,SAAS,aAAa,OAAO,iBAAiB,IAAI,EAAE;AAAA,MAC1F,gBAAgB,EAAE,cAAc,MAAM,QAAQ,GAAG;AAAA,IACnD,CAAU;AAEV,UAAM,SAAS,MAAM,gDAAgD;AAAA,MACnE,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,MACT,UAAU;AAAA,MACV,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAED,WAAO,mBAAmB,EAAE,qBAAqB,kBAAkB,MAAM;AACzE,WAAO,8CAA8C,EAAE,qBAAqB,kBAAkB;AAAA,MAC5F,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,eAAe;AAAA,MACf,MAAM;AAAA,MACN,WAAW;AAAA,MACX,cAAc;AAAA,MACd,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,MAAM;AAAA,IACR,CAAC;AACD,WAAO,MAAM,EAAE,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,SAAS;AAAA,QACP,YAAY;AAAA,QACZ,UAAU;AAAA,UACR,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,UAAU;AAAA,UACV,WAAW;AAAA,UACX,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,iBAAiB;AAAA,UACjB,MAAM;AAAA,UACN,eAAe;AAAA,UACf,eAAe;AAAA,UACf,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa;AAAA,UACb,SAAS;AAAA,QACX;AAAA,QACA,UAAU,EAAE,aAAa,EAAE,WAAW,SAAS,aAAa,OAAO,iBAAiB,IAAI,EAAE;AAAA,QAC1F,gBAAgB,EAAE,QAAQ,GAAG;AAAA,MAC/B;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -18,10 +18,12 @@ import {
|
|
|
18
18
|
} from "../../src/tools/mercadolibre/write-helpers.js";
|
|
19
19
|
import { getMercadoLibreAccessForProfile } from "../../src/config/mercadolibre.js";
|
|
20
20
|
import { getMercadoLibreConnectionRow } from "../../src/config/mercadolibre-profile-store.js";
|
|
21
|
+
import { decryptSecret } from "../../src/config/vtex-crypto.js";
|
|
21
22
|
import {
|
|
22
23
|
buildMercadoLibrePaginationMetadata,
|
|
23
24
|
formatMercadoLibreError,
|
|
24
25
|
getMercadoLibreUsersMe,
|
|
26
|
+
getMercadoLibreUsersMeWithAccessToken,
|
|
25
27
|
normalizeMercadoLibrePaging
|
|
26
28
|
} from "../../src/services/mercadolibre/mercadolibre-api.js";
|
|
27
29
|
import {
|
|
@@ -67,8 +69,12 @@ vi.mock("../../src/config/mercadolibre.js", () => ({
|
|
|
67
69
|
vi.mock("../../src/config/mercadolibre-profile-store.js", () => ({
|
|
68
70
|
getMercadoLibreConnectionRow: vi.fn()
|
|
69
71
|
}));
|
|
72
|
+
vi.mock("../../src/config/vtex-crypto.js", () => ({
|
|
73
|
+
decryptSecret: vi.fn()
|
|
74
|
+
}));
|
|
70
75
|
vi.mock("../../src/services/mercadolibre/mercadolibre-api.js", () => ({
|
|
71
76
|
getMercadoLibreUsersMe: vi.fn(),
|
|
77
|
+
getMercadoLibreUsersMeWithAccessToken: vi.fn(),
|
|
72
78
|
formatMercadoLibreError: vi.fn(
|
|
73
79
|
(err, fallback) => `formatted:${fallback}:${err instanceof Error ? err.message : String(err)}`
|
|
74
80
|
),
|
|
@@ -142,26 +148,31 @@ describe("MercadoLibre small and medium tool handlers", () => {
|
|
|
142
148
|
expect(result).toEqual({ selection_required: true });
|
|
143
149
|
expect(getMercadoLibreAccessForProfile).not.toHaveBeenCalled();
|
|
144
150
|
});
|
|
145
|
-
it("validates connection
|
|
146
|
-
vi.mocked(getMercadoLibreConnectionRow).
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
it("validates connection with its persisted unexpired token without refresh", async () => {
|
|
152
|
+
vi.mocked(getMercadoLibreConnectionRow).mockResolvedValue({
|
|
153
|
+
sellerId: "seller-99",
|
|
154
|
+
scopes: ["read", "write"],
|
|
155
|
+
expiresAt: /* @__PURE__ */ new Date("2099-07-01T00:00:00.000Z"),
|
|
156
|
+
encryptedAccessToken: "stored-token",
|
|
157
|
+
status: "error"
|
|
158
|
+
});
|
|
159
|
+
vi.mocked(decryptSecret).mockReturnValue("stored-access-token");
|
|
160
|
+
vi.mocked(getMercadoLibreUsersMeWithAccessToken).mockResolvedValue({
|
|
161
|
+
id: 12345,
|
|
162
|
+
nickname: "meli-store"
|
|
153
163
|
});
|
|
154
164
|
const result = await meliValidateConnectionHandler({ profileId: "meli-profile-1" });
|
|
165
|
+
expect(getMercadoLibreUsersMeWithAccessToken).toHaveBeenCalledWith("stored-access-token");
|
|
155
166
|
expect(result).toEqual({
|
|
156
167
|
kind: "object",
|
|
157
168
|
payload: {
|
|
158
169
|
profile_id: "meli-profile-1",
|
|
159
|
-
|
|
160
|
-
|
|
170
|
+
observation_only: true,
|
|
171
|
+
validation_status: "valid",
|
|
161
172
|
seller_id: "seller-99",
|
|
162
173
|
account_id: 12345,
|
|
163
174
|
nickname: "meli-store",
|
|
164
|
-
expires_at: "
|
|
175
|
+
expires_at: "2099-07-01T00:00:00.000Z",
|
|
165
176
|
scopes: ["read", "write"]
|
|
166
177
|
}
|
|
167
178
|
});
|
|
@@ -582,7 +593,15 @@ describe("MercadoLibre small and medium tool handlers", () => {
|
|
|
582
593
|
});
|
|
583
594
|
});
|
|
584
595
|
it("formats service failures through MercadoLibre error helpers", async () => {
|
|
585
|
-
vi.mocked(
|
|
596
|
+
vi.mocked(getMercadoLibreConnectionRow).mockResolvedValue({
|
|
597
|
+
sellerId: "seller-99",
|
|
598
|
+
scopes: ["read"],
|
|
599
|
+
expiresAt: /* @__PURE__ */ new Date("2099-07-01T00:00:00.000Z"),
|
|
600
|
+
encryptedAccessToken: "stored-token",
|
|
601
|
+
status: "active"
|
|
602
|
+
});
|
|
603
|
+
vi.mocked(decryptSecret).mockReturnValue("stored-access-token");
|
|
604
|
+
vi.mocked(getMercadoLibreUsersMeWithAccessToken).mockRejectedValue(new Error("boom"));
|
|
586
605
|
const result = await meliValidateConnectionHandler({ profileId: "meli-profile-1" });
|
|
587
606
|
expect(formatMercadoLibreError).toHaveBeenCalledWith(
|
|
588
607
|
expect.any(Error),
|