@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,199 +1,169 @@
1
- import type { BusinessUnitDraft } from "@commercetools/platform-sdk";
2
- import supertest from "supertest";
3
1
  import { afterEach, describe, expect, test } from "vitest";
2
+ import { businessUnitDraftFactory } from "#src/testing/business-unit.ts";
4
3
  import { CommercetoolsMock } from "../index.ts";
5
4
 
6
5
  const ctMock = new CommercetoolsMock();
7
6
 
8
7
  describe("MyBusinessUnit", () => {
9
- afterEach(() => {
10
- ctMock.clear();
8
+ const businessUnitFactory = businessUnitDraftFactory(ctMock);
9
+
10
+ afterEach(async () => {
11
+ await ctMock.clear();
11
12
  });
12
13
 
13
14
  test("Get my business units", async () => {
14
- // First create a business unit
15
- const draft: BusinessUnitDraft = {
15
+ await businessUnitFactory.create({
16
16
  key: "my-business-unit",
17
17
  unitType: "Company",
18
18
  name: "My Business Unit",
19
19
  contactEmail: "contact@example.com",
20
- };
21
- const createResponse = await supertest(ctMock.app)
22
- .post("/dummy/business-units")
23
- .send(draft);
24
-
25
- expect(createResponse.status).toBe(201);
20
+ });
26
21
 
27
- const response = await supertest(ctMock.app).get(
28
- "/dummy/me/business-units/",
29
- );
22
+ const response = await ctMock.app.inject({
23
+ method: "GET",
24
+ url: "/dummy/me/business-units",
25
+ });
30
26
 
31
- expect(response.status).toBe(200);
32
- expect(response.body.count).toBeGreaterThanOrEqual(0);
33
- expect(response.body.results).toBeDefined();
27
+ expect(response.statusCode).toBe(200);
28
+ expect(response.json().count).toBeGreaterThanOrEqual(0);
29
+ expect(response.json().results).toBeDefined();
34
30
  });
35
31
 
36
32
  test("Get my business unit by ID", async () => {
37
- // First create a business unit
38
- const draft: BusinessUnitDraft = {
33
+ const businessUnit = await businessUnitFactory.create({
39
34
  key: "my-business-unit",
40
35
  unitType: "Company",
41
36
  name: "My Business Unit",
42
37
  contactEmail: "contact@example.com",
43
- };
44
- const createResponse = await supertest(ctMock.app)
45
- .post("/dummy/business-units")
46
- .send(draft);
47
-
48
- expect(createResponse.status).toBe(201);
38
+ });
49
39
 
50
- const response = await supertest(ctMock.app).get(
51
- `/dummy/me/business-units/${createResponse.body.id}`,
52
- );
40
+ const response = await ctMock.app.inject({
41
+ method: "GET",
42
+ url: `/dummy/me/business-units/${businessUnit.id}`,
43
+ });
53
44
 
54
- expect(response.status).toBe(200);
55
- expect(response.body).toEqual(createResponse.body);
45
+ expect(response.statusCode).toBe(200);
46
+ expect(response.json()).toEqual(businessUnit);
56
47
  });
57
48
 
58
49
  test("Get my business unit by key", async () => {
59
- // First create a business unit
60
- const draft: BusinessUnitDraft = {
50
+ const businessUnit = await businessUnitFactory.create({
61
51
  key: "my-business-unit",
62
52
  unitType: "Company",
63
53
  name: "My Business Unit",
64
54
  contactEmail: "contact@example.com",
65
- };
66
- const createResponse = await supertest(ctMock.app)
67
- .post("/dummy/business-units")
68
- .send(draft);
55
+ });
69
56
 
70
- expect(createResponse.status).toBe(201);
57
+ const response = await ctMock.app.inject({
58
+ method: "GET",
59
+ url: `/dummy/me/business-units/key=${businessUnit.key}`,
60
+ });
71
61
 
72
- const response = await supertest(ctMock.app).get(
73
- `/dummy/me/business-units/key=${createResponse.body.key}`,
74
- );
75
-
76
- expect(response.status).toBe(200);
77
- expect(response.body).toEqual(createResponse.body);
62
+ expect(response.statusCode).toBe(200);
63
+ expect(response.json()).toEqual(businessUnit);
78
64
  });
79
65
 
80
66
  test("Delete my business unit", async () => {
81
- // First create a business unit
82
- const draft: BusinessUnitDraft = {
67
+ const businessUnit = await businessUnitFactory.create({
83
68
  key: "my-business-unit",
84
69
  unitType: "Company",
85
70
  name: "My Business Unit",
86
71
  contactEmail: "contact@example.com",
87
- };
88
- const createResponse = await supertest(ctMock.app)
89
- .post("/dummy/business-units")
90
- .send(draft);
91
-
92
- expect(createResponse.status).toBe(201);
72
+ });
93
73
 
94
74
  // Now delete the business unit
95
- const deleteResponse = await supertest(ctMock.app).delete(
96
- `/dummy/me/business-units/${createResponse.body.id}`,
97
- );
75
+ const deleteResponse = await ctMock.app.inject({
76
+ method: "DELETE",
77
+ url: `/dummy/me/business-units/${businessUnit.id}`,
78
+ });
98
79
 
99
- expect(deleteResponse.status).toBe(200);
100
- expect(deleteResponse.body).toEqual(createResponse.body);
80
+ expect(deleteResponse.statusCode).toBe(200);
81
+ expect(deleteResponse.json()).toEqual(businessUnit);
101
82
 
102
83
  // Verify that the business unit is deleted
103
- const newResponse = await supertest(ctMock.app).get(
104
- `/dummy/me/business-units/${createResponse.body.id}`,
105
- );
106
- expect(newResponse.status).toBe(404);
84
+ const newResponse = await ctMock.app.inject({
85
+ method: "GET",
86
+ url: `/dummy/me/business-units/${businessUnit.id}`,
87
+ });
88
+ expect(newResponse.statusCode).toBe(404);
107
89
  });
108
90
 
109
91
  test("Delete my business unit by key", async () => {
110
- // First create a business unit
111
- const draft: BusinessUnitDraft = {
92
+ const businessUnit = await businessUnitFactory.create({
112
93
  key: "my-business-unit",
113
94
  unitType: "Company",
114
95
  name: "My Business Unit",
115
96
  contactEmail: "contact@example.com",
116
- };
117
- const createResponse = await supertest(ctMock.app)
118
- .post("/dummy/business-units")
119
- .send(draft);
120
-
121
- expect(createResponse.status).toBe(201);
97
+ });
122
98
 
123
99
  // Now delete the business unit
124
- const deleteResponse = await supertest(ctMock.app).delete(
125
- `/dummy/me/business-units/key=${createResponse.body.key}`,
126
- );
100
+ const deleteResponse = await ctMock.app.inject({
101
+ method: "DELETE",
102
+ url: `/dummy/me/business-units/key=${businessUnit.key}`,
103
+ });
127
104
 
128
- expect(deleteResponse.status).toBe(200);
129
- expect(deleteResponse.body).toEqual(createResponse.body);
105
+ expect(deleteResponse.statusCode).toBe(200);
106
+ expect(deleteResponse.json()).toEqual(businessUnit);
130
107
 
131
108
  // Verify that the business unit is deleted
132
- const newResponse = await supertest(ctMock.app).get(
133
- `/dummy/me/business-units/key=${createResponse.body.key}`,
134
- );
135
- expect(newResponse.status).toBe(404);
109
+ const newResponse = await ctMock.app.inject({
110
+ method: "GET",
111
+ url: `/dummy/me/business-units/key=${businessUnit.key}`,
112
+ });
113
+ expect(newResponse.statusCode).toBe(404);
136
114
  });
137
115
 
138
116
  test("Update my business unit", async () => {
139
- // First create a business unit
140
- const draft: BusinessUnitDraft = {
117
+ const businessUnit = await businessUnitFactory.create({
141
118
  key: "my-business-unit",
142
119
  unitType: "Company",
143
120
  name: "My Business Unit",
144
121
  contactEmail: "contact@example.com",
145
- };
146
- const createResponse = await supertest(ctMock.app)
147
- .post("/dummy/business-units")
148
- .send(draft);
149
-
150
- expect(createResponse.status).toBe(201);
151
-
152
- const updateResponse = await supertest(ctMock.app)
153
- .post(`/dummy/me/business-units/${createResponse.body.id}`)
154
- .send({
155
- id: createResponse.body.id,
156
- version: createResponse.body.version,
122
+ });
123
+
124
+ const updateResponse = await ctMock.app.inject({
125
+ method: "POST",
126
+ url: `/dummy/me/business-units/${businessUnit.id}`,
127
+ payload: {
128
+ id: businessUnit.id,
129
+ version: businessUnit.version,
157
130
  actions: [
158
131
  {
159
132
  action: "changeName",
160
133
  name: "Updated Business Unit Name",
161
134
  },
162
135
  ],
163
- });
136
+ },
137
+ });
164
138
 
165
- expect(updateResponse.status).toBe(200);
166
- expect(updateResponse.body.name).toBe("Updated Business Unit Name");
139
+ expect(updateResponse.statusCode).toBe(200);
140
+ expect(updateResponse.json().name).toBe("Updated Business Unit Name");
167
141
  });
168
142
 
169
143
  test("Update my business unit by key", async () => {
170
- // First create a business unit
171
- const draft: BusinessUnitDraft = {
144
+ const businessUnit = await businessUnitFactory.create({
172
145
  key: "my-business-unit",
173
146
  unitType: "Company",
174
147
  name: "My Business Unit",
175
148
  contactEmail: "contact@example.com",
176
- };
177
- const createResponse = await supertest(ctMock.app)
178
- .post("/dummy/business-units")
179
- .send(draft);
180
-
181
- expect(createResponse.status).toBe(201);
182
-
183
- const updateResponse = await supertest(ctMock.app)
184
- .post(`/dummy/me/business-units/key=${createResponse.body.key}`)
185
- .send({
186
- id: createResponse.body.id,
187
- version: createResponse.body.version,
149
+ });
150
+
151
+ const updateResponse = await ctMock.app.inject({
152
+ method: "POST",
153
+ url: `/dummy/me/business-units/key=${businessUnit.key}`,
154
+ payload: {
155
+ id: businessUnit.id,
156
+ version: businessUnit.version,
188
157
  actions: [
189
158
  {
190
159
  action: "changeName",
191
160
  name: "Updated Business Unit Name",
192
161
  },
193
162
  ],
194
- });
163
+ },
164
+ });
195
165
 
196
- expect(updateResponse.status).toBe(200);
197
- expect(updateResponse.body.name).toBe("Updated Business Unit Name");
166
+ expect(updateResponse.statusCode).toBe(200);
167
+ expect(updateResponse.json().name).toBe("Updated Business Unit Name");
198
168
  });
199
169
  });
@@ -1,11 +1,11 @@
1
- import { Router } from "express";
1
+ import type { FastifyInstance } from "fastify";
2
2
  import type { BusinessUnitRepository } from "#src/repositories/business-unit.ts";
3
3
  import AbstractService from "./abstract.ts";
4
4
 
5
5
  export class MyBusinessUnitService extends AbstractService {
6
6
  public repository: BusinessUnitRepository;
7
7
 
8
- constructor(parent: Router, repository: BusinessUnitRepository) {
8
+ constructor(parent: FastifyInstance, repository: BusinessUnitRepository) {
9
9
  super(parent);
10
10
  this.repository = repository;
11
11
  }
@@ -14,24 +14,30 @@ export class MyBusinessUnitService extends AbstractService {
14
14
  return "me";
15
15
  }
16
16
 
17
- registerRoutes(parent: Router) {
17
+ registerRoutes(parent: FastifyInstance) {
18
18
  // Overwrite this function to be able to handle /me/business-units path.
19
19
  const basePath = this.getBasePath();
20
- const router = Router({ mergeParams: true });
21
-
22
- this.extraRoutes(router);
23
-
24
- router.get("/business-units/", this.get.bind(this));
25
- router.get("/business-units/key=:key", this.getWithKey.bind(this));
26
- router.get("/business-units/:id", this.getWithId.bind(this));
27
-
28
- router.delete("/business-units/key=:key", this.deleteWithKey.bind(this));
29
- router.delete("/business-units/:id", this.deleteWithId.bind(this));
30
-
31
- router.post("/business-units/", this.post.bind(this));
32
- router.post("/business-units/key=:key", this.postWithKey.bind(this));
33
- router.post("/business-units/:id", this.postWithId.bind(this));
34
-
35
- parent.use(`/${basePath}`, router);
20
+ parent.register(
21
+ (instance, opts, done) => {
22
+ this.extraRoutes(instance);
23
+
24
+ instance.get("/business-units", this.get.bind(this));
25
+ instance.get("/business-units/key=:key", this.getWithKey.bind(this));
26
+ instance.get("/business-units/:id", this.getWithId.bind(this));
27
+
28
+ instance.delete(
29
+ "/business-units/key=:key",
30
+ this.deleteWithKey.bind(this),
31
+ );
32
+ instance.delete("/business-units/:id", this.deleteWithId.bind(this));
33
+
34
+ instance.post("/business-units", this.post.bind(this));
35
+ instance.post("/business-units/key=:key", this.postWithKey.bind(this));
36
+ instance.post("/business-units/:id", this.postWithId.bind(this));
37
+
38
+ done();
39
+ },
40
+ { prefix: `/${basePath}` },
41
+ );
36
42
  }
37
43
  }
@@ -1,42 +1,46 @@
1
- import type { Cart, MyCartDraft } from "@commercetools/platform-sdk";
2
- import supertest from "supertest";
1
+ import type { Cart } from "@commercetools/platform-sdk";
3
2
  import { afterEach, beforeEach, describe, expect, test } from "vitest";
3
+ import { cartDraftFactory, typeDraftFactory } from "#src/testing/index.ts";
4
4
  import { CommercetoolsMock } from "../index.ts";
5
5
 
6
6
  const ctMock = new CommercetoolsMock();
7
7
 
8
8
  describe("MyCart", () => {
9
+ const cartDraft = cartDraftFactory(ctMock);
10
+ const typeDraft = typeDraftFactory(ctMock);
11
+
9
12
  beforeEach(async () => {
10
- const response = await supertest(ctMock.app)
11
- .post("/dummy/types")
12
- .send({
13
- key: "custom-payment",
14
- name: {
15
- "nl-NL": "custom-payment",
16
- },
17
- resourceTypeIds: ["payment"],
18
- });
19
- expect(response.status).toBe(201);
13
+ await typeDraft.create({
14
+ key: "custom-payment",
15
+ name: {
16
+ "nl-NL": "custom-payment",
17
+ },
18
+ resourceTypeIds: ["payment"],
19
+ });
20
20
  });
21
21
 
22
- afterEach(() => {
23
- ctMock.clear();
22
+ afterEach(async () => {
23
+ await ctMock.clear();
24
24
  });
25
25
 
26
26
  test("Create my cart", async () => {
27
- const draft: MyCartDraft = {
27
+ const draft = cartDraft.build({
28
28
  currency: "EUR",
29
- };
29
+ });
30
30
 
31
- const response = await supertest(ctMock.app)
32
- .post("/dummy/me/carts")
33
- .send(draft);
31
+ const response = await ctMock.app.inject({
32
+ method: "POST",
33
+ url: "/dummy/me/carts",
34
+ payload: draft,
35
+ });
34
36
 
35
- expect(response.status).toBe(201);
36
- expect(response.body).toEqual({
37
+ expect(response.statusCode).toBe(201);
38
+ expect(response.json()).toEqual({
37
39
  id: expect.anything(),
38
40
  createdAt: expect.anything(),
41
+ createdBy: expect.anything(),
39
42
  lastModifiedAt: expect.anything(),
43
+ lastModifiedBy: expect.anything(),
40
44
  version: 1,
41
45
  cartState: "Active",
42
46
  discountCodes: [],
@@ -63,38 +67,39 @@ describe("MyCart", () => {
63
67
  });
64
68
 
65
69
  test("Get my cart by ID", async () => {
66
- const draft: MyCartDraft = {
70
+ const cart = await cartDraft.create({
67
71
  currency: "EUR",
68
- };
69
- const createResponse = await supertest(ctMock.app)
70
- .post("/dummy/me/carts")
71
- .send(draft);
72
+ });
72
73
 
73
- const response = await supertest(ctMock.app).get(
74
- `/dummy/me/carts/${createResponse.body.id}`,
75
- );
74
+ const response = await ctMock.app.inject({
75
+ method: "GET",
76
+ url: `/dummy/me/carts/${cart.id}`,
77
+ });
76
78
 
77
- expect(response.status).toBe(200);
78
- expect(response.body).toEqual(createResponse.body);
79
+ expect(response.statusCode).toBe(200);
80
+ expect(response.json()).toEqual(cart);
79
81
  });
80
82
 
81
83
  test("Get my active cart", async () => {
82
- const draft: MyCartDraft = {
84
+ const cart = await cartDraft.create({
83
85
  currency: "EUR",
84
- };
85
- const createResponse = await supertest(ctMock.app)
86
- .post("/dummy/me/carts")
87
- .send(draft);
86
+ });
88
87
 
89
- const response = await supertest(ctMock.app).get("/dummy/me/active-cart");
88
+ const response = await ctMock.app.inject({
89
+ method: "GET",
90
+ url: "/dummy/me/active-cart",
91
+ });
90
92
 
91
- expect(response.status).toBe(200);
92
- expect(response.body).toEqual(createResponse.body);
93
+ expect(response.statusCode).toBe(200);
94
+ expect(response.json()).toEqual(cart);
93
95
  });
94
96
 
95
97
  test("Get my active cart which doesnt exists", async () => {
96
- const response = await supertest(ctMock.app).get("/dummy/me/active-cart");
98
+ const response = await ctMock.app.inject({
99
+ method: "GET",
100
+ url: "/dummy/me/active-cart",
101
+ });
97
102
 
98
- expect(response.status).toBe(404);
103
+ expect(response.statusCode).toBe(404);
99
104
  });
100
105
  });
@@ -1,12 +1,13 @@
1
- import type { Request, Response } from "express";
2
- import { Router } from "express";
1
+ import type { ResourceNotFoundError } from "@commercetools/platform-sdk";
2
+ import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
3
+ import { CommercetoolsError } from "#src/exceptions.ts";
3
4
  import type { CartRepository } from "../repositories/cart/index.ts";
4
5
  import AbstractService from "./abstract.ts";
5
6
 
6
7
  export class MyCartService extends AbstractService {
7
8
  public repository: CartRepository;
8
9
 
9
- constructor(parent: Router, repository: CartRepository) {
10
+ constructor(parent: FastifyInstance, repository: CartRepository) {
10
11
  super(parent);
11
12
  this.repository = repository;
12
13
  }
@@ -15,40 +16,43 @@ export class MyCartService extends AbstractService {
15
16
  return "me";
16
17
  }
17
18
 
18
- registerRoutes(parent: Router) {
19
+ registerRoutes(parent: FastifyInstance) {
19
20
  // Overwrite this function to be able to handle /me/active-cart path.
20
21
  const basePath = this.getBasePath();
21
- const router = Router({ mergeParams: true });
22
+ parent.register(
23
+ (instance, opts, done) => {
24
+ this.extraRoutes(instance);
22
25
 
23
- this.extraRoutes(router);
26
+ instance.get("/active-cart", this.activeCart.bind(this));
27
+ instance.get("/carts", this.get.bind(this));
28
+ instance.get("/carts/:id", this.getWithId.bind(this));
24
29
 
25
- router.get("/active-cart", this.activeCart.bind(this));
26
- router.get("/carts/", this.get.bind(this));
27
- router.get("/carts/:id", this.getWithId.bind(this));
30
+ instance.delete("/carts/:id", this.deleteWithId.bind(this));
28
31
 
29
- router.delete("/carts/:id", this.deleteWithId.bind(this));
32
+ instance.post("/carts", this.post.bind(this));
33
+ instance.post("/carts/:id", this.postWithId.bind(this));
30
34
 
31
- router.post("/carts/", this.post.bind(this));
32
- router.post("/carts/:id", this.postWithId.bind(this));
33
-
34
- parent.use(`/${basePath}`, router);
35
+ done();
36
+ },
37
+ { prefix: `/${basePath}` },
38
+ );
35
39
  }
36
40
 
37
- activeCart(request: Request, response: Response) {
38
- const resource = this.repository.getActiveCart(request.params.projectKey);
41
+ async activeCart(
42
+ request: FastifyRequest<{ Params: Record<string, string> }>,
43
+ reply: FastifyReply,
44
+ ) {
45
+ const params = request.params;
46
+ const resource = await this.repository.getActiveCart(params.projectKey);
39
47
  if (!resource) {
40
- response.status(404).send({
41
- statusCode: 404,
42
- message: "No active cart exists.",
43
- errors: [
44
- {
45
- code: "ResourceNotFound",
46
- message: "No active cart exists.",
47
- },
48
- ],
49
- });
50
- return;
48
+ throw new CommercetoolsError<ResourceNotFoundError>(
49
+ {
50
+ code: "ResourceNotFound",
51
+ message: "No active cart exists.",
52
+ },
53
+ 404,
54
+ );
51
55
  }
52
- response.status(200).send(resource);
56
+ return reply.status(200).send(resource);
53
57
  }
54
58
  }