@labdigital/commercetools-mock 2.65.1 → 3.0.0-beta.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 (281) hide show
  1. package/README.md +31 -8
  2. package/dist/abstract-BKFcva6S.mjs +1044 -0
  3. package/dist/abstract-BKFcva6S.mjs.map +1 -0
  4. package/dist/config-BcNSzPZz.d.mts +1718 -0
  5. package/dist/index.d.mts +50 -1633
  6. package/dist/index.mjs +3771 -2654
  7. package/dist/index.mjs.map +1 -1
  8. package/dist/storage/sqlite.d.mts +59 -0
  9. package/dist/storage/sqlite.mjs +234 -0
  10. package/dist/storage/sqlite.mjs.map +1 -0
  11. package/package.json +26 -29
  12. package/src/ctMock.ts +125 -136
  13. package/src/helpers.ts +14 -6
  14. package/src/index.ts +5 -0
  15. package/src/lib/masking.ts +4 -5
  16. package/src/lib/product-review-statistics.test.ts +257 -294
  17. package/src/lib/review-statistics.ts +17 -4
  18. package/src/oauth/helpers.ts +7 -4
  19. package/src/oauth/server.test.ts +102 -62
  20. package/src/oauth/server.ts +215 -213
  21. package/src/oauth/store.ts +20 -6
  22. package/src/orderSearch.ts +3 -3
  23. package/src/product-projection-search.ts +38 -20
  24. package/src/product-search-availability.test.ts +31 -52
  25. package/src/product-search.ts +19 -10
  26. package/src/projectAPI.ts +6 -22
  27. package/src/repositories/abstract.ts +182 -48
  28. package/src/repositories/as-associate.test.ts +19 -19
  29. package/src/repositories/associate-role.ts +12 -23
  30. package/src/repositories/attribute-group.test.ts +23 -23
  31. package/src/repositories/attribute-group.ts +6 -4
  32. package/src/repositories/business-unit.test.ts +63 -57
  33. package/src/repositories/business-unit.ts +107 -55
  34. package/src/repositories/cart/actions.ts +96 -65
  35. package/src/repositories/cart/helpers.ts +15 -11
  36. package/src/repositories/cart/index.test.ts +136 -30
  37. package/src/repositories/cart/index.ts +76 -59
  38. package/src/repositories/cart-discount/actions.ts +12 -44
  39. package/src/repositories/cart-discount/index.ts +20 -8
  40. package/src/repositories/category/actions.ts +27 -27
  41. package/src/repositories/category/index.test.ts +13 -9
  42. package/src/repositories/category/index.ts +40 -23
  43. package/src/repositories/channel.test.ts +53 -51
  44. package/src/repositories/channel.ts +12 -22
  45. package/src/repositories/custom-object.ts +34 -25
  46. package/src/repositories/customer/actions.ts +47 -25
  47. package/src/repositories/customer/index.test.ts +11 -11
  48. package/src/repositories/customer/index.ts +65 -35
  49. package/src/repositories/customer-group.test.ts +44 -42
  50. package/src/repositories/customer-group.ts +12 -22
  51. package/src/repositories/discount-code/actions.ts +3 -19
  52. package/src/repositories/discount-code/index.ts +9 -4
  53. package/src/repositories/discount-group/index.ts +8 -3
  54. package/src/repositories/extension.test.ts +27 -27
  55. package/src/repositories/extension.ts +10 -5
  56. package/src/repositories/helpers.ts +126 -47
  57. package/src/repositories/inventory-entry/actions.ts +3 -24
  58. package/src/repositories/inventory-entry/index.ts +19 -11
  59. package/src/repositories/my-customer.ts +13 -12
  60. package/src/repositories/my-order.ts +5 -2
  61. package/src/repositories/order/actions.ts +89 -56
  62. package/src/repositories/order/index.test.ts +36 -31
  63. package/src/repositories/order/index.ts +83 -49
  64. package/src/repositories/order-edit.ts +8 -3
  65. package/src/repositories/payment/actions.ts +64 -44
  66. package/src/repositories/payment/helpers.ts +3 -3
  67. package/src/repositories/payment/index.ts +28 -12
  68. package/src/repositories/product/actions.ts +133 -98
  69. package/src/repositories/product/helpers.ts +29 -16
  70. package/src/repositories/product/index.ts +42 -25
  71. package/src/repositories/product-discount.ts +6 -4
  72. package/src/repositories/product-projection.ts +41 -21
  73. package/src/repositories/product-selection.ts +8 -15
  74. package/src/repositories/product-tailoring.ts +22 -3
  75. package/src/repositories/product-type.ts +45 -4
  76. package/src/repositories/project.ts +57 -13
  77. package/src/repositories/quote/actions.ts +5 -28
  78. package/src/repositories/quote/index.ts +29 -6
  79. package/src/repositories/quote-request/actions.ts +5 -28
  80. package/src/repositories/quote-request/index.test.ts +3 -3
  81. package/src/repositories/quote-request/index.ts +31 -11
  82. package/src/repositories/quote-staged/actions.ts +5 -28
  83. package/src/repositories/quote-staged/index.ts +22 -8
  84. package/src/repositories/recurrence-policy/index.ts +6 -4
  85. package/src/repositories/recurring-order/actions.ts +7 -32
  86. package/src/repositories/recurring-order/index.ts +8 -6
  87. package/src/repositories/review.test.ts +147 -142
  88. package/src/repositories/review.ts +31 -37
  89. package/src/repositories/shipping-method/actions.ts +11 -28
  90. package/src/repositories/shipping-method/index.ts +26 -15
  91. package/src/repositories/shopping-list/actions.ts +21 -31
  92. package/src/repositories/shopping-list/index.ts +44 -22
  93. package/src/repositories/standalone-price.ts +6 -4
  94. package/src/repositories/state.ts +15 -9
  95. package/src/repositories/store.ts +21 -32
  96. package/src/repositories/subscription.test.ts +22 -22
  97. package/src/repositories/subscription.ts +8 -3
  98. package/src/repositories/tax-category/index.ts +8 -3
  99. package/src/repositories/type/actions.ts +21 -3
  100. package/src/repositories/type/index.ts +5 -3
  101. package/src/repositories/zone.test.ts +112 -77
  102. package/src/repositories/zone.ts +5 -3
  103. package/src/schemas/generated/associate-role.ts +13 -0
  104. package/src/schemas/generated/attribute-group.ts +12 -0
  105. package/src/schemas/generated/business-unit.ts +38 -0
  106. package/src/schemas/generated/cart-discount.ts +33 -0
  107. package/src/schemas/generated/cart.ts +61 -0
  108. package/src/schemas/generated/category.ts +25 -0
  109. package/src/schemas/generated/channel.ts +21 -0
  110. package/src/schemas/generated/common.ts +1372 -0
  111. package/src/schemas/generated/custom-object.ts +11 -0
  112. package/src/schemas/generated/customer-group.ts +11 -0
  113. package/src/schemas/generated/customer.ts +47 -0
  114. package/src/schemas/generated/discount-code.ts +25 -0
  115. package/src/schemas/generated/discount-group.ts +13 -0
  116. package/src/schemas/generated/extension.ts +15 -0
  117. package/src/schemas/generated/index.ts +42 -0
  118. package/src/schemas/generated/inventory-entry.ts +20 -0
  119. package/src/schemas/generated/my-quote-request.ts +10 -0
  120. package/src/schemas/generated/order-edit.ts +18 -0
  121. package/src/schemas/generated/order-from-cart.ts +25 -0
  122. package/src/schemas/generated/payment.ts +30 -0
  123. package/src/schemas/generated/product-discount.ts +20 -0
  124. package/src/schemas/generated/product-selection.ts +18 -0
  125. package/src/schemas/generated/product-tailoring.ts +26 -0
  126. package/src/schemas/generated/product-type.ts +12 -0
  127. package/src/schemas/generated/product.ts +37 -0
  128. package/src/schemas/generated/quote-request.ts +19 -0
  129. package/src/schemas/generated/quote.ts +18 -0
  130. package/src/schemas/generated/recurrence-policy.ts +15 -0
  131. package/src/schemas/generated/recurring-order.ts +19 -0
  132. package/src/schemas/generated/review.ts +24 -0
  133. package/src/schemas/generated/shipping-method.ts +24 -0
  134. package/src/schemas/generated/shopping-list.ts +28 -0
  135. package/src/schemas/generated/staged-quote.ts +18 -0
  136. package/src/schemas/generated/standalone-price.ts +32 -0
  137. package/src/schemas/generated/state.ts +20 -0
  138. package/src/schemas/generated/store.ts +23 -0
  139. package/src/schemas/generated/subscription.ts +20 -0
  140. package/src/schemas/generated/tax-category.ts +12 -0
  141. package/src/schemas/generated/type.ts +17 -0
  142. package/src/schemas/generated/zone.ts +12 -0
  143. package/src/schemas/update-request.ts +3 -5
  144. package/src/server.ts +32 -4
  145. package/src/services/abstract.ts +207 -101
  146. package/src/services/as-associate-cart.test.ts +28 -36
  147. package/src/services/as-associate-cart.ts +15 -12
  148. package/src/services/as-associate-order.test.ts +33 -40
  149. package/src/services/as-associate-order.ts +15 -12
  150. package/src/services/as-associate-quote-request.ts +15 -12
  151. package/src/services/as-associate-shopping-list.test.ts +25 -35
  152. package/src/services/as-associate-shopping-list.ts +15 -12
  153. package/src/services/as-associate.test.ts +21 -15
  154. package/src/services/as-associate.ts +23 -22
  155. package/src/services/associate-roles.test.ts +16 -22
  156. package/src/services/associate-roles.ts +2 -2
  157. package/src/services/attribute-group.test.ts +40 -44
  158. package/src/services/attribute-group.ts +2 -2
  159. package/src/services/business-units.test.ts +227 -163
  160. package/src/services/business-units.ts +2 -2
  161. package/src/services/cart-discount.test.ts +253 -187
  162. package/src/services/cart-discount.ts +2 -2
  163. package/src/services/cart.test.ts +833 -832
  164. package/src/services/cart.ts +31 -12
  165. package/src/services/category.test.ts +208 -130
  166. package/src/services/category.ts +2 -2
  167. package/src/services/channel.test.ts +39 -44
  168. package/src/services/channel.ts +2 -2
  169. package/src/services/custom-object.test.ts +103 -79
  170. package/src/services/custom-object.ts +106 -38
  171. package/src/services/customer-group.test.ts +39 -44
  172. package/src/services/customer-group.ts +2 -2
  173. package/src/services/customer.test.ts +357 -292
  174. package/src/services/customer.ts +70 -23
  175. package/src/services/discount-code.test.ts +57 -68
  176. package/src/services/discount-code.ts +2 -2
  177. package/src/services/discount-group.test.ts +111 -134
  178. package/src/services/discount-group.ts +2 -2
  179. package/src/services/draft-validation.test.ts +255 -0
  180. package/src/services/extension.test.ts +39 -44
  181. package/src/services/extension.ts +2 -2
  182. package/src/services/inventory-entry.test.ts +106 -87
  183. package/src/services/inventory-entry.ts +2 -2
  184. package/src/services/my-business-unit.test.ts +82 -112
  185. package/src/services/my-business-unit.ts +25 -19
  186. package/src/services/my-cart.test.ts +46 -41
  187. package/src/services/my-cart.ts +32 -28
  188. package/src/services/my-customer.test.ts +153 -88
  189. package/src/services/my-customer.ts +130 -61
  190. package/src/services/my-order.ts +15 -12
  191. package/src/services/my-payment.test.ts +30 -24
  192. package/src/services/my-payment.ts +2 -2
  193. package/src/services/my-shopping-list.ts +2 -2
  194. package/src/services/order.test.ts +332 -276
  195. package/src/services/order.ts +45 -27
  196. package/src/services/payment.test.ts +31 -29
  197. package/src/services/payment.ts +2 -2
  198. package/src/services/product-discount.test.ts +39 -46
  199. package/src/services/product-discount.ts +2 -2
  200. package/src/services/product-projection.test.ts +176 -166
  201. package/src/services/product-projection.ts +31 -15
  202. package/src/services/product-selection.test.ts +17 -9
  203. package/src/services/product-selection.ts +2 -2
  204. package/src/services/product-type.test.ts +80 -21
  205. package/src/services/product-type.ts +2 -2
  206. package/src/services/product.test.ts +569 -534
  207. package/src/services/product.ts +14 -7
  208. package/src/services/project.test.ts +22 -12
  209. package/src/services/project.ts +28 -13
  210. package/src/services/quote-request.test.ts +36 -39
  211. package/src/services/quote-request.ts +2 -2
  212. package/src/services/quote-staged.ts +2 -2
  213. package/src/services/quote.ts +2 -2
  214. package/src/services/recurrence-policy.test.ts +114 -139
  215. package/src/services/recurrence-policy.ts +2 -2
  216. package/src/services/recurring-order.test.ts +149 -194
  217. package/src/services/recurring-order.ts +2 -2
  218. package/src/services/reviews.test.ts +127 -106
  219. package/src/services/reviews.ts +2 -2
  220. package/src/services/shipping-method.test.ts +96 -125
  221. package/src/services/shipping-method.ts +24 -12
  222. package/src/services/shopping-list.test.ts +183 -141
  223. package/src/services/shopping-list.ts +2 -2
  224. package/src/services/standalone-price.test.ts +60 -46
  225. package/src/services/standalone-price.ts +2 -2
  226. package/src/services/state.test.ts +20 -25
  227. package/src/services/state.ts +2 -2
  228. package/src/services/store.test.ts +26 -45
  229. package/src/services/store.ts +2 -2
  230. package/src/services/subscription.test.ts +39 -44
  231. package/src/services/subscription.ts +2 -2
  232. package/src/services/tax-category.test.ts +33 -36
  233. package/src/services/tax-category.ts +2 -2
  234. package/src/services/type.test.ts +45 -44
  235. package/src/services/type.ts +2 -2
  236. package/src/services/zone.test.ts +40 -44
  237. package/src/services/zone.ts +2 -2
  238. package/src/shipping.ts +41 -11
  239. package/src/storage/abstract.ts +248 -17
  240. package/src/storage/in-memory.ts +147 -290
  241. package/src/storage/sqlite.ts +429 -0
  242. package/src/storage/storage-map.ts +75 -0
  243. package/src/storage/storage.test-helpers.ts +97 -0
  244. package/src/storage/storage.test.ts +802 -0
  245. package/src/testing/associate-role.ts +28 -0
  246. package/src/testing/attribute-group.ts +27 -0
  247. package/src/testing/business-unit.ts +9 -8
  248. package/src/testing/cart-discount.ts +34 -0
  249. package/src/testing/cart.ts +20 -0
  250. package/src/testing/category.ts +25 -0
  251. package/src/testing/channel.ts +23 -0
  252. package/src/testing/custom-object.ts +27 -0
  253. package/src/testing/customer-group.ts +26 -0
  254. package/src/testing/customer.ts +36 -33
  255. package/src/testing/discount-code.ts +29 -0
  256. package/src/testing/discount-group.ts +27 -0
  257. package/src/testing/extension.ts +32 -0
  258. package/src/testing/index.ts +33 -0
  259. package/src/testing/inventory-entry.ts +26 -0
  260. package/src/testing/order.ts +27 -0
  261. package/src/testing/payment.ts +23 -0
  262. package/src/testing/product-discount.ts +33 -0
  263. package/src/testing/product-selection.ts +28 -0
  264. package/src/testing/product-type.ts +27 -0
  265. package/src/testing/product.ts +38 -0
  266. package/src/testing/quote-request.ts +29 -0
  267. package/src/testing/recurrence-policy.ts +33 -0
  268. package/src/testing/recurring-order.ts +32 -0
  269. package/src/testing/review.ts +24 -0
  270. package/src/testing/shipping-method.ts +31 -0
  271. package/src/testing/shopping-list.ts +25 -0
  272. package/src/testing/standalone-price.ts +31 -0
  273. package/src/testing/state.ts +21 -0
  274. package/src/testing/store.ts +26 -0
  275. package/src/testing/subscription.ts +38 -0
  276. package/src/testing/tax-category.ts +27 -0
  277. package/src/testing/type.ts +9 -6
  278. package/src/testing/zone.ts +22 -0
  279. package/src/validate.test.ts +122 -0
  280. package/src/validate.ts +78 -7
  281. package/src/.env +0 -0
@@ -19,8 +19,8 @@ describe("Order repository", () => {
19
19
  };
20
20
  const repository = new OrderRepository(config);
21
21
 
22
- beforeEach(() => {
23
- storage.clear();
22
+ beforeEach(async () => {
23
+ await storage.clear();
24
24
  });
25
25
 
26
26
  test("create from cart", async () => {
@@ -143,10 +143,10 @@ describe("Order repository", () => {
143
143
  },
144
144
  };
145
145
 
146
- storage.add("dummy", "cart", cart);
146
+ await storage.add("dummy", "cart", cart);
147
147
  const ctx = { projectKey: "dummy" };
148
148
 
149
- const result = repository.create(ctx, {
149
+ const result = await repository.create(ctx, {
150
150
  cart: {
151
151
  id: cart.id,
152
152
  typeId: "cart",
@@ -155,7 +155,7 @@ describe("Order repository", () => {
155
155
  });
156
156
  expect(result.cart?.id).toBe(cart.id);
157
157
 
158
- const items = repository.query(ctx);
158
+ const items = await repository.query(ctx);
159
159
  expect(items.count).toBe(1);
160
160
 
161
161
  expect(result.orderNumber).not.toBeUndefined();
@@ -192,7 +192,7 @@ describe("Order repository", () => {
192
192
  expect(result.shippingInfo).toEqual(cart.shippingInfo);
193
193
  });
194
194
 
195
- test("should calculate taxed price when creating order from cart", () => {
195
+ test("should calculate taxed price when creating order from cart", async () => {
196
196
  const cart: Cart = {
197
197
  ...getBaseResourceProperties(),
198
198
  id: "cart-with-taxed-items",
@@ -279,9 +279,9 @@ describe("Order repository", () => {
279
279
  inventoryMode: "None",
280
280
  };
281
281
 
282
- storage.add("dummy", "cart", cart);
282
+ await storage.add("dummy", "cart", cart);
283
283
  const ctx = { projectKey: "dummy" };
284
- const result = repository.create(ctx, {
284
+ const result = await repository.create(ctx, {
285
285
  cart: { id: cart.id, typeId: "cart" },
286
286
  version: cart.version,
287
287
  });
@@ -293,7 +293,7 @@ describe("Order repository", () => {
293
293
  });
294
294
 
295
295
  test("create order in store", async () => {
296
- storage.add("dummy", "store", {
296
+ await storage.add("dummy", "store", {
297
297
  ...getBaseResourceProperties(),
298
298
  id: "store-123",
299
299
  key: "testStore",
@@ -305,7 +305,7 @@ describe("Order repository", () => {
305
305
  productSelections: [],
306
306
  });
307
307
 
308
- storage.add("dummy", "business-unit", {
308
+ await storage.add("dummy", "business-unit", {
309
309
  ...getBaseResourceProperties(),
310
310
  id: "business-unit-123",
311
311
  unitType: "Company",
@@ -321,9 +321,11 @@ describe("Order repository", () => {
321
321
  key: "test-business-unit",
322
322
  },
323
323
  approvalRuleMode: "Explicit",
324
+ shippingAddressIds: [],
325
+ billingAddressIds: [],
324
326
  });
325
327
 
326
- storage.add("dummy", "customer", {
328
+ await storage.add("dummy", "customer", {
327
329
  ...getBaseResourceProperties(),
328
330
  id: "customer-123",
329
331
  email: "test@example.com",
@@ -339,6 +341,9 @@ describe("Order repository", () => {
339
341
  stores: [],
340
342
  isEmailVerified: true,
341
343
  authenticationMode: "Password" as const,
344
+ shippingAddressIds: [],
345
+ billingAddressIds: [],
346
+ customerGroupAssignments: [],
342
347
  });
343
348
 
344
349
  const draft: OrderImportDraft = {
@@ -362,7 +367,7 @@ describe("Order repository", () => {
362
367
  };
363
368
 
364
369
  const ctx = { projectKey: "dummy", storeKey: "testStore" };
365
- const result = repository.import(ctx, draft);
370
+ const result = await repository.import(ctx, draft);
366
371
 
367
372
  expect(result.orderNumber).toBe("100000002");
368
373
  expect(result.store?.key).toBe("testStore");
@@ -374,8 +379,8 @@ describe("Order repository", () => {
374
379
  expect(result.paymentState).toBe("Paid");
375
380
  });
376
381
 
377
- test("should calculate taxed price when importing order", () => {
378
- storage.add("dummy", "product", {
382
+ test("should calculate taxed price when importing order", async () => {
383
+ await storage.add("dummy", "product", {
379
384
  ...getBaseResourceProperties(),
380
385
  id: "product-import",
381
386
  productType: {
@@ -450,7 +455,7 @@ describe("Order repository", () => {
450
455
  customLineItems: [],
451
456
  };
452
457
 
453
- const result = repository.import({ projectKey: "dummy" }, draft);
458
+ const result = await repository.import({ projectKey: "dummy" }, draft);
454
459
  expect(result.taxedPrice).toBeDefined();
455
460
  expect(result.taxedPrice?.totalNet.centAmount).toBe(1000);
456
461
  expect(result.taxedPrice?.totalGross.centAmount).toBe(1210);
@@ -458,7 +463,7 @@ describe("Order repository", () => {
458
463
  });
459
464
 
460
465
  test("import exiting product", async () => {
461
- storage.add("dummy", "product", {
466
+ await storage.add("dummy", "product", {
462
467
  id: "15fc56ba-a74e-4cf8-b4b0-bada5c101541",
463
468
  masterData: {
464
469
  // @ts-expect-error
@@ -563,7 +568,7 @@ describe("Order repository", () => {
563
568
  ],
564
569
  };
565
570
 
566
- repository.import({ projectKey: "dummy" }, draft);
571
+ await repository.import({ projectKey: "dummy" }, draft);
567
572
  });
568
573
  /*
569
574
  test('import non exiting product', async () => {
@@ -697,7 +702,7 @@ describe("Order repository", () => {
697
702
  */
698
703
 
699
704
  describe("shippingInfo functionality", () => {
700
- test("createShippingInfo creates basic shipping info", () => {
705
+ test("createShippingInfo creates basic shipping info", async () => {
701
706
  // Create a zone for Netherlands
702
707
  const zone = {
703
708
  ...getBaseResourceProperties(),
@@ -757,9 +762,9 @@ describe("Order repository", () => {
757
762
  ],
758
763
  };
759
764
 
760
- storage.add("dummy", "zone", zone);
761
- storage.add("dummy", "shipping-method", shippingMethod);
762
- storage.add("dummy", "tax-category", taxCategory);
765
+ await storage.add("dummy", "zone", zone);
766
+ await storage.add("dummy", "shipping-method", shippingMethod);
767
+ await storage.add("dummy", "tax-category", taxCategory);
763
768
 
764
769
  const order: Order = {
765
770
  ...getBaseResourceProperties(),
@@ -795,7 +800,7 @@ describe("Order repository", () => {
795
800
  };
796
801
 
797
802
  const ctx = { projectKey: "dummy" };
798
- const result = repository.createShippingInfo(ctx, order, {
803
+ const result = await repository.createShippingInfo(ctx, order, {
799
804
  typeId: "shipping-method",
800
805
  id: "shipping-method-123",
801
806
  });
@@ -810,7 +815,7 @@ describe("Order repository", () => {
810
815
  expect(result.taxCategory?.id).toBe("tax-category-123");
811
816
  });
812
817
 
813
- test("import order with shippingInfo", () => {
818
+ test("import order with shippingInfo", async () => {
814
819
  // Create required resources
815
820
  const zone = {
816
821
  ...getBaseResourceProperties(),
@@ -869,9 +874,9 @@ describe("Order repository", () => {
869
874
  ],
870
875
  };
871
876
 
872
- storage.add("dummy", "zone", zone);
873
- storage.add("dummy", "shipping-method", shippingMethod);
874
- storage.add("dummy", "tax-category", taxCategory);
877
+ await storage.add("dummy", "zone", zone);
878
+ await storage.add("dummy", "shipping-method", shippingMethod);
879
+ await storage.add("dummy", "tax-category", taxCategory);
875
880
 
876
881
  const draft: OrderImportDraft = {
877
882
  orderNumber: "imported-order-123",
@@ -938,7 +943,7 @@ describe("Order repository", () => {
938
943
  };
939
944
 
940
945
  const ctx = { projectKey: "dummy" };
941
- const result = repository.import(ctx, draft);
946
+ const result = await repository.import(ctx, draft);
942
947
 
943
948
  expect(result.shippingInfo).toBeDefined();
944
949
  expect(result.shippingInfo?.shippingMethodName).toBe("Standard Shipping");
@@ -952,7 +957,7 @@ describe("Order repository", () => {
952
957
  expect(result.shippingInfo?.deliveries).toEqual([]);
953
958
  });
954
959
 
955
- test("createShippingInfo throws error for non-existent shipping method", () => {
960
+ test("createShippingInfo throws error for non-existent shipping method", async () => {
956
961
  const order: Order = {
957
962
  ...getBaseResourceProperties(),
958
963
  orderNumber: "order-456",
@@ -989,12 +994,12 @@ describe("Order repository", () => {
989
994
 
990
995
  const ctx = { projectKey: "dummy" };
991
996
 
992
- expect(() => {
997
+ await expect(
993
998
  repository.createShippingInfo(ctx, order, {
994
999
  typeId: "shipping-method",
995
1000
  id: "non-existent-shipping-method",
996
- });
997
- }).toThrow(
1001
+ }),
1002
+ ).rejects.toThrow(
998
1003
  /The shipping method with ID 'non-existent-shipping-method' is not allowed/,
999
1004
  );
1000
1005
  });
@@ -4,6 +4,7 @@ import type {
4
4
  CartReference,
5
5
  CustomLineItem,
6
6
  CustomLineItemImportDraft,
7
+ DuplicateFieldError,
7
8
  GeneralError,
8
9
  LineItem,
9
10
  LineItemImportDraft,
@@ -13,8 +14,9 @@ import type {
13
14
  OrderPagedSearchResponse,
14
15
  OrderSearchRequest,
15
16
  Product,
16
- ProductPagedQueryResponse,
17
17
  ProductVariant,
18
+ ReferencedResourceNotFoundError,
19
+ ResourceNotFoundError,
18
20
  ShippingInfo,
19
21
  ShippingMethodDoesNotMatchCartError,
20
22
  ShippingMethodReference,
@@ -30,6 +32,7 @@ import {
30
32
  calculateTaxTotals,
31
33
  } from "#src/lib/tax.ts";
32
34
  import { OrderSearch } from "#src/orderSearch.ts";
35
+ import { OrderFromCartDraftSchema } from "#src/schemas/generated/order-from-cart.ts";
33
36
  import {
34
37
  createShippingInfoFromMethod,
35
38
  getShippingMethodsMatchingCart,
@@ -55,11 +58,15 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
55
58
  super("order", config);
56
59
  this.actions = new OrderUpdateHandler(config.storage);
57
60
  this._searchService = new OrderSearch(config);
61
+ this.draftSchema = OrderFromCartDraftSchema;
58
62
  }
59
63
 
60
- create(context: RepositoryContext, draft: OrderFromCartDraft): Order {
64
+ async create(
65
+ context: RepositoryContext,
66
+ draft: OrderFromCartDraft,
67
+ ): Promise<Order> {
61
68
  assert(draft.cart, "draft.cart is missing");
62
- return this.createFromCart(
69
+ return await this.createFromCart(
63
70
  context,
64
71
  {
65
72
  id: draft.cart.id!,
@@ -69,21 +76,27 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
69
76
  );
70
77
  }
71
78
 
72
- createFromCart(
79
+ async createFromCart(
73
80
  context: RepositoryContext,
74
81
  cartReference: CartReference,
75
82
  orderNumber?: string,
76
83
  ) {
77
- const cart = this._storage.getByResourceIdentifier(
84
+ const cart = (await this._storage.getByResourceIdentifier(
78
85
  context.projectKey,
79
86
  cartReference,
80
- ) as Cart | null;
87
+ )) as Cart | null;
81
88
  if (!cart) {
82
- throw new Error("Cannot find cart");
89
+ throw new CommercetoolsError<ResourceNotFoundError>(
90
+ {
91
+ code: "ResourceNotFound",
92
+ message: "Cannot find cart",
93
+ },
94
+ 404,
95
+ );
83
96
  }
84
97
 
85
98
  const resource: Writable<Order> = {
86
- ...getBaseResourceProperties(),
99
+ ...getBaseResourceProperties(context.clientId),
87
100
  anonymousId: cart.anonymousId,
88
101
  billingAddress: cart.billingAddress,
89
102
  cart: cartReference,
@@ -127,14 +140,28 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
127
140
  resource.taxedPrice = resource.taxedPrice ?? taxedPrice;
128
141
  resource.taxedShippingPrice =
129
142
  resource.taxedShippingPrice ?? taxedShippingPrice;
130
- return this.saveNew(context, resource);
143
+ return await this.saveNew(context, resource);
131
144
  }
132
145
 
133
- import(context: RepositoryContext, draft: OrderImportDraft): Order {
146
+ async import(
147
+ context: RepositoryContext,
148
+ draft: OrderImportDraft,
149
+ ): Promise<Order> {
134
150
  // TODO: Check if order with given orderNumber already exists
135
151
  assert(this, "OrderRepository not valid");
152
+ const lineItems = await Promise.all(
153
+ draft.lineItems?.map((item) =>
154
+ this.lineItemFromImportDraft(context, item),
155
+ ) || [],
156
+ );
157
+ const customLineItems = await Promise.all(
158
+ draft.customLineItems?.map((item) =>
159
+ this.customLineItemFromImportDraft(context, item),
160
+ ) || [],
161
+ );
162
+
136
163
  const resource: Writable<Order> = {
137
- ...getBaseResourceProperties(),
164
+ ...getBaseResourceProperties(context.clientId),
138
165
 
139
166
  billingAddress: createAddress(
140
167
  draft.billingAddress,
@@ -147,7 +174,7 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
147
174
  this._storage,
148
175
  ),
149
176
 
150
- custom: createCustomFields(
177
+ custom: await createCustomFields(
151
178
  draft.custom,
152
179
  context.projectKey,
153
180
  this._storage,
@@ -166,21 +193,15 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
166
193
  shippingMode: "Single",
167
194
  shipping: [],
168
195
  shippingInfo: undefined,
169
- store: resolveStoreReference(
196
+ store: await resolveStoreReference(
170
197
  draft.store,
171
198
  context.projectKey,
172
199
  this._storage,
173
200
  ),
174
201
  syncInfo: [],
175
202
 
176
- lineItems:
177
- draft.lineItems?.map((item) =>
178
- this.lineItemFromImportDraft.bind(this)(context, item),
179
- ) || [],
180
- customLineItems:
181
- draft.customLineItems?.map((item) =>
182
- this.customLineItemFromImportDraft.bind(this)(context, item),
183
- ) || [],
203
+ lineItems,
204
+ customLineItems,
184
205
 
185
206
  totalPrice: createCentPrecisionMoney(draft.totalPrice),
186
207
  };
@@ -192,7 +213,7 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
192
213
  // get id when reference is by key only
193
214
  if (shippingMethodRef.key && !shippingMethodRef.id) {
194
215
  const shippingMethod =
195
- this._storage.getByResourceIdentifier<"shipping-method">(
216
+ await this._storage.getByResourceIdentifier<"shipping-method">(
196
217
  context.projectKey,
197
218
  shippingMethodRef,
198
219
  );
@@ -205,7 +226,7 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
205
226
  shippingMethodRef.id = shippingMethod.id;
206
227
  }
207
228
 
208
- resource.shippingInfo = this.createShippingInfo(context, resource, {
229
+ resource.shippingInfo = await this.createShippingInfo(context, resource, {
209
230
  typeId: "shipping-method",
210
231
  id: shippingMethodRef.id as string,
211
232
  });
@@ -221,13 +242,13 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
221
242
  resource.taxedShippingPrice =
222
243
  resource.taxedShippingPrice ?? taxedShippingPrice;
223
244
 
224
- return this.saveNew(context, resource);
245
+ return await this.saveNew(context, resource);
225
246
  }
226
247
 
227
- private lineItemFromImportDraft(
248
+ private async lineItemFromImportDraft(
228
249
  context: RepositoryContext,
229
250
  draft: LineItemImportDraft,
230
- ): LineItem {
251
+ ): Promise<LineItem> {
231
252
  let product: Product;
232
253
  let variant: ProductVariant | undefined;
233
254
 
@@ -237,11 +258,11 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
237
258
  sku: draft.variant.sku,
238
259
  };
239
260
 
240
- const items = this._storage.query(context.projectKey, "product", {
261
+ const items = await this._storage.query(context.projectKey, "product", {
241
262
  where: [
242
263
  `masterData(current(masterVariant(sku="${draft.variant.sku}"))) or masterData(current(variants(sku="${draft.variant.sku}")))`,
243
264
  ],
244
- }) as ProductPagedQueryResponse;
265
+ });
245
266
 
246
267
  if (items.count !== 1) {
247
268
  throw new CommercetoolsError<GeneralError>({
@@ -262,7 +283,11 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
262
283
  throw new Error("Internal state error");
263
284
  }
264
285
  } else {
265
- throw new Error("No product found");
286
+ throw new CommercetoolsError<ReferencedResourceNotFoundError>({
287
+ code: "ReferencedResourceNotFound",
288
+ message: "No product found",
289
+ typeId: "product",
290
+ });
266
291
  }
267
292
 
268
293
  const quantity = draft.quantity ?? 1;
@@ -272,8 +297,8 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
272
297
  });
273
298
 
274
299
  return {
275
- ...getBaseResourceProperties(),
276
- custom: createCustomFields(
300
+ ...getBaseResourceProperties(context.clientId),
301
+ custom: await createCustomFields(
277
302
  draft.custom,
278
303
  context.projectKey,
279
304
  this._storage,
@@ -305,10 +330,10 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
305
330
  } satisfies LineItem;
306
331
  }
307
332
 
308
- private customLineItemFromImportDraft(
333
+ private async customLineItemFromImportDraft(
309
334
  context: RepositoryContext,
310
335
  draft: CustomLineItemImportDraft,
311
- ): CustomLineItem {
336
+ ): Promise<CustomLineItem> {
312
337
  const quantity = draft.quantity ?? 1;
313
338
  const totalPrice = createCentPrecisionMoney({
314
339
  currencyCode: draft.money.currencyCode,
@@ -316,8 +341,8 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
316
341
  });
317
342
 
318
343
  return {
319
- ...getBaseResourceProperties(),
320
- custom: createCustomFields(
344
+ ...getBaseResourceProperties(context.clientId),
345
+ custom: await createCustomFields(
321
346
  draft.custom,
322
347
  context.projectKey,
323
348
  this._storage,
@@ -340,32 +365,41 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
340
365
  } satisfies CustomLineItem;
341
366
  }
342
367
 
343
- getWithOrderNumber(
368
+ async getWithOrderNumber(
344
369
  context: RepositoryContext,
345
370
  orderNumber: string,
346
371
  params: QueryParams = {},
347
- ): Order | undefined {
348
- const result = this._storage.query(context.projectKey, this.getTypeId(), {
349
- ...params,
350
- where: [`orderNumber="${orderNumber}"`],
351
- });
372
+ ): Promise<Order | undefined> {
373
+ const result = await this._storage.query(
374
+ context.projectKey,
375
+ this.getTypeId(),
376
+ {
377
+ ...params,
378
+ where: [`orderNumber="${orderNumber}"`],
379
+ },
380
+ );
352
381
  if (result.count === 1) {
353
382
  return result.results[0] as Order;
354
383
  }
355
384
 
356
385
  // Catch this for now, should be checked when creating/updating
357
386
  if (result.count > 1) {
358
- throw new Error("Duplicate order numbers");
387
+ throw new CommercetoolsError<DuplicateFieldError>({
388
+ code: "DuplicateField",
389
+ message: "Duplicate order numbers",
390
+ field: "orderNumber",
391
+ duplicateValue: orderNumber,
392
+ });
359
393
  }
360
394
 
361
395
  return;
362
396
  }
363
397
 
364
- createShippingInfo(
398
+ async createShippingInfo(
365
399
  context: RepositoryContext,
366
400
  resource: Writable<Order>,
367
401
  shippingMethodRef: ShippingMethodReference,
368
- ): ShippingInfo {
402
+ ): Promise<ShippingInfo> {
369
403
  const cartLikeForMatching: Writable<Cart> = {
370
404
  ...resource,
371
405
  cartState: "Active" as const,
@@ -380,7 +414,7 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
380
414
  shippingInfo: undefined,
381
415
  };
382
416
 
383
- const shippingMethods = getShippingMethodsMatchingCart(
417
+ const shippingMethods = await getShippingMethodsMatchingCart(
384
418
  context,
385
419
  this._storage,
386
420
  cartLikeForMatching,
@@ -400,7 +434,7 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
400
434
  });
401
435
  }
402
436
 
403
- const baseShippingInfo = createShippingInfoFromMethod(
437
+ const baseShippingInfo = await createShippingInfoFromMethod(
404
438
  context,
405
439
  this._storage,
406
440
  resource,
@@ -413,10 +447,10 @@ export class OrderRepository extends AbstractResourceRepository<"order"> {
413
447
  };
414
448
  }
415
449
 
416
- search(
450
+ async search(
417
451
  context: RepositoryContext,
418
452
  searchRequest: OrderSearchRequest,
419
- ): OrderPagedSearchResponse {
420
- return this._searchService.search(context.projectKey, searchRequest);
453
+ ): Promise<OrderPagedSearchResponse> {
454
+ return await this._searchService.search(context.projectKey, searchRequest);
421
455
  }
422
456
  }
@@ -4,6 +4,7 @@ import type {
4
4
  OrderEditResult,
5
5
  } from "@commercetools/platform-sdk";
6
6
  import type { Config } from "#src/config.ts";
7
+ import { OrderEditDraftSchema } from "#src/schemas/generated/order-edit.ts";
7
8
  import { getBaseResourceProperties } from "../helpers.ts";
8
9
  import type { RepositoryContext } from "./abstract.ts";
9
10
  import { AbstractResourceRepository } from "./abstract.ts";
@@ -11,17 +12,21 @@ import { AbstractResourceRepository } from "./abstract.ts";
11
12
  export class OrderEditRepository extends AbstractResourceRepository<"order-edit"> {
12
13
  constructor(config: Config) {
13
14
  super("order-edit", config);
15
+ this.draftSchema = OrderEditDraftSchema;
14
16
  }
15
17
 
16
- create(context: RepositoryContext, draft: OrderEditDraft): OrderEdit {
18
+ async create(
19
+ context: RepositoryContext,
20
+ draft: OrderEditDraft,
21
+ ): Promise<OrderEdit> {
17
22
  const resource: OrderEdit = {
18
- ...getBaseResourceProperties(),
23
+ ...getBaseResourceProperties(context.clientId),
19
24
  stagedActions: draft.stagedActions ?? [],
20
25
  resource: draft.resource,
21
26
  result: {
22
27
  type: "NotProcessed",
23
28
  } as OrderEditResult,
24
29
  };
25
- return this.saveNew(context, resource);
30
+ return await this.saveNew(context, resource);
26
31
  }
27
32
  }