@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
@@ -1,30 +1,35 @@
1
- import type { TaxCategoryDraft } from "@commercetools/platform-sdk";
2
- import supertest from "supertest";
3
1
  import { afterEach, describe, expect, test } from "vitest";
2
+ import { taxCategoryDraftFactory } from "#src/testing/index.ts";
4
3
  import { CommercetoolsMock } from "../index.ts";
5
4
 
6
5
  const ctMock = new CommercetoolsMock();
7
6
 
8
7
  describe("Tax Category", () => {
9
- afterEach(() => {
10
- ctMock.clear();
8
+ const taxCategoryDraft = taxCategoryDraftFactory(ctMock);
9
+
10
+ afterEach(async () => {
11
+ await ctMock.clear();
11
12
  });
12
13
  test("Create tax category", async () => {
13
- const draft: TaxCategoryDraft = {
14
+ const draft = taxCategoryDraft.build({
14
15
  name: "foo",
15
16
  key: "standard",
16
17
  rates: [],
17
- };
18
- const response = await supertest(ctMock.app)
19
- .post("/dummy/tax-categories")
20
- .send(draft);
18
+ });
21
19
 
22
- expect(response.status).toBe(201);
20
+ const response = await ctMock.app.inject({
21
+ method: "POST",
22
+ url: "/dummy/tax-categories",
23
+ payload: draft,
24
+ });
23
25
 
24
- expect(response.body).toEqual({
26
+ expect(response.statusCode).toBe(201);
27
+ expect(response.json()).toEqual({
25
28
  createdAt: expect.anything(),
29
+ createdBy: expect.anything(),
26
30
  id: expect.anything(),
27
31
  lastModifiedAt: expect.anything(),
32
+ lastModifiedBy: expect.anything(),
28
33
  name: "foo",
29
34
  rates: [],
30
35
  key: "standard",
@@ -33,48 +38,40 @@ describe("Tax Category", () => {
33
38
  });
34
39
 
35
40
  test("Get tax category", async () => {
36
- const draft: TaxCategoryDraft = {
41
+ const taxCategory = await taxCategoryDraft.create({
37
42
  name: "foo",
38
43
  key: "standard",
39
44
  rates: [],
40
- };
41
- const createResponse = await supertest(ctMock.app)
42
- .post("/dummy/tax-categories")
43
- .send(draft);
44
-
45
- expect(createResponse.status).toBe(201);
45
+ });
46
46
 
47
- const response = await supertest(ctMock.app).get(
48
- `/dummy/tax-categories/${createResponse.body.id}`,
49
- );
47
+ const response = await ctMock.app.inject({
48
+ method: "GET",
49
+ url: `/dummy/tax-categories/${taxCategory.id}`,
50
+ });
50
51
 
51
- expect(response.status).toBe(200);
52
- expect(response.body).toEqual(createResponse.body);
52
+ expect(response.statusCode).toBe(200);
53
+ expect(response.json()).toEqual(taxCategory);
53
54
  });
54
55
 
55
56
  test("Get tax category with key", async () => {
56
- const draft: TaxCategoryDraft = {
57
+ const taxCategory = await taxCategoryDraft.create({
57
58
  name: "foo",
58
59
  key: "standard",
59
60
  rates: [],
60
- };
61
- const createResponse = await supertest(ctMock.app)
62
- .post("/dummy/tax-categories")
63
- .send(draft);
64
-
65
- expect(createResponse.status).toBe(201);
61
+ });
66
62
 
67
- const response = await supertest(ctMock.app)
68
- .get("/dummy/tax-categories/")
69
- .query({ where: `key="${createResponse.body.key}"` });
63
+ const response = await ctMock.app.inject({
64
+ method: "GET",
65
+ url: `/dummy/tax-categories/?where=${encodeURIComponent(`key="${taxCategory.key}"`)}`,
66
+ });
70
67
 
71
- expect(response.status).toBe(200);
72
- expect(response.body).toEqual({
68
+ expect(response.statusCode).toBe(200);
69
+ expect(response.json()).toEqual({
73
70
  count: 1,
74
71
  limit: 20,
75
72
  offset: 0,
76
73
  total: 1,
77
- results: [createResponse.body],
74
+ results: [taxCategory],
78
75
  });
79
76
  });
80
77
  });
@@ -1,11 +1,11 @@
1
- import type { Router } from "express";
1
+ import type { FastifyInstance } from "fastify";
2
2
  import type { TaxCategoryRepository } from "../repositories/tax-category/index.ts";
3
3
  import AbstractService from "./abstract.ts";
4
4
 
5
5
  export class TaxCategoryService extends AbstractService {
6
6
  public repository: TaxCategoryRepository;
7
7
 
8
- constructor(parent: Router, repository: TaxCategoryRepository) {
8
+ constructor(parent: FastifyInstance, repository: TaxCategoryRepository) {
9
9
  super(parent);
10
10
  this.repository = repository;
11
11
  }
@@ -1,13 +1,14 @@
1
- import type { TypeDraft } from "@commercetools/platform-sdk";
2
- import supertest from "supertest";
3
1
  import { describe, expect, test } from "vitest";
2
+ import { typeDraftFactory } from "#src/testing/index.ts";
4
3
  import { CommercetoolsMock } from "../index.ts";
5
4
 
6
5
  const ctMock = new CommercetoolsMock();
7
6
 
8
7
  describe("Type", () => {
8
+ const factory = typeDraftFactory(ctMock);
9
+
9
10
  test("Create type", async () => {
10
- const draft: TypeDraft = {
11
+ const draft = factory.build({
11
12
  key: "my-custom-type",
12
13
  name: {
13
14
  en: "My Custom Type",
@@ -25,15 +26,23 @@ describe("Type", () => {
25
26
  },
26
27
  },
27
28
  ],
28
- };
29
- const response = await supertest(ctMock.app)
30
- .post("/dummy/types")
31
- .send(draft);
29
+ });
30
+
31
+ const response = await ctMock.app.inject({
32
+ method: "POST",
33
+ url: "/dummy/types",
34
+ payload: draft,
35
+ });
32
36
 
33
- expect(response.status).toBe(201);
37
+ expect(response.statusCode).toBe(201);
34
38
 
35
- expect(response.body).toEqual({
39
+ const type = response.json();
40
+ expect(type).toEqual({
36
41
  createdAt: expect.anything(),
42
+ createdBy: expect.anything(),
43
+ description: {
44
+ en: "Type description",
45
+ },
37
46
  fieldDefinitions: [
38
47
  {
39
48
  label: {
@@ -49,6 +58,7 @@ describe("Type", () => {
49
58
  id: expect.anything(),
50
59
  key: "my-custom-type",
51
60
  lastModifiedAt: expect.anything(),
61
+ lastModifiedBy: expect.anything(),
52
62
  name: {
53
63
  en: "My Custom Type",
54
64
  },
@@ -58,70 +68,61 @@ describe("Type", () => {
58
68
  });
59
69
 
60
70
  test("Get type", async () => {
61
- const draft: TypeDraft = {
71
+ const type = await factory.create({
62
72
  key: "test-type",
63
73
  name: {
64
74
  en: "Test Type",
65
75
  },
66
76
  resourceTypeIds: ["product"],
67
77
  fieldDefinitions: [],
68
- };
69
- const createResponse = await supertest(ctMock.app)
70
- .post("/dummy/types")
71
- .send(draft);
72
-
73
- expect(createResponse.status).toBe(201);
78
+ });
74
79
 
75
- const response = await supertest(ctMock.app).get(
76
- `/dummy/types/${createResponse.body.id}`,
77
- );
80
+ const response = await ctMock.app.inject({
81
+ method: "GET",
82
+ url: `/dummy/types/${type.id}`,
83
+ });
78
84
 
79
- expect(response.status).toBe(200);
80
- expect(response.body).toEqual(createResponse.body);
85
+ expect(response.statusCode).toBe(200);
86
+ expect(response.json()).toEqual(type);
81
87
  });
82
88
 
83
89
  test("Get type by key", async () => {
84
- const draft: TypeDraft = {
90
+ const type = await factory.create({
85
91
  key: "key-type",
86
92
  name: {
87
93
  en: "Key Type",
88
94
  },
89
95
  resourceTypeIds: ["customer"],
90
96
  fieldDefinitions: [],
91
- };
92
- const createResponse = await supertest(ctMock.app)
93
- .post("/dummy/types")
94
- .send(draft);
95
-
96
- expect(createResponse.status).toBe(201);
97
+ });
97
98
 
98
- const response = await supertest(ctMock.app).get(
99
- "/dummy/types/key=key-type",
100
- );
99
+ const response = await ctMock.app.inject({
100
+ method: "GET",
101
+ url: "/dummy/types/key=key-type",
102
+ });
101
103
 
102
- expect(response.status).toBe(200);
103
- expect(response.body).toEqual(createResponse.body);
104
+ expect(response.statusCode).toBe(200);
105
+ expect(response.json()).toEqual(type);
104
106
  });
105
107
 
106
108
  test("Query types", async () => {
107
- const draft: TypeDraft = {
109
+ const type = await factory.create({
108
110
  key: "query-type",
109
111
  name: {
110
112
  en: "Query Type",
111
113
  },
112
114
  resourceTypeIds: ["order"],
113
115
  fieldDefinitions: [],
114
- };
115
- const createResponse = await supertest(ctMock.app)
116
- .post("/dummy/types")
117
- .send(draft);
118
-
119
- expect(createResponse.status).toBe(201);
116
+ });
120
117
 
121
- const response = await supertest(ctMock.app).get("/dummy/types");
118
+ const response = await ctMock.app.inject({
119
+ method: "GET",
120
+ url: "/dummy/types",
121
+ });
122
122
 
123
- expect(response.status).toBe(200);
124
- expect(response.body.count).toBeGreaterThan(0);
125
- expect(response.body.results).toContainEqual(createResponse.body);
123
+ expect(response.statusCode).toBe(200);
124
+ const body = response.json();
125
+ expect(body.count).toBeGreaterThan(0);
126
+ expect(body.results).toContainEqual(type);
126
127
  });
127
128
  });
@@ -1,11 +1,11 @@
1
- import type { Router } from "express";
1
+ import type { FastifyInstance } from "fastify";
2
2
  import type { TypeRepository } from "../repositories/type/index.ts";
3
3
  import AbstractService from "./abstract.ts";
4
4
 
5
5
  export class TypeService extends AbstractService {
6
6
  public repository: TypeRepository;
7
7
 
8
- constructor(parent: Router, repository: TypeRepository) {
8
+ constructor(parent: FastifyInstance, repository: TypeRepository) {
9
9
  super(parent);
10
10
  this.repository = repository;
11
11
  }
@@ -1,13 +1,14 @@
1
- import type { ZoneDraft } from "@commercetools/platform-sdk";
2
- import supertest from "supertest";
3
1
  import { describe, expect, test } from "vitest";
2
+ import { zoneDraftFactory } from "#src/testing/index.ts";
4
3
  import { CommercetoolsMock } from "../index.ts";
5
4
 
6
5
  const ctMock = new CommercetoolsMock();
7
6
 
8
7
  describe("Zone", () => {
8
+ const zoneDraft = zoneDraftFactory(ctMock);
9
+
9
10
  test("Create zone", async () => {
10
- const draft: ZoneDraft = {
11
+ const draft = zoneDraft.build({
11
12
  key: "europe-zone",
12
13
  name: "Europe",
13
14
  locations: [
@@ -18,19 +19,23 @@ describe("Zone", () => {
18
19
  country: "NL",
19
20
  },
20
21
  ],
21
- };
22
- const response = await supertest(ctMock.app)
23
- .post("/dummy/zones")
24
- .send(draft);
22
+ });
25
23
 
26
- expect(response.status).toBe(201);
24
+ const response = await ctMock.app.inject({
25
+ method: "POST",
26
+ url: "/dummy/zones",
27
+ payload: draft,
28
+ });
27
29
 
28
- expect(response.body).toEqual({
30
+ expect(response.statusCode).toBe(201);
31
+ expect(response.json()).toEqual({
29
32
  createdAt: expect.anything(),
33
+ createdBy: expect.anything(),
30
34
  description: undefined,
31
35
  id: expect.anything(),
32
36
  key: "europe-zone",
33
37
  lastModifiedAt: expect.anything(),
38
+ lastModifiedBy: expect.anything(),
34
39
  locations: [
35
40
  {
36
41
  country: "DE",
@@ -45,7 +50,7 @@ describe("Zone", () => {
45
50
  });
46
51
 
47
52
  test("Get zone", async () => {
48
- const draft: ZoneDraft = {
53
+ const zone = await zoneDraft.create({
49
54
  key: "test-zone",
50
55
  name: "Test Zone",
51
56
  locations: [
@@ -53,23 +58,19 @@ describe("Zone", () => {
53
58
  country: "US",
54
59
  },
55
60
  ],
56
- };
57
- const createResponse = await supertest(ctMock.app)
58
- .post("/dummy/zones")
59
- .send(draft);
60
-
61
- expect(createResponse.status).toBe(201);
61
+ });
62
62
 
63
- const response = await supertest(ctMock.app).get(
64
- `/dummy/zones/${createResponse.body.id}`,
65
- );
63
+ const response = await ctMock.app.inject({
64
+ method: "GET",
65
+ url: `/dummy/zones/${zone.id}`,
66
+ });
66
67
 
67
- expect(response.status).toBe(200);
68
- expect(response.body).toEqual(createResponse.body);
68
+ expect(response.statusCode).toBe(200);
69
+ expect(response.json()).toEqual(zone);
69
70
  });
70
71
 
71
72
  test("Get zone by key", async () => {
72
- const draft: ZoneDraft = {
73
+ const zone = await zoneDraft.create({
73
74
  key: "key-zone",
74
75
  name: "Key Zone",
75
76
  locations: [
@@ -77,23 +78,19 @@ describe("Zone", () => {
77
78
  country: "CA",
78
79
  },
79
80
  ],
80
- };
81
- const createResponse = await supertest(ctMock.app)
82
- .post("/dummy/zones")
83
- .send(draft);
84
-
85
- expect(createResponse.status).toBe(201);
81
+ });
86
82
 
87
- const response = await supertest(ctMock.app).get(
88
- "/dummy/zones/key=key-zone",
89
- );
83
+ const response = await ctMock.app.inject({
84
+ method: "GET",
85
+ url: "/dummy/zones/key=key-zone",
86
+ });
90
87
 
91
- expect(response.status).toBe(200);
92
- expect(response.body).toEqual(createResponse.body);
88
+ expect(response.statusCode).toBe(200);
89
+ expect(response.json()).toEqual(zone);
93
90
  });
94
91
 
95
92
  test("Query zones", async () => {
96
- const draft: ZoneDraft = {
93
+ const zone = await zoneDraft.create({
97
94
  key: "query-zone",
98
95
  name: "Query Zone",
99
96
  locations: [
@@ -101,17 +98,16 @@ describe("Zone", () => {
101
98
  country: "FR",
102
99
  },
103
100
  ],
104
- };
105
- const createResponse = await supertest(ctMock.app)
106
- .post("/dummy/zones")
107
- .send(draft);
108
-
109
- expect(createResponse.status).toBe(201);
101
+ });
110
102
 
111
- const response = await supertest(ctMock.app).get("/dummy/zones");
103
+ const response = await ctMock.app.inject({
104
+ method: "GET",
105
+ url: "/dummy/zones",
106
+ });
112
107
 
113
- expect(response.status).toBe(200);
114
- expect(response.body.count).toBeGreaterThan(0);
115
- expect(response.body.results).toContainEqual(createResponse.body);
108
+ expect(response.statusCode).toBe(200);
109
+ const body = response.json();
110
+ expect(body.count).toBeGreaterThan(0);
111
+ expect(body.results).toContainEqual(zone);
116
112
  });
117
113
  });
@@ -1,11 +1,11 @@
1
- import type { Router } from "express";
1
+ import type { FastifyInstance } from "fastify";
2
2
  import type { ZoneRepository } from "../repositories/zone.ts";
3
3
  import AbstractService from "./abstract.ts";
4
4
 
5
5
  export class ZoneService extends AbstractService {
6
6
  public repository: ZoneRepository;
7
7
 
8
- constructor(parent: Router, repository: ZoneRepository) {
8
+ constructor(parent: FastifyInstance, repository: ZoneRepository) {
9
9
  super(parent);
10
10
  this.repository = repository;
11
11
  }
package/src/shipping.ts CHANGED
@@ -42,7 +42,13 @@ export const markMatchingShippingRatePriceTiers = (
42
42
  }
43
43
 
44
44
  if (new Set(tiers.map((tier) => tier.type)).size > 1) {
45
- throw new Error("Can't handle multiple types of tiers");
45
+ throw new CommercetoolsError<InvalidOperationError>(
46
+ {
47
+ code: "InvalidOperation",
48
+ message: "Can't handle multiple types of tiers",
49
+ },
50
+ 400,
51
+ );
46
52
  }
47
53
 
48
54
  const tierType = tiers[0].type;
@@ -54,7 +60,13 @@ export const markMatchingShippingRatePriceTiers = (
54
60
  // case 'CartScore':
55
61
  // return markMatchingCartScoreTiers(cart, tiers)
56
62
  default:
57
- throw new Error(`Unsupported tier type: ${tierType}`);
63
+ throw new CommercetoolsError<InvalidOperationError>(
64
+ {
65
+ code: "InvalidOperation",
66
+ message: `Unsupported tier type: ${tierType}`,
67
+ },
68
+ 400,
69
+ );
58
70
  }
59
71
  };
60
72
 
@@ -94,7 +106,7 @@ const markMatchingCartValueTiers = (
94
106
  * the flag isMatching set to true. This ShippingRate is used when the
95
107
  * ShippingMethod is added to the Cart.
96
108
  */
97
- export const getShippingMethodsMatchingCart = (
109
+ export const getShippingMethodsMatchingCart = async (
98
110
  context: RepositoryContext,
99
111
  storage: AbstractStorage,
100
112
  cart: Cart,
@@ -108,12 +120,12 @@ export const getShippingMethodsMatchingCart = (
108
120
  }
109
121
 
110
122
  // Get all shipping methods that have a zone that matches the shipping address
111
- const zones = storage.query<"zone">(context.projectKey, "zone", {
123
+ const zones = await storage.query<"zone">(context.projectKey, "zone", {
112
124
  where: [`locations(country="${cart.shippingAddress.country}"))`],
113
125
  limit: 100,
114
126
  });
115
127
  const zoneIds = zones.results.map((zone) => zone.id);
116
- const shippingMethods = storage.query<"shipping-method">(
128
+ const shippingMethods = await storage.query<"shipping-method">(
117
129
  context.projectKey,
118
130
  "shipping-method",
119
131
  {
@@ -173,12 +185,12 @@ interface ShippingCalculationSource {
173
185
  /**
174
186
  * Creates shipping info from a shipping method, handling all tax calculations and pricing logic.
175
187
  */
176
- export const createShippingInfoFromMethod = (
188
+ export const createShippingInfoFromMethod = async (
177
189
  context: RepositoryContext,
178
190
  storage: AbstractStorage,
179
191
  resource: ShippingCalculationSource,
180
192
  method: ShippingMethod,
181
- ): Omit<ShippingInfo, "deliveries"> => {
193
+ ): Promise<Omit<ShippingInfo, "deliveries">> => {
182
194
  const country = resource.shippingAddress!.country;
183
195
 
184
196
  // There should only be one zone rate matching the address, since
@@ -191,7 +203,13 @@ export const createShippingInfoFromMethod = (
191
203
  if (!zoneRate) {
192
204
  // This shouldn't happen because getShippingMethodsMatchingCart already
193
205
  // filtered out shipping methods without any zones matching the address
194
- throw new Error("Zone rate not found");
206
+ throw new CommercetoolsError<InvalidOperationError>(
207
+ {
208
+ code: "InvalidOperation",
209
+ message: "Zone rate not found",
210
+ },
211
+ 400,
212
+ );
195
213
  }
196
214
 
197
215
  // Shipping rates are defined by currency, and getShippingMethodsMatchingCart
@@ -201,10 +219,16 @@ export const createShippingInfoFromMethod = (
201
219
  if (!shippingRate) {
202
220
  // This shouldn't happen because getShippingMethodsMatchingCart already
203
221
  // filtered out shipping methods without any matching rates
204
- throw new Error("Shipping rate not found");
222
+ throw new CommercetoolsError<InvalidOperationError>(
223
+ {
224
+ code: "InvalidOperation",
225
+ message: "Shipping rate not found",
226
+ },
227
+ 400,
228
+ );
205
229
  }
206
230
 
207
- const taxCategory = storage.getByResourceIdentifier<"tax-category">(
231
+ const taxCategory = await storage.getByResourceIdentifier<"tax-category">(
208
232
  context.projectKey,
209
233
  method.taxCategory,
210
234
  );
@@ -222,7 +246,13 @@ export const createShippingInfoFromMethod = (
222
246
 
223
247
  const shippingRateTier = shippingRate.tiers.find((tier) => tier.isMatching);
224
248
  if (shippingRateTier && shippingRateTier.type !== "CartValue") {
225
- throw new Error("Non-CartValue shipping rate tier is not supported");
249
+ throw new CommercetoolsError<InvalidOperationError>(
250
+ {
251
+ code: "InvalidOperation",
252
+ message: "Non-CartValue shipping rate tier is not supported",
253
+ },
254
+ 400,
255
+ );
226
256
  }
227
257
 
228
258
  let shippingPrice = shippingRateTier