@yoryoboy/bi-mcp 1.11.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/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 +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__/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/vtex/vtex-pricing-write-tools.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { z } from \"zod\";\n\nimport { getSkuPrice } from \"../../src/services/vtex/vtex-pricing.js\";\nimport {\n\tdeleteFixedPricesForPriceTable,\n\tupsertFixedPricesForPriceTable,\n} from \"../../src/services/vtex/vtex-pricing-write.js\";\nimport { deleteFixedPriceHandler } from \"../../src/tools/vtex/delete-fixed-price.js\";\nimport { upsertFixedPriceHandler } from \"../../src/tools/vtex/upsert-fixed-price.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-pricing.js\", () => ({\n\tgetSkuPrice: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-pricing-write.js\", () => ({\n\tupsertFixedPricesForPriceTable: vi.fn(),\n\tdeleteFixedPricesForPriceTable: vi.fn(),\n}));\n\ndescribe(\"VTEX pricing 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(\"upsertFixedPriceHandler\", () => {\n\t\tconst fixedPrices = [\n\t\t\t{\n\t\t\t\tvalue: 12999,\n\t\t\t\tlistPrice: 14999,\n\t\t\t\tminQuantity: 1,\n\t\t\t\tdateRange: {\n\t\t\t\t\tfrom: \"2026-06-01T00:00:00Z\",\n\t\t\t\t\tto: \"2026-06-30T23:59:59Z\",\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\n\t\tit(\"fetches before and after price snapshots around the upsert\", async () => {\n\t\t\tconst beforePrice = { itemId: \"sku-1\", fixedPrices: [] };\n\t\t\tconst afterPrice = { itemId: \"sku-1\", fixedPrices };\n\t\t\tvi.mocked(getSkuPrice)\n\t\t\t\t.mockResolvedValueOnce(beforePrice as never)\n\t\t\t\t.mockResolvedValueOnce(afterPrice as never);\n\n\t\t\tconst result = await upsertFixedPriceHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tskuId: \"sku-1\",\n\t\t\t\tpriceTableId: \"trade-1\",\n\t\t\t\tfixedPrices,\n\t\t\t});\n\n\t\t\texpect(getSkuPrice).toHaveBeenNthCalledWith(1, \"profile-1\", \"sku-1\");\n\t\t\texpect(upsertFixedPricesForPriceTable).toHaveBeenCalledWith(\n\t\t\t\t\"profile-1\",\n\t\t\t\t\"sku-1\",\n\t\t\t\t\"trade-1\",\n\t\t\t\tfixedPrices,\n\t\t\t);\n\t\t\texpect(getSkuPrice).toHaveBeenNthCalledWith(2, \"profile-1\", \"sku-1\");\n\t\t\texpect(buildWriteSuccessResponse).toHaveBeenCalledWith({\n\t\t\t\tprofileId: \"profile-1\",\n\t\t\t\toperation: \"upsert_fixed_price\",\n\t\t\t\tresourceId: \"sku-1\",\n\t\t\t\triskLevel: \"low\",\n\t\t\t\tmessage: \"Fixed prices updated successfully for the selected price table.\",\n\t\t\t\tbefore: beforePrice,\n\t\t\t\tafter: afterPrice,\n\t\t\t\tdetails: {\n\t\t\t\t\tsku_id: \"sku-1\",\n\t\t\t\t\tprice_table_id: \"trade-1\",\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: \"upsert_fixed_price\" }),\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 upsertFixedPriceHandler({\n\t\t\t\tskuId: \"sku-1\",\n\t\t\t\tpriceTableId: \"trade-1\",\n\t\t\t\tfixedPrices,\n\t\t\t});\n\n\t\t\texpect(result).toEqual({ selection: true });\n\t\t\texpect(getSkuPrice).not.toHaveBeenCalled();\n\t\t\texpect(upsertFixedPricesForPriceTable).not.toHaveBeenCalled();\n\t\t});\n\n\t\tit(\"maps service errors through handleVtexWriteError\", async () => {\n\t\t\tvi.mocked(getSkuPrice).mockResolvedValue({ itemId: \"sku-1\" } as never);\n\t\t\tvi.mocked(upsertFixedPricesForPriceTable).mockRejectedValue(\n\t\t\t\tnew Error(\"boom\"),\n\t\t\t);\n\n\t\t\tconst result = await upsertFixedPriceHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tskuId: \"sku-1\",\n\t\t\t\tpriceTableId: \"trade-1\",\n\t\t\t\tfixedPrices,\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 update fixed prices for SKU sku-1 on price table trade-1\",\n\t\t\t);\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"error\",\n\t\t\t\tfallback:\n\t\t\t\t\t\"Failed to update fixed prices for SKU sku-1 on price table trade-1\",\n\t\t\t\terr: expect.any(Error),\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"deleteFixedPriceHandler\", () => {\n\t\tit(\"fetches before and after price snapshots around the delete\", async () => {\n\t\t\tconst beforePrice = {\n\t\t\t\titemId: \"sku-2\",\n\t\t\t\tfixedPrices: [{ tradePolicyId: \"trade-2\", value: 9999 }],\n\t\t\t};\n\t\t\tconst afterPrice = { itemId: \"sku-2\", fixedPrices: [] };\n\t\t\tvi.mocked(getSkuPrice)\n\t\t\t\t.mockResolvedValueOnce(beforePrice as never)\n\t\t\t\t.mockResolvedValueOnce(afterPrice as never);\n\n\t\t\tconst result = await deleteFixedPriceHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tskuId: \"sku-2\",\n\t\t\t\tpriceTableId: \"trade-2\",\n\t\t\t});\n\n\t\t\texpect(getSkuPrice).toHaveBeenNthCalledWith(1, \"profile-1\", \"sku-2\");\n\t\t\texpect(deleteFixedPricesForPriceTable).toHaveBeenCalledWith(\n\t\t\t\t\"profile-1\",\n\t\t\t\t\"sku-2\",\n\t\t\t\t\"trade-2\",\n\t\t\t);\n\t\t\texpect(getSkuPrice).toHaveBeenNthCalledWith(2, \"profile-1\", \"sku-2\");\n\t\t\texpect(buildWriteSuccessResponse).toHaveBeenCalledWith({\n\t\t\t\tprofileId: \"profile-1\",\n\t\t\t\toperation: \"delete_fixed_price\",\n\t\t\t\tresourceId: \"sku-2\",\n\t\t\t\triskLevel: \"low\",\n\t\t\t\tmessage: \"Fixed prices deleted successfully for the selected price table.\",\n\t\t\t\tbefore: beforePrice,\n\t\t\t\tafter: afterPrice,\n\t\t\t\tdetails: {\n\t\t\t\t\tsku_id: \"sku-2\",\n\t\t\t\t\tprice_table_id: \"trade-2\",\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: \"delete_fixed_price\" }),\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 deleteFixedPriceHandler({\n\t\t\t\tskuId: \"sku-2\",\n\t\t\t\tpriceTableId: \"trade-2\",\n\t\t\t});\n\n\t\t\texpect(result).toEqual({ selection: true });\n\t\t\texpect(getSkuPrice).not.toHaveBeenCalled();\n\t\t\texpect(deleteFixedPricesForPriceTable).not.toHaveBeenCalled();\n\t\t});\n\n\t\tit(\"maps service errors through handleVtexWriteError\", async () => {\n\t\t\tvi.mocked(getSkuPrice).mockResolvedValue({ itemId: \"sku-2\" } as never);\n\t\t\tvi.mocked(deleteFixedPricesForPriceTable).mockRejectedValue(\n\t\t\t\tnew Error(\"boom\"),\n\t\t\t);\n\n\t\t\tconst result = await deleteFixedPriceHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tskuId: \"sku-2\",\n\t\t\t\tpriceTableId: \"trade-2\",\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 delete fixed prices for SKU sku-2 on price table trade-2\",\n\t\t\t);\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"error\",\n\t\t\t\tfallback:\n\t\t\t\t\t\"Failed to delete fixed prices for SKU sku-2 on price table trade-2\",\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,106 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { getVtexApiClients } from "../../src/services/vtex/vtex-api.js";
|
|
3
|
+
import {
|
|
4
|
+
deleteFixedPricesForPriceTable,
|
|
5
|
+
deleteSkuPrice,
|
|
6
|
+
patchFixedPrices,
|
|
7
|
+
updateSkuPrice,
|
|
8
|
+
upsertFixedPricesForPriceTable
|
|
9
|
+
} from "../../src/services/vtex/vtex-pricing-write.js";
|
|
10
|
+
vi.mock("../../src/services/vtex/vtex-api.js", () => ({
|
|
11
|
+
getVtexApiClients: vi.fn()
|
|
12
|
+
}));
|
|
13
|
+
describe("vtex-pricing-write service", () => {
|
|
14
|
+
const pricingPut = vi.fn();
|
|
15
|
+
const pricingPatch = vi.fn();
|
|
16
|
+
const pricingPost = vi.fn();
|
|
17
|
+
const pricingDelete = vi.fn();
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
vi.clearAllMocks();
|
|
20
|
+
vi.mocked(getVtexApiClients).mockResolvedValue({
|
|
21
|
+
config: {
|
|
22
|
+
accountName: "test-account",
|
|
23
|
+
apiKey: "key",
|
|
24
|
+
apiToken: "token",
|
|
25
|
+
baseUrl: "https://example.vtex.com",
|
|
26
|
+
pricingBaseUrl: "https://pricing.example.vtex.com"
|
|
27
|
+
},
|
|
28
|
+
vtexApi: {
|
|
29
|
+
get: vi.fn()
|
|
30
|
+
},
|
|
31
|
+
vtexPricingApi: {
|
|
32
|
+
put: pricingPut,
|
|
33
|
+
patch: pricingPatch,
|
|
34
|
+
post: pricingPost,
|
|
35
|
+
delete: pricingDelete
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
it("updates a sku price through the pricing client", async () => {
|
|
40
|
+
const payload = {
|
|
41
|
+
basePrice: 100,
|
|
42
|
+
costPrice: 80,
|
|
43
|
+
markup: 25,
|
|
44
|
+
listPrice: 120
|
|
45
|
+
};
|
|
46
|
+
pricingPut.mockResolvedValue({ data: null });
|
|
47
|
+
await updateSkuPrice("profile-1", "sku-123", payload);
|
|
48
|
+
expect(getVtexApiClients).toHaveBeenCalledWith("profile-1");
|
|
49
|
+
expect(pricingPut).toHaveBeenCalledWith("/pricing/prices/sku-123", payload);
|
|
50
|
+
});
|
|
51
|
+
it("patches fixed prices through the pricing client", async () => {
|
|
52
|
+
const payload = [
|
|
53
|
+
{
|
|
54
|
+
minQuantity: 1,
|
|
55
|
+
value: 100,
|
|
56
|
+
listPrice: 120
|
|
57
|
+
}
|
|
58
|
+
];
|
|
59
|
+
pricingPatch.mockResolvedValue({ data: null });
|
|
60
|
+
await patchFixedPrices("profile-1", "sku-123", payload);
|
|
61
|
+
expect(getVtexApiClients).toHaveBeenCalledWith("profile-1");
|
|
62
|
+
expect(pricingPatch).toHaveBeenCalledWith(
|
|
63
|
+
"/pricing/prices/sku-123/fixed",
|
|
64
|
+
payload
|
|
65
|
+
);
|
|
66
|
+
});
|
|
67
|
+
it("upserts fixed prices for a price table through the pricing client", async () => {
|
|
68
|
+
const payload = [
|
|
69
|
+
{
|
|
70
|
+
minQuantity: 1,
|
|
71
|
+
value: 100,
|
|
72
|
+
dateRange: {
|
|
73
|
+
from: "2026-06-01T00:00:00Z",
|
|
74
|
+
to: "2026-06-30T23:59:59Z"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
];
|
|
78
|
+
pricingPost.mockResolvedValue({ data: null });
|
|
79
|
+
await upsertFixedPricesForPriceTable(
|
|
80
|
+
"profile-1",
|
|
81
|
+
"sku-123",
|
|
82
|
+
"trade-1",
|
|
83
|
+
payload
|
|
84
|
+
);
|
|
85
|
+
expect(getVtexApiClients).toHaveBeenCalledWith("profile-1");
|
|
86
|
+
expect(pricingPost).toHaveBeenCalledWith(
|
|
87
|
+
"/pricing/prices/sku-123/fixed/trade-1",
|
|
88
|
+
payload
|
|
89
|
+
);
|
|
90
|
+
});
|
|
91
|
+
it("deletes fixed prices for a price table through the pricing client", async () => {
|
|
92
|
+
pricingDelete.mockResolvedValue({ data: null });
|
|
93
|
+
await deleteFixedPricesForPriceTable("profile-1", "sku-123", "trade-1");
|
|
94
|
+
expect(getVtexApiClients).toHaveBeenCalledWith("profile-1");
|
|
95
|
+
expect(pricingDelete).toHaveBeenCalledWith(
|
|
96
|
+
"/pricing/prices/sku-123/fixed/trade-1"
|
|
97
|
+
);
|
|
98
|
+
});
|
|
99
|
+
it("deletes a sku price through the pricing client", async () => {
|
|
100
|
+
pricingDelete.mockResolvedValue({ data: null });
|
|
101
|
+
await deleteSkuPrice("profile-1", "sku-123");
|
|
102
|
+
expect(getVtexApiClients).toHaveBeenCalledWith("profile-1");
|
|
103
|
+
expect(pricingDelete).toHaveBeenCalledWith("/pricing/prices/sku-123");
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=vtex-pricing-write.service.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../tests/vtex/vtex-pricing-write.service.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { getVtexApiClients } from \"../../src/services/vtex/vtex-api.js\";\nimport {\n\tdeleteFixedPricesForPriceTable,\n\tdeleteSkuPrice,\n\tpatchFixedPrices,\n\tupdateSkuPrice,\n\tupsertFixedPricesForPriceTable,\n} from \"../../src/services/vtex/vtex-pricing-write.js\";\n\nvi.mock(\"../../src/services/vtex/vtex-api.js\", () => ({\n\tgetVtexApiClients: vi.fn(),\n}));\n\ndescribe(\"vtex-pricing-write service\", () => {\n\tconst pricingPut = vi.fn();\n\tconst pricingPatch = vi.fn();\n\tconst pricingPost = vi.fn();\n\tconst pricingDelete = 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: vi.fn(),\n\t\t\t} as never,\n\t\t\tvtexPricingApi: {\n\t\t\t\tput: pricingPut,\n\t\t\t\tpatch: pricingPatch,\n\t\t\t\tpost: pricingPost,\n\t\t\t\tdelete: pricingDelete,\n\t\t\t} as never,\n\t\t});\n\t});\n\n\tit(\"updates a sku price through the pricing client\", async () => {\n\t\tconst payload = {\n\t\t\tbasePrice: 100,\n\t\t\tcostPrice: 80,\n\t\t\tmarkup: 25,\n\t\t\tlistPrice: 120,\n\t\t};\n\t\tpricingPut.mockResolvedValue({ data: null });\n\n\t\tawait updateSkuPrice(\"profile-1\", \"sku-123\", payload);\n\n\t\texpect(getVtexApiClients).toHaveBeenCalledWith(\"profile-1\");\n\t\texpect(pricingPut).toHaveBeenCalledWith(\"/pricing/prices/sku-123\", payload);\n\t});\n\n\tit(\"patches fixed prices through the pricing client\", async () => {\n\t\tconst payload = [\n\t\t\t{\n\t\t\t\tminQuantity: 1,\n\t\t\t\tvalue: 100,\n\t\t\t\tlistPrice: 120,\n\t\t\t},\n\t\t];\n\t\tpricingPatch.mockResolvedValue({ data: null });\n\n\t\tawait patchFixedPrices(\"profile-1\", \"sku-123\", payload);\n\n\t\texpect(getVtexApiClients).toHaveBeenCalledWith(\"profile-1\");\n\t\texpect(pricingPatch).toHaveBeenCalledWith(\n\t\t\t\"/pricing/prices/sku-123/fixed\",\n\t\t\tpayload,\n\t\t);\n\t});\n\n\tit(\"upserts fixed prices for a price table through the pricing client\", async () => {\n\t\tconst payload = [\n\t\t\t{\n\t\t\t\tminQuantity: 1,\n\t\t\t\tvalue: 100,\n\t\t\t\tdateRange: {\n\t\t\t\t\tfrom: \"2026-06-01T00:00:00Z\",\n\t\t\t\t\tto: \"2026-06-30T23:59:59Z\",\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t\tpricingPost.mockResolvedValue({ data: null });\n\n\t\tawait upsertFixedPricesForPriceTable(\n\t\t\t\"profile-1\",\n\t\t\t\"sku-123\",\n\t\t\t\"trade-1\",\n\t\t\tpayload,\n\t\t);\n\n\t\texpect(getVtexApiClients).toHaveBeenCalledWith(\"profile-1\");\n\t\texpect(pricingPost).toHaveBeenCalledWith(\n\t\t\t\"/pricing/prices/sku-123/fixed/trade-1\",\n\t\t\tpayload,\n\t\t);\n\t});\n\n\tit(\"deletes fixed prices for a price table through the pricing client\", async () => {\n\t\tpricingDelete.mockResolvedValue({ data: null });\n\n\t\tawait deleteFixedPricesForPriceTable(\"profile-1\", \"sku-123\", \"trade-1\");\n\n\t\texpect(getVtexApiClients).toHaveBeenCalledWith(\"profile-1\");\n\t\texpect(pricingDelete).toHaveBeenCalledWith(\n\t\t\t\"/pricing/prices/sku-123/fixed/trade-1\",\n\t\t);\n\t});\n\n\tit(\"deletes a sku price through the pricing client\", async () => {\n\t\tpricingDelete.mockResolvedValue({ data: null });\n\n\t\tawait deleteSkuPrice(\"profile-1\", \"sku-123\");\n\n\t\texpect(getVtexApiClients).toHaveBeenCalledWith(\"profile-1\");\n\t\texpect(pricingDelete).toHaveBeenCalledWith(\"/pricing/prices/sku-123\");\n\t});\n});\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,YAAY,UAAU,QAAQ,IAAI,UAAU;AAErD,SAAS,yBAAyB;AAClC;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAEP,GAAG,KAAK,uCAAuC,OAAO;AAAA,EACrD,mBAAmB,GAAG,GAAG;AAC1B,EAAE;AAEF,SAAS,8BAA8B,MAAM;AAC5C,QAAM,aAAa,GAAG,GAAG;AACzB,QAAM,eAAe,GAAG,GAAG;AAC3B,QAAM,cAAc,GAAG,GAAG;AAC1B,QAAM,gBAAgB,GAAG,GAAG;AAE5B,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,GAAG,GAAG;AAAA,MACZ;AAAA,MACA,gBAAgB;AAAA,QACf,KAAK;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,QAAQ;AAAA,MACT;AAAA,IACD,CAAC;AAAA,EACF,CAAC;AAED,KAAG,kDAAkD,YAAY;AAChE,UAAM,UAAU;AAAA,MACf,WAAW;AAAA,MACX,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,WAAW;AAAA,IACZ;AACA,eAAW,kBAAkB,EAAE,MAAM,KAAK,CAAC;AAE3C,UAAM,eAAe,aAAa,WAAW,OAAO;AAEpD,WAAO,iBAAiB,EAAE,qBAAqB,WAAW;AAC1D,WAAO,UAAU,EAAE,qBAAqB,2BAA2B,OAAO;AAAA,EAC3E,CAAC;AAED,KAAG,mDAAmD,YAAY;AACjE,UAAM,UAAU;AAAA,MACf;AAAA,QACC,aAAa;AAAA,QACb,OAAO;AAAA,QACP,WAAW;AAAA,MACZ;AAAA,IACD;AACA,iBAAa,kBAAkB,EAAE,MAAM,KAAK,CAAC;AAE7C,UAAM,iBAAiB,aAAa,WAAW,OAAO;AAEtD,WAAO,iBAAiB,EAAE,qBAAqB,WAAW;AAC1D,WAAO,YAAY,EAAE;AAAA,MACpB;AAAA,MACA;AAAA,IACD;AAAA,EACD,CAAC;AAED,KAAG,qEAAqE,YAAY;AACnF,UAAM,UAAU;AAAA,MACf;AAAA,QACC,aAAa;AAAA,QACb,OAAO;AAAA,QACP,WAAW;AAAA,UACV,MAAM;AAAA,UACN,IAAI;AAAA,QACL;AAAA,MACD;AAAA,IACD;AACA,gBAAY,kBAAkB,EAAE,MAAM,KAAK,CAAC;AAE5C,UAAM;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAEA,WAAO,iBAAiB,EAAE,qBAAqB,WAAW;AAC1D,WAAO,WAAW,EAAE;AAAA,MACnB;AAAA,MACA;AAAA,IACD;AAAA,EACD,CAAC;AAED,KAAG,qEAAqE,YAAY;AACnF,kBAAc,kBAAkB,EAAE,MAAM,KAAK,CAAC;AAE9C,UAAM,+BAA+B,aAAa,WAAW,SAAS;AAEtE,WAAO,iBAAiB,EAAE,qBAAqB,WAAW;AAC1D,WAAO,aAAa,EAAE;AAAA,MACrB;AAAA,IACD;AAAA,EACD,CAAC;AAED,KAAG,kDAAkD,YAAY;AAChE,kBAAc,kBAAkB,EAAE,MAAM,KAAK,CAAC;AAE9C,UAAM,eAAe,aAAa,SAAS;AAE3C,WAAO,iBAAiB,EAAE,qBAAqB,WAAW;AAC1D,WAAO,aAAa,EAAE,qBAAqB,yBAAyB;AAAA,EACrE,CAAC;AACF,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
getComputedPrice,
|
|
4
|
+
getSkuPrice
|
|
5
|
+
} from "../../src/services/vtex/vtex-pricing.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-pricing service", () => {
|
|
11
|
+
const pricingGet = 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: vi.fn()
|
|
24
|
+
},
|
|
25
|
+
vtexPricingApi: {
|
|
26
|
+
get: pricingGet
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
it("fetches a SKU price through the pricing client and returns response data", async () => {
|
|
31
|
+
pricingGet.mockResolvedValue({
|
|
32
|
+
data: {
|
|
33
|
+
itemId: "sku-123",
|
|
34
|
+
listPrice: 15e3,
|
|
35
|
+
costPrice: 1e4,
|
|
36
|
+
markup: 1.5,
|
|
37
|
+
basePrice: 14e3,
|
|
38
|
+
fixedPrices: []
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
const result = await getSkuPrice("profile-1", "sku-123");
|
|
42
|
+
expect(getVtexApiClients).toHaveBeenCalledWith("profile-1");
|
|
43
|
+
expect(pricingGet).toHaveBeenCalledWith("/pricing/prices/sku-123");
|
|
44
|
+
expect(result).toEqual({
|
|
45
|
+
itemId: "sku-123",
|
|
46
|
+
listPrice: 15e3,
|
|
47
|
+
costPrice: 1e4,
|
|
48
|
+
markup: 1.5,
|
|
49
|
+
basePrice: 14e3,
|
|
50
|
+
fixedPrices: []
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
it("fetches computed pricing with the provided params", async () => {
|
|
54
|
+
pricingGet.mockResolvedValue({
|
|
55
|
+
data: {
|
|
56
|
+
tradePolicyId: "1",
|
|
57
|
+
listPrice: 16e3,
|
|
58
|
+
costPrice: 1e4,
|
|
59
|
+
sellingPrice: 15e3,
|
|
60
|
+
priceValidUntil: "2026-06-30T00:00:00Z"
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
const result = await getComputedPrice("profile-1", "sku-123", "default", {
|
|
64
|
+
categoryId: 10,
|
|
65
|
+
brandId: 20,
|
|
66
|
+
quantity: 3
|
|
67
|
+
});
|
|
68
|
+
expect(getVtexApiClients).toHaveBeenCalledWith("profile-1");
|
|
69
|
+
expect(pricingGet).toHaveBeenCalledWith(
|
|
70
|
+
"/pricing/prices/sku-123/computed/default",
|
|
71
|
+
{
|
|
72
|
+
params: {
|
|
73
|
+
categoryId: 10,
|
|
74
|
+
brandId: 20,
|
|
75
|
+
quantity: 3
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
expect(result).toEqual({
|
|
80
|
+
tradePolicyId: "1",
|
|
81
|
+
listPrice: 16e3,
|
|
82
|
+
costPrice: 1e4,
|
|
83
|
+
sellingPrice: 15e3,
|
|
84
|
+
priceValidUntil: "2026-06-30T00:00:00Z"
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=vtex-pricing.service.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../tests/vtex/vtex-pricing.service.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport {\n\tgetComputedPrice,\n\tgetSkuPrice,\n} from \"../../src/services/vtex/vtex-pricing.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-pricing service\", () => {\n\tconst pricingGet = 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: vi.fn(),\n\t\t\t} as never,\n\t\t\tvtexPricingApi: {\n\t\t\t\tget: pricingGet,\n\t\t\t} as never,\n\t\t});\n\t});\n\n\tit(\"fetches a SKU price through the pricing client and returns response data\", async () => {\n\t\tpricingGet.mockResolvedValue({\n\t\t\tdata: {\n\t\t\t\titemId: \"sku-123\",\n\t\t\t\tlistPrice: 15000,\n\t\t\t\tcostPrice: 10000,\n\t\t\t\tmarkup: 1.5,\n\t\t\t\tbasePrice: 14000,\n\t\t\t\tfixedPrices: [],\n\t\t\t},\n\t\t});\n\n\t\tconst result = await getSkuPrice(\"profile-1\", \"sku-123\");\n\n\t\texpect(getVtexApiClients).toHaveBeenCalledWith(\"profile-1\");\n\t\texpect(pricingGet).toHaveBeenCalledWith(\"/pricing/prices/sku-123\");\n\t\texpect(result).toEqual({\n\t\t\titemId: \"sku-123\",\n\t\t\tlistPrice: 15000,\n\t\t\tcostPrice: 10000,\n\t\t\tmarkup: 1.5,\n\t\t\tbasePrice: 14000,\n\t\t\tfixedPrices: [],\n\t\t});\n\t});\n\n\tit(\"fetches computed pricing with the provided params\", async () => {\n\t\tpricingGet.mockResolvedValue({\n\t\t\tdata: {\n\t\t\t\ttradePolicyId: \"1\",\n\t\t\t\tlistPrice: 16000,\n\t\t\t\tcostPrice: 10000,\n\t\t\t\tsellingPrice: 15000,\n\t\t\t\tpriceValidUntil: \"2026-06-30T00:00:00Z\",\n\t\t\t},\n\t\t});\n\n\t\tconst result = await getComputedPrice(\"profile-1\", \"sku-123\", \"default\", {\n\t\t\tcategoryId: 10,\n\t\t\tbrandId: 20,\n\t\t\tquantity: 3,\n\t\t});\n\n\t\texpect(getVtexApiClients).toHaveBeenCalledWith(\"profile-1\");\n\t\texpect(pricingGet).toHaveBeenCalledWith(\n\t\t\t\"/pricing/prices/sku-123/computed/default\",\n\t\t\t{\n\t\t\t\tparams: {\n\t\t\t\t\tcategoryId: 10,\n\t\t\t\t\tbrandId: 20,\n\t\t\t\t\tquantity: 3,\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\texpect(result).toEqual({\n\t\t\ttradePolicyId: \"1\",\n\t\t\tlistPrice: 16000,\n\t\t\tcostPrice: 10000,\n\t\t\tsellingPrice: 15000,\n\t\t\tpriceValidUntil: \"2026-06-30T00:00:00Z\",\n\t\t});\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,GAAG,GAAG;AAAA,MACZ;AAAA,MACA,gBAAgB;AAAA,QACf,KAAK;AAAA,MACN;AAAA,IACD,CAAC;AAAA,EACF,CAAC;AAED,KAAG,4EAA4E,YAAY;AAC1F,eAAW,kBAAkB;AAAA,MAC5B,MAAM;AAAA,QACL,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,aAAa,CAAC;AAAA,MACf;AAAA,IACD,CAAC;AAED,UAAM,SAAS,MAAM,YAAY,aAAa,SAAS;AAEvD,WAAO,iBAAiB,EAAE,qBAAqB,WAAW;AAC1D,WAAO,UAAU,EAAE,qBAAqB,yBAAyB;AACjE,WAAO,MAAM,EAAE,QAAQ;AAAA,MACtB,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,aAAa,CAAC;AAAA,IACf,CAAC;AAAA,EACF,CAAC;AAED,KAAG,qDAAqD,YAAY;AACnE,eAAW,kBAAkB;AAAA,MAC5B,MAAM;AAAA,QACL,eAAe;AAAA,QACf,WAAW;AAAA,QACX,WAAW;AAAA,QACX,cAAc;AAAA,QACd,iBAAiB;AAAA,MAClB;AAAA,IACD,CAAC;AAED,UAAM,SAAS,MAAM,iBAAiB,aAAa,WAAW,WAAW;AAAA,MACxE,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,UAAU;AAAA,IACX,CAAC;AAED,WAAO,iBAAiB,EAAE,qBAAqB,WAAW;AAC1D,WAAO,UAAU,EAAE;AAAA,MAClB;AAAA,MACA;AAAA,QACC,QAAQ;AAAA,UACP,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,UAAU;AAAA,QACX;AAAA,MACD;AAAA,IACD;AACA,WAAO,MAAM,EAAE,QAAQ;AAAA,MACtB,eAAe;AAAA,MACf,WAAW;AAAA,MACX,WAAW;AAAA,MACX,cAAc;AAAA,MACd,iBAAiB;AAAA,IAClB,CAAC;AAAA,EACF,CAAC;AACF,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { computedPriceHandler } from "../../src/tools/vtex/computed-price.js";
|
|
3
|
+
import { productOffersHandler } from "../../src/tools/vtex/product-offers.js";
|
|
4
|
+
import { resolveVtexProfileOrSelection } from "../../src/tools/vtex/profile-resolution.js";
|
|
5
|
+
import { skuOffersHandler } from "../../src/tools/vtex/sku-offers.js";
|
|
6
|
+
import { skuPriceHandler } from "../../src/tools/vtex/sku-price.js";
|
|
7
|
+
import {
|
|
8
|
+
getProductOffers,
|
|
9
|
+
getSkuOffers
|
|
10
|
+
} from "../../src/services/vtex/vtex-catalog.js";
|
|
11
|
+
import { formatVtexError } from "../../src/services/vtex/vtex-api.js";
|
|
12
|
+
import {
|
|
13
|
+
getComputedPrice,
|
|
14
|
+
getSkuPrice
|
|
15
|
+
} from "../../src/services/vtex/vtex-pricing.js";
|
|
16
|
+
vi.mock("mcp-use/server", () => ({
|
|
17
|
+
object: vi.fn((payload) => ({ kind: "object", payload })),
|
|
18
|
+
error: vi.fn((message) => ({ kind: "error", message }))
|
|
19
|
+
}));
|
|
20
|
+
vi.mock("../../src/tools/vtex/profile-resolution.js", () => ({
|
|
21
|
+
resolveVtexProfileOrSelection: vi.fn()
|
|
22
|
+
}));
|
|
23
|
+
vi.mock("../../src/services/vtex/vtex-pricing.js", () => ({
|
|
24
|
+
getSkuPrice: vi.fn(),
|
|
25
|
+
getComputedPrice: vi.fn()
|
|
26
|
+
}));
|
|
27
|
+
vi.mock("../../src/services/vtex/vtex-catalog.js", () => ({
|
|
28
|
+
getProductOffers: vi.fn(),
|
|
29
|
+
getSkuOffers: vi.fn()
|
|
30
|
+
}));
|
|
31
|
+
vi.mock("../../src/services/vtex/vtex-api.js", () => ({
|
|
32
|
+
formatVtexError: vi.fn(
|
|
33
|
+
(err, fallback) => `formatted:${fallback}:${err instanceof Error ? err.message : String(err)}`
|
|
34
|
+
)
|
|
35
|
+
}));
|
|
36
|
+
describe("small VTEX read-only tools", () => {
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
vi.clearAllMocks();
|
|
39
|
+
vi.mocked(resolveVtexProfileOrSelection).mockResolvedValue({
|
|
40
|
+
ok: true,
|
|
41
|
+
value: { profileId: "profile-1" }
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
it("formats sku price output", async () => {
|
|
45
|
+
vi.mocked(getSkuPrice).mockResolvedValue({
|
|
46
|
+
itemId: "sku-123",
|
|
47
|
+
listPrice: 15e3,
|
|
48
|
+
costPrice: 1e4,
|
|
49
|
+
markup: 1.5,
|
|
50
|
+
basePrice: 14e3,
|
|
51
|
+
fixedPrices: [
|
|
52
|
+
{
|
|
53
|
+
minQuantity: 2,
|
|
54
|
+
tradePolicyId: "1",
|
|
55
|
+
dateRange: { from: "2026-06-01", to: "2026-06-30" },
|
|
56
|
+
value: 12e3,
|
|
57
|
+
listPrice: 16e3
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
});
|
|
61
|
+
const result = await skuPriceHandler({
|
|
62
|
+
profileId: "custom",
|
|
63
|
+
itemId: "sku-123"
|
|
64
|
+
});
|
|
65
|
+
expect(resolveVtexProfileOrSelection).toHaveBeenCalledWith("custom");
|
|
66
|
+
expect(getSkuPrice).toHaveBeenCalledWith("profile-1", "sku-123");
|
|
67
|
+
expect(result).toEqual({
|
|
68
|
+
kind: "object",
|
|
69
|
+
payload: {
|
|
70
|
+
profile_id: "profile-1",
|
|
71
|
+
item_id: "sku-123",
|
|
72
|
+
list_price: 150,
|
|
73
|
+
cost_price: 100,
|
|
74
|
+
base_price: 140,
|
|
75
|
+
markup: 1.5,
|
|
76
|
+
fixed_prices: [
|
|
77
|
+
{
|
|
78
|
+
min_quantity: 2,
|
|
79
|
+
trade_policy_id: "1",
|
|
80
|
+
date_range: { from: "2026-06-01", to: "2026-06-30" },
|
|
81
|
+
value: 120,
|
|
82
|
+
list_price: 160
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
it("formats computed price output", async () => {
|
|
89
|
+
vi.mocked(getComputedPrice).mockResolvedValue({
|
|
90
|
+
tradePolicyId: "1",
|
|
91
|
+
listPrice: 16e3,
|
|
92
|
+
costPrice: 1e4,
|
|
93
|
+
sellingPrice: 15e3,
|
|
94
|
+
priceValidUntil: "2026-06-30T00:00:00Z"
|
|
95
|
+
});
|
|
96
|
+
const result = await computedPriceHandler({
|
|
97
|
+
profileId: "custom",
|
|
98
|
+
itemId: "sku-123",
|
|
99
|
+
priceTableId: "default",
|
|
100
|
+
categoryId: 10,
|
|
101
|
+
brandId: 20,
|
|
102
|
+
quantity: 3
|
|
103
|
+
});
|
|
104
|
+
expect(getComputedPrice).toHaveBeenCalledWith(
|
|
105
|
+
"profile-1",
|
|
106
|
+
"sku-123",
|
|
107
|
+
"default",
|
|
108
|
+
{
|
|
109
|
+
categoryId: 10,
|
|
110
|
+
brandId: 20,
|
|
111
|
+
quantity: 3
|
|
112
|
+
}
|
|
113
|
+
);
|
|
114
|
+
expect(result).toEqual({
|
|
115
|
+
kind: "object",
|
|
116
|
+
payload: {
|
|
117
|
+
profile_id: "profile-1",
|
|
118
|
+
item_id: "sku-123",
|
|
119
|
+
price_table_id: "default",
|
|
120
|
+
trade_policy_id: "1",
|
|
121
|
+
list_price: 160,
|
|
122
|
+
cost_price: 100,
|
|
123
|
+
selling_price: 150,
|
|
124
|
+
price_valid_until: "2026-06-30T00:00:00Z"
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
it("formats product offers output with snake_case keys", async () => {
|
|
129
|
+
vi.mocked(getProductOffers).mockResolvedValue([
|
|
130
|
+
{ sellerId: "1", availableQuantity: 4, listPrice: 15e3 }
|
|
131
|
+
]);
|
|
132
|
+
const result = await productOffersHandler({
|
|
133
|
+
profileId: "custom",
|
|
134
|
+
productId: "prod-1"
|
|
135
|
+
});
|
|
136
|
+
expect(getProductOffers).toHaveBeenCalledWith("profile-1", "prod-1");
|
|
137
|
+
expect(result).toEqual({
|
|
138
|
+
kind: "object",
|
|
139
|
+
payload: {
|
|
140
|
+
profile_id: "profile-1",
|
|
141
|
+
product_id: "prod-1",
|
|
142
|
+
offers: [{ seller_id: "1", available_quantity: 4, list_price: 15e3 }]
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
it("formats sku offers output with snake_case keys", async () => {
|
|
147
|
+
vi.mocked(getSkuOffers).mockResolvedValue([
|
|
148
|
+
{ sellerId: "1", availableQuantity: 2, tradePolicyId: "3" }
|
|
149
|
+
]);
|
|
150
|
+
const result = await skuOffersHandler({
|
|
151
|
+
profileId: "custom",
|
|
152
|
+
productId: "prod-1",
|
|
153
|
+
skuId: "sku-9"
|
|
154
|
+
});
|
|
155
|
+
expect(getSkuOffers).toHaveBeenCalledWith("profile-1", "prod-1", "sku-9");
|
|
156
|
+
expect(result).toEqual({
|
|
157
|
+
kind: "object",
|
|
158
|
+
payload: {
|
|
159
|
+
profile_id: "profile-1",
|
|
160
|
+
product_id: "prod-1",
|
|
161
|
+
sku_id: "sku-9",
|
|
162
|
+
offers: [
|
|
163
|
+
{ seller_id: "1", available_quantity: 2, trade_policy_id: "3" }
|
|
164
|
+
]
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
it("returns profile selection payload unchanged when resolution fails", async () => {
|
|
169
|
+
vi.mocked(resolveVtexProfileOrSelection).mockResolvedValue({
|
|
170
|
+
ok: false,
|
|
171
|
+
response: { selection: true }
|
|
172
|
+
});
|
|
173
|
+
const result = await skuPriceHandler({ itemId: "sku-123" });
|
|
174
|
+
expect(result).toEqual({ selection: true });
|
|
175
|
+
expect(getSkuPrice).not.toHaveBeenCalled();
|
|
176
|
+
});
|
|
177
|
+
it("formats service failures through formatVtexError", async () => {
|
|
178
|
+
vi.mocked(getSkuPrice).mockRejectedValue(new Error("boom"));
|
|
179
|
+
const result = await skuPriceHandler({
|
|
180
|
+
profileId: "custom",
|
|
181
|
+
itemId: "sku-123"
|
|
182
|
+
});
|
|
183
|
+
expect(formatVtexError).toHaveBeenCalled();
|
|
184
|
+
expect(result).toEqual({
|
|
185
|
+
kind: "error",
|
|
186
|
+
message: "formatted:Failed to fetch SKU price for item sku-123:boom"
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
//# sourceMappingURL=vtex-small-tools.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../tests/vtex/vtex-small-tools.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { computedPriceHandler } from \"../../src/tools/vtex/computed-price.js\";\nimport { productOffersHandler } from \"../../src/tools/vtex/product-offers.js\";\nimport { resolveVtexProfileOrSelection } from \"../../src/tools/vtex/profile-resolution.js\";\nimport { skuOffersHandler } from \"../../src/tools/vtex/sku-offers.js\";\nimport { skuPriceHandler } from \"../../src/tools/vtex/sku-price.js\";\nimport {\n\tgetProductOffers,\n\tgetSkuOffers,\n} from \"../../src/services/vtex/vtex-catalog.js\";\nimport { formatVtexError } from \"../../src/services/vtex/vtex-api.js\";\nimport {\n\tgetComputedPrice,\n\tgetSkuPrice,\n} from \"../../src/services/vtex/vtex-pricing.js\";\n\nvi.mock(\"mcp-use/server\", () => ({\n\tobject: vi.fn((payload: unknown) => ({ kind: \"object\", payload })),\n\terror: vi.fn((message: string) => ({ kind: \"error\", message })),\n}));\n\nvi.mock(\"../../src/tools/vtex/profile-resolution.js\", () => ({\n\tresolveVtexProfileOrSelection: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-pricing.js\", () => ({\n\tgetSkuPrice: vi.fn(),\n\tgetComputedPrice: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-catalog.js\", () => ({\n\tgetProductOffers: vi.fn(),\n\tgetSkuOffers: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-api.js\", () => ({\n\tformatVtexError: vi.fn(\n\t\t(err: unknown, fallback: string) =>\n\t\t\t`formatted:${fallback}:${err instanceof Error ? err.message : String(err)}`,\n\t),\n}));\n\ndescribe(\"small VTEX read-only tools\", () => {\n\tbeforeEach(() => {\n\t\tvi.clearAllMocks();\n\t\tvi.mocked(resolveVtexProfileOrSelection).mockResolvedValue({\n\t\t\tok: true,\n\t\t\tvalue: { profileId: \"profile-1\" },\n\t\t});\n\t});\n\n\tit(\"formats sku price output\", async () => {\n\t\tvi.mocked(getSkuPrice).mockResolvedValue({\n\t\t\titemId: \"sku-123\",\n\t\t\tlistPrice: 15000,\n\t\t\tcostPrice: 10000,\n\t\t\tmarkup: 1.5,\n\t\t\tbasePrice: 14000,\n\t\t\tfixedPrices: [\n\t\t\t\t{\n\t\t\t\t\tminQuantity: 2,\n\t\t\t\t\ttradePolicyId: \"1\",\n\t\t\t\t\tdateRange: { from: \"2026-06-01\", to: \"2026-06-30\" },\n\t\t\t\t\tvalue: 12000,\n\t\t\t\t\tlistPrice: 16000,\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\n\t\tconst result = await skuPriceHandler({\n\t\t\tprofileId: \"custom\",\n\t\t\titemId: \"sku-123\",\n\t\t});\n\n\t\texpect(resolveVtexProfileOrSelection).toHaveBeenCalledWith(\"custom\");\n\t\texpect(getSkuPrice).toHaveBeenCalledWith(\"profile-1\", \"sku-123\");\n\t\texpect(result).toEqual({\n\t\t\tkind: \"object\",\n\t\t\tpayload: {\n\t\t\t\tprofile_id: \"profile-1\",\n\t\t\t\titem_id: \"sku-123\",\n\t\t\t\tlist_price: 150,\n\t\t\t\tcost_price: 100,\n\t\t\t\tbase_price: 140,\n\t\t\t\tmarkup: 1.5,\n\t\t\t\tfixed_prices: [\n\t\t\t\t\t{\n\t\t\t\t\t\tmin_quantity: 2,\n\t\t\t\t\t\ttrade_policy_id: \"1\",\n\t\t\t\t\t\tdate_range: { from: \"2026-06-01\", to: \"2026-06-30\" },\n\t\t\t\t\t\tvalue: 120,\n\t\t\t\t\t\tlist_price: 160,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t});\n\t});\n\n\tit(\"formats computed price output\", async () => {\n\t\tvi.mocked(getComputedPrice).mockResolvedValue({\n\t\t\ttradePolicyId: \"1\",\n\t\t\tlistPrice: 16000,\n\t\t\tcostPrice: 10000,\n\t\t\tsellingPrice: 15000,\n\t\t\tpriceValidUntil: \"2026-06-30T00:00:00Z\",\n\t\t});\n\n\t\tconst result = await computedPriceHandler({\n\t\t\tprofileId: \"custom\",\n\t\t\titemId: \"sku-123\",\n\t\t\tpriceTableId: \"default\",\n\t\t\tcategoryId: 10,\n\t\t\tbrandId: 20,\n\t\t\tquantity: 3,\n\t\t});\n\n\t\texpect(getComputedPrice).toHaveBeenCalledWith(\n\t\t\t\"profile-1\",\n\t\t\t\"sku-123\",\n\t\t\t\"default\",\n\t\t\t{\n\t\t\t\tcategoryId: 10,\n\t\t\t\tbrandId: 20,\n\t\t\t\tquantity: 3,\n\t\t\t},\n\t\t);\n\t\texpect(result).toEqual({\n\t\t\tkind: \"object\",\n\t\t\tpayload: {\n\t\t\t\tprofile_id: \"profile-1\",\n\t\t\t\titem_id: \"sku-123\",\n\t\t\t\tprice_table_id: \"default\",\n\t\t\t\ttrade_policy_id: \"1\",\n\t\t\t\tlist_price: 160,\n\t\t\t\tcost_price: 100,\n\t\t\t\tselling_price: 150,\n\t\t\t\tprice_valid_until: \"2026-06-30T00:00:00Z\",\n\t\t\t},\n\t\t});\n\t});\n\n\tit(\"formats product offers output with snake_case keys\", async () => {\n\t\tvi.mocked(getProductOffers).mockResolvedValue([\n\t\t\t{ sellerId: \"1\", availableQuantity: 4, listPrice: 15000 },\n\t\t]);\n\n\t\tconst result = await productOffersHandler({\n\t\t\tprofileId: \"custom\",\n\t\t\tproductId: \"prod-1\",\n\t\t});\n\n\t\texpect(getProductOffers).toHaveBeenCalledWith(\"profile-1\", \"prod-1\");\n\t\texpect(result).toEqual({\n\t\t\tkind: \"object\",\n\t\t\tpayload: {\n\t\t\t\tprofile_id: \"profile-1\",\n\t\t\t\tproduct_id: \"prod-1\",\n\t\t\t\toffers: [{ seller_id: \"1\", available_quantity: 4, list_price: 15000 }],\n\t\t\t},\n\t\t});\n\t});\n\n\tit(\"formats sku offers output with snake_case keys\", async () => {\n\t\tvi.mocked(getSkuOffers).mockResolvedValue([\n\t\t\t{ sellerId: \"1\", availableQuantity: 2, tradePolicyId: \"3\" },\n\t\t]);\n\n\t\tconst result = await skuOffersHandler({\n\t\t\tprofileId: \"custom\",\n\t\t\tproductId: \"prod-1\",\n\t\t\tskuId: \"sku-9\",\n\t\t});\n\n\t\texpect(getSkuOffers).toHaveBeenCalledWith(\"profile-1\", \"prod-1\", \"sku-9\");\n\t\texpect(result).toEqual({\n\t\t\tkind: \"object\",\n\t\t\tpayload: {\n\t\t\t\tprofile_id: \"profile-1\",\n\t\t\t\tproduct_id: \"prod-1\",\n\t\t\t\tsku_id: \"sku-9\",\n\t\t\t\toffers: [\n\t\t\t\t\t{ seller_id: \"1\", available_quantity: 2, trade_policy_id: \"3\" },\n\t\t\t\t],\n\t\t\t},\n\t\t});\n\t});\n\n\tit(\"returns profile selection payload unchanged when resolution fails\", async () => {\n\t\tvi.mocked(resolveVtexProfileOrSelection).mockResolvedValue({\n\t\t\tok: false,\n\t\t\tresponse: { selection: true },\n\t\t} as never);\n\n\t\tconst result = await skuPriceHandler({ itemId: \"sku-123\" });\n\n\t\texpect(result).toEqual({ selection: true });\n\t\texpect(getSkuPrice).not.toHaveBeenCalled();\n\t});\n\n\tit(\"formats service failures through formatVtexError\", async () => {\n\t\tvi.mocked(getSkuPrice).mockRejectedValue(new Error(\"boom\"));\n\n\t\tconst result = await skuPriceHandler({\n\t\t\tprofileId: \"custom\",\n\t\t\titemId: \"sku-123\",\n\t\t});\n\n\t\texpect(formatVtexError).toHaveBeenCalled();\n\t\texpect(result).toEqual({\n\t\t\tkind: \"error\",\n\t\t\tmessage: \"formatted:Failed to fetch SKU price for item sku-123:boom\",\n\t\t});\n\t});\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|