@yoryoboy/bi-mcp 1.11.0 → 1.14.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 +426 -6
- 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/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-payments.test.js +95 -0
- package/dist/src/services/vtex/__tests__/vtex-payments.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-payments-write.js +64 -0
- package/dist/src/services/vtex/vtex-payments-write.js.map +7 -0
- package/dist/src/services/vtex/vtex-payments.js +43 -0
- package/dist/src/services/vtex/vtex-payments.js.map +7 -0
- 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 +37 -6
- 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__/commercial-condition-references.test.js +14 -0
- package/dist/src/tools/vtex/__tests__/commercial-condition-references.test.js.map +7 -0
- package/dist/src/tools/vtex/__tests__/commercial-conditions.test.js +276 -0
- package/dist/src/tools/vtex/__tests__/commercial-conditions.test.js.map +7 -0
- package/dist/src/tools/vtex/__tests__/payment-rules.test.js +253 -0
- package/dist/src/tools/vtex/__tests__/payment-rules.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 +477 -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/commercial-conditions.js +220 -0
- package/dist/src/tools/vtex/commercial-conditions.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-sku.js +3 -1
- package/dist/src/tools/vtex/create-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 +25 -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/payment-rules.js +229 -0
- package/dist/src/tools/vtex/payment-rules.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-commercial-conditions-docs.test.js +26 -0
- package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js.map +7 -0
- package/dist/tests/vtex/vtex-commercial-conditions-surface.test.js +42 -0
- package/dist/tests/vtex/vtex-commercial-conditions-surface.test.js.map +7 -0
- package/dist/tests/vtex/vtex-commercial-conditions-workflow.test.js +190 -0
- package/dist/tests/vtex/vtex-commercial-conditions-workflow.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/vtex/vtex-catalog-write-tools.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { z } from \"zod\";\n\nimport { associateSpecificationHandler } from \"../../src/tools/vtex/associate-specification.js\";\nimport { createBrandHandler } from \"../../src/tools/vtex/create-brand.js\";\nimport { createCategoryHandler } from \"../../src/tools/vtex/create-category.js\";\nimport { createProductHandler } from \"../../src/tools/vtex/create-product.js\";\nimport { createSkuHandler } from \"../../src/tools/vtex/create-sku.js\";\nimport {\n\tcreateSpecificationHandler,\n\tcreateSpecificationSchema,\n} from \"../../src/tools/vtex/create-specification.js\";\nimport { createSpecificationValueHandler } from \"../../src/tools/vtex/create-specification-value.js\";\nimport {\n\tassociateProductSpecification,\n\tassociateSkuSpecification,\n\tcreateBrand,\n\tcreateCategory,\n\tcreateProduct,\n\tcreateSku,\n\tcreateSkuEan,\n\tcreateSpecification,\n\tcreateSpecificationValue,\n} from \"../../src/services/vtex/vtex-catalog-write.js\";\nimport {\n\tbuildWriteSuccessResponse,\n\thandleVtexWriteError,\n\tresolveVtexWriteProfile,\n} from \"../../src/tools/vtex/write-helpers.js\";\n\nvi.mock(\"../../src/tools/vtex/write-helpers.js\", () => ({\n\tvtexProfileIdSchemaField: z.string().optional(),\n\tconfirmationSchemaField: z.boolean().optional(),\n\tconfirmationNoteSchemaField: z.string().optional(),\n\tresolveVtexWriteProfile: vi.fn(),\n\tbuildWriteSuccessResponse: vi.fn((params: unknown) => ({\n\t\tkind: \"success\",\n\t\tparams,\n\t})),\n\thandleVtexWriteError: vi.fn((err: unknown, fallback: string) => ({\n\t\tkind: \"error\",\n\t\tfallback,\n\t\terr,\n\t})),\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-catalog-write.js\", () => ({\n\tcreateBrand: vi.fn(),\n\tcreateCategory: vi.fn(),\n\tcreateProduct: vi.fn(),\n\tcreateSku: vi.fn(),\n\tcreateSkuEan: vi.fn(),\n\tcreateSpecification: vi.fn(),\n\tcreateSpecificationValue: vi.fn(),\n\tassociateProductSpecification: vi.fn(),\n\tassociateSkuSpecification: vi.fn(),\n}));\n\ndescribe(\"VTEX catalog/specification write tools\", () => {\n\tbeforeEach(() => {\n\t\tvi.clearAllMocks();\n\t\tvi.mocked(resolveVtexWriteProfile).mockResolvedValue({\n\t\t\tok: true,\n\t\t\tvalue: { profileId: \"profile-1\" },\n\t\t});\n\t});\n\n\tdescribe(\"createBrandHandler\", () => {\n\t\tit(\"applies default payload values before creating a brand\", async () => {\n\t\t\tconst createdBrand = { Id: 10, Name: \"Nike\", Active: true };\n\t\t\tvi.mocked(createBrand).mockResolvedValue(createdBrand as never);\n\n\t\t\tconst result = await createBrandHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tid: 10,\n\t\t\t\tname: \"Nike\",\n\t\t\t\tlinkId: \"nike\",\n\t\t\t});\n\n\t\t\texpect(createBrand).toHaveBeenCalledWith(\"profile-1\", {\n\t\t\t\tId: 10,\n\t\t\t\tName: \"Nike\",\n\t\t\t\tText: \"Nike\",\n\t\t\t\tKeywords: \"\",\n\t\t\t\tSiteTitle: \"Nike\",\n\t\t\t\tActive: true,\n\t\t\t\tMenuHome: false,\n\t\t\t\tLinkId: \"nike\",\n\t\t\t\tScore: null,\n\t\t\t\tAdWordsRemarketingCode: null,\n\t\t\t\tLomadeeCampaignCode: null,\n\t\t\t});\n\t\t\texpect(buildWriteSuccessResponse).toHaveBeenCalledWith({\n\t\t\t\tprofileId: \"profile-1\",\n\t\t\t\toperation: \"create_brand\",\n\t\t\t\tresourceId: \"10\",\n\t\t\t\triskLevel: \"low\",\n\t\t\t\tmessage: \"Brand created successfully.\",\n\t\t\t\tbefore: null,\n\t\t\t\tafter: createdBrand,\n\t\t\t});\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"success\",\n\t\t\t\tparams: expect.objectContaining({ operation: \"create_brand\" }),\n\t\t\t});\n\t\t});\n\n\t\tit(\"returns profile selection payload when profile resolution fails\", async () => {\n\t\t\tvi.mocked(resolveVtexWriteProfile).mockResolvedValue({\n\t\t\t\tok: false,\n\t\t\t\tresponse: { selection: true },\n\t\t\t} as never);\n\n\t\t\tconst result = await createBrandHandler({ id: 10, name: \"Nike\" });\n\n\t\t\texpect(result).toEqual({ selection: true });\n\t\t\texpect(createBrand).not.toHaveBeenCalled();\n\t\t});\n\n\t\tit(\"maps service errors through handleVtexWriteError\", async () => {\n\t\t\tvi.mocked(createBrand).mockRejectedValue(new Error(\"boom\"));\n\n\t\t\tconst result = await createBrandHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tid: 10,\n\t\t\t\tname: \"Nike\",\n\t\t\t});\n\n\t\t\texpect(handleVtexWriteError).toHaveBeenCalledWith(\n\t\t\t\texpect.any(Error),\n\t\t\t\t\"Failed to create brand in VTEX\",\n\t\t\t);\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"error\",\n\t\t\t\tfallback: \"Failed to create brand in VTEX\",\n\t\t\t\terr: expect.any(Error),\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"createCategoryHandler\", () => {\n\t\tit(\"forwards the expected VTEX category payload with defaults\", async () => {\n\t\t\tconst createdCategory = { Id: 20, Name: \"Shoes\" };\n\t\t\tvi.mocked(createCategory).mockResolvedValue(createdCategory as never);\n\n\t\t\tconst result = await createCategoryHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tname: \"Shoes\",\n\t\t\t\ttitle: \"Running Shoes\",\n\t\t\t\tdescription: \"Category description\",\n\t\t\t\tfatherCategoryId: null,\n\t\t\t\tglobalCategoryId: 123,\n\t\t\t\tstockKeepingUnitSelectionMode: \"SPECIFICATION\",\n\t\t\t});\n\n\t\t\texpect(createCategory).toHaveBeenCalledWith(\"profile-1\", {\n\t\t\t\tId: undefined,\n\t\t\t\tName: \"Shoes\",\n\t\t\t\tKeywords: \"\",\n\t\t\t\tTitle: \"Running Shoes\",\n\t\t\t\tDescription: \"Category description\",\n\t\t\t\tAdWordsRemarketingCode: null,\n\t\t\t\tLomadeeCampaignCode: null,\n\t\t\t\tFatherCategoryId: null,\n\t\t\t\tGlobalCategoryId: 123,\n\t\t\t\tShowInStoreFront: true,\n\t\t\t\tIsActive: true,\n\t\t\t\tActiveStoreFrontLink: true,\n\t\t\t\tShowBrandFilter: true,\n\t\t\t\tScore: null,\n\t\t\t\tStockKeepingUnitSelectionMode: \"SPECIFICATION\",\n\t\t\t});\n\t\t\texpect(buildWriteSuccessResponse).toHaveBeenCalledWith({\n\t\t\t\tprofileId: \"profile-1\",\n\t\t\t\toperation: \"create_category\",\n\t\t\t\tresourceId: \"20\",\n\t\t\t\triskLevel: \"low\",\n\t\t\t\tmessage: \"Category created successfully.\",\n\t\t\t\tbefore: null,\n\t\t\t\tafter: createdCategory,\n\t\t\t});\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"success\",\n\t\t\t\tparams: expect.objectContaining({ operation: \"create_category\" }),\n\t\t\t});\n\t\t});\n\n\t\tit(\"returns profile selection payload when profile resolution fails\", async () => {\n\t\t\tvi.mocked(resolveVtexWriteProfile).mockResolvedValue({\n\t\t\t\tok: false,\n\t\t\t\tresponse: { selection: true },\n\t\t\t} as never);\n\n\t\t\tconst result = await createCategoryHandler({\n\t\t\t\tname: \"Shoes\",\n\t\t\t\ttitle: \"Running Shoes\",\n\t\t\t\tdescription: \"Category description\",\n\t\t\t\tglobalCategoryId: 123,\n\t\t\t\tstockKeepingUnitSelectionMode: \"SPECIFICATION\",\n\t\t\t});\n\n\t\t\texpect(result).toEqual({ selection: true });\n\t\t\texpect(createCategory).not.toHaveBeenCalled();\n\t\t});\n\n\t\tit(\"maps service errors through handleVtexWriteError\", async () => {\n\t\t\tvi.mocked(createCategory).mockRejectedValue(new Error(\"boom\"));\n\n\t\t\tconst result = await createCategoryHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tname: \"Shoes\",\n\t\t\t\ttitle: \"Running Shoes\",\n\t\t\t\tdescription: \"Category description\",\n\t\t\t\tglobalCategoryId: 123,\n\t\t\t\tstockKeepingUnitSelectionMode: \"SPECIFICATION\",\n\t\t\t});\n\n\t\t\texpect(handleVtexWriteError).toHaveBeenCalledWith(\n\t\t\t\texpect.any(Error),\n\t\t\t\t\"Failed to create category in VTEX\",\n\t\t\t);\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"error\",\n\t\t\t\tfallback: \"Failed to create category in VTEX\",\n\t\t\t\terr: expect.any(Error),\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"createProductHandler\", () => {\n\t\tit(\"forwards the expected VTEX product payload and builds a success response\", async () => {\n\t\t\tconst createdProduct = { Id: 55, Name: \"Running Shoe\" };\n\t\t\tvi.mocked(createProduct).mockResolvedValue(createdProduct as never);\n\n\t\t\tconst result = await createProductHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tname: \"Running Shoe\",\n\t\t\t\tcategoryPath: \"Mens/Shoes/Running\",\n\t\t\t\tbrandName: \"Acme\",\n\t\t\t\tdepartmentId: 7,\n\t\t\t\trefId: \"RUN-001\",\n\t\t\t\ttitle: \"Running Shoe\",\n\t\t\t\tdescription: \"Main description\",\n\t\t\t\tdescriptionShort: \"Short description\",\n\t\t\t\tlinkId: \"running-shoe\",\n\t\t\t\treleaseDate: \"2026-06-01T00:00:00Z\",\n\t\t\t\tkeyWords: \"running,shoe\",\n\t\t\t\tisVisible: true,\n\t\t\t\tisActive: false,\n\t\t\t\ttaxCode: \"TX-1\",\n\t\t\t\tmetaTagDescription: \"Meta description\",\n\t\t\t\tsupplierId: 91,\n\t\t\t\tshowWithoutStock: true,\n\t\t\t\tscore: 12,\n\t\t\t});\n\n\t\t\texpect(createProduct).toHaveBeenCalledWith(\"profile-1\", {\n\t\t\t\tName: \"Running Shoe\",\n\t\t\t\tCategoryPath: \"Mens/Shoes/Running\",\n\t\t\t\tBrandName: \"Acme\",\n\t\t\t\tDepartmentId: 7,\n\t\t\t\tRefId: \"RUN-001\",\n\t\t\t\tTitle: \"Running Shoe\",\n\t\t\t\tDescription: \"Main description\",\n\t\t\t\tDescriptionShort: \"Short description\",\n\t\t\t\tLinkId: \"running-shoe\",\n\t\t\t\tReleaseDate: \"2026-06-01T00:00:00Z\",\n\t\t\t\tKeyWords: \"running,shoe\",\n\t\t\t\tIsVisible: true,\n\t\t\t\tIsActive: false,\n\t\t\t\tTaxCode: \"TX-1\",\n\t\t\t\tMetaTagDescription: \"Meta description\",\n\t\t\t\tSupplierId: 91,\n\t\t\t\tShowWithoutStock: true,\n\t\t\t\tScore: 12,\n\t\t\t});\n\t\t\texpect(buildWriteSuccessResponse).toHaveBeenCalledWith({\n\t\t\t\tprofileId: \"profile-1\",\n\t\t\t\toperation: \"create_product\",\n\t\t\t\tresourceId: \"55\",\n\t\t\t\triskLevel: \"low\",\n\t\t\t\tmessage: \"Product created successfully.\",\n\t\t\t\tbefore: null,\n\t\t\t\tafter: createdProduct,\n\t\t\t\tdetails: {\n\t\t\t\t\tproduct_id: \"55\",\n\t\t\t\t},\n\t\t\t});\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"success\",\n\t\t\t\tparams: expect.objectContaining({ operation: \"create_product\" }),\n\t\t\t});\n\t\t});\n\n\t\tit(\"returns profile selection payload when profile resolution fails\", async () => {\n\t\t\tvi.mocked(resolveVtexWriteProfile).mockResolvedValue({\n\t\t\t\tok: false,\n\t\t\t\tresponse: { selection: true },\n\t\t\t} as never);\n\n\t\t\tconst result = await createProductHandler({\n\t\t\t\tname: \"Running Shoe\",\n\t\t\t\tcategoryId: 10,\n\t\t\t\tbrandId: 20,\n\t\t\t});\n\n\t\t\texpect(result).toEqual({ selection: true });\n\t\t\texpect(createProduct).not.toHaveBeenCalled();\n\t\t});\n\n\t\tit(\"maps service errors through handleVtexWriteError\", async () => {\n\t\t\tvi.mocked(createProduct).mockRejectedValue(new Error(\"boom\"));\n\n\t\t\tconst result = await createProductHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tname: \"Running Shoe\",\n\t\t\t\tcategoryId: 10,\n\t\t\t\tbrandId: 20,\n\t\t\t});\n\n\t\t\texpect(handleVtexWriteError).toHaveBeenCalledWith(\n\t\t\t\texpect.any(Error),\n\t\t\t\t\"Failed to create product in VTEX\",\n\t\t\t);\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"error\",\n\t\t\t\tfallback: \"Failed to create product in VTEX\",\n\t\t\t\terr: expect.any(Error),\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"createSkuHandler\", () => {\n\t\tconst skuPayload = {\n\t\t\tprofileId: \"custom\",\n\t\t\tproductId: 99,\n\t\t\tname: \"Running Shoe / Black / 42\",\n\t\t\trefId: \"RUN-001-42\",\n\t\t\tpackagedHeight: 10,\n\t\t\tpackagedLength: 20,\n\t\t\tpackagedWidth: 30,\n\t\t\tpackagedWeightKg: 1.5,\n\t\t\theight: 9,\n\t\t\tlength: 19,\n\t\t\twidth: 29,\n\t\t\tweightKg: 1.25,\n\t\t\tmeasurementUnit: \"un\",\n\t\t\tunitMultiplier: 1,\n\t\t\tmanufacturerCode: \"ACME-42\",\n\t\t\tcommercialConditionId: 12,\n\t\t};\n\n\t\tit(\"forwards the expected VTEX SKU payload with default flags\", async () => {\n\t\t\tconst createdSku = { Id: 77, Name: skuPayload.name };\n\t\t\tvi.mocked(createSku).mockResolvedValue(createdSku as never);\n\n\t\t\tconst result = await createSkuHandler(skuPayload);\n\n\t\t\texpect(createSku).toHaveBeenCalledWith(\"profile-1\", {\n\t\t\t\tProductId: 99,\n\t\t\t\tName: \"Running Shoe / Black / 42\",\n\t\t\t\tRefId: \"RUN-001-42\",\n\t\t\t\tPackagedHeight: 10,\n\t\t\t\tPackagedLength: 20,\n\t\t\t\tPackagedWidth: 30,\n\t\t\t\tPackagedWeightKg: 1.5,\n\t\t\t\tActivateIfPossible: true,\n\t\t\t\tIsActive: false,\n\t\t\t\tHeight: 9,\n\t\t\t\tLength: 19,\n\t\t\t\tWidth: 29,\n\t\t\t\tWeightKg: 1.25,\n\t\t\t\tMeasurementUnit: \"un\",\n\t\t\t\tUnitMultiplier: 1,\n\t\t\t\tManufacturerCode: \"ACME-42\",\n\t\t\t\tCommercialConditionId: 12,\n\t\t\t});\n\t\t\texpect(createSkuEan).not.toHaveBeenCalled();\n\t\t\texpect(buildWriteSuccessResponse).toHaveBeenCalledWith({\n\t\t\t\tprofileId: \"profile-1\",\n\t\t\t\toperation: \"create_sku\",\n\t\t\t\tresourceId: \"77\",\n\t\t\t\triskLevel: \"low\",\n\t\t\t\tmessage: \"SKU created successfully.\",\n\t\t\t\tbefore: null,\n\t\t\t\tafter: createdSku,\n\t\t\t\tdetails: {\n\t\t\t\t\tproduct_id: 99,\n\t\t\t\t\tsku_id: \"77\",\n\t\t\t\t},\n\t\t\t});\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"success\",\n\t\t\t\tparams: expect.objectContaining({ operation: \"create_sku\" }),\n\t\t\t});\n\t\t});\n\n\t\tit(\"creates the sku then attaches the EAN when provided\", async () => {\n\t\t\tconst createdSku = { Id: 78, Name: skuPayload.name };\n\t\t\tvi.mocked(createSku).mockResolvedValue(createdSku as never);\n\n\t\t\tawait createSkuHandler({\n\t\t\t\t...skuPayload,\n\t\t\t\tean: \" 7791234567890 \",\n\t\t\t\tisActive: true,\n\t\t\t\tactivateIfPossible: false,\n\t\t\t});\n\n\t\t\texpect(createSku).toHaveBeenCalledWith(\"profile-1\", {\n\t\t\t\tProductId: 99,\n\t\t\t\tName: \"Running Shoe / Black / 42\",\n\t\t\t\tRefId: \"RUN-001-42\",\n\t\t\t\tPackagedHeight: 10,\n\t\t\t\tPackagedLength: 20,\n\t\t\t\tPackagedWidth: 30,\n\t\t\t\tPackagedWeightKg: 1.5,\n\t\t\t\tActivateIfPossible: false,\n\t\t\t\tIsActive: true,\n\t\t\t\tHeight: 9,\n\t\t\t\tLength: 19,\n\t\t\t\tWidth: 29,\n\t\t\t\tWeightKg: 1.25,\n\t\t\t\tMeasurementUnit: \"un\",\n\t\t\t\tUnitMultiplier: 1,\n\t\t\t\tManufacturerCode: \"ACME-42\",\n\t\t\t\tCommercialConditionId: 12,\n\t\t\t});\n\t\t\texpect(createSkuEan).toHaveBeenCalledWith(\n\t\t\t\t\"profile-1\",\n\t\t\t\t\"78\",\n\t\t\t\t\"7791234567890\",\n\t\t\t);\n\t\t\texpect(\n\t\t\t\tvi.mocked(createSku).mock.invocationCallOrder[0],\n\t\t\t).toBeLessThan(vi.mocked(createSkuEan).mock.invocationCallOrder[0]);\n\t\t\texpect(buildWriteSuccessResponse).toHaveBeenCalledWith(\n\t\t\t\texpect.objectContaining({\n\t\t\t\t\tafter: expect.objectContaining({ Eans: [\"7791234567890\"] }),\n\t\t\t\t}),\n\t\t\t);\n\t\t});\n\n\t\tit(\"skips EAN attachment when EAN is missing or blank\", async () => {\n\t\t\tconst createdSku = { Id: 79, Name: skuPayload.name };\n\t\t\tvi.mocked(createSku).mockResolvedValue(createdSku as never);\n\n\t\t\tawait createSkuHandler({\n\t\t\t\t...skuPayload,\n\t\t\t\tean: \" \",\n\t\t\t});\n\n\t\t\texpect(createSkuEan).not.toHaveBeenCalled();\n\t\t});\n\n\t\tit(\"returns profile selection payload when profile resolution fails\", async () => {\n\t\t\tvi.mocked(resolveVtexWriteProfile).mockResolvedValue({\n\t\t\t\tok: false,\n\t\t\t\tresponse: { selection: true },\n\t\t\t} as never);\n\n\t\t\tconst result = await createSkuHandler({\n\t\t\t\tproductId: 99,\n\t\t\t\tname: \"Running Shoe / Black / 42\",\n\t\t\t\trefId: \"RUN-001-42\",\n\t\t\t\tpackagedHeight: 10,\n\t\t\t\tpackagedLength: 20,\n\t\t\t\tpackagedWidth: 30,\n\t\t\t\tpackagedWeightKg: 1.5,\n\t\t\t});\n\n\t\t\texpect(result).toEqual({ selection: true });\n\t\t\texpect(createSku).not.toHaveBeenCalled();\n\t\t\texpect(createSkuEan).not.toHaveBeenCalled();\n\t\t});\n\n\t\tit(\"maps service errors through handleVtexWriteError\", async () => {\n\t\t\tvi.mocked(createSku).mockRejectedValue(new Error(\"boom\"));\n\n\t\t\tconst result = await createSkuHandler(skuPayload);\n\n\t\t\texpect(handleVtexWriteError).toHaveBeenCalledWith(\n\t\t\t\texpect.any(Error),\n\t\t\t\t\"Failed to create SKU in VTEX\",\n\t\t\t);\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"error\",\n\t\t\t\tfallback: \"Failed to create SKU in VTEX\",\n\t\t\t\terr: expect.any(Error),\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"createSpecificationHandler\", () => {\n\t\tit(\"schema converts fieldTypeId from string to number\", () => {\n\t\t\tconst parsed = createSpecificationSchema.parse({\n\t\t\t\tfieldTypeId: \"4\",\n\t\t\t\tfieldGroupId: 12,\n\t\t\t\tname: \"Color\",\n\t\t\t});\n\n\t\t\texpect(parsed.fieldTypeId).toBe(4);\n\t\t});\n\n\t\tit(\"fills default fields before creating a specification\", async () => {\n\t\t\tconst createdSpecification = { Id: 30, Name: \"Color\" };\n\t\t\tvi.mocked(createSpecification).mockResolvedValue(\n\t\t\t\tcreatedSpecification as never,\n\t\t\t);\n\n\t\t\tconst result = await createSpecificationHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tfieldTypeId: 4,\n\t\t\t\tfieldGroupId: 12,\n\t\t\t\tname: \"Color\",\n\t\t\t});\n\n\t\t\texpect(createSpecification).toHaveBeenCalledWith(\"profile-1\", {\n\t\t\t\tFieldTypeId: 4,\n\t\t\t\tFieldGroupId: 12,\n\t\t\t\tName: \"Color\",\n\t\t\t\tCategoryId: undefined,\n\t\t\t\tDescription: null,\n\t\t\t\tPosition: 0,\n\t\t\t\tIsFilter: false,\n\t\t\t\tIsRequired: false,\n\t\t\t\tIsOnProductDetails: true,\n\t\t\t\tIsStockKeepingUnit: false,\n\t\t\t\tIsWizard: false,\n\t\t\t\tIsActive: true,\n\t\t\t\tIsTopMenuLinkActive: false,\n\t\t\t\tIsSideMenuLinkActive: false,\n\t\t\t\tDefaultValue: \"\",\n\t\t\t});\n\t\t\texpect(buildWriteSuccessResponse).toHaveBeenCalledWith({\n\t\t\t\tprofileId: \"profile-1\",\n\t\t\t\toperation: \"create_specification\",\n\t\t\t\tresourceId: \"30\",\n\t\t\t\triskLevel: \"low\",\n\t\t\t\tmessage: \"Specification created successfully.\",\n\t\t\t\tbefore: null,\n\t\t\t\tafter: createdSpecification,\n\t\t\t});\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"success\",\n\t\t\t\tparams: expect.objectContaining({ operation: \"create_specification\" }),\n\t\t\t});\n\t\t});\n\n\t\tit(\"returns profile selection payload when profile resolution fails\", async () => {\n\t\t\tvi.mocked(resolveVtexWriteProfile).mockResolvedValue({\n\t\t\t\tok: false,\n\t\t\t\tresponse: { selection: true },\n\t\t\t} as never);\n\n\t\t\tconst result = await createSpecificationHandler({\n\t\t\t\tfieldTypeId: 4,\n\t\t\t\tfieldGroupId: 12,\n\t\t\t\tname: \"Color\",\n\t\t\t});\n\n\t\t\texpect(result).toEqual({ selection: true });\n\t\t\texpect(createSpecification).not.toHaveBeenCalled();\n\t\t});\n\n\t\tit(\"maps service errors through handleVtexWriteError\", async () => {\n\t\t\tvi.mocked(createSpecification).mockRejectedValue(new Error(\"boom\"));\n\n\t\t\tconst result = await createSpecificationHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tfieldTypeId: 4,\n\t\t\t\tfieldGroupId: 12,\n\t\t\t\tname: \"Color\",\n\t\t\t});\n\n\t\t\texpect(handleVtexWriteError).toHaveBeenCalledWith(\n\t\t\t\texpect.any(Error),\n\t\t\t\t\"Failed to create specification in VTEX\",\n\t\t\t);\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"error\",\n\t\t\t\tfallback: \"Failed to create specification in VTEX\",\n\t\t\t\terr: expect.any(Error),\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"createSpecificationValueHandler\", () => {\n\t\tit(\"fills default fields before creating a specification value\", async () => {\n\t\t\tconst createdValue = { FieldValueId: 40, Name: \"Red\" };\n\t\t\tvi.mocked(createSpecificationValue).mockResolvedValue(\n\t\t\t\tcreatedValue as never,\n\t\t\t);\n\n\t\t\tconst result = await createSpecificationValueHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tfieldId: 30,\n\t\t\t\tname: \"Red\",\n\t\t\t});\n\n\t\t\texpect(createSpecificationValue).toHaveBeenCalledWith(\"profile-1\", {\n\t\t\t\tFieldId: 30,\n\t\t\t\tName: \"Red\",\n\t\t\t\tIsActive: true,\n\t\t\t\tPosition: 0,\n\t\t\t\tText: null,\n\t\t\t});\n\t\t\texpect(buildWriteSuccessResponse).toHaveBeenCalledWith({\n\t\t\t\tprofileId: \"profile-1\",\n\t\t\t\toperation: \"create_specification_value\",\n\t\t\t\tresourceId: \"40\",\n\t\t\t\triskLevel: \"low\",\n\t\t\t\tmessage: \"Specification value created successfully.\",\n\t\t\t\tbefore: null,\n\t\t\t\tafter: createdValue,\n\t\t\t});\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"success\",\n\t\t\t\tparams: expect.objectContaining({\n\t\t\t\t\toperation: \"create_specification_value\",\n\t\t\t\t}),\n\t\t\t});\n\t\t});\n\n\t\tit(\"returns profile selection payload when profile resolution fails\", async () => {\n\t\t\tvi.mocked(resolveVtexWriteProfile).mockResolvedValue({\n\t\t\t\tok: false,\n\t\t\t\tresponse: { selection: true },\n\t\t\t} as never);\n\n\t\t\tconst result = await createSpecificationValueHandler({\n\t\t\t\tfieldId: 30,\n\t\t\t\tname: \"Red\",\n\t\t\t});\n\n\t\t\texpect(result).toEqual({ selection: true });\n\t\t\texpect(createSpecificationValue).not.toHaveBeenCalled();\n\t\t});\n\n\t\tit(\"maps service errors through handleVtexWriteError\", async () => {\n\t\t\tvi.mocked(createSpecificationValue).mockRejectedValue(new Error(\"boom\"));\n\n\t\t\tconst result = await createSpecificationValueHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tfieldId: 30,\n\t\t\t\tname: \"Red\",\n\t\t\t});\n\n\t\t\texpect(handleVtexWriteError).toHaveBeenCalledWith(\n\t\t\t\texpect.any(Error),\n\t\t\t\t\"Failed to create specification value in VTEX\",\n\t\t\t);\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"error\",\n\t\t\t\tfallback: \"Failed to create specification value in VTEX\",\n\t\t\t\terr: expect.any(Error),\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"associateSpecificationHandler\", () => {\n\t\tit(\"routes product associations to the product service and shapes optional payload fields\", async () => {\n\t\t\tconst association = { success: true, id: \"prod-1\" };\n\t\t\tvi.mocked(associateProductSpecification).mockResolvedValue(\n\t\t\t\tassociation as never,\n\t\t\t);\n\n\t\t\tconst result = await associateSpecificationHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tentityType: \"product\",\n\t\t\t\tresourceId: \"prod-1\",\n\t\t\t\tfieldId: 30,\n\t\t\t\tfieldValueId: 40,\n\t\t\t});\n\n\t\t\texpect(associateProductSpecification).toHaveBeenCalledWith(\n\t\t\t\t\"profile-1\",\n\t\t\t\t\"prod-1\",\n\t\t\t\t{\n\t\t\t\t\tFieldId: 30,\n\t\t\t\t\tFieldValueId: 40,\n\t\t\t\t},\n\t\t\t);\n\t\t\texpect(associateSkuSpecification).not.toHaveBeenCalled();\n\t\t\texpect(buildWriteSuccessResponse).toHaveBeenCalledWith({\n\t\t\t\tprofileId: \"profile-1\",\n\t\t\t\toperation: \"associate_specification\",\n\t\t\t\tresourceId: \"prod-1\",\n\t\t\t\triskLevel: \"low\",\n\t\t\t\tmessage: \"Specification associated successfully.\",\n\t\t\t\tbefore: null,\n\t\t\t\tafter: association,\n\t\t\t\tdetails: { entity_type: \"product\" },\n\t\t\t});\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"success\",\n\t\t\t\tparams: expect.objectContaining({\n\t\t\t\t\toperation: \"associate_specification\",\n\t\t\t\t}),\n\t\t\t});\n\t\t});\n\n\t\tit(\"routes sku associations to the sku service and keeps free-text payloads\", async () => {\n\t\t\tconst association = { success: true, id: \"sku-1\" };\n\t\t\tvi.mocked(associateSkuSpecification).mockResolvedValue(\n\t\t\t\tassociation as never,\n\t\t\t);\n\n\t\t\tawait associateSpecificationHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tentityType: \"sku\",\n\t\t\t\tresourceId: \"sku-1\",\n\t\t\t\tfieldId: 30,\n\t\t\t\ttext: \"Blue\",\n\t\t\t});\n\n\t\t\texpect(associateSkuSpecification).toHaveBeenCalledWith(\n\t\t\t\t\"profile-1\",\n\t\t\t\t\"sku-1\",\n\t\t\t\t{\n\t\t\t\t\tFieldId: 30,\n\t\t\t\t\tText: \"Blue\",\n\t\t\t\t},\n\t\t\t);\n\t\t\texpect(associateProductSpecification).not.toHaveBeenCalled();\n\t\t});\n\n\t\tit(\"keeps both FieldValueId and Text when both are provided\", async () => {\n\t\t\tconst association = { success: true, id: \"sku-2\" };\n\t\t\tvi.mocked(associateSkuSpecification).mockResolvedValue(\n\t\t\t\tassociation as never,\n\t\t\t);\n\n\t\t\tawait associateSpecificationHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tentityType: \"sku\",\n\t\t\t\tresourceId: \"sku-2\",\n\t\t\t\tfieldId: 31,\n\t\t\t\tfieldValueId: 41,\n\t\t\t\ttext: \"Navy\",\n\t\t\t});\n\n\t\t\texpect(associateSkuSpecification).toHaveBeenCalledWith(\n\t\t\t\t\"profile-1\",\n\t\t\t\t\"sku-2\",\n\t\t\t\t{\n\t\t\t\t\tFieldId: 31,\n\t\t\t\t\tFieldValueId: 41,\n\t\t\t\t\tText: \"Navy\",\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\n\t\tit(\"returns profile selection payload when profile resolution fails\", async () => {\n\t\t\tvi.mocked(resolveVtexWriteProfile).mockResolvedValue({\n\t\t\t\tok: false,\n\t\t\t\tresponse: { selection: true },\n\t\t\t} as never);\n\n\t\t\tconst result = await associateSpecificationHandler({\n\t\t\t\tentityType: \"product\",\n\t\t\t\tresourceId: \"prod-1\",\n\t\t\t\tfieldId: 30,\n\t\t\t});\n\n\t\t\texpect(result).toEqual({ selection: true });\n\t\t\texpect(associateProductSpecification).not.toHaveBeenCalled();\n\t\t\texpect(associateSkuSpecification).not.toHaveBeenCalled();\n\t\t});\n\n\t\tit(\"maps service errors through handleVtexWriteError\", async () => {\n\t\t\tvi.mocked(associateProductSpecification).mockRejectedValue(\n\t\t\t\tnew Error(\"boom\"),\n\t\t\t);\n\n\t\t\tconst result = await associateSpecificationHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tentityType: \"product\",\n\t\t\t\tresourceId: \"prod-1\",\n\t\t\t\tfieldId: 30,\n\t\t\t});\n\n\t\t\texpect(handleVtexWriteError).toHaveBeenCalledWith(\n\t\t\t\texpect.any(Error),\n\t\t\t\t\"Failed to associate specification to product prod-1\",\n\t\t\t);\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"error\",\n\t\t\t\tfallback: \"Failed to associate specification to product prod-1\",\n\t\t\t\terr: expect.any(Error),\n\t\t\t});\n\t\t});\n\t});\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
getProductOffers,
|
|
4
|
+
getSkuOffers
|
|
5
|
+
} from "../../src/services/vtex/vtex-catalog.js";
|
|
6
|
+
import { getVtexApiClients } from "../../src/services/vtex/vtex-api.js";
|
|
7
|
+
vi.mock("../../src/services/vtex/vtex-api.js", () => ({
|
|
8
|
+
getVtexApiClients: vi.fn()
|
|
9
|
+
}));
|
|
10
|
+
describe("vtex-catalog service", () => {
|
|
11
|
+
const catalogGet = vi.fn();
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
vi.clearAllMocks();
|
|
14
|
+
vi.mocked(getVtexApiClients).mockResolvedValue({
|
|
15
|
+
config: {
|
|
16
|
+
accountName: "test-account",
|
|
17
|
+
apiKey: "key",
|
|
18
|
+
apiToken: "token",
|
|
19
|
+
baseUrl: "https://example.vtex.com",
|
|
20
|
+
pricingBaseUrl: "https://pricing.example.vtex.com"
|
|
21
|
+
},
|
|
22
|
+
vtexApi: {
|
|
23
|
+
get: catalogGet
|
|
24
|
+
},
|
|
25
|
+
vtexPricingApi: {
|
|
26
|
+
get: vi.fn()
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
it("fetches product offers through the general VTEX client", async () => {
|
|
31
|
+
const payload = [{ seller: "1", price: 1e3 }];
|
|
32
|
+
catalogGet.mockResolvedValue({ data: payload });
|
|
33
|
+
const result = await getProductOffers("profile-1", "product-1");
|
|
34
|
+
expect(getVtexApiClients).toHaveBeenCalledWith("profile-1");
|
|
35
|
+
expect(catalogGet).toHaveBeenCalledWith(
|
|
36
|
+
"/api/catalog_system/pub/products/offers/product-1"
|
|
37
|
+
);
|
|
38
|
+
expect(result).toEqual(payload);
|
|
39
|
+
});
|
|
40
|
+
it("fetches SKU offers using both product and sku identifiers", async () => {
|
|
41
|
+
const payload = [{ seller: "1", availableQuantity: 4 }];
|
|
42
|
+
catalogGet.mockResolvedValue({ data: payload });
|
|
43
|
+
const result = await getSkuOffers("profile-1", "product-1", "sku-9");
|
|
44
|
+
expect(getVtexApiClients).toHaveBeenCalledWith("profile-1");
|
|
45
|
+
expect(catalogGet).toHaveBeenCalledWith(
|
|
46
|
+
"/api/catalog_system/pub/products/offers/product-1/sku/sku-9"
|
|
47
|
+
);
|
|
48
|
+
expect(result).toEqual(payload);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=vtex-catalog.service.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../tests/vtex/vtex-catalog.service.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport {\n\tgetProductOffers,\n\tgetSkuOffers,\n} from \"../../src/services/vtex/vtex-catalog.js\";\nimport { getVtexApiClients } from \"../../src/services/vtex/vtex-api.js\";\n\nvi.mock(\"../../src/services/vtex/vtex-api.js\", () => ({\n\tgetVtexApiClients: vi.fn(),\n}));\n\ndescribe(\"vtex-catalog service\", () => {\n\tconst catalogGet = vi.fn();\n\n\tbeforeEach(() => {\n\t\tvi.clearAllMocks();\n\n\t\tvi.mocked(getVtexApiClients).mockResolvedValue({\n\t\t\tconfig: {\n\t\t\t\taccountName: \"test-account\",\n\t\t\t\tapiKey: \"key\",\n\t\t\t\tapiToken: \"token\",\n\t\t\t\tbaseUrl: \"https://example.vtex.com\",\n\t\t\t\tpricingBaseUrl: \"https://pricing.example.vtex.com\",\n\t\t\t},\n\t\t\tvtexApi: {\n\t\t\t\tget: catalogGet,\n\t\t\t} as never,\n\t\t\tvtexPricingApi: {\n\t\t\t\tget: vi.fn(),\n\t\t\t} as never,\n\t\t});\n\t});\n\n\tit(\"fetches product offers through the general VTEX client\", async () => {\n\t\tconst payload = [{ seller: \"1\", price: 1000 }];\n\t\tcatalogGet.mockResolvedValue({ data: payload });\n\n\t\tconst result = await getProductOffers(\"profile-1\", \"product-1\");\n\n\t\texpect(getVtexApiClients).toHaveBeenCalledWith(\"profile-1\");\n\t\texpect(catalogGet).toHaveBeenCalledWith(\n\t\t\t\"/api/catalog_system/pub/products/offers/product-1\",\n\t\t);\n\t\texpect(result).toEqual(payload);\n\t});\n\n\tit(\"fetches SKU offers using both product and sku identifiers\", async () => {\n\t\tconst payload = [{ seller: \"1\", availableQuantity: 4 }];\n\t\tcatalogGet.mockResolvedValue({ data: payload });\n\n\t\tconst result = await getSkuOffers(\"profile-1\", \"product-1\", \"sku-9\");\n\n\t\texpect(getVtexApiClients).toHaveBeenCalledWith(\"profile-1\");\n\t\texpect(catalogGet).toHaveBeenCalledWith(\n\t\t\t\"/api/catalog_system/pub/products/offers/product-1/sku/sku-9\",\n\t\t);\n\t\texpect(result).toEqual(payload);\n\t});\n});\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,YAAY,UAAU,QAAQ,IAAI,UAAU;AAErD;AAAA,EACC;AAAA,EACA;AAAA,OACM;AACP,SAAS,yBAAyB;AAElC,GAAG,KAAK,uCAAuC,OAAO;AAAA,EACrD,mBAAmB,GAAG,GAAG;AAC1B,EAAE;AAEF,SAAS,wBAAwB,MAAM;AACtC,QAAM,aAAa,GAAG,GAAG;AAEzB,aAAW,MAAM;AAChB,OAAG,cAAc;AAEjB,OAAG,OAAO,iBAAiB,EAAE,kBAAkB;AAAA,MAC9C,QAAQ;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,gBAAgB;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,QACR,KAAK;AAAA,MACN;AAAA,MACA,gBAAgB;AAAA,QACf,KAAK,GAAG,GAAG;AAAA,MACZ;AAAA,IACD,CAAC;AAAA,EACF,CAAC;AAED,KAAG,0DAA0D,YAAY;AACxE,UAAM,UAAU,CAAC,EAAE,QAAQ,KAAK,OAAO,IAAK,CAAC;AAC7C,eAAW,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAE9C,UAAM,SAAS,MAAM,iBAAiB,aAAa,WAAW;AAE9D,WAAO,iBAAiB,EAAE,qBAAqB,WAAW;AAC1D,WAAO,UAAU,EAAE;AAAA,MAClB;AAAA,IACD;AACA,WAAO,MAAM,EAAE,QAAQ,OAAO;AAAA,EAC/B,CAAC;AAED,KAAG,6DAA6D,YAAY;AAC3E,UAAM,UAAU,CAAC,EAAE,QAAQ,KAAK,mBAAmB,EAAE,CAAC;AACtD,eAAW,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAE9C,UAAM,SAAS,MAAM,aAAa,aAAa,aAAa,OAAO;AAEnE,WAAO,iBAAiB,EAAE,qBAAqB,WAAW;AAC1D,WAAO,UAAU,EAAE;AAAA,MAClB;AAAA,IACD;AACA,WAAO,MAAM,EAAE,QAAQ,OAAO;AAAA,EAC/B,CAAC;AACF,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
describe("VTEX commercial conditions documentation", () => {
|
|
4
|
+
it("documents the new VTEX payments capability across project docs", async () => {
|
|
5
|
+
const projectStatus = await readFile(new URL("../../docs/PROJECT_STATUS.md", import.meta.url), "utf8");
|
|
6
|
+
const keyEndpoints = await readFile(
|
|
7
|
+
new URL("../../src/services/vtex/docs/vtex-key-endpoints.md", import.meta.url),
|
|
8
|
+
"utf8"
|
|
9
|
+
);
|
|
10
|
+
const dashboardCapabilities = await readFile(
|
|
11
|
+
new URL("../../../bi-mcp-dashboard/docs/content/CAPACIDADES_MCP.md", import.meta.url),
|
|
12
|
+
"utf8"
|
|
13
|
+
);
|
|
14
|
+
expect(projectStatus).toContain("`35` tools VTEX.");
|
|
15
|
+
expect(projectStatus).toContain("condiciones comerciales y reglas de pago");
|
|
16
|
+
expect(keyEndpoints).toContain("Legacy payments endpoints exposed with sandbox caveat");
|
|
17
|
+
expect(keyEndpoints).toContain("`vtex_commercial_conditions`");
|
|
18
|
+
expect(keyEndpoints).toContain("`vtex_payment_rules`");
|
|
19
|
+
expect(dashboardCapabilities).toContain(
|
|
20
|
+
"Gesti\xF3n de Condiciones Comerciales y Reglas de Pago"
|
|
21
|
+
);
|
|
22
|
+
expect(dashboardCapabilities).toContain("`vtex_commercial_conditions`");
|
|
23
|
+
expect(dashboardCapabilities).toContain("`vtex_payment_rules`");
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=vtex-commercial-conditions-docs.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../tests/vtex/vtex-commercial-conditions-docs.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { readFile } from \"node:fs/promises\";\nimport { describe, expect, it } from \"vitest\";\n\ndescribe(\"VTEX commercial conditions documentation\", () => {\n it(\"documents the new VTEX payments capability across project docs\", async () => {\n const projectStatus = await readFile(new URL(\"../../docs/PROJECT_STATUS.md\", import.meta.url), \"utf8\");\n const keyEndpoints = await readFile(\n new URL(\"../../src/services/vtex/docs/vtex-key-endpoints.md\", import.meta.url),\n \"utf8\"\n );\n const dashboardCapabilities = await readFile(\n new URL(\"../../../bi-mcp-dashboard/docs/content/CAPACIDADES_MCP.md\", import.meta.url),\n \"utf8\"\n );\n\n expect(projectStatus).toContain(\"`35` tools VTEX.\");\n expect(projectStatus).toContain(\"condiciones comerciales y reglas de pago\");\n\n expect(keyEndpoints).toContain(\"Legacy payments endpoints exposed with sandbox caveat\");\n expect(keyEndpoints).toContain(\"`vtex_commercial_conditions`\");\n expect(keyEndpoints).toContain(\"`vtex_payment_rules`\");\n\n expect(dashboardCapabilities).toContain(\n \"Gesti\u00F3n de Condiciones Comerciales y Reglas de Pago\"\n );\n expect(dashboardCapabilities).toContain(\"`vtex_commercial_conditions`\");\n expect(dashboardCapabilities).toContain(\"`vtex_payment_rules`\");\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,gBAAgB;AACzB,SAAS,UAAU,QAAQ,UAAU;AAErC,SAAS,4CAA4C,MAAM;AACzD,KAAG,kEAAkE,YAAY;AAC/E,UAAM,gBAAgB,MAAM,SAAS,IAAI,IAAI,gCAAgC,YAAY,GAAG,GAAG,MAAM;AACrG,UAAM,eAAe,MAAM;AAAA,MACzB,IAAI,IAAI,sDAAsD,YAAY,GAAG;AAAA,MAC7E;AAAA,IACF;AACA,UAAM,wBAAwB,MAAM;AAAA,MAClC,IAAI,IAAI,6DAA6D,YAAY,GAAG;AAAA,MACpF;AAAA,IACF;AAEA,WAAO,aAAa,EAAE,UAAU,kBAAkB;AAClD,WAAO,aAAa,EAAE,UAAU,0CAA0C;AAE1E,WAAO,YAAY,EAAE,UAAU,uDAAuD;AACtF,WAAO,YAAY,EAAE,UAAU,8BAA8B;AAC7D,WAAO,YAAY,EAAE,UAAU,sBAAsB;AAErD,WAAO,qBAAqB,EAAE;AAAA,MAC5B;AAAA,IACF;AACA,WAAO,qBAAqB,EAAE,UAAU,8BAA8B;AACtE,WAAO,qBAAqB,EAAE,UAAU,sBAAsB;AAAA,EAChE,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
describe("VTEX commercial conditions server surface", () => {
|
|
4
|
+
it("exports and registers both action-based payments tools", async () => {
|
|
5
|
+
const serverSource = await readFile(new URL("../../index.ts", import.meta.url), "utf8");
|
|
6
|
+
const exportsSource = await readFile(new URL("../../src/tools/vtex/index.ts", import.meta.url), "utf8");
|
|
7
|
+
expect(exportsSource).toContain('export * from "./commercial-conditions.js"');
|
|
8
|
+
expect(exportsSource).toContain('export * from "./payment-rules.js"');
|
|
9
|
+
for (const toolName of ["vtex_commercial_conditions", "vtex_payment_rules"]) {
|
|
10
|
+
const registrationStart = serverSource.indexOf(`name: "${toolName}"`);
|
|
11
|
+
expect(registrationStart, `${toolName} registration exists`).toBeGreaterThan(-1);
|
|
12
|
+
const registrationBlock = serverSource.slice(registrationStart, registrationStart + 900);
|
|
13
|
+
expect(registrationBlock).toContain("readOnlyHint: false");
|
|
14
|
+
expect(registrationBlock).toContain("destructiveHint: true");
|
|
15
|
+
expect(registrationBlock).toContain("openWorldHint: true");
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
it("keeps both tool descriptions business-safe and action-focused", async () => {
|
|
19
|
+
const serverSource = await readFile(new URL("../../index.ts", import.meta.url), "utf8");
|
|
20
|
+
const commercialConditionsStart = serverSource.indexOf('name: "vtex_commercial_conditions"');
|
|
21
|
+
const paymentRulesStart = serverSource.indexOf('name: "vtex_payment_rules"');
|
|
22
|
+
expect(commercialConditionsStart).toBeGreaterThan(-1);
|
|
23
|
+
expect(paymentRulesStart).toBeGreaterThan(-1);
|
|
24
|
+
const commercialConditionsBlock = serverSource.slice(commercialConditionsStart, commercialConditionsStart + 900);
|
|
25
|
+
const paymentRulesBlock = serverSource.slice(paymentRulesStart, paymentRulesStart + 900);
|
|
26
|
+
expect(commercialConditionsBlock).toContain(
|
|
27
|
+
"condition records used by checkout and installment strategies"
|
|
28
|
+
);
|
|
29
|
+
expect(commercialConditionsBlock).toContain("Delete operations require confirmed=true");
|
|
30
|
+
expect(commercialConditionsBlock).not.toContain("sandbox");
|
|
31
|
+
expect(commercialConditionsBlock).not.toContain("production writes");
|
|
32
|
+
expect(commercialConditionsBlock).not.toContain("legacy VTEX Payments endpoints");
|
|
33
|
+
expect(paymentRulesBlock).toContain(
|
|
34
|
+
"rules that map installments, payment systems, and optional commercial-condition restrictions"
|
|
35
|
+
);
|
|
36
|
+
expect(paymentRulesBlock).toContain("Delete operations require confirmed=true");
|
|
37
|
+
expect(paymentRulesBlock).not.toContain("sandbox");
|
|
38
|
+
expect(paymentRulesBlock).not.toContain("production writes");
|
|
39
|
+
expect(paymentRulesBlock).not.toContain("legacy VTEX Payments endpoint");
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=vtex-commercial-conditions-surface.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../tests/vtex/vtex-commercial-conditions-surface.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { readFile } from \"node:fs/promises\";\nimport { describe, expect, it } from \"vitest\";\n\ndescribe(\"VTEX commercial conditions server surface\", () => {\n it(\"exports and registers both action-based payments tools\", async () => {\n const serverSource = await readFile(new URL(\"../../index.ts\", import.meta.url), \"utf8\");\n const exportsSource = await readFile(new URL(\"../../src/tools/vtex/index.ts\", import.meta.url), \"utf8\");\n\n expect(exportsSource).toContain('export * from \"./commercial-conditions.js\"');\n expect(exportsSource).toContain('export * from \"./payment-rules.js\"');\n\n for (const toolName of [\"vtex_commercial_conditions\", \"vtex_payment_rules\"]) {\n const registrationStart = serverSource.indexOf(`name: \"${toolName}\"`);\n expect(registrationStart, `${toolName} registration exists`).toBeGreaterThan(-1);\n\n const registrationBlock = serverSource.slice(registrationStart, registrationStart + 900);\n expect(registrationBlock).toContain(\"readOnlyHint: false\");\n expect(registrationBlock).toContain(\"destructiveHint: true\");\n expect(registrationBlock).toContain(\"openWorldHint: true\");\n }\n });\n\n it(\"keeps both tool descriptions business-safe and action-focused\", async () => {\n const serverSource = await readFile(new URL(\"../../index.ts\", import.meta.url), \"utf8\");\n\n const commercialConditionsStart = serverSource.indexOf('name: \"vtex_commercial_conditions\"');\n const paymentRulesStart = serverSource.indexOf('name: \"vtex_payment_rules\"');\n\n expect(commercialConditionsStart).toBeGreaterThan(-1);\n expect(paymentRulesStart).toBeGreaterThan(-1);\n\n const commercialConditionsBlock = serverSource.slice(commercialConditionsStart, commercialConditionsStart + 900);\n const paymentRulesBlock = serverSource.slice(paymentRulesStart, paymentRulesStart + 900);\n\n expect(commercialConditionsBlock).toContain(\n \"condition records used by checkout and installment strategies\"\n );\n expect(commercialConditionsBlock).toContain(\"Delete operations require confirmed=true\");\n expect(commercialConditionsBlock).not.toContain(\"sandbox\");\n expect(commercialConditionsBlock).not.toContain(\"production writes\");\n expect(commercialConditionsBlock).not.toContain(\"legacy VTEX Payments endpoints\");\n\n expect(paymentRulesBlock).toContain(\n \"rules that map installments, payment systems, and optional commercial-condition restrictions\"\n );\n expect(paymentRulesBlock).toContain(\"Delete operations require confirmed=true\");\n expect(paymentRulesBlock).not.toContain(\"sandbox\");\n expect(paymentRulesBlock).not.toContain(\"production writes\");\n expect(paymentRulesBlock).not.toContain(\"legacy VTEX Payments endpoint\");\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,gBAAgB;AACzB,SAAS,UAAU,QAAQ,UAAU;AAErC,SAAS,6CAA6C,MAAM;AAC1D,KAAG,0DAA0D,YAAY;AACvE,UAAM,eAAe,MAAM,SAAS,IAAI,IAAI,kBAAkB,YAAY,GAAG,GAAG,MAAM;AACtF,UAAM,gBAAgB,MAAM,SAAS,IAAI,IAAI,iCAAiC,YAAY,GAAG,GAAG,MAAM;AAEtG,WAAO,aAAa,EAAE,UAAU,4CAA4C;AAC5E,WAAO,aAAa,EAAE,UAAU,oCAAoC;AAEpE,eAAW,YAAY,CAAC,8BAA8B,oBAAoB,GAAG;AAC3E,YAAM,oBAAoB,aAAa,QAAQ,UAAU,QAAQ,GAAG;AACpE,aAAO,mBAAmB,GAAG,QAAQ,sBAAsB,EAAE,gBAAgB,EAAE;AAE/E,YAAM,oBAAoB,aAAa,MAAM,mBAAmB,oBAAoB,GAAG;AACvF,aAAO,iBAAiB,EAAE,UAAU,qBAAqB;AACzD,aAAO,iBAAiB,EAAE,UAAU,uBAAuB;AAC3D,aAAO,iBAAiB,EAAE,UAAU,qBAAqB;AAAA,IAC3D;AAAA,EACF,CAAC;AAED,KAAG,iEAAiE,YAAY;AAC9E,UAAM,eAAe,MAAM,SAAS,IAAI,IAAI,kBAAkB,YAAY,GAAG,GAAG,MAAM;AAEtF,UAAM,4BAA4B,aAAa,QAAQ,oCAAoC;AAC3F,UAAM,oBAAoB,aAAa,QAAQ,4BAA4B;AAE3E,WAAO,yBAAyB,EAAE,gBAAgB,EAAE;AACpD,WAAO,iBAAiB,EAAE,gBAAgB,EAAE;AAE5C,UAAM,4BAA4B,aAAa,MAAM,2BAA2B,4BAA4B,GAAG;AAC/G,UAAM,oBAAoB,aAAa,MAAM,mBAAmB,oBAAoB,GAAG;AAEvF,WAAO,yBAAyB,EAAE;AAAA,MAChC;AAAA,IACF;AACA,WAAO,yBAAyB,EAAE,UAAU,0CAA0C;AACtF,WAAO,yBAAyB,EAAE,IAAI,UAAU,SAAS;AACzD,WAAO,yBAAyB,EAAE,IAAI,UAAU,mBAAmB;AACnE,WAAO,yBAAyB,EAAE,IAAI,UAAU,gCAAgC;AAEhF,WAAO,iBAAiB,EAAE;AAAA,MACxB;AAAA,IACF;AACA,WAAO,iBAAiB,EAAE,UAAU,0CAA0C;AAC9E,WAAO,iBAAiB,EAAE,IAAI,UAAU,SAAS;AACjD,WAAO,iBAAiB,EAAE,IAAI,UAAU,mBAAmB;AAC3D,WAAO,iBAAiB,EAAE,IAAI,UAAU,+BAA+B;AAAA,EACzE,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
const objectMock = vi.fn((value) => ({ kind: "object", value }));
|
|
4
|
+
const errorMock = vi.fn((message) => ({ kind: "error", message }));
|
|
5
|
+
const createCommercialConditionMock = vi.fn();
|
|
6
|
+
const getCommercialConditionMock = vi.fn();
|
|
7
|
+
const createPaymentRuleMock = vi.fn();
|
|
8
|
+
const getPaymentRuleMock = vi.fn();
|
|
9
|
+
const updateSkuBasicFieldsServiceMock = vi.fn();
|
|
10
|
+
const resolveVtexWriteProfileMock = vi.fn();
|
|
11
|
+
const buildWriteSuccessResponseMock = vi.fn((value) => ({ kind: "write", value }));
|
|
12
|
+
const handleVtexWriteErrorMock = vi.fn((_err, fallback) => ({ kind: "error", message: fallback }));
|
|
13
|
+
const requireExplicitConfirmationMock = vi.fn();
|
|
14
|
+
vi.mock("mcp-use/server", () => ({
|
|
15
|
+
object: objectMock,
|
|
16
|
+
error: errorMock
|
|
17
|
+
}));
|
|
18
|
+
vi.mock("../../src/services/vtex/vtex-payments.js", () => ({
|
|
19
|
+
getCommercialCondition: getCommercialConditionMock,
|
|
20
|
+
listCommercialConditions: vi.fn(),
|
|
21
|
+
getPaymentRule: getPaymentRuleMock,
|
|
22
|
+
listPaymentRules: vi.fn()
|
|
23
|
+
}));
|
|
24
|
+
vi.mock("../../src/services/vtex/vtex-payments-write.js", () => ({
|
|
25
|
+
createCommercialCondition: createCommercialConditionMock,
|
|
26
|
+
updateCommercialCondition: vi.fn(),
|
|
27
|
+
deleteCommercialCondition: vi.fn(),
|
|
28
|
+
createPaymentRule: createPaymentRuleMock,
|
|
29
|
+
updatePaymentRule: vi.fn(),
|
|
30
|
+
deletePaymentRule: vi.fn()
|
|
31
|
+
}));
|
|
32
|
+
vi.mock("../../src/services/vtex/vtex-catalog-write.js", () => ({
|
|
33
|
+
updateSkuBasicFields: updateSkuBasicFieldsServiceMock,
|
|
34
|
+
replaceSkuEans: vi.fn(),
|
|
35
|
+
createProduct: vi.fn(),
|
|
36
|
+
createSku: vi.fn(),
|
|
37
|
+
addSkuEan: vi.fn(),
|
|
38
|
+
getSkuImages: vi.fn(),
|
|
39
|
+
attachSkuImage: vi.fn(),
|
|
40
|
+
updateSkuImage: vi.fn()
|
|
41
|
+
}));
|
|
42
|
+
vi.mock("../../src/tools/vtex/write-helpers.js", () => ({
|
|
43
|
+
vtexProfileIdSchemaField: z.string().trim().min(1).optional().describe("profile"),
|
|
44
|
+
confirmationSchemaField: z.boolean().optional().describe("confirmed"),
|
|
45
|
+
resolveVtexWriteProfile: resolveVtexWriteProfileMock,
|
|
46
|
+
buildWriteSuccessResponse: buildWriteSuccessResponseMock,
|
|
47
|
+
handleVtexWriteError: handleVtexWriteErrorMock,
|
|
48
|
+
requireExplicitConfirmation: requireExplicitConfirmationMock
|
|
49
|
+
}));
|
|
50
|
+
const commercialConditionsModule = await import("../../src/tools/vtex/commercial-conditions.js");
|
|
51
|
+
const paymentRulesModule = await import("../../src/tools/vtex/payment-rules.js");
|
|
52
|
+
const skuModule = await import("../../src/tools/vtex/update-sku-basic-fields.js");
|
|
53
|
+
describe("VTEX commercial conditions business workflow", () => {
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
vi.clearAllMocks();
|
|
56
|
+
resolveVtexWriteProfileMock.mockResolvedValue({
|
|
57
|
+
ok: true,
|
|
58
|
+
value: { profileId: "profile-1" }
|
|
59
|
+
});
|
|
60
|
+
requireExplicitConfirmationMock.mockReturnValue(null);
|
|
61
|
+
});
|
|
62
|
+
it("supports a selective installments workflow for condition-targeted SKUs", async () => {
|
|
63
|
+
createCommercialConditionMock.mockResolvedValue({
|
|
64
|
+
id: 901,
|
|
65
|
+
Name: "9-cuotas-sin-interes",
|
|
66
|
+
IsActive: true
|
|
67
|
+
});
|
|
68
|
+
createPaymentRuleMock.mockResolvedValue({
|
|
69
|
+
id: 902,
|
|
70
|
+
commercialConditionId: 901,
|
|
71
|
+
paymentSystem: "2",
|
|
72
|
+
restrictedByCondition: true,
|
|
73
|
+
installments: [{ count: 9, interest: false }]
|
|
74
|
+
});
|
|
75
|
+
updateSkuBasicFieldsServiceMock.mockResolvedValue({
|
|
76
|
+
before: { Id: 333, CommercialConditionId: 0 },
|
|
77
|
+
after: { Id: 333, CommercialConditionId: 901 }
|
|
78
|
+
});
|
|
79
|
+
getCommercialConditionMock.mockResolvedValue({
|
|
80
|
+
id: 901,
|
|
81
|
+
name: "9-cuotas-sin-interes",
|
|
82
|
+
isActive: true
|
|
83
|
+
});
|
|
84
|
+
getPaymentRuleMock.mockResolvedValueOnce({
|
|
85
|
+
id: 100,
|
|
86
|
+
commercialConditionId: 0,
|
|
87
|
+
paymentSystem: "2",
|
|
88
|
+
restrictedByCondition: false,
|
|
89
|
+
installments: [{ count: 6, interest: false }]
|
|
90
|
+
}).mockResolvedValueOnce({
|
|
91
|
+
id: 902,
|
|
92
|
+
commercialConditionId: 901,
|
|
93
|
+
paymentSystem: "2",
|
|
94
|
+
restrictedByCondition: true,
|
|
95
|
+
installments: [{ count: 9, interest: false }]
|
|
96
|
+
});
|
|
97
|
+
const createdCondition = await commercialConditionsModule.commercialConditionsHandler({
|
|
98
|
+
action: "create",
|
|
99
|
+
profileId: "profile-1",
|
|
100
|
+
name: "9-cuotas-sin-interes",
|
|
101
|
+
isActive: true
|
|
102
|
+
});
|
|
103
|
+
const createdRule = await paymentRulesModule.paymentRulesHandler({
|
|
104
|
+
action: "create",
|
|
105
|
+
profileId: "profile-1",
|
|
106
|
+
commercialConditionId: 901,
|
|
107
|
+
paymentSystem: "2",
|
|
108
|
+
restrictedByCondition: true,
|
|
109
|
+
installments: [{ count: 9, interest: false }]
|
|
110
|
+
});
|
|
111
|
+
const assignedSku = await skuModule.updateSkuBasicFieldsHandler({
|
|
112
|
+
profileId: "profile-1",
|
|
113
|
+
skuId: "333",
|
|
114
|
+
commercialConditionId: 901
|
|
115
|
+
});
|
|
116
|
+
const defaultRule = await paymentRulesModule.paymentRulesHandler({
|
|
117
|
+
action: "get",
|
|
118
|
+
profileId: "profile-1",
|
|
119
|
+
ruleId: 100
|
|
120
|
+
});
|
|
121
|
+
const targetedRule = await paymentRulesModule.paymentRulesHandler({
|
|
122
|
+
action: "get",
|
|
123
|
+
profileId: "profile-1",
|
|
124
|
+
ruleId: 902
|
|
125
|
+
});
|
|
126
|
+
expect(createCommercialConditionMock).toHaveBeenCalledWith("profile-1", {
|
|
127
|
+
Name: "9-cuotas-sin-interes",
|
|
128
|
+
IsActive: true
|
|
129
|
+
});
|
|
130
|
+
expect(createPaymentRuleMock).toHaveBeenCalledWith("profile-1", {
|
|
131
|
+
commercialConditionId: 901,
|
|
132
|
+
paymentSystem: "2",
|
|
133
|
+
restrictedByCondition: true,
|
|
134
|
+
installments: [{ count: 9, interest: false }]
|
|
135
|
+
});
|
|
136
|
+
expect(updateSkuBasicFieldsServiceMock).toHaveBeenCalledWith("profile-1", "333", {
|
|
137
|
+
commercialConditionId: 901
|
|
138
|
+
});
|
|
139
|
+
expect(createdCondition).toMatchObject({
|
|
140
|
+
kind: "write",
|
|
141
|
+
value: {
|
|
142
|
+
operation: "commercial_conditions_create",
|
|
143
|
+
resourceId: "901"
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
expect(createdRule).toMatchObject({
|
|
147
|
+
kind: "write",
|
|
148
|
+
value: {
|
|
149
|
+
operation: "payment_rules_create",
|
|
150
|
+
resourceId: "902"
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
expect(assignedSku).toMatchObject({
|
|
154
|
+
kind: "write",
|
|
155
|
+
value: {
|
|
156
|
+
operation: "update_sku_basic_fields",
|
|
157
|
+
resourceId: "333"
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
expect(defaultRule).toEqual({
|
|
161
|
+
kind: "object",
|
|
162
|
+
value: {
|
|
163
|
+
profile_id: "profile-1",
|
|
164
|
+
rule_id: 100,
|
|
165
|
+
payment_rule: {
|
|
166
|
+
id: 100,
|
|
167
|
+
commercial_condition_id: 0,
|
|
168
|
+
payment_system: "2",
|
|
169
|
+
restricted_by_condition: false,
|
|
170
|
+
installments: [{ count: 6, interest: false }]
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
expect(targetedRule).toEqual({
|
|
175
|
+
kind: "object",
|
|
176
|
+
value: {
|
|
177
|
+
profile_id: "profile-1",
|
|
178
|
+
rule_id: 902,
|
|
179
|
+
payment_rule: {
|
|
180
|
+
id: 902,
|
|
181
|
+
commercial_condition_id: 901,
|
|
182
|
+
payment_system: "2",
|
|
183
|
+
restricted_by_condition: true,
|
|
184
|
+
installments: [{ count: 9, interest: false }]
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
//# sourceMappingURL=vtex-commercial-conditions-workflow.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../tests/vtex/vtex-commercial-conditions-workflow.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { z } from \"zod\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst objectMock = vi.fn((value) => ({ kind: \"object\", value }));\nconst errorMock = vi.fn((message) => ({ kind: \"error\", message }));\n\nconst createCommercialConditionMock = vi.fn();\nconst getCommercialConditionMock = vi.fn();\nconst createPaymentRuleMock = vi.fn();\nconst getPaymentRuleMock = vi.fn();\nconst updateSkuBasicFieldsServiceMock = vi.fn();\n\nconst resolveVtexWriteProfileMock = vi.fn();\nconst buildWriteSuccessResponseMock = vi.fn((value) => ({ kind: \"write\", value }));\nconst handleVtexWriteErrorMock = vi.fn((_err, fallback) => ({ kind: \"error\", message: fallback }));\nconst requireExplicitConfirmationMock = vi.fn();\n\nvi.mock(\"mcp-use/server\", () => ({\n object: objectMock,\n error: errorMock,\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-payments.js\", () => ({\n getCommercialCondition: getCommercialConditionMock,\n listCommercialConditions: vi.fn(),\n getPaymentRule: getPaymentRuleMock,\n listPaymentRules: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-payments-write.js\", () => ({\n createCommercialCondition: createCommercialConditionMock,\n updateCommercialCondition: vi.fn(),\n deleteCommercialCondition: vi.fn(),\n createPaymentRule: createPaymentRuleMock,\n updatePaymentRule: vi.fn(),\n deletePaymentRule: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-catalog-write.js\", () => ({\n updateSkuBasicFields: updateSkuBasicFieldsServiceMock,\n replaceSkuEans: vi.fn(),\n createProduct: vi.fn(),\n createSku: vi.fn(),\n addSkuEan: vi.fn(),\n getSkuImages: vi.fn(),\n attachSkuImage: vi.fn(),\n updateSkuImage: vi.fn(),\n}));\n\nvi.mock(\"../../src/tools/vtex/write-helpers.js\", () => ({\n vtexProfileIdSchemaField: z.string().trim().min(1).optional().describe(\"profile\"),\n confirmationSchemaField: z.boolean().optional().describe(\"confirmed\"),\n resolveVtexWriteProfile: resolveVtexWriteProfileMock,\n buildWriteSuccessResponse: buildWriteSuccessResponseMock,\n handleVtexWriteError: handleVtexWriteErrorMock,\n requireExplicitConfirmation: requireExplicitConfirmationMock,\n}));\n\nconst commercialConditionsModule = await import(\"../../src/tools/vtex/commercial-conditions.js\");\nconst paymentRulesModule = await import(\"../../src/tools/vtex/payment-rules.js\");\nconst skuModule = await import(\"../../src/tools/vtex/update-sku-basic-fields.js\");\n\ndescribe(\"VTEX commercial conditions business workflow\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n resolveVtexWriteProfileMock.mockResolvedValue({\n ok: true,\n value: { profileId: \"profile-1\" },\n });\n requireExplicitConfirmationMock.mockReturnValue(null);\n });\n\n it(\"supports a selective installments workflow for condition-targeted SKUs\", async () => {\n createCommercialConditionMock.mockResolvedValue({\n id: 901,\n Name: \"9-cuotas-sin-interes\",\n IsActive: true,\n });\n createPaymentRuleMock.mockResolvedValue({\n id: 902,\n commercialConditionId: 901,\n paymentSystem: \"2\",\n restrictedByCondition: true,\n installments: [{ count: 9, interest: false }],\n });\n updateSkuBasicFieldsServiceMock.mockResolvedValue({\n before: { Id: 333, CommercialConditionId: 0 },\n after: { Id: 333, CommercialConditionId: 901 },\n });\n getCommercialConditionMock.mockResolvedValue({\n id: 901,\n name: \"9-cuotas-sin-interes\",\n isActive: true,\n });\n getPaymentRuleMock\n .mockResolvedValueOnce({\n id: 100,\n commercialConditionId: 0,\n paymentSystem: \"2\",\n restrictedByCondition: false,\n installments: [{ count: 6, interest: false }],\n })\n .mockResolvedValueOnce({\n id: 902,\n commercialConditionId: 901,\n paymentSystem: \"2\",\n restrictedByCondition: true,\n installments: [{ count: 9, interest: false }],\n });\n\n const createdCondition = await commercialConditionsModule.commercialConditionsHandler({\n action: \"create\",\n profileId: \"profile-1\",\n name: \"9-cuotas-sin-interes\",\n isActive: true,\n });\n\n const createdRule = await paymentRulesModule.paymentRulesHandler({\n action: \"create\",\n profileId: \"profile-1\",\n commercialConditionId: 901,\n paymentSystem: \"2\",\n restrictedByCondition: true,\n installments: [{ count: 9, interest: false }],\n });\n\n const assignedSku = await skuModule.updateSkuBasicFieldsHandler({\n profileId: \"profile-1\",\n skuId: \"333\",\n commercialConditionId: 901,\n });\n\n const defaultRule = await paymentRulesModule.paymentRulesHandler({\n action: \"get\",\n profileId: \"profile-1\",\n ruleId: 100,\n });\n\n const targetedRule = await paymentRulesModule.paymentRulesHandler({\n action: \"get\",\n profileId: \"profile-1\",\n ruleId: 902,\n });\n\n expect(createCommercialConditionMock).toHaveBeenCalledWith(\"profile-1\", {\n Name: \"9-cuotas-sin-interes\",\n IsActive: true,\n });\n expect(createPaymentRuleMock).toHaveBeenCalledWith(\"profile-1\", {\n commercialConditionId: 901,\n paymentSystem: \"2\",\n restrictedByCondition: true,\n installments: [{ count: 9, interest: false }],\n });\n expect(updateSkuBasicFieldsServiceMock).toHaveBeenCalledWith(\"profile-1\", \"333\", {\n commercialConditionId: 901,\n });\n\n expect(createdCondition).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"commercial_conditions_create\",\n resourceId: \"901\",\n },\n });\n expect(createdRule).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"payment_rules_create\",\n resourceId: \"902\",\n },\n });\n expect(assignedSku).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"update_sku_basic_fields\",\n resourceId: \"333\",\n },\n });\n\n expect(defaultRule).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n rule_id: 100,\n payment_rule: {\n id: 100,\n commercial_condition_id: 0,\n payment_system: \"2\",\n restricted_by_condition: false,\n installments: [{ count: 6, interest: false }],\n },\n },\n });\n expect(targetedRule).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n rule_id: 902,\n payment_rule: {\n id: 902,\n commercial_condition_id: 901,\n payment_system: \"2\",\n restricted_by_condition: true,\n installments: [{ count: 9, interest: false }],\n },\n },\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|