@yoryoboy/bi-mcp 1.10.0 → 1.13.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 +4 -5
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.js +398 -8
- package/dist/index.js.map +2 -2
- package/dist/mcp-use.json +2 -2
- package/dist/src/config/__tests__/meta.test.js +35 -0
- package/dist/src/config/__tests__/meta.test.js.map +7 -0
- package/dist/src/config/mercadolibre-profile-store.js +25 -0
- package/dist/src/config/mercadolibre-profile-store.js.map +2 -2
- package/dist/src/config/meta-store.js +109 -0
- package/dist/src/config/meta-store.js.map +7 -0
- package/dist/src/config/meta.js +0 -2
- package/dist/src/config/meta.js.map +2 -2
- package/dist/src/meta/__tests__/meta-utils.test.js +155 -0
- package/dist/src/meta/__tests__/meta-utils.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-api.test.js +265 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-api.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-items.test.js +311 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-items.test.js.map +7 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-orders.test.js +220 -0
- package/dist/src/services/mercadolibre/__tests__/mercadolibre-orders.test.js.map +7 -0
- package/dist/src/services/meta/__tests__/meta-ads.test.js +126 -0
- package/dist/src/services/meta/__tests__/meta-ads.test.js.map +7 -0
- package/dist/src/services/meta/__tests__/meta-api.test.js +70 -0
- package/dist/src/services/meta/__tests__/meta-api.test.js.map +7 -0
- package/dist/src/services/meta/meta-ads.js +94 -40
- package/dist/src/services/meta/meta-ads.js.map +2 -2
- package/dist/src/services/meta/meta-api.js +8 -6
- package/dist/src/services/meta/meta-api.js.map +2 -2
- package/dist/src/services/vtex/__tests__/vtex-catalog-write-batch.test.js +165 -0
- package/dist/src/services/vtex/__tests__/vtex-catalog-write-batch.test.js.map +7 -0
- package/dist/src/services/vtex/__tests__/vtex-catalog-write-eans.test.js +92 -0
- package/dist/src/services/vtex/__tests__/vtex-catalog-write-eans.test.js.map +7 -0
- package/dist/src/services/vtex/__tests__/vtex-catalog-write-products.test.js +41 -0
- package/dist/src/services/vtex/__tests__/vtex-catalog-write-products.test.js.map +7 -0
- package/dist/src/services/vtex/__tests__/vtex-catalog.test.js +80 -0
- package/dist/src/services/vtex/__tests__/vtex-catalog.test.js.map +7 -0
- package/dist/src/services/vtex/__tests__/vtex-orders-write-http.test.js +85 -0
- package/dist/src/services/vtex/__tests__/vtex-orders-write-http.test.js.map +7 -0
- package/dist/src/services/vtex/__tests__/vtex-orders-write-state-validation.test.js +251 -0
- package/dist/src/services/vtex/__tests__/vtex-orders-write-state-validation.test.js.map +7 -0
- package/dist/src/services/vtex/__tests__/vtex-write.test.js +111 -0
- package/dist/src/services/vtex/__tests__/vtex-write.test.js.map +7 -0
- package/dist/src/services/vtex/vtex-catalog-write.js +194 -1
- package/dist/src/services/vtex/vtex-catalog-write.js.map +2 -2
- package/dist/src/services/vtex/vtex-catalog.js +118 -1
- package/dist/src/services/vtex/vtex-catalog.js.map +2 -2
- package/dist/src/services/vtex/vtex-pricing-write.js +5 -0
- package/dist/src/services/vtex/vtex-pricing-write.js.map +2 -2
- package/dist/src/services/vtex/vtex-write.js +67 -1
- package/dist/src/services/vtex/vtex-write.js.map +2 -2
- package/dist/src/tools/config/list-profiles.js +85 -11
- package/dist/src/tools/config/list-profiles.js.map +2 -2
- package/dist/src/tools/index.js.map +2 -2
- package/dist/src/tools/mercadolibre/__tests__/helpers.test.js +37 -0
- package/dist/src/tools/mercadolibre/__tests__/helpers.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/__tests__/profile-resolution.test.js +30 -0
- package/dist/src/tools/mercadolibre/__tests__/profile-resolution.test.js.map +7 -0
- package/dist/src/tools/mercadolibre/profile-resolution.js +4 -50
- package/dist/src/tools/mercadolibre/profile-resolution.js.map +2 -2
- package/dist/src/tools/meta/__tests__/pagination.test.js +133 -0
- package/dist/src/tools/meta/__tests__/pagination.test.js.map +7 -0
- package/dist/src/tools/meta/__tests__/profile-access.test.js +262 -0
- package/dist/src/tools/meta/__tests__/profile-access.test.js.map +7 -0
- package/dist/src/tools/meta/__tests__/read-tools.test.js +722 -0
- package/dist/src/tools/meta/__tests__/read-tools.test.js.map +7 -0
- package/dist/src/tools/meta/__tests__/schemas.test.js +103 -0
- package/dist/src/tools/meta/__tests__/schemas.test.js.map +7 -0
- package/dist/src/tools/meta/account-overview.js +37 -19
- package/dist/src/tools/meta/account-overview.js.map +2 -2
- package/dist/src/tools/meta/ad-account-info.js +31 -6
- package/dist/src/tools/meta/ad-account-info.js.map +2 -2
- package/dist/src/tools/meta/ads-performance.js +35 -21
- package/dist/src/tools/meta/ads-performance.js.map +2 -2
- package/dist/src/tools/meta/campaign-performance.js +35 -18
- package/dist/src/tools/meta/campaign-performance.js.map +2 -2
- package/dist/src/tools/meta/list-accessible-ad-accounts.js +39 -10
- package/dist/src/tools/meta/list-accessible-ad-accounts.js.map +2 -2
- package/dist/src/tools/meta/list-accessible-businesses.js +37 -13
- package/dist/src/tools/meta/list-accessible-businesses.js.map +2 -2
- package/dist/src/tools/meta/placement-mix.js +37 -22
- package/dist/src/tools/meta/placement-mix.js.map +2 -2
- package/dist/src/tools/meta/profile-access.js +215 -0
- package/dist/src/tools/meta/profile-access.js.map +7 -0
- package/dist/src/tools/meta/schema-helpers.js +19 -0
- package/dist/src/tools/meta/schema-helpers.js.map +7 -0
- package/dist/src/tools/meta/time-series.js +40 -23
- package/dist/src/tools/meta/time-series.js.map +2 -2
- package/dist/src/tools/vtex/__tests__/catalog-admin-batch.test.js +233 -0
- package/dist/src/tools/vtex/__tests__/catalog-admin-batch.test.js.map +7 -0
- package/dist/src/tools/vtex/__tests__/catalog-admin-categories.test.js +649 -0
- package/dist/src/tools/vtex/__tests__/catalog-admin-categories.test.js.map +7 -0
- package/dist/src/tools/vtex/__tests__/catalog-admin-product-specifications.test.js +339 -0
- package/dist/src/tools/vtex/__tests__/catalog-admin-product-specifications.test.js.map +7 -0
- package/dist/src/tools/vtex/__tests__/catalog-admin-products-skus.test.js +235 -0
- package/dist/src/tools/vtex/__tests__/catalog-admin-products-skus.test.js.map +7 -0
- package/dist/src/tools/vtex/__tests__/catalog-navigation-reads.test.js +372 -0
- package/dist/src/tools/vtex/__tests__/catalog-navigation-reads.test.js.map +7 -0
- package/dist/src/tools/vtex/__tests__/catalog-navigation-surface.test.js +57 -0
- package/dist/src/tools/vtex/__tests__/catalog-navigation-surface.test.js.map +7 -0
- package/dist/src/tools/vtex/__tests__/write-helpers.test.js +97 -0
- package/dist/src/tools/vtex/__tests__/write-helpers.test.js.map +7 -0
- package/dist/src/tools/vtex/activate-sku.js +1 -48
- package/dist/src/tools/vtex/activate-sku.js.map +2 -2
- package/dist/src/tools/vtex/associate-specification.js +3 -54
- package/dist/src/tools/vtex/associate-specification.js.map +2 -2
- package/dist/src/tools/vtex/attach-catalog-image.js +3 -57
- package/dist/src/tools/vtex/attach-catalog-image.js.map +2 -2
- package/dist/src/tools/vtex/catalog-admin-batch.js +298 -0
- package/dist/src/tools/vtex/catalog-admin-batch.js.map +7 -0
- package/dist/src/tools/vtex/catalog-admin-categories.js +542 -0
- package/dist/src/tools/vtex/catalog-admin-categories.js.map +7 -0
- package/dist/src/tools/vtex/catalog-admin-product-specifications.js +275 -0
- package/dist/src/tools/vtex/catalog-admin-product-specifications.js.map +7 -0
- package/dist/src/tools/vtex/catalog-admin-products-skus.js +475 -0
- package/dist/src/tools/vtex/catalog-admin-products-skus.js.map +7 -0
- package/dist/src/tools/vtex/catalog-navigation-reads.js +430 -0
- package/dist/src/tools/vtex/catalog-navigation-reads.js.map +7 -0
- package/dist/src/tools/vtex/create-brand.js +1 -64
- package/dist/src/tools/vtex/create-brand.js.map +2 -2
- package/dist/src/tools/vtex/create-category.js +1 -76
- package/dist/src/tools/vtex/create-category.js.map +2 -2
- package/dist/src/tools/vtex/create-product-with-sku.js +3 -114
- package/dist/src/tools/vtex/create-product-with-sku.js.map +2 -2
- package/dist/src/tools/vtex/create-specification-value.js +3 -47
- package/dist/src/tools/vtex/create-specification-value.js.map +2 -2
- package/dist/src/tools/vtex/create-specification.js +1 -80
- package/dist/src/tools/vtex/create-specification.js.map +2 -2
- package/dist/src/tools/vtex/deactivate-sku.js +1 -48
- package/dist/src/tools/vtex/deactivate-sku.js.map +2 -2
- package/dist/src/tools/vtex/delete-all-product-specifications.js +9 -0
- package/dist/src/tools/vtex/delete-all-product-specifications.js.map +7 -0
- package/dist/src/tools/vtex/delete-all-sku-specifications.js +9 -0
- package/dist/src/tools/vtex/delete-all-sku-specifications.js.map +7 -0
- package/dist/src/tools/vtex/delete-brand.js +9 -0
- package/dist/src/tools/vtex/delete-brand.js.map +7 -0
- package/dist/src/tools/vtex/delete-catalog-image.js +9 -0
- package/dist/src/tools/vtex/delete-catalog-image.js.map +7 -0
- package/dist/src/tools/vtex/delete-product-specification.js +9 -0
- package/dist/src/tools/vtex/delete-product-specification.js.map +7 -0
- package/dist/src/tools/vtex/delete-sku-price.js +55 -0
- package/dist/src/tools/vtex/delete-sku-price.js.map +7 -0
- package/dist/src/tools/vtex/delete-sku-specification.js +9 -0
- package/dist/src/tools/vtex/delete-sku-specification.js.map +7 -0
- package/dist/src/tools/vtex/get-brand.js +6 -0
- package/dist/src/tools/vtex/get-brand.js.map +7 -0
- package/dist/src/tools/vtex/get-category-tree.js +6 -0
- package/dist/src/tools/vtex/get-category-tree.js.map +7 -0
- package/dist/src/tools/vtex/get-category.js +6 -0
- package/dist/src/tools/vtex/get-category.js.map +7 -0
- package/dist/src/tools/vtex/get-product-specifications.js +9 -0
- package/dist/src/tools/vtex/get-product-specifications.js.map +7 -0
- package/dist/src/tools/vtex/get-product.js +6 -0
- package/dist/src/tools/vtex/get-product.js.map +7 -0
- package/dist/src/tools/vtex/get-sku.js +6 -0
- package/dist/src/tools/vtex/get-sku.js.map +7 -0
- package/dist/src/tools/vtex/index.js +23 -1
- package/dist/src/tools/vtex/index.js.map +2 -2
- package/dist/src/tools/vtex/list-brands.js +6 -0
- package/dist/src/tools/vtex/list-brands.js.map +7 -0
- package/dist/src/tools/vtex/list-categories.js +6 -0
- package/dist/src/tools/vtex/list-categories.js.map +7 -0
- package/dist/src/tools/vtex/list-products-by-category.js +6 -0
- package/dist/src/tools/vtex/list-products-by-category.js.map +7 -0
- package/dist/src/tools/vtex/list-products.js +6 -0
- package/dist/src/tools/vtex/list-products.js.map +7 -0
- package/dist/src/tools/vtex/list-skus-by-product.js +6 -0
- package/dist/src/tools/vtex/list-skus-by-product.js.map +7 -0
- package/dist/src/tools/vtex/list-specification-groups.js +9 -0
- package/dist/src/tools/vtex/list-specification-groups.js.map +7 -0
- package/dist/src/tools/vtex/move-category.js +6 -0
- package/dist/src/tools/vtex/move-category.js.map +7 -0
- package/dist/src/tools/vtex/profile-resolution.js +4 -51
- package/dist/src/tools/vtex/profile-resolution.js.map +2 -2
- package/dist/src/tools/vtex/update-brand.js +6 -0
- package/dist/src/tools/vtex/update-brand.js.map +7 -0
- package/dist/src/tools/vtex/update-category.js +6 -0
- package/dist/src/tools/vtex/update-category.js.map +7 -0
- package/dist/src/tools/vtex/update-product-basic-fields.js +3 -65
- package/dist/src/tools/vtex/update-product-basic-fields.js.map +2 -2
- package/dist/src/tools/vtex/update-sku-basic-fields.js +1 -87
- package/dist/src/tools/vtex/update-sku-basic-fields.js.map +2 -2
- package/dist/src/tools/vtex/update-sku-price.js +21 -1
- package/dist/src/tools/vtex/update-sku-price.js.map +2 -2
- package/dist/src/tools/vtex/write-helpers.js +104 -14
- package/dist/src/tools/vtex/write-helpers.js.map +2 -2
- package/dist/src/utils/provider-profile-selection.js +117 -0
- package/dist/src/utils/provider-profile-selection.js.map +7 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-medium-batch4.test.js +678 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-medium-batch4.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch5.test.js +564 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch5.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch6.test.js +387 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch6.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch7.test.js +368 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch7.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-small.test.js +626 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-small.test.js.map +7 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-write-batch8.test.js +480 -0
- package/dist/tests/meli/mercadolibre-tool-handlers-write-batch8.test.js.map +7 -0
- package/dist/tests/setup.js +2 -0
- package/dist/tests/setup.js.map +7 -0
- package/dist/tests/smoke/test-harness.test.js +7 -0
- package/dist/tests/smoke/test-harness.test.js.map +7 -0
- package/dist/tests/vtex/read-only-utils.test.js +161 -0
- package/dist/tests/vtex/read-only-utils.test.js.map +7 -0
- package/dist/tests/vtex/vtex-catalog-admin-docs.test.js +24 -0
- package/dist/tests/vtex/vtex-catalog-admin-docs.test.js.map +7 -0
- package/dist/tests/vtex/vtex-catalog-admin-surface.test.js +30 -0
- package/dist/tests/vtex/vtex-catalog-admin-surface.test.js.map +7 -0
- package/dist/tests/vtex/vtex-catalog-write-tools.test.js +712 -0
- package/dist/tests/vtex/vtex-catalog-write-tools.test.js.map +7 -0
- package/dist/tests/vtex/vtex-catalog.service.test.js +51 -0
- package/dist/tests/vtex/vtex-catalog.service.test.js.map +7 -0
- package/dist/tests/vtex/vtex-inventory-tools.test.js +201 -0
- package/dist/tests/vtex/vtex-inventory-tools.test.js.map +7 -0
- package/dist/tests/vtex/vtex-logistics.service.test.js +134 -0
- package/dist/tests/vtex/vtex-logistics.service.test.js.map +7 -0
- package/dist/tests/vtex/vtex-order-details.tool.test.js +141 -0
- package/dist/tests/vtex/vtex-order-details.tool.test.js.map +7 -0
- package/dist/tests/vtex/vtex-order-write-tools.test.js +483 -0
- package/dist/tests/vtex/vtex-order-write-tools.test.js.map +7 -0
- package/dist/tests/vtex/vtex-orders-summary.tool.test.js +185 -0
- package/dist/tests/vtex/vtex-orders-summary.tool.test.js.map +7 -0
- package/dist/tests/vtex/vtex-orders.service.test.js +120 -0
- package/dist/tests/vtex/vtex-orders.service.test.js.map +7 -0
- package/dist/tests/vtex/vtex-pricing-write-tools.test.js +202 -0
- package/dist/tests/vtex/vtex-pricing-write-tools.test.js.map +7 -0
- package/dist/tests/vtex/vtex-pricing-write.service.test.js +106 -0
- package/dist/tests/vtex/vtex-pricing-write.service.test.js.map +7 -0
- package/dist/tests/vtex/vtex-pricing.service.test.js +88 -0
- package/dist/tests/vtex/vtex-pricing.service.test.js.map +7 -0
- package/dist/tests/vtex/vtex-small-tools.test.js +190 -0
- package/dist/tests/vtex/vtex-small-tools.test.js.map +7 -0
- package/dist/tests/vtex/vtex-write-simple-tools.test.js +647 -0
- package/dist/tests/vtex/vtex-write-simple-tools.test.js.map +7 -0
- package/dist/vitest.config.js +15 -0
- package/dist/vitest.config.js.map +7 -0
- package/package.json +6 -2
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../tests/meli/mercadolibre-tool-handlers-small.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { meliGetAccountContextHandler } from \"../../src/tools/mercadolibre/get-account-context.js\";\nimport { meliValidateConnectionHandler } from \"../../src/tools/mercadolibre/validate-connection.js\";\nimport { meliPredictCategoryHandler } from \"../../src/tools/mercadolibre/predict-category.js\";\nimport { meliGetCategoryRequirementsHandler } from \"../../src/tools/mercadolibre/get-category-requirements.js\";\nimport { meliEstimateListingFeeHandler } from \"../../src/tools/mercadolibre/estimate-listing-fee.js\";\nimport { meliGetSiteCategoriesAndListingTypesHandler } from \"../../src/tools/mercadolibre/get-site-categories-and-listing-types.js\";\nimport { meliGetItemDetailsHandler } from \"../../src/tools/mercadolibre/get-item-details.js\";\nimport { meliSearchQuestionsHandler } from \"../../src/tools/mercadolibre/search-questions.js\";\nimport { meliAnswerQuestionHandler } from \"../../src/tools/mercadolibre/answer-question.js\";\nimport { meliGetListingQualityHandler } from \"../../src/tools/mercadolibre/get-listing-quality.js\";\nimport { meliGetItemVisitsHandler } from \"../../src/tools/mercadolibre/get-item-visits.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"../../src/tools/mercadolibre/profile-resolution.js\";\nimport {\n buildMercadoLibreWriteSuccessResponse,\n handleMercadoLibreWriteError,\n resolveMercadoLibreWriteProfile,\n} from \"../../src/tools/mercadolibre/write-helpers.js\";\nimport { getMercadoLibreAccessForProfile } from \"../../src/config/mercadolibre.js\";\nimport { getMercadoLibreConnectionRow } from \"../../src/config/mercadolibre-profile-store.js\";\nimport {\n buildMercadoLibrePaginationMetadata,\n formatMercadoLibreError,\n getMercadoLibreUsersMe,\n normalizeMercadoLibrePaging,\n} from \"../../src/services/mercadolibre/mercadolibre-api.js\";\nimport {\n getMercadoLibreCategoryAttributes,\n getMercadoLibreCategoryShippingPreferences,\n getMercadoLibreItemDetailsBatch,\n getMercadoLibreItemDetailsWithFallbackBatch,\n getMercadoLibreItemPerformance,\n getMercadoLibreItemVisitsWindow,\n getMercadoLibreSiteCategoriesAndListingTypes,\n getMercadoLibreUserItemsVisits,\n searchMercadoLibreDomainDiscovery,\n} from \"../../src/services/mercadolibre/mercadolibre-items.js\";\nimport {\n answerMercadoLibreQuestion,\n searchMercadoLibreQuestions,\n} from \"../../src/services/mercadolibre/mercadolibre-questions.js\";\nimport { buildMercadoLibreListingFeeEstimate } from \"../../src/tools/mercadolibre/listing-fee-helpers.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/tools/mercadolibre/write-helpers.js\", async () => {\n const { z } = await import(\"zod\");\n\n return {\n mercadolibreProfileIdSchemaField: z.string().optional(),\n resolveMercadoLibreWriteProfile: vi.fn(),\n buildMercadoLibreWriteSuccessResponse: vi.fn((payload: unknown) => ({ kind: \"success\", payload })),\n handleMercadoLibreWriteError: vi.fn(\n (err: unknown, fallback: string) => ({\n kind: \"error\",\n message: `write:${fallback}:${err instanceof Error ? err.message : String(err)}`,\n })\n ),\n };\n});\n\nvi.mock(\"../../src/config/mercadolibre.js\", () => ({\n getMercadoLibreAccessForProfile: vi.fn(),\n}));\n\nvi.mock(\"../../src/config/mercadolibre-profile-store.js\", () => ({\n getMercadoLibreConnectionRow: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-api.js\", () => ({\n getMercadoLibreUsersMe: vi.fn(),\n formatMercadoLibreError: vi.fn(\n (err: unknown, fallback: string) =>\n `formatted:${fallback}:${err instanceof Error ? err.message : String(err)}`\n ),\n normalizeMercadoLibrePaging: vi.fn((paging: unknown) => paging),\n buildMercadoLibrePaginationMetadata: vi.fn((metadata: unknown) => metadata),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-items.js\", () => ({\n searchMercadoLibreDomainDiscovery: vi.fn(),\n getMercadoLibreCategoryAttributes: vi.fn(),\n getMercadoLibreCategoryShippingPreferences: vi.fn(),\n getMercadoLibreSiteCategoriesAndListingTypes: vi.fn(),\n getMercadoLibreItemDetailsBatch: vi.fn(),\n getMercadoLibreItemDetailsWithFallbackBatch: vi.fn(),\n getMercadoLibreItemPerformance: vi.fn(),\n getMercadoLibreItemVisitsWindow: vi.fn(),\n getMercadoLibreUserItemsVisits: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-questions.js\", () => ({\n searchMercadoLibreQuestions: vi.fn(),\n answerMercadoLibreQuestion: vi.fn(),\n}));\n\nvi.mock(\"../../src/tools/mercadolibre/listing-fee-helpers.js\", () => ({\n buildMercadoLibreListingFeeEstimate: vi.fn(),\n}));\n\ndescribe(\"MercadoLibre small and medium tool handlers\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n\n vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({\n ok: true,\n value: { profileId: \"meli-profile-1\" },\n });\n\n vi.mocked(resolveMercadoLibreWriteProfile).mockResolvedValue({\n ok: true,\n value: { profileId: \"meli-profile-1\" },\n });\n\n vi.mocked(getMercadoLibreAccessForProfile).mockResolvedValue({\n sellerId: \"seller-99\",\n scopes: [\"read\", \"write\"],\n expiresAt: \"2026-07-01T00:00:00.000Z\",\n } as never);\n\n vi.mocked(getMercadoLibreUsersMe).mockResolvedValue({\n id: 12345,\n nickname: \"meli-store\",\n } as never);\n\n vi.mocked(buildMercadoLibrePaginationMetadata).mockImplementation((metadata) => metadata as never);\n vi.mocked(normalizeMercadoLibrePaging).mockImplementation((paging) => paging as never);\n });\n\n it(\"returns MercadoLibre account context with resolved profile access\", async () => {\n const result = await meliGetAccountContextHandler({ profileId: \"custom-profile\" });\n\n expect(resolveMercadoLibreProfileOrSelection).toHaveBeenCalledWith(\"custom-profile\");\n expect(getMercadoLibreAccessForProfile).toHaveBeenCalledWith(\"meli-profile-1\");\n expect(getMercadoLibreUsersMe).toHaveBeenCalledWith(\"meli-profile-1\");\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n seller_id: \"seller-99\",\n nickname: \"meli-store\",\n account_id: 12345,\n scopes: [\"read\", \"write\"],\n expires_at: \"2026-07-01T00:00:00.000Z\",\n },\n });\n });\n\n it(\"returns profile selection payload unchanged for read handlers\", async () => {\n vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({\n ok: false,\n response: { selection_required: true },\n } as never);\n\n const result = await meliGetAccountContextHandler({ profileId: undefined });\n\n expect(result).toEqual({ selection_required: true });\n expect(getMercadoLibreAccessForProfile).not.toHaveBeenCalled();\n });\n\n it(\"validates connection and reports refresh detection\", async () => {\n vi.mocked(getMercadoLibreConnectionRow)\n .mockResolvedValueOnce({\n expiresAt: new Date(\"2026-06-01T00:00:00.000Z\"),\n encryptedAccessToken: \"old-token\",\n } as never)\n .mockResolvedValueOnce({\n status: \"active\",\n expiresAt: new Date(\"2026-07-01T00:00:00.000Z\"),\n encryptedAccessToken: \"new-token\",\n } as never);\n\n const result = await meliValidateConnectionHandler({ profileId: \"meli-profile-1\" });\n\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n validation_status: \"active\",\n refreshed: true,\n seller_id: \"seller-99\",\n account_id: 12345,\n nickname: \"meli-store\",\n expires_at: \"2026-07-01T00:00:00.000Z\",\n scopes: [\"read\", \"write\"],\n },\n });\n });\n\n it(\"predicts categories with normalized candidate payloads and defaults\", async () => {\n vi.mocked(searchMercadoLibreDomainDiscovery).mockResolvedValue([\n {\n category_id: \"MLA123\",\n category_name: \"Sneakers\",\n domain_id: \"MLA-SNEAKERS\",\n domain_name: \"Sneakers\",\n attributes_matched: \"4\",\n },\n ] as never);\n\n const result = await meliPredictCategoryHandler({\n profileId: \"meli-profile-1\",\n query: \"running shoes\",\n });\n\n expect(searchMercadoLibreDomainDiscovery).toHaveBeenCalledWith(\n \"meli-profile-1\",\n \"running shoes\",\n 5,\n \"MLA\"\n );\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n query: \"running shoes\",\n site_id: \"MLA\",\n candidates: [\n {\n category_id: \"MLA123\",\n category_name: \"Sneakers\",\n domain_id: \"MLA-SNEAKERS\",\n domain_name: \"Sneakers\",\n attributes_matched: 4,\n },\n ],\n },\n });\n });\n\n it(\"splits required and recommended category requirements\", async () => {\n vi.mocked(getMercadoLibreCategoryAttributes).mockResolvedValue([\n {\n id: \"BRAND\",\n name: \"Brand\",\n value_type: \"string\",\n value_max_length: 255,\n tags: { required: true },\n },\n {\n id: \"MODEL\",\n name: \"Model\",\n value_type: \"string\",\n tags: {},\n },\n ] as never);\n vi.mocked(getMercadoLibreCategoryShippingPreferences).mockResolvedValue({\n mode: \"me2\",\n logistic_types: [\"drop_off\"],\n } as never);\n\n const result = await meliGetCategoryRequirementsHandler({\n profileId: \"meli-profile-1\",\n categoryId: \"MLA999\",\n });\n\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n category_id: \"MLA999\",\n required_attributes: [\n {\n id: \"BRAND\",\n name: \"Brand\",\n value_type: \"string\",\n value_max_length: 255,\n },\n ],\n recommended_attributes: [\n {\n id: \"MODEL\",\n name: \"Model\",\n value_type: \"string\",\n },\n ],\n shipping_preferences: {\n mode: \"me2\",\n logistics: [\"drop_off\"],\n },\n },\n });\n });\n\n it(\"delegates listing fee estimation with the resolved profile\", async () => {\n vi.mocked(buildMercadoLibreListingFeeEstimate).mockResolvedValue({\n profile_id: \"meli-profile-1\",\n fee_amount: 1234,\n site_id: null,\n } as never);\n\n const result = await meliEstimateListingFeeHandler({\n profileId: \"meli-profile-1\",\n itemId: \"MLA1\",\n query: \"running shoes\",\n price: 10000,\n categoryId: \"MLA123\",\n listingTypeId: \"gold_special\",\n shippingMode: \"me2\",\n logisticType: \"drop_off\",\n billableWeight: 1200,\n currencyId: \"ARS\",\n tags: [\"test-tag\"],\n });\n\n expect(buildMercadoLibreListingFeeEstimate).toHaveBeenCalledWith({\n profileId: \"meli-profile-1\",\n itemId: \"MLA1\",\n query: \"running shoes\",\n price: 10000,\n categoryId: \"MLA123\",\n listingTypeId: \"gold_special\",\n shippingMode: \"me2\",\n logisticType: \"drop_off\",\n billableWeight: 1200,\n currencyId: \"ARS\",\n tags: [\"test-tag\"],\n });\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n fee_amount: 1234,\n },\n });\n });\n\n it(\"combines site categories and listing types metadata\", async () => {\n vi.mocked(getMercadoLibreSiteCategoriesAndListingTypes).mockResolvedValue({\n siteId: \"MLA\",\n categories: [{ id: \"MLA1\", name: \"Shoes\" }],\n listingTypes: [{ id: \"gold_special\", name: \"Cl\u00E1sica\" }],\n } as never);\n\n const result = await meliGetSiteCategoriesAndListingTypesHandler({ profileId: \"meli-profile-1\" });\n\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n site_id: \"MLA\",\n categories: [{ id: \"MLA1\", name: \"Shoes\" }],\n listing_types: [{ id: \"gold_special\", name: \"Cl\u00E1sica\" }],\n metadata: {\n site_id: \"MLA\",\n categories_count: 1,\n listing_types_count: 1,\n pagination: \"No aplica. La tool consolida dos endpoints de cat\u00E1logo del sitio MLA en una sola respuesta.\",\n },\n },\n });\n });\n\n it(\"returns item details directly from multiget when all requested ids are found\", async () => {\n vi.mocked(getMercadoLibreItemDetailsBatch).mockResolvedValue([\n { id: \"MLA1\", title: \"Boots\", pictures: [{ id: \"1\" }], status: \"active\" },\n { id: \"MLA2\", title: \"Sneakers\", pictures: [{ id: \"2\" }], status: \"paused\" },\n ] as never);\n\n const result = await meliGetItemDetailsHandler({\n profileId: \"meli-profile-1\",\n itemIds: [\"MLA1\", \"MLA1\", \"MLA2\"],\n });\n\n expect(getMercadoLibreItemDetailsBatch).toHaveBeenCalledWith(\"meli-profile-1\", [\"MLA1\", \"MLA2\"]);\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n metadata: {\n profile_id: \"meli-profile-1\",\n requested: 2,\n successful: 2,\n failed: 0,\n source: \"items_multiget\",\n },\n items: [\n { id: \"MLA1\", title: \"Boots\", status: \"active\" },\n { id: \"MLA2\", title: \"Sneakers\", status: \"paused\" },\n ],\n },\n });\n });\n\n it(\"falls back to item-by-item details when multiget coverage is partial\", async () => {\n vi.mocked(getMercadoLibreItemDetailsBatch).mockResolvedValue([{ id: \"MLA1\", title: \"Boots\" }] as never);\n vi.mocked(getMercadoLibreItemDetailsWithFallbackBatch).mockResolvedValue({\n successful: [\n {\n id: \"MLA1\",\n document: { id: \"MLA1\", title: \"Boots\" },\n },\n ],\n failed: [\n {\n id: \"MLA2\",\n message: \"not found\",\n statusCode: 404,\n attempts: 2,\n retryable: false,\n },\n ],\n } as never);\n\n const result = await meliGetItemDetailsHandler({\n profileId: \"meli-profile-1\",\n itemIds: [\"MLA1\", \"MLA2\"],\n });\n\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n metadata: {\n profile_id: \"meli-profile-1\",\n requested: 2,\n successful: 1,\n failed: 1,\n has_failures: true,\n source: \"item_by_item_fallback\",\n },\n items: [{ id: \"MLA1\", title: \"Boots\" }],\n failures: [\n {\n item_id: \"MLA2\",\n message: \"not found\",\n status_code: 404,\n attempts: 2,\n retryable: false,\n },\n ],\n },\n });\n });\n\n it(\"searches questions with seller context and normalized pagination\", async () => {\n vi.mocked(searchMercadoLibreQuestions).mockResolvedValue({\n questions: [\n {\n id: 777,\n item_id: \"MLA1\",\n item: { title: \"Boots\" },\n status: \"unanswered\",\n text: \"Do you ship today?\",\n date_created: \"2026-03-10T14:45:55.000Z\",\n from: { id: 555, nickname: \"buyer\" },\n answer: { status: \"not_answered\" },\n },\n ],\n paging: { total: 1, limit: 20, offset: 0 },\n } as never);\n\n const result = await meliSearchQuestionsHandler({ profileId: \"meli-profile-1\" });\n\n expect(searchMercadoLibreQuestions).toHaveBeenCalledWith(\"meli-profile-1\", {\n sellerId: \"seller-99\",\n itemId: undefined,\n status: undefined,\n limit: 20,\n offset: 0,\n });\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n metadata: {\n total: 1,\n limit: 20,\n offset: 0,\n returned: 1,\n nextField: \"offset\",\n },\n questions: [\n {\n question_id: 777,\n item_id: \"MLA1\",\n item_title: \"Boots\",\n status: \"unanswered\",\n text: \"Do you ship today?\",\n date_created: \"2026-03-10 14:45\",\n from: { id: \"\", nickname: \"buyer\" },\n answer_status: \"not_answered\",\n },\n ],\n },\n });\n });\n\n it(\"routes question answers through write helpers\", async () => {\n vi.mocked(answerMercadoLibreQuestion).mockResolvedValue({ id: 777, status: \"answered\" } as never);\n\n const result = await meliAnswerQuestionHandler({\n profileId: \"meli-profile-1\",\n questionId: 777,\n text: \"Yes, we can ship today.\",\n });\n\n expect(resolveMercadoLibreWriteProfile).toHaveBeenCalledWith(\"meli-profile-1\");\n expect(answerMercadoLibreQuestion).toHaveBeenCalledWith(\n \"meli-profile-1\",\n 777,\n \"Yes, we can ship today.\"\n );\n expect(buildMercadoLibreWriteSuccessResponse).toHaveBeenCalledWith({\n profileId: \"meli-profile-1\",\n operation: \"answer_question\",\n resourceId: \"777\",\n message: \"MercadoLibre question answered successfully.\",\n after: { id: 777, status: \"answered\" },\n });\n expect(result).toEqual({\n kind: \"success\",\n payload: {\n profileId: \"meli-profile-1\",\n operation: \"answer_question\",\n resourceId: \"777\",\n message: \"MercadoLibre question answered successfully.\",\n after: { id: 777, status: \"answered\" },\n },\n });\n });\n\n it(\"formats listing quality summaries with warning normalization\", async () => {\n vi.mocked(getMercadoLibreItemPerformance).mockResolvedValue({\n score: \"85\",\n status: \"healthy\",\n health: \"good\",\n sales: 20,\n visits: 300,\n warnings: [{ id: \"photo\", text: \"Add more photos\", severity: \"medium\" }],\n item: { title: \"Boots\", status: \"active\" },\n } as never);\n\n const result = await meliGetListingQualityHandler({\n profileId: \"meli-profile-1\",\n itemId: \"MLA1\",\n });\n\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n item_id: \"MLA1\",\n quality_score: 85,\n level: \"healthy\",\n health: \"good\",\n sales: 20,\n visits: 300,\n warnings: [\n {\n type: \"photo\",\n message: \"Add more photos\",\n severity: \"medium\",\n },\n ],\n raw_summary: {\n title: \"Boots\",\n status: \"active\",\n },\n },\n });\n });\n\n it(\"returns item-level visits windows when item ids are provided\", async () => {\n vi.mocked(getMercadoLibreItemVisitsWindow).mockResolvedValue({\n total_visits: 14,\n results: [{ date: \"2026-03-10\", visits: 14 }],\n } as never);\n\n const result = await meliGetItemVisitsHandler({\n profileId: \"meli-profile-1\",\n itemIds: [\"MLA1\", \"MLA1\"],\n last: 7,\n ending: \"2026-03-10\",\n });\n\n expect(getMercadoLibreItemVisitsWindow).toHaveBeenCalledTimes(1);\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n seller_id: \"seller-99\",\n total_visits: 14,\n items: [\n {\n item_id: \"MLA1\",\n total_visits: 14,\n last: 7,\n unit: \"day\",\n ending: \"2026-03-10\",\n time_window: [{ date: \"2026-03-10\", visits: 14 }],\n },\n ],\n },\n });\n });\n\n it(\"returns a validation error when visits are requested without item ids or date range\", async () => {\n const result = await meliGetItemVisitsHandler({ profileId: \"meli-profile-1\" });\n\n expect(result).toEqual({\n kind: \"error\",\n message: \"Provide itemIds, or provide both startDate and endDate for seller-level visits.\",\n });\n expect(getMercadoLibreUserItemsVisits).not.toHaveBeenCalled();\n });\n\n it(\"returns seller-level visits when a date range is provided\", async () => {\n vi.mocked(getMercadoLibreUserItemsVisits).mockResolvedValue({\n results: [\n { item_id: \"MLA1\", total_visits: 10 },\n { id: \"MLA2\", visits: 4 },\n ],\n } as never);\n\n const result = await meliGetItemVisitsHandler({\n profileId: \"meli-profile-1\",\n startDate: \"2026-03-01\",\n endDate: \"2026-03-10\",\n });\n\n expect(getMercadoLibreUserItemsVisits).toHaveBeenCalledWith(\n \"meli-profile-1\",\n \"seller-99\",\n \"2026-03-01\",\n \"2026-03-10\"\n );\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n profile_id: \"meli-profile-1\",\n seller_id: \"seller-99\",\n total_visits: 14,\n item_visit_rows: [\n { item_id: \"MLA1\", total_visits: 10 },\n { item_id: \"MLA2\", total_visits: 4 },\n ],\n },\n });\n });\n\n it(\"formats service failures through MercadoLibre error helpers\", async () => {\n vi.mocked(getMercadoLibreUsersMe).mockRejectedValue(new Error(\"boom\"));\n\n const result = await meliValidateConnectionHandler({ profileId: \"meli-profile-1\" });\n\n expect(formatMercadoLibreError).toHaveBeenCalledWith(\n expect.any(Error),\n \"Failed to validate MercadoLibre connection\"\n );\n expect(result).toEqual({\n kind: \"error\",\n message: \"formatted:Failed to validate MercadoLibre connection:boom\",\n });\n });\n\n it(\"returns write-helper selection payloads unchanged and skips answer calls\", async () => {\n vi.mocked(resolveMercadoLibreWriteProfile).mockResolvedValue({\n ok: false,\n response: { selection_required: true, provider: \"mercadolibre\" },\n } as never);\n\n const result = await meliAnswerQuestionHandler({\n profileId: undefined,\n questionId: 777,\n text: \"Answer\",\n });\n\n expect(result).toEqual({ selection_required: true, provider: \"mercadolibre\" });\n expect(answerMercadoLibreQuestion).not.toHaveBeenCalled();\n });\n\n it(\"routes write failures through the MercadoLibre write error helper\", async () => {\n vi.mocked(answerMercadoLibreQuestion).mockRejectedValue(new Error(\"cannot-answer\"));\n\n const result = await meliAnswerQuestionHandler({\n profileId: \"meli-profile-1\",\n questionId: 888,\n text: \"Answer\",\n });\n\n expect(handleMercadoLibreWriteError).toHaveBeenCalledWith(\n expect.any(Error),\n \"Failed to answer MercadoLibre question 888\"\n );\n expect(result).toEqual({\n kind: \"error\",\n message: \"write:Failed to answer MercadoLibre question 888:cannot-answer\",\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { meliCreateItemHandler } from "../../src/tools/mercadolibre/create-item.js";
|
|
3
|
+
import {
|
|
4
|
+
meliUpdateItemBasicFieldsHandler,
|
|
5
|
+
meliUpdateItemBasicFieldsSchema
|
|
6
|
+
} from "../../src/tools/mercadolibre/update-item-basic-fields.js";
|
|
7
|
+
import { meliUpdateItemDescriptionHandler } from "../../src/tools/mercadolibre/update-item-description.js";
|
|
8
|
+
import { meliUpdateItemPicturesHandler } from "../../src/tools/mercadolibre/update-item-pictures.js";
|
|
9
|
+
import { meliPauseOrReactivateItemHandler } from "../../src/tools/mercadolibre/pause-or-reactivate-item.js";
|
|
10
|
+
import { resolveMercadoLibreProfileOrSelection } from "../../src/tools/mercadolibre/profile-resolution.js";
|
|
11
|
+
import { formatMercadoLibreError } from "../../src/services/mercadolibre/mercadolibre-api.js";
|
|
12
|
+
import {
|
|
13
|
+
addMercadoLibreItemPicture,
|
|
14
|
+
createMercadoLibreItem,
|
|
15
|
+
createMercadoLibreItemDescription,
|
|
16
|
+
getMercadoLibreItem,
|
|
17
|
+
getMercadoLibreItemDescription,
|
|
18
|
+
replaceMercadoLibreItemDescription,
|
|
19
|
+
updateMercadoLibreItem
|
|
20
|
+
} 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-api.js", async () => {
|
|
29
|
+
const actual = await vi.importActual(
|
|
30
|
+
"../../src/services/mercadolibre/mercadolibre-api.js"
|
|
31
|
+
);
|
|
32
|
+
return {
|
|
33
|
+
...actual,
|
|
34
|
+
formatMercadoLibreError: vi.fn(
|
|
35
|
+
(err, fallback) => `formatted:${fallback}:${err instanceof Error ? err.message : String(err)}`
|
|
36
|
+
)
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
vi.mock("../../src/services/mercadolibre/mercadolibre-items.js", () => ({
|
|
40
|
+
createMercadoLibreItem: vi.fn(),
|
|
41
|
+
createMercadoLibreItemDescription: vi.fn(),
|
|
42
|
+
getMercadoLibreItem: vi.fn(),
|
|
43
|
+
updateMercadoLibreItem: vi.fn(),
|
|
44
|
+
getMercadoLibreItemDescription: vi.fn(),
|
|
45
|
+
replaceMercadoLibreItemDescription: vi.fn(),
|
|
46
|
+
addMercadoLibreItemPicture: vi.fn()
|
|
47
|
+
}));
|
|
48
|
+
describe("MercadoLibre write tool handlers batch 8", () => {
|
|
49
|
+
beforeEach(() => {
|
|
50
|
+
vi.clearAllMocks();
|
|
51
|
+
vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({
|
|
52
|
+
ok: true,
|
|
53
|
+
value: { profileId: "meli-profile-1" }
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
it("creates an item with MercadoLibre defaults when description is omitted", async () => {
|
|
57
|
+
vi.mocked(createMercadoLibreItem).mockResolvedValue({ id: "MLA100", status: "active" });
|
|
58
|
+
const result = await meliCreateItemHandler({
|
|
59
|
+
profileId: "custom-profile",
|
|
60
|
+
title: "Running shoes",
|
|
61
|
+
categoryId: "MLA123",
|
|
62
|
+
price: 99999,
|
|
63
|
+
listingTypeId: "gold_special",
|
|
64
|
+
condition: "new",
|
|
65
|
+
availableQuantity: 4
|
|
66
|
+
});
|
|
67
|
+
expect(createMercadoLibreItem).toHaveBeenCalledWith("meli-profile-1", {
|
|
68
|
+
site_id: "MLA",
|
|
69
|
+
title: "Running shoes",
|
|
70
|
+
category_id: "MLA123",
|
|
71
|
+
price: 99999,
|
|
72
|
+
currency_id: "ARS",
|
|
73
|
+
buying_mode: "buy_it_now",
|
|
74
|
+
listing_type_id: "gold_special",
|
|
75
|
+
condition: "new",
|
|
76
|
+
available_quantity: 4,
|
|
77
|
+
attributes: void 0,
|
|
78
|
+
pictures: void 0,
|
|
79
|
+
shipping: void 0,
|
|
80
|
+
sale_terms: void 0,
|
|
81
|
+
channels: void 0
|
|
82
|
+
});
|
|
83
|
+
expect(createMercadoLibreItemDescription).not.toHaveBeenCalled();
|
|
84
|
+
expect(result).toEqual({
|
|
85
|
+
kind: "object",
|
|
86
|
+
payload: {
|
|
87
|
+
ok: true,
|
|
88
|
+
profile_id: "meli-profile-1",
|
|
89
|
+
operation: "create_item",
|
|
90
|
+
resource_id: "MLA100",
|
|
91
|
+
message: "MercadoLibre item created successfully.",
|
|
92
|
+
summary: {
|
|
93
|
+
after: { id: "MLA100", status: "active" }
|
|
94
|
+
},
|
|
95
|
+
details: {
|
|
96
|
+
description_created: false
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
it("creates the item description after item creation when the created id is available", async () => {
|
|
102
|
+
vi.mocked(createMercadoLibreItem).mockResolvedValue({ id: "MLA101", status: "paused" });
|
|
103
|
+
vi.mocked(createMercadoLibreItemDescription).mockResolvedValue({ plain_text: "Fresh copy" });
|
|
104
|
+
const result = await meliCreateItemHandler({
|
|
105
|
+
profileId: "meli-profile-1",
|
|
106
|
+
title: "Travel mug",
|
|
107
|
+
categoryId: "MLA456",
|
|
108
|
+
price: 25e3,
|
|
109
|
+
currencyId: "USD",
|
|
110
|
+
buyingMode: "auction",
|
|
111
|
+
listingTypeId: "gold_pro",
|
|
112
|
+
condition: "used",
|
|
113
|
+
availableQuantity: 1,
|
|
114
|
+
description: "Fresh copy",
|
|
115
|
+
pictures: [{ source: "https://img.example.com/1.png" }]
|
|
116
|
+
});
|
|
117
|
+
expect(createMercadoLibreItemDescription).toHaveBeenCalledWith(
|
|
118
|
+
"meli-profile-1",
|
|
119
|
+
"MLA101",
|
|
120
|
+
"Fresh copy"
|
|
121
|
+
);
|
|
122
|
+
expect(result).toEqual(
|
|
123
|
+
expect.objectContaining({
|
|
124
|
+
kind: "object",
|
|
125
|
+
payload: expect.objectContaining({
|
|
126
|
+
resource_id: "MLA101",
|
|
127
|
+
details: { description_created: true }
|
|
128
|
+
})
|
|
129
|
+
})
|
|
130
|
+
);
|
|
131
|
+
});
|
|
132
|
+
it("skips description creation when the created resource id is not a string", async () => {
|
|
133
|
+
vi.mocked(createMercadoLibreItem).mockResolvedValue({ id: 404, status: "active" });
|
|
134
|
+
const result = await meliCreateItemHandler({
|
|
135
|
+
profileId: "meli-profile-1",
|
|
136
|
+
title: "Bottle",
|
|
137
|
+
categoryId: "MLA789",
|
|
138
|
+
price: 15e3,
|
|
139
|
+
listingTypeId: "gold_special",
|
|
140
|
+
condition: "new",
|
|
141
|
+
availableQuantity: 8,
|
|
142
|
+
description: "Will not be created"
|
|
143
|
+
});
|
|
144
|
+
expect(createMercadoLibreItemDescription).not.toHaveBeenCalled();
|
|
145
|
+
expect(result).toEqual(
|
|
146
|
+
expect.objectContaining({
|
|
147
|
+
kind: "object",
|
|
148
|
+
payload: expect.objectContaining({
|
|
149
|
+
details: { description_created: true }
|
|
150
|
+
})
|
|
151
|
+
})
|
|
152
|
+
);
|
|
153
|
+
});
|
|
154
|
+
it("returns the shared selection response before creating an item", async () => {
|
|
155
|
+
vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({
|
|
156
|
+
ok: false,
|
|
157
|
+
response: { selection_required: true }
|
|
158
|
+
});
|
|
159
|
+
const result = await meliCreateItemHandler({
|
|
160
|
+
profileId: void 0,
|
|
161
|
+
title: "Bottle",
|
|
162
|
+
categoryId: "MLA789",
|
|
163
|
+
price: 15e3,
|
|
164
|
+
listingTypeId: "gold_special",
|
|
165
|
+
condition: "new",
|
|
166
|
+
availableQuantity: 8
|
|
167
|
+
});
|
|
168
|
+
expect(result).toEqual({ selection_required: true });
|
|
169
|
+
expect(createMercadoLibreItem).not.toHaveBeenCalled();
|
|
170
|
+
});
|
|
171
|
+
it("formats create item failures through the MercadoLibre write helper", async () => {
|
|
172
|
+
vi.mocked(createMercadoLibreItem).mockRejectedValue(new Error("boom"));
|
|
173
|
+
const result = await meliCreateItemHandler({
|
|
174
|
+
profileId: "meli-profile-1",
|
|
175
|
+
title: "Bottle",
|
|
176
|
+
categoryId: "MLA789",
|
|
177
|
+
price: 15e3,
|
|
178
|
+
listingTypeId: "gold_special",
|
|
179
|
+
condition: "new",
|
|
180
|
+
availableQuantity: 8
|
|
181
|
+
});
|
|
182
|
+
expect(formatMercadoLibreError).toHaveBeenCalledWith(
|
|
183
|
+
expect.any(Error),
|
|
184
|
+
"Failed to create MercadoLibre item"
|
|
185
|
+
);
|
|
186
|
+
expect(result).toEqual({
|
|
187
|
+
kind: "error",
|
|
188
|
+
message: "formatted:Failed to create MercadoLibre item:boom"
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
it("updates MercadoLibre basic item fields using the previous item snapshot", async () => {
|
|
192
|
+
vi.mocked(getMercadoLibreItem).mockResolvedValue({ id: "MLA200", price: 1e4 });
|
|
193
|
+
vi.mocked(updateMercadoLibreItem).mockResolvedValue({ id: "MLA200", price: 12e3 });
|
|
194
|
+
const result = await meliUpdateItemBasicFieldsHandler({
|
|
195
|
+
profileId: "meli-profile-1",
|
|
196
|
+
itemId: "MLA200",
|
|
197
|
+
title: "Updated title",
|
|
198
|
+
price: 12e3,
|
|
199
|
+
availableQuantity: 5,
|
|
200
|
+
status: "paused",
|
|
201
|
+
listingTypeId: "gold_pro",
|
|
202
|
+
channels: ["marketplace"]
|
|
203
|
+
});
|
|
204
|
+
expect(getMercadoLibreItem).toHaveBeenCalledWith("meli-profile-1", "MLA200");
|
|
205
|
+
expect(updateMercadoLibreItem).toHaveBeenCalledWith("meli-profile-1", "MLA200", {
|
|
206
|
+
title: "Updated title",
|
|
207
|
+
price: 12e3,
|
|
208
|
+
available_quantity: 5,
|
|
209
|
+
attributes: void 0,
|
|
210
|
+
sale_terms: void 0,
|
|
211
|
+
shipping: void 0,
|
|
212
|
+
status: "paused",
|
|
213
|
+
listing_type_id: "gold_pro",
|
|
214
|
+
channels: ["marketplace"]
|
|
215
|
+
});
|
|
216
|
+
expect(result).toEqual(
|
|
217
|
+
expect.objectContaining({
|
|
218
|
+
kind: "object",
|
|
219
|
+
payload: expect.objectContaining({
|
|
220
|
+
operation: "update_item_basic_fields",
|
|
221
|
+
resource_id: "MLA200",
|
|
222
|
+
summary: {
|
|
223
|
+
before: { id: "MLA200", price: 1e4 },
|
|
224
|
+
after: { id: "MLA200", price: 12e3 }
|
|
225
|
+
}
|
|
226
|
+
})
|
|
227
|
+
})
|
|
228
|
+
);
|
|
229
|
+
});
|
|
230
|
+
it("returns the selection payload before updating MercadoLibre basic item fields", async () => {
|
|
231
|
+
vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({
|
|
232
|
+
ok: false,
|
|
233
|
+
response: { selection_required: true, provider: "mercadolibre" }
|
|
234
|
+
});
|
|
235
|
+
const result = await meliUpdateItemBasicFieldsHandler({
|
|
236
|
+
profileId: void 0,
|
|
237
|
+
itemId: "MLA200",
|
|
238
|
+
price: 12e3
|
|
239
|
+
});
|
|
240
|
+
expect(result).toEqual({ selection_required: true, provider: "mercadolibre" });
|
|
241
|
+
expect(getMercadoLibreItem).not.toHaveBeenCalled();
|
|
242
|
+
});
|
|
243
|
+
it("formats failures while updating MercadoLibre basic item fields", async () => {
|
|
244
|
+
vi.mocked(getMercadoLibreItem).mockResolvedValue({ id: "MLA200" });
|
|
245
|
+
vi.mocked(updateMercadoLibreItem).mockRejectedValue(new Error("cannot update"));
|
|
246
|
+
const result = await meliUpdateItemBasicFieldsHandler({
|
|
247
|
+
profileId: "meli-profile-1",
|
|
248
|
+
itemId: "MLA200",
|
|
249
|
+
price: 12e3
|
|
250
|
+
});
|
|
251
|
+
expect(result).toEqual({
|
|
252
|
+
kind: "error",
|
|
253
|
+
message: "formatted:Failed to update MercadoLibre item MLA200:cannot update"
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
it("requires at least one MercadoLibre basic field update while allowing late optional fields", () => {
|
|
257
|
+
const invalid = meliUpdateItemBasicFieldsSchema.safeParse({
|
|
258
|
+
profileId: "meli-profile-1",
|
|
259
|
+
itemId: "MLA200"
|
|
260
|
+
});
|
|
261
|
+
const validWithFirstOptional = meliUpdateItemBasicFieldsSchema.safeParse({
|
|
262
|
+
profileId: "meli-profile-1",
|
|
263
|
+
itemId: "MLA200",
|
|
264
|
+
title: "Updated title"
|
|
265
|
+
});
|
|
266
|
+
const validWithLastOptional = meliUpdateItemBasicFieldsSchema.safeParse({
|
|
267
|
+
profileId: "meli-profile-1",
|
|
268
|
+
itemId: "MLA200",
|
|
269
|
+
channels: ["marketplace"]
|
|
270
|
+
});
|
|
271
|
+
expect(invalid.success).toBe(false);
|
|
272
|
+
expect(invalid.error?.issues[0]?.message).toBe("At least one item field must be provided.");
|
|
273
|
+
expect(validWithFirstOptional.success).toBe(true);
|
|
274
|
+
expect(validWithLastOptional.success).toBe(true);
|
|
275
|
+
});
|
|
276
|
+
it("replaces an existing MercadoLibre item description when it already exists", async () => {
|
|
277
|
+
vi.mocked(getMercadoLibreItemDescription).mockResolvedValue({ plain_text: "Old copy" });
|
|
278
|
+
vi.mocked(replaceMercadoLibreItemDescription).mockResolvedValue({ plain_text: "New copy" });
|
|
279
|
+
const result = await meliUpdateItemDescriptionHandler({
|
|
280
|
+
profileId: "meli-profile-1",
|
|
281
|
+
itemId: "MLA300",
|
|
282
|
+
plainText: "New copy"
|
|
283
|
+
});
|
|
284
|
+
expect(replaceMercadoLibreItemDescription).toHaveBeenCalledWith(
|
|
285
|
+
"meli-profile-1",
|
|
286
|
+
"MLA300",
|
|
287
|
+
"New copy"
|
|
288
|
+
);
|
|
289
|
+
expect(createMercadoLibreItemDescription).not.toHaveBeenCalled();
|
|
290
|
+
expect(result).toEqual(
|
|
291
|
+
expect.objectContaining({
|
|
292
|
+
kind: "object",
|
|
293
|
+
payload: expect.objectContaining({
|
|
294
|
+
summary: {
|
|
295
|
+
before: { plain_text: "Old copy" },
|
|
296
|
+
after: { plain_text: "New copy" }
|
|
297
|
+
}
|
|
298
|
+
})
|
|
299
|
+
})
|
|
300
|
+
);
|
|
301
|
+
});
|
|
302
|
+
it("falls back to creating a MercadoLibre item description when replace flow fails", async () => {
|
|
303
|
+
vi.mocked(getMercadoLibreItemDescription).mockResolvedValue({ plain_text: "Old copy" });
|
|
304
|
+
vi.mocked(replaceMercadoLibreItemDescription).mockRejectedValue(new Error("replace failed"));
|
|
305
|
+
vi.mocked(createMercadoLibreItemDescription).mockResolvedValue({ plain_text: "Fallback copy" });
|
|
306
|
+
const result = await meliUpdateItemDescriptionHandler({
|
|
307
|
+
profileId: "meli-profile-1",
|
|
308
|
+
itemId: "MLA301",
|
|
309
|
+
plainText: "Fallback copy"
|
|
310
|
+
});
|
|
311
|
+
expect(createMercadoLibreItemDescription).toHaveBeenCalledWith(
|
|
312
|
+
"meli-profile-1",
|
|
313
|
+
"MLA301",
|
|
314
|
+
"Fallback copy"
|
|
315
|
+
);
|
|
316
|
+
expect(result).toEqual(
|
|
317
|
+
expect.objectContaining({
|
|
318
|
+
kind: "object",
|
|
319
|
+
payload: expect.objectContaining({
|
|
320
|
+
summary: {
|
|
321
|
+
before: { plain_text: "Old copy" },
|
|
322
|
+
after: { plain_text: "Fallback copy" }
|
|
323
|
+
}
|
|
324
|
+
})
|
|
325
|
+
})
|
|
326
|
+
);
|
|
327
|
+
});
|
|
328
|
+
it("returns the selection payload before updating the MercadoLibre description", async () => {
|
|
329
|
+
vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({
|
|
330
|
+
ok: false,
|
|
331
|
+
response: { selection_required: true }
|
|
332
|
+
});
|
|
333
|
+
const result = await meliUpdateItemDescriptionHandler({
|
|
334
|
+
profileId: void 0,
|
|
335
|
+
itemId: "MLA300",
|
|
336
|
+
plainText: "New copy"
|
|
337
|
+
});
|
|
338
|
+
expect(result).toEqual({ selection_required: true });
|
|
339
|
+
});
|
|
340
|
+
it("formats MercadoLibre description update failures when fallback creation also fails", async () => {
|
|
341
|
+
vi.mocked(getMercadoLibreItemDescription).mockRejectedValue(new Error("not found"));
|
|
342
|
+
vi.mocked(createMercadoLibreItemDescription).mockRejectedValue(new Error("create failed"));
|
|
343
|
+
const result = await meliUpdateItemDescriptionHandler({
|
|
344
|
+
profileId: "meli-profile-1",
|
|
345
|
+
itemId: "MLA302",
|
|
346
|
+
plainText: "New copy"
|
|
347
|
+
});
|
|
348
|
+
expect(result).toEqual({
|
|
349
|
+
kind: "error",
|
|
350
|
+
message: "formatted:Failed to update description for MLA302:create failed"
|
|
351
|
+
});
|
|
352
|
+
});
|
|
353
|
+
it("replaces the full MercadoLibre item pictures array in replace mode", async () => {
|
|
354
|
+
vi.mocked(getMercadoLibreItem).mockResolvedValueOnce({ id: "MLA400", pictures: [{ id: "1" }] }).mockResolvedValueOnce({ id: "MLA400", pictures: [{ id: "2" }] });
|
|
355
|
+
vi.mocked(updateMercadoLibreItem).mockResolvedValue({ id: "MLA400", pictures: [{ id: "2" }] });
|
|
356
|
+
const result = await meliUpdateItemPicturesHandler({
|
|
357
|
+
profileId: "meli-profile-1",
|
|
358
|
+
itemId: "MLA400",
|
|
359
|
+
mode: "replace",
|
|
360
|
+
pictures: [{ source: "https://img.example.com/2.png" }]
|
|
361
|
+
});
|
|
362
|
+
expect(updateMercadoLibreItem).toHaveBeenCalledWith("meli-profile-1", "MLA400", {
|
|
363
|
+
pictures: [{ source: "https://img.example.com/2.png" }]
|
|
364
|
+
});
|
|
365
|
+
expect(addMercadoLibreItemPicture).not.toHaveBeenCalled();
|
|
366
|
+
expect(result).toEqual(
|
|
367
|
+
expect.objectContaining({
|
|
368
|
+
kind: "object",
|
|
369
|
+
payload: expect.objectContaining({
|
|
370
|
+
details: { mode: "replace", pictures_count: 1 }
|
|
371
|
+
})
|
|
372
|
+
})
|
|
373
|
+
);
|
|
374
|
+
});
|
|
375
|
+
it("adds pictures sequentially and reloads the item in add mode", async () => {
|
|
376
|
+
vi.mocked(getMercadoLibreItem).mockResolvedValueOnce({ id: "MLA401", pictures: [{ id: "1" }] }).mockResolvedValueOnce({ id: "MLA401", pictures: [{ id: "1" }, { id: "2" }, { id: "3" }] });
|
|
377
|
+
const result = await meliUpdateItemPicturesHandler({
|
|
378
|
+
profileId: "meli-profile-1",
|
|
379
|
+
itemId: "MLA401",
|
|
380
|
+
mode: "add",
|
|
381
|
+
pictures: [
|
|
382
|
+
{ source: "https://img.example.com/2.png" },
|
|
383
|
+
{ source: "https://img.example.com/3.png" }
|
|
384
|
+
]
|
|
385
|
+
});
|
|
386
|
+
expect(addMercadoLibreItemPicture).toHaveBeenNthCalledWith(
|
|
387
|
+
1,
|
|
388
|
+
"meli-profile-1",
|
|
389
|
+
"MLA401",
|
|
390
|
+
"https://img.example.com/2.png"
|
|
391
|
+
);
|
|
392
|
+
expect(addMercadoLibreItemPicture).toHaveBeenNthCalledWith(
|
|
393
|
+
2,
|
|
394
|
+
"meli-profile-1",
|
|
395
|
+
"MLA401",
|
|
396
|
+
"https://img.example.com/3.png"
|
|
397
|
+
);
|
|
398
|
+
expect(result).toEqual(
|
|
399
|
+
expect.objectContaining({
|
|
400
|
+
kind: "object",
|
|
401
|
+
payload: expect.objectContaining({
|
|
402
|
+
details: { mode: "add", pictures_count: 2 }
|
|
403
|
+
})
|
|
404
|
+
})
|
|
405
|
+
);
|
|
406
|
+
});
|
|
407
|
+
it("formats MercadoLibre picture update failures", async () => {
|
|
408
|
+
vi.mocked(getMercadoLibreItem).mockRejectedValue(new Error("snapshot failed"));
|
|
409
|
+
const result = await meliUpdateItemPicturesHandler({
|
|
410
|
+
profileId: "meli-profile-1",
|
|
411
|
+
itemId: "MLA402",
|
|
412
|
+
mode: "replace",
|
|
413
|
+
pictures: [{ source: "https://img.example.com/2.png" }]
|
|
414
|
+
});
|
|
415
|
+
expect(result).toEqual({
|
|
416
|
+
kind: "error",
|
|
417
|
+
message: "formatted:Failed to update pictures for MLA402:snapshot failed"
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
it("returns the shared selection payload before updating MercadoLibre pictures", async () => {
|
|
421
|
+
vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({
|
|
422
|
+
ok: false,
|
|
423
|
+
response: { selection_required: true }
|
|
424
|
+
});
|
|
425
|
+
const result = await meliUpdateItemPicturesHandler({
|
|
426
|
+
profileId: void 0,
|
|
427
|
+
itemId: "MLA402",
|
|
428
|
+
mode: "add",
|
|
429
|
+
pictures: [{ source: "https://img.example.com/2.png" }]
|
|
430
|
+
});
|
|
431
|
+
expect(result).toEqual({ selection_required: true });
|
|
432
|
+
});
|
|
433
|
+
it("changes the MercadoLibre item status for pause or reactivate operations", async () => {
|
|
434
|
+
vi.mocked(getMercadoLibreItem).mockResolvedValue({ id: "MLA500", status: "paused" });
|
|
435
|
+
vi.mocked(updateMercadoLibreItem).mockResolvedValue({ id: "MLA500", status: "active" });
|
|
436
|
+
const result = await meliPauseOrReactivateItemHandler({
|
|
437
|
+
profileId: "meli-profile-1",
|
|
438
|
+
itemId: "MLA500",
|
|
439
|
+
status: "active"
|
|
440
|
+
});
|
|
441
|
+
expect(updateMercadoLibreItem).toHaveBeenCalledWith("meli-profile-1", "MLA500", {
|
|
442
|
+
status: "active"
|
|
443
|
+
});
|
|
444
|
+
expect(result).toEqual(
|
|
445
|
+
expect.objectContaining({
|
|
446
|
+
kind: "object",
|
|
447
|
+
payload: expect.objectContaining({
|
|
448
|
+
operation: "pause_or_reactivate_item",
|
|
449
|
+
message: "MercadoLibre item status changed to active."
|
|
450
|
+
})
|
|
451
|
+
})
|
|
452
|
+
);
|
|
453
|
+
});
|
|
454
|
+
it("returns the shared selection payload before pausing or reactivating an item", async () => {
|
|
455
|
+
vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({
|
|
456
|
+
ok: false,
|
|
457
|
+
response: { selection_required: true, available_profiles: [] }
|
|
458
|
+
});
|
|
459
|
+
const result = await meliPauseOrReactivateItemHandler({
|
|
460
|
+
profileId: void 0,
|
|
461
|
+
itemId: "MLA500",
|
|
462
|
+
status: "paused"
|
|
463
|
+
});
|
|
464
|
+
expect(result).toEqual({ selection_required: true, available_profiles: [] });
|
|
465
|
+
});
|
|
466
|
+
it("formats MercadoLibre status change failures", async () => {
|
|
467
|
+
vi.mocked(getMercadoLibreItem).mockResolvedValue({ id: "MLA500", status: "active" });
|
|
468
|
+
vi.mocked(updateMercadoLibreItem).mockRejectedValue(new Error("state failed"));
|
|
469
|
+
const result = await meliPauseOrReactivateItemHandler({
|
|
470
|
+
profileId: "meli-profile-1",
|
|
471
|
+
itemId: "MLA500",
|
|
472
|
+
status: "paused"
|
|
473
|
+
});
|
|
474
|
+
expect(result).toEqual({
|
|
475
|
+
kind: "error",
|
|
476
|
+
message: "formatted:Failed to change status for MLA500:state failed"
|
|
477
|
+
});
|
|
478
|
+
});
|
|
479
|
+
});
|
|
480
|
+
//# sourceMappingURL=mercadolibre-tool-handlers-write-batch8.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../tests/meli/mercadolibre-tool-handlers-write-batch8.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { meliCreateItemHandler } from \"../../src/tools/mercadolibre/create-item.js\";\nimport {\n meliUpdateItemBasicFieldsHandler,\n meliUpdateItemBasicFieldsSchema,\n} from \"../../src/tools/mercadolibre/update-item-basic-fields.js\";\nimport { meliUpdateItemDescriptionHandler } from \"../../src/tools/mercadolibre/update-item-description.js\";\nimport { meliUpdateItemPicturesHandler } from \"../../src/tools/mercadolibre/update-item-pictures.js\";\nimport { meliPauseOrReactivateItemHandler } from \"../../src/tools/mercadolibre/pause-or-reactivate-item.js\";\nimport { resolveMercadoLibreProfileOrSelection } from \"../../src/tools/mercadolibre/profile-resolution.js\";\nimport { formatMercadoLibreError } from \"../../src/services/mercadolibre/mercadolibre-api.js\";\nimport {\n addMercadoLibreItemPicture,\n createMercadoLibreItem,\n createMercadoLibreItemDescription,\n getMercadoLibreItem,\n getMercadoLibreItemDescription,\n replaceMercadoLibreItemDescription,\n updateMercadoLibreItem,\n} 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-api.js\", async () => {\n const actual = await vi.importActual<typeof import(\"../../src/services/mercadolibre/mercadolibre-api.js\")>(\n \"../../src/services/mercadolibre/mercadolibre-api.js\"\n );\n\n return {\n ...actual,\n formatMercadoLibreError: vi.fn(\n (err: unknown, fallback: string) =>\n `formatted:${fallback}:${err instanceof Error ? err.message : String(err)}`\n ),\n };\n});\n\nvi.mock(\"../../src/services/mercadolibre/mercadolibre-items.js\", () => ({\n createMercadoLibreItem: vi.fn(),\n createMercadoLibreItemDescription: vi.fn(),\n getMercadoLibreItem: vi.fn(),\n updateMercadoLibreItem: vi.fn(),\n getMercadoLibreItemDescription: vi.fn(),\n replaceMercadoLibreItemDescription: vi.fn(),\n addMercadoLibreItemPicture: vi.fn(),\n}));\n\ndescribe(\"MercadoLibre write tool handlers batch 8\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n\n vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({\n ok: true,\n value: { profileId: \"meli-profile-1\" },\n });\n });\n\n it(\"creates an item with MercadoLibre defaults when description is omitted\", async () => {\n vi.mocked(createMercadoLibreItem).mockResolvedValue({ id: \"MLA100\", status: \"active\" } as never);\n\n const result = await meliCreateItemHandler({\n profileId: \"custom-profile\",\n title: \"Running shoes\",\n categoryId: \"MLA123\",\n price: 99999,\n listingTypeId: \"gold_special\",\n condition: \"new\",\n availableQuantity: 4,\n });\n\n expect(createMercadoLibreItem).toHaveBeenCalledWith(\"meli-profile-1\", {\n site_id: \"MLA\",\n title: \"Running shoes\",\n category_id: \"MLA123\",\n price: 99999,\n currency_id: \"ARS\",\n buying_mode: \"buy_it_now\",\n listing_type_id: \"gold_special\",\n condition: \"new\",\n available_quantity: 4,\n attributes: undefined,\n pictures: undefined,\n shipping: undefined,\n sale_terms: undefined,\n channels: undefined,\n });\n expect(createMercadoLibreItemDescription).not.toHaveBeenCalled();\n expect(result).toEqual({\n kind: \"object\",\n payload: {\n ok: true,\n profile_id: \"meli-profile-1\",\n operation: \"create_item\",\n resource_id: \"MLA100\",\n message: \"MercadoLibre item created successfully.\",\n summary: {\n after: { id: \"MLA100\", status: \"active\" },\n },\n details: {\n description_created: false,\n },\n },\n });\n });\n\n it(\"creates the item description after item creation when the created id is available\", async () => {\n vi.mocked(createMercadoLibreItem).mockResolvedValue({ id: \"MLA101\", status: \"paused\" } as never);\n vi.mocked(createMercadoLibreItemDescription).mockResolvedValue({ plain_text: \"Fresh copy\" } as never);\n\n const result = await meliCreateItemHandler({\n profileId: \"meli-profile-1\",\n title: \"Travel mug\",\n categoryId: \"MLA456\",\n price: 25000,\n currencyId: \"USD\",\n buyingMode: \"auction\",\n listingTypeId: \"gold_pro\",\n condition: \"used\",\n availableQuantity: 1,\n description: \"Fresh copy\",\n pictures: [{ source: \"https://img.example.com/1.png\" }],\n });\n\n expect(createMercadoLibreItemDescription).toHaveBeenCalledWith(\n \"meli-profile-1\",\n \"MLA101\",\n \"Fresh copy\"\n );\n expect(result).toEqual(\n expect.objectContaining({\n kind: \"object\",\n payload: expect.objectContaining({\n resource_id: \"MLA101\",\n details: { description_created: true },\n }),\n })\n );\n });\n\n it(\"skips description creation when the created resource id is not a string\", async () => {\n vi.mocked(createMercadoLibreItem).mockResolvedValue({ id: 404, status: \"active\" } as never);\n\n const result = await meliCreateItemHandler({\n profileId: \"meli-profile-1\",\n title: \"Bottle\",\n categoryId: \"MLA789\",\n price: 15000,\n listingTypeId: \"gold_special\",\n condition: \"new\",\n availableQuantity: 8,\n description: \"Will not be created\",\n });\n\n expect(createMercadoLibreItemDescription).not.toHaveBeenCalled();\n expect(result).toEqual(\n expect.objectContaining({\n kind: \"object\",\n payload: expect.objectContaining({\n details: { description_created: true },\n }),\n })\n );\n });\n\n it(\"returns the shared selection response before creating an item\", async () => {\n vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({\n ok: false,\n response: { selection_required: true },\n } as never);\n\n const result = await meliCreateItemHandler({\n profileId: undefined,\n title: \"Bottle\",\n categoryId: \"MLA789\",\n price: 15000,\n listingTypeId: \"gold_special\",\n condition: \"new\",\n availableQuantity: 8,\n });\n\n expect(result).toEqual({ selection_required: true });\n expect(createMercadoLibreItem).not.toHaveBeenCalled();\n });\n\n it(\"formats create item failures through the MercadoLibre write helper\", async () => {\n vi.mocked(createMercadoLibreItem).mockRejectedValue(new Error(\"boom\"));\n\n const result = await meliCreateItemHandler({\n profileId: \"meli-profile-1\",\n title: \"Bottle\",\n categoryId: \"MLA789\",\n price: 15000,\n listingTypeId: \"gold_special\",\n condition: \"new\",\n availableQuantity: 8,\n });\n\n expect(formatMercadoLibreError).toHaveBeenCalledWith(\n expect.any(Error),\n \"Failed to create MercadoLibre item\"\n );\n expect(result).toEqual({\n kind: \"error\",\n message: \"formatted:Failed to create MercadoLibre item:boom\",\n });\n });\n\n it(\"updates MercadoLibre basic item fields using the previous item snapshot\", async () => {\n vi.mocked(getMercadoLibreItem).mockResolvedValue({ id: \"MLA200\", price: 10000 } as never);\n vi.mocked(updateMercadoLibreItem).mockResolvedValue({ id: \"MLA200\", price: 12000 } as never);\n\n const result = await meliUpdateItemBasicFieldsHandler({\n profileId: \"meli-profile-1\",\n itemId: \"MLA200\",\n title: \"Updated title\",\n price: 12000,\n availableQuantity: 5,\n status: \"paused\",\n listingTypeId: \"gold_pro\",\n channels: [\"marketplace\"],\n });\n\n expect(getMercadoLibreItem).toHaveBeenCalledWith(\"meli-profile-1\", \"MLA200\");\n expect(updateMercadoLibreItem).toHaveBeenCalledWith(\"meli-profile-1\", \"MLA200\", {\n title: \"Updated title\",\n price: 12000,\n available_quantity: 5,\n attributes: undefined,\n sale_terms: undefined,\n shipping: undefined,\n status: \"paused\",\n listing_type_id: \"gold_pro\",\n channels: [\"marketplace\"],\n });\n expect(result).toEqual(\n expect.objectContaining({\n kind: \"object\",\n payload: expect.objectContaining({\n operation: \"update_item_basic_fields\",\n resource_id: \"MLA200\",\n summary: {\n before: { id: \"MLA200\", price: 10000 },\n after: { id: \"MLA200\", price: 12000 },\n },\n }),\n })\n );\n });\n\n it(\"returns the selection payload before updating MercadoLibre basic item fields\", async () => {\n vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({\n ok: false,\n response: { selection_required: true, provider: \"mercadolibre\" },\n } as never);\n\n const result = await meliUpdateItemBasicFieldsHandler({\n profileId: undefined,\n itemId: \"MLA200\",\n price: 12000,\n });\n\n expect(result).toEqual({ selection_required: true, provider: \"mercadolibre\" });\n expect(getMercadoLibreItem).not.toHaveBeenCalled();\n });\n\n it(\"formats failures while updating MercadoLibre basic item fields\", async () => {\n vi.mocked(getMercadoLibreItem).mockResolvedValue({ id: \"MLA200\" } as never);\n vi.mocked(updateMercadoLibreItem).mockRejectedValue(new Error(\"cannot update\"));\n\n const result = await meliUpdateItemBasicFieldsHandler({\n profileId: \"meli-profile-1\",\n itemId: \"MLA200\",\n price: 12000,\n });\n\n expect(result).toEqual({\n kind: \"error\",\n message: \"formatted:Failed to update MercadoLibre item MLA200:cannot update\",\n });\n });\n\n it(\"requires at least one MercadoLibre basic field update while allowing late optional fields\", () => {\n const invalid = meliUpdateItemBasicFieldsSchema.safeParse({\n profileId: \"meli-profile-1\",\n itemId: \"MLA200\",\n });\n const validWithFirstOptional = meliUpdateItemBasicFieldsSchema.safeParse({\n profileId: \"meli-profile-1\",\n itemId: \"MLA200\",\n title: \"Updated title\",\n });\n const validWithLastOptional = meliUpdateItemBasicFieldsSchema.safeParse({\n profileId: \"meli-profile-1\",\n itemId: \"MLA200\",\n channels: [\"marketplace\"],\n });\n\n expect(invalid.success).toBe(false);\n expect(invalid.error?.issues[0]?.message).toBe(\"At least one item field must be provided.\");\n expect(validWithFirstOptional.success).toBe(true);\n expect(validWithLastOptional.success).toBe(true);\n });\n\n it(\"replaces an existing MercadoLibre item description when it already exists\", async () => {\n vi.mocked(getMercadoLibreItemDescription).mockResolvedValue({ plain_text: \"Old copy\" } as never);\n vi.mocked(replaceMercadoLibreItemDescription).mockResolvedValue({ plain_text: \"New copy\" } as never);\n\n const result = await meliUpdateItemDescriptionHandler({\n profileId: \"meli-profile-1\",\n itemId: \"MLA300\",\n plainText: \"New copy\",\n });\n\n expect(replaceMercadoLibreItemDescription).toHaveBeenCalledWith(\n \"meli-profile-1\",\n \"MLA300\",\n \"New copy\"\n );\n expect(createMercadoLibreItemDescription).not.toHaveBeenCalled();\n expect(result).toEqual(\n expect.objectContaining({\n kind: \"object\",\n payload: expect.objectContaining({\n summary: {\n before: { plain_text: \"Old copy\" },\n after: { plain_text: \"New copy\" },\n },\n }),\n })\n );\n });\n\n it(\"falls back to creating a MercadoLibre item description when replace flow fails\", async () => {\n vi.mocked(getMercadoLibreItemDescription).mockResolvedValue({ plain_text: \"Old copy\" } as never);\n vi.mocked(replaceMercadoLibreItemDescription).mockRejectedValue(new Error(\"replace failed\"));\n vi.mocked(createMercadoLibreItemDescription).mockResolvedValue({ plain_text: \"Fallback copy\" } as never);\n\n const result = await meliUpdateItemDescriptionHandler({\n profileId: \"meli-profile-1\",\n itemId: \"MLA301\",\n plainText: \"Fallback copy\",\n });\n\n expect(createMercadoLibreItemDescription).toHaveBeenCalledWith(\n \"meli-profile-1\",\n \"MLA301\",\n \"Fallback copy\"\n );\n expect(result).toEqual(\n expect.objectContaining({\n kind: \"object\",\n payload: expect.objectContaining({\n summary: {\n before: { plain_text: \"Old copy\" },\n after: { plain_text: \"Fallback copy\" },\n },\n }),\n })\n );\n });\n\n it(\"returns the selection payload before updating the MercadoLibre description\", async () => {\n vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({\n ok: false,\n response: { selection_required: true },\n } as never);\n\n const result = await meliUpdateItemDescriptionHandler({\n profileId: undefined,\n itemId: \"MLA300\",\n plainText: \"New copy\",\n });\n\n expect(result).toEqual({ selection_required: true });\n });\n\n it(\"formats MercadoLibre description update failures when fallback creation also fails\", async () => {\n vi.mocked(getMercadoLibreItemDescription).mockRejectedValue(new Error(\"not found\"));\n vi.mocked(createMercadoLibreItemDescription).mockRejectedValue(new Error(\"create failed\"));\n\n const result = await meliUpdateItemDescriptionHandler({\n profileId: \"meli-profile-1\",\n itemId: \"MLA302\",\n plainText: \"New copy\",\n });\n\n expect(result).toEqual({\n kind: \"error\",\n message: \"formatted:Failed to update description for MLA302:create failed\",\n });\n });\n\n it(\"replaces the full MercadoLibre item pictures array in replace mode\", async () => {\n vi.mocked(getMercadoLibreItem)\n .mockResolvedValueOnce({ id: \"MLA400\", pictures: [{ id: \"1\" }] } as never)\n .mockResolvedValueOnce({ id: \"MLA400\", pictures: [{ id: \"2\" }] } as never);\n vi.mocked(updateMercadoLibreItem).mockResolvedValue({ id: \"MLA400\", pictures: [{ id: \"2\" }] } as never);\n\n const result = await meliUpdateItemPicturesHandler({\n profileId: \"meli-profile-1\",\n itemId: \"MLA400\",\n mode: \"replace\",\n pictures: [{ source: \"https://img.example.com/2.png\" }],\n });\n\n expect(updateMercadoLibreItem).toHaveBeenCalledWith(\"meli-profile-1\", \"MLA400\", {\n pictures: [{ source: \"https://img.example.com/2.png\" }],\n });\n expect(addMercadoLibreItemPicture).not.toHaveBeenCalled();\n expect(result).toEqual(\n expect.objectContaining({\n kind: \"object\",\n payload: expect.objectContaining({\n details: { mode: \"replace\", pictures_count: 1 },\n }),\n })\n );\n });\n\n it(\"adds pictures sequentially and reloads the item in add mode\", async () => {\n vi.mocked(getMercadoLibreItem)\n .mockResolvedValueOnce({ id: \"MLA401\", pictures: [{ id: \"1\" }] } as never)\n .mockResolvedValueOnce({ id: \"MLA401\", pictures: [{ id: \"1\" }, { id: \"2\" }, { id: \"3\" }] } as never);\n\n const result = await meliUpdateItemPicturesHandler({\n profileId: \"meli-profile-1\",\n itemId: \"MLA401\",\n mode: \"add\",\n pictures: [\n { source: \"https://img.example.com/2.png\" },\n { source: \"https://img.example.com/3.png\" },\n ],\n });\n\n expect(addMercadoLibreItemPicture).toHaveBeenNthCalledWith(\n 1,\n \"meli-profile-1\",\n \"MLA401\",\n \"https://img.example.com/2.png\"\n );\n expect(addMercadoLibreItemPicture).toHaveBeenNthCalledWith(\n 2,\n \"meli-profile-1\",\n \"MLA401\",\n \"https://img.example.com/3.png\"\n );\n expect(result).toEqual(\n expect.objectContaining({\n kind: \"object\",\n payload: expect.objectContaining({\n details: { mode: \"add\", pictures_count: 2 },\n }),\n })\n );\n });\n\n it(\"formats MercadoLibre picture update failures\", async () => {\n vi.mocked(getMercadoLibreItem).mockRejectedValue(new Error(\"snapshot failed\"));\n\n const result = await meliUpdateItemPicturesHandler({\n profileId: \"meli-profile-1\",\n itemId: \"MLA402\",\n mode: \"replace\",\n pictures: [{ source: \"https://img.example.com/2.png\" }],\n });\n\n expect(result).toEqual({\n kind: \"error\",\n message: \"formatted:Failed to update pictures for MLA402:snapshot failed\",\n });\n });\n\n it(\"returns the shared selection payload before updating MercadoLibre pictures\", async () => {\n vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({\n ok: false,\n response: { selection_required: true },\n } as never);\n\n const result = await meliUpdateItemPicturesHandler({\n profileId: undefined,\n itemId: \"MLA402\",\n mode: \"add\",\n pictures: [{ source: \"https://img.example.com/2.png\" }],\n });\n\n expect(result).toEqual({ selection_required: true });\n });\n\n it(\"changes the MercadoLibre item status for pause or reactivate operations\", async () => {\n vi.mocked(getMercadoLibreItem).mockResolvedValue({ id: \"MLA500\", status: \"paused\" } as never);\n vi.mocked(updateMercadoLibreItem).mockResolvedValue({ id: \"MLA500\", status: \"active\" } as never);\n\n const result = await meliPauseOrReactivateItemHandler({\n profileId: \"meli-profile-1\",\n itemId: \"MLA500\",\n status: \"active\",\n });\n\n expect(updateMercadoLibreItem).toHaveBeenCalledWith(\"meli-profile-1\", \"MLA500\", {\n status: \"active\",\n });\n expect(result).toEqual(\n expect.objectContaining({\n kind: \"object\",\n payload: expect.objectContaining({\n operation: \"pause_or_reactivate_item\",\n message: \"MercadoLibre item status changed to active.\",\n }),\n })\n );\n });\n\n it(\"returns the shared selection payload before pausing or reactivating an item\", async () => {\n vi.mocked(resolveMercadoLibreProfileOrSelection).mockResolvedValue({\n ok: false,\n response: { selection_required: true, available_profiles: [] },\n } as never);\n\n const result = await meliPauseOrReactivateItemHandler({\n profileId: undefined,\n itemId: \"MLA500\",\n status: \"paused\",\n });\n\n expect(result).toEqual({ selection_required: true, available_profiles: [] });\n });\n\n it(\"formats MercadoLibre status change failures\", async () => {\n vi.mocked(getMercadoLibreItem).mockResolvedValue({ id: \"MLA500\", status: \"active\" } as never);\n vi.mocked(updateMercadoLibreItem).mockRejectedValue(new Error(\"state failed\"));\n\n const result = await meliPauseOrReactivateItemHandler({\n profileId: \"meli-profile-1\",\n itemId: \"MLA500\",\n status: \"paused\",\n });\n\n expect(result).toEqual({\n kind: \"error\",\n message: \"formatted:Failed to change status for MLA500:state failed\",\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|