@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.
Files changed (261) hide show
  1. package/README.md +4 -5
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/index.js +426 -6
  4. package/dist/index.js.map +2 -2
  5. package/dist/mcp-use.json +2 -2
  6. package/dist/src/config/__tests__/meta.test.js +35 -0
  7. package/dist/src/config/__tests__/meta.test.js.map +7 -0
  8. package/dist/src/config/meta-store.js +109 -0
  9. package/dist/src/config/meta-store.js.map +7 -0
  10. package/dist/src/config/meta.js +0 -2
  11. package/dist/src/config/meta.js.map +2 -2
  12. package/dist/src/meta/__tests__/meta-utils.test.js +155 -0
  13. package/dist/src/meta/__tests__/meta-utils.test.js.map +7 -0
  14. package/dist/src/services/mercadolibre/__tests__/mercadolibre-api.test.js +265 -0
  15. package/dist/src/services/mercadolibre/__tests__/mercadolibre-api.test.js.map +7 -0
  16. package/dist/src/services/mercadolibre/__tests__/mercadolibre-items.test.js +311 -0
  17. package/dist/src/services/mercadolibre/__tests__/mercadolibre-items.test.js.map +7 -0
  18. package/dist/src/services/mercadolibre/__tests__/mercadolibre-orders.test.js +220 -0
  19. package/dist/src/services/mercadolibre/__tests__/mercadolibre-orders.test.js.map +7 -0
  20. package/dist/src/services/meta/__tests__/meta-ads.test.js +126 -0
  21. package/dist/src/services/meta/__tests__/meta-ads.test.js.map +7 -0
  22. package/dist/src/services/meta/__tests__/meta-api.test.js +70 -0
  23. package/dist/src/services/meta/__tests__/meta-api.test.js.map +7 -0
  24. package/dist/src/services/meta/meta-ads.js +94 -40
  25. package/dist/src/services/meta/meta-ads.js.map +2 -2
  26. package/dist/src/services/meta/meta-api.js +8 -6
  27. package/dist/src/services/meta/meta-api.js.map +2 -2
  28. package/dist/src/services/vtex/__tests__/vtex-catalog-write-batch.test.js +165 -0
  29. package/dist/src/services/vtex/__tests__/vtex-catalog-write-batch.test.js.map +7 -0
  30. package/dist/src/services/vtex/__tests__/vtex-catalog-write-eans.test.js +92 -0
  31. package/dist/src/services/vtex/__tests__/vtex-catalog-write-eans.test.js.map +7 -0
  32. package/dist/src/services/vtex/__tests__/vtex-catalog-write-products.test.js +41 -0
  33. package/dist/src/services/vtex/__tests__/vtex-catalog-write-products.test.js.map +7 -0
  34. package/dist/src/services/vtex/__tests__/vtex-catalog.test.js +80 -0
  35. package/dist/src/services/vtex/__tests__/vtex-catalog.test.js.map +7 -0
  36. package/dist/src/services/vtex/__tests__/vtex-orders-write-http.test.js +85 -0
  37. package/dist/src/services/vtex/__tests__/vtex-orders-write-http.test.js.map +7 -0
  38. package/dist/src/services/vtex/__tests__/vtex-orders-write-state-validation.test.js +251 -0
  39. package/dist/src/services/vtex/__tests__/vtex-orders-write-state-validation.test.js.map +7 -0
  40. package/dist/src/services/vtex/__tests__/vtex-payments.test.js +95 -0
  41. package/dist/src/services/vtex/__tests__/vtex-payments.test.js.map +7 -0
  42. package/dist/src/services/vtex/__tests__/vtex-write.test.js +111 -0
  43. package/dist/src/services/vtex/__tests__/vtex-write.test.js.map +7 -0
  44. package/dist/src/services/vtex/vtex-catalog-write.js +194 -1
  45. package/dist/src/services/vtex/vtex-catalog-write.js.map +2 -2
  46. package/dist/src/services/vtex/vtex-catalog.js +118 -1
  47. package/dist/src/services/vtex/vtex-catalog.js.map +2 -2
  48. package/dist/src/services/vtex/vtex-payments-write.js +64 -0
  49. package/dist/src/services/vtex/vtex-payments-write.js.map +7 -0
  50. package/dist/src/services/vtex/vtex-payments.js +43 -0
  51. package/dist/src/services/vtex/vtex-payments.js.map +7 -0
  52. package/dist/src/services/vtex/vtex-pricing-write.js +5 -0
  53. package/dist/src/services/vtex/vtex-pricing-write.js.map +2 -2
  54. package/dist/src/services/vtex/vtex-write.js +67 -1
  55. package/dist/src/services/vtex/vtex-write.js.map +2 -2
  56. package/dist/src/tools/config/list-profiles.js +37 -6
  57. package/dist/src/tools/config/list-profiles.js.map +2 -2
  58. package/dist/src/tools/index.js.map +2 -2
  59. package/dist/src/tools/mercadolibre/__tests__/helpers.test.js +37 -0
  60. package/dist/src/tools/mercadolibre/__tests__/helpers.test.js.map +7 -0
  61. package/dist/src/tools/mercadolibre/__tests__/profile-resolution.test.js +30 -0
  62. package/dist/src/tools/mercadolibre/__tests__/profile-resolution.test.js.map +7 -0
  63. package/dist/src/tools/mercadolibre/profile-resolution.js +4 -50
  64. package/dist/src/tools/mercadolibre/profile-resolution.js.map +2 -2
  65. package/dist/src/tools/meta/__tests__/pagination.test.js +133 -0
  66. package/dist/src/tools/meta/__tests__/pagination.test.js.map +7 -0
  67. package/dist/src/tools/meta/__tests__/profile-access.test.js +262 -0
  68. package/dist/src/tools/meta/__tests__/profile-access.test.js.map +7 -0
  69. package/dist/src/tools/meta/__tests__/read-tools.test.js +722 -0
  70. package/dist/src/tools/meta/__tests__/read-tools.test.js.map +7 -0
  71. package/dist/src/tools/meta/__tests__/schemas.test.js +103 -0
  72. package/dist/src/tools/meta/__tests__/schemas.test.js.map +7 -0
  73. package/dist/src/tools/meta/account-overview.js +37 -19
  74. package/dist/src/tools/meta/account-overview.js.map +2 -2
  75. package/dist/src/tools/meta/ad-account-info.js +31 -6
  76. package/dist/src/tools/meta/ad-account-info.js.map +2 -2
  77. package/dist/src/tools/meta/ads-performance.js +35 -21
  78. package/dist/src/tools/meta/ads-performance.js.map +2 -2
  79. package/dist/src/tools/meta/campaign-performance.js +35 -18
  80. package/dist/src/tools/meta/campaign-performance.js.map +2 -2
  81. package/dist/src/tools/meta/list-accessible-ad-accounts.js +39 -10
  82. package/dist/src/tools/meta/list-accessible-ad-accounts.js.map +2 -2
  83. package/dist/src/tools/meta/list-accessible-businesses.js +37 -13
  84. package/dist/src/tools/meta/list-accessible-businesses.js.map +2 -2
  85. package/dist/src/tools/meta/placement-mix.js +37 -22
  86. package/dist/src/tools/meta/placement-mix.js.map +2 -2
  87. package/dist/src/tools/meta/profile-access.js +215 -0
  88. package/dist/src/tools/meta/profile-access.js.map +7 -0
  89. package/dist/src/tools/meta/schema-helpers.js +19 -0
  90. package/dist/src/tools/meta/schema-helpers.js.map +7 -0
  91. package/dist/src/tools/meta/time-series.js +40 -23
  92. package/dist/src/tools/meta/time-series.js.map +2 -2
  93. package/dist/src/tools/vtex/__tests__/catalog-admin-batch.test.js +233 -0
  94. package/dist/src/tools/vtex/__tests__/catalog-admin-batch.test.js.map +7 -0
  95. package/dist/src/tools/vtex/__tests__/catalog-admin-categories.test.js +649 -0
  96. package/dist/src/tools/vtex/__tests__/catalog-admin-categories.test.js.map +7 -0
  97. package/dist/src/tools/vtex/__tests__/catalog-admin-product-specifications.test.js +339 -0
  98. package/dist/src/tools/vtex/__tests__/catalog-admin-product-specifications.test.js.map +7 -0
  99. package/dist/src/tools/vtex/__tests__/catalog-admin-products-skus.test.js +235 -0
  100. package/dist/src/tools/vtex/__tests__/catalog-admin-products-skus.test.js.map +7 -0
  101. package/dist/src/tools/vtex/__tests__/catalog-navigation-reads.test.js +372 -0
  102. package/dist/src/tools/vtex/__tests__/catalog-navigation-reads.test.js.map +7 -0
  103. package/dist/src/tools/vtex/__tests__/catalog-navigation-surface.test.js +57 -0
  104. package/dist/src/tools/vtex/__tests__/catalog-navigation-surface.test.js.map +7 -0
  105. package/dist/src/tools/vtex/__tests__/commercial-condition-references.test.js +14 -0
  106. package/dist/src/tools/vtex/__tests__/commercial-condition-references.test.js.map +7 -0
  107. package/dist/src/tools/vtex/__tests__/commercial-conditions.test.js +276 -0
  108. package/dist/src/tools/vtex/__tests__/commercial-conditions.test.js.map +7 -0
  109. package/dist/src/tools/vtex/__tests__/payment-rules.test.js +253 -0
  110. package/dist/src/tools/vtex/__tests__/payment-rules.test.js.map +7 -0
  111. package/dist/src/tools/vtex/__tests__/write-helpers.test.js +97 -0
  112. package/dist/src/tools/vtex/__tests__/write-helpers.test.js.map +7 -0
  113. package/dist/src/tools/vtex/activate-sku.js +1 -48
  114. package/dist/src/tools/vtex/activate-sku.js.map +2 -2
  115. package/dist/src/tools/vtex/associate-specification.js +3 -54
  116. package/dist/src/tools/vtex/associate-specification.js.map +2 -2
  117. package/dist/src/tools/vtex/attach-catalog-image.js +3 -57
  118. package/dist/src/tools/vtex/attach-catalog-image.js.map +2 -2
  119. package/dist/src/tools/vtex/catalog-admin-batch.js +298 -0
  120. package/dist/src/tools/vtex/catalog-admin-batch.js.map +7 -0
  121. package/dist/src/tools/vtex/catalog-admin-categories.js +542 -0
  122. package/dist/src/tools/vtex/catalog-admin-categories.js.map +7 -0
  123. package/dist/src/tools/vtex/catalog-admin-product-specifications.js +275 -0
  124. package/dist/src/tools/vtex/catalog-admin-product-specifications.js.map +7 -0
  125. package/dist/src/tools/vtex/catalog-admin-products-skus.js +477 -0
  126. package/dist/src/tools/vtex/catalog-admin-products-skus.js.map +7 -0
  127. package/dist/src/tools/vtex/catalog-navigation-reads.js +430 -0
  128. package/dist/src/tools/vtex/catalog-navigation-reads.js.map +7 -0
  129. package/dist/src/tools/vtex/commercial-conditions.js +220 -0
  130. package/dist/src/tools/vtex/commercial-conditions.js.map +7 -0
  131. package/dist/src/tools/vtex/create-brand.js +1 -64
  132. package/dist/src/tools/vtex/create-brand.js.map +2 -2
  133. package/dist/src/tools/vtex/create-category.js +1 -76
  134. package/dist/src/tools/vtex/create-category.js.map +2 -2
  135. package/dist/src/tools/vtex/create-product-with-sku.js +3 -114
  136. package/dist/src/tools/vtex/create-product-with-sku.js.map +2 -2
  137. package/dist/src/tools/vtex/create-sku.js +3 -1
  138. package/dist/src/tools/vtex/create-sku.js.map +2 -2
  139. package/dist/src/tools/vtex/create-specification-value.js +3 -47
  140. package/dist/src/tools/vtex/create-specification-value.js.map +2 -2
  141. package/dist/src/tools/vtex/create-specification.js +1 -80
  142. package/dist/src/tools/vtex/create-specification.js.map +2 -2
  143. package/dist/src/tools/vtex/deactivate-sku.js +1 -48
  144. package/dist/src/tools/vtex/deactivate-sku.js.map +2 -2
  145. package/dist/src/tools/vtex/delete-all-product-specifications.js +9 -0
  146. package/dist/src/tools/vtex/delete-all-product-specifications.js.map +7 -0
  147. package/dist/src/tools/vtex/delete-all-sku-specifications.js +9 -0
  148. package/dist/src/tools/vtex/delete-all-sku-specifications.js.map +7 -0
  149. package/dist/src/tools/vtex/delete-brand.js +9 -0
  150. package/dist/src/tools/vtex/delete-brand.js.map +7 -0
  151. package/dist/src/tools/vtex/delete-catalog-image.js +9 -0
  152. package/dist/src/tools/vtex/delete-catalog-image.js.map +7 -0
  153. package/dist/src/tools/vtex/delete-product-specification.js +9 -0
  154. package/dist/src/tools/vtex/delete-product-specification.js.map +7 -0
  155. package/dist/src/tools/vtex/delete-sku-price.js +55 -0
  156. package/dist/src/tools/vtex/delete-sku-price.js.map +7 -0
  157. package/dist/src/tools/vtex/delete-sku-specification.js +9 -0
  158. package/dist/src/tools/vtex/delete-sku-specification.js.map +7 -0
  159. package/dist/src/tools/vtex/get-brand.js +6 -0
  160. package/dist/src/tools/vtex/get-brand.js.map +7 -0
  161. package/dist/src/tools/vtex/get-category-tree.js +6 -0
  162. package/dist/src/tools/vtex/get-category-tree.js.map +7 -0
  163. package/dist/src/tools/vtex/get-category.js +6 -0
  164. package/dist/src/tools/vtex/get-category.js.map +7 -0
  165. package/dist/src/tools/vtex/get-product-specifications.js +9 -0
  166. package/dist/src/tools/vtex/get-product-specifications.js.map +7 -0
  167. package/dist/src/tools/vtex/get-product.js +6 -0
  168. package/dist/src/tools/vtex/get-product.js.map +7 -0
  169. package/dist/src/tools/vtex/get-sku.js +6 -0
  170. package/dist/src/tools/vtex/get-sku.js.map +7 -0
  171. package/dist/src/tools/vtex/index.js +25 -1
  172. package/dist/src/tools/vtex/index.js.map +2 -2
  173. package/dist/src/tools/vtex/list-brands.js +6 -0
  174. package/dist/src/tools/vtex/list-brands.js.map +7 -0
  175. package/dist/src/tools/vtex/list-categories.js +6 -0
  176. package/dist/src/tools/vtex/list-categories.js.map +7 -0
  177. package/dist/src/tools/vtex/list-products-by-category.js +6 -0
  178. package/dist/src/tools/vtex/list-products-by-category.js.map +7 -0
  179. package/dist/src/tools/vtex/list-products.js +6 -0
  180. package/dist/src/tools/vtex/list-products.js.map +7 -0
  181. package/dist/src/tools/vtex/list-skus-by-product.js +6 -0
  182. package/dist/src/tools/vtex/list-skus-by-product.js.map +7 -0
  183. package/dist/src/tools/vtex/list-specification-groups.js +9 -0
  184. package/dist/src/tools/vtex/list-specification-groups.js.map +7 -0
  185. package/dist/src/tools/vtex/move-category.js +6 -0
  186. package/dist/src/tools/vtex/move-category.js.map +7 -0
  187. package/dist/src/tools/vtex/payment-rules.js +229 -0
  188. package/dist/src/tools/vtex/payment-rules.js.map +7 -0
  189. package/dist/src/tools/vtex/profile-resolution.js +4 -51
  190. package/dist/src/tools/vtex/profile-resolution.js.map +2 -2
  191. package/dist/src/tools/vtex/update-brand.js +6 -0
  192. package/dist/src/tools/vtex/update-brand.js.map +7 -0
  193. package/dist/src/tools/vtex/update-category.js +6 -0
  194. package/dist/src/tools/vtex/update-category.js.map +7 -0
  195. package/dist/src/tools/vtex/update-product-basic-fields.js +3 -65
  196. package/dist/src/tools/vtex/update-product-basic-fields.js.map +2 -2
  197. package/dist/src/tools/vtex/update-sku-basic-fields.js +1 -87
  198. package/dist/src/tools/vtex/update-sku-basic-fields.js.map +2 -2
  199. package/dist/src/tools/vtex/update-sku-price.js +21 -1
  200. package/dist/src/tools/vtex/update-sku-price.js.map +2 -2
  201. package/dist/src/tools/vtex/write-helpers.js +104 -14
  202. package/dist/src/tools/vtex/write-helpers.js.map +2 -2
  203. package/dist/src/utils/provider-profile-selection.js +117 -0
  204. package/dist/src/utils/provider-profile-selection.js.map +7 -0
  205. package/dist/tests/meli/mercadolibre-tool-handlers-medium-batch4.test.js +678 -0
  206. package/dist/tests/meli/mercadolibre-tool-handlers-medium-batch4.test.js.map +7 -0
  207. package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch5.test.js +564 -0
  208. package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch5.test.js.map +7 -0
  209. package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch6.test.js +387 -0
  210. package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch6.test.js.map +7 -0
  211. package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch7.test.js +368 -0
  212. package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch7.test.js.map +7 -0
  213. package/dist/tests/meli/mercadolibre-tool-handlers-small.test.js +626 -0
  214. package/dist/tests/meli/mercadolibre-tool-handlers-small.test.js.map +7 -0
  215. package/dist/tests/meli/mercadolibre-tool-handlers-write-batch8.test.js +480 -0
  216. package/dist/tests/meli/mercadolibre-tool-handlers-write-batch8.test.js.map +7 -0
  217. package/dist/tests/setup.js +2 -0
  218. package/dist/tests/setup.js.map +7 -0
  219. package/dist/tests/smoke/test-harness.test.js +7 -0
  220. package/dist/tests/smoke/test-harness.test.js.map +7 -0
  221. package/dist/tests/vtex/read-only-utils.test.js +161 -0
  222. package/dist/tests/vtex/read-only-utils.test.js.map +7 -0
  223. package/dist/tests/vtex/vtex-catalog-admin-docs.test.js +24 -0
  224. package/dist/tests/vtex/vtex-catalog-admin-docs.test.js.map +7 -0
  225. package/dist/tests/vtex/vtex-catalog-admin-surface.test.js +30 -0
  226. package/dist/tests/vtex/vtex-catalog-admin-surface.test.js.map +7 -0
  227. package/dist/tests/vtex/vtex-catalog-write-tools.test.js +712 -0
  228. package/dist/tests/vtex/vtex-catalog-write-tools.test.js.map +7 -0
  229. package/dist/tests/vtex/vtex-catalog.service.test.js +51 -0
  230. package/dist/tests/vtex/vtex-catalog.service.test.js.map +7 -0
  231. package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js +26 -0
  232. package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js.map +7 -0
  233. package/dist/tests/vtex/vtex-commercial-conditions-surface.test.js +42 -0
  234. package/dist/tests/vtex/vtex-commercial-conditions-surface.test.js.map +7 -0
  235. package/dist/tests/vtex/vtex-commercial-conditions-workflow.test.js +190 -0
  236. package/dist/tests/vtex/vtex-commercial-conditions-workflow.test.js.map +7 -0
  237. package/dist/tests/vtex/vtex-inventory-tools.test.js +201 -0
  238. package/dist/tests/vtex/vtex-inventory-tools.test.js.map +7 -0
  239. package/dist/tests/vtex/vtex-logistics.service.test.js +134 -0
  240. package/dist/tests/vtex/vtex-logistics.service.test.js.map +7 -0
  241. package/dist/tests/vtex/vtex-order-details.tool.test.js +141 -0
  242. package/dist/tests/vtex/vtex-order-details.tool.test.js.map +7 -0
  243. package/dist/tests/vtex/vtex-order-write-tools.test.js +483 -0
  244. package/dist/tests/vtex/vtex-order-write-tools.test.js.map +7 -0
  245. package/dist/tests/vtex/vtex-orders-summary.tool.test.js +185 -0
  246. package/dist/tests/vtex/vtex-orders-summary.tool.test.js.map +7 -0
  247. package/dist/tests/vtex/vtex-orders.service.test.js +120 -0
  248. package/dist/tests/vtex/vtex-orders.service.test.js.map +7 -0
  249. package/dist/tests/vtex/vtex-pricing-write-tools.test.js +202 -0
  250. package/dist/tests/vtex/vtex-pricing-write-tools.test.js.map +7 -0
  251. package/dist/tests/vtex/vtex-pricing-write.service.test.js +106 -0
  252. package/dist/tests/vtex/vtex-pricing-write.service.test.js.map +7 -0
  253. package/dist/tests/vtex/vtex-pricing.service.test.js +88 -0
  254. package/dist/tests/vtex/vtex-pricing.service.test.js.map +7 -0
  255. package/dist/tests/vtex/vtex-small-tools.test.js +190 -0
  256. package/dist/tests/vtex/vtex-small-tools.test.js.map +7 -0
  257. package/dist/tests/vtex/vtex-write-simple-tools.test.js +647 -0
  258. package/dist/tests/vtex/vtex-write-simple-tools.test.js.map +7 -0
  259. package/dist/vitest.config.js +15 -0
  260. package/dist/vitest.config.js.map +7 -0
  261. 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
+ }