@labdigital/commercetools-mock 2.66.0 → 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 +3769 -2653
  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 +84 -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,11 +1,11 @@
1
- import { Router } from "express";
1
+ import type { FastifyInstance } from "fastify";
2
2
  import type { CartRepository } from "../repositories/cart/index.ts";
3
3
  import AbstractService from "./abstract.ts";
4
4
 
5
5
  export class AsAssociateCartService extends AbstractService {
6
6
  public repository: CartRepository;
7
7
 
8
- constructor(parent: Router, repository: CartRepository) {
8
+ constructor(parent: FastifyInstance, repository: CartRepository) {
9
9
  super(parent);
10
10
  this.repository = repository;
11
11
  }
@@ -14,20 +14,23 @@ export class AsAssociateCartService extends AbstractService {
14
14
  return "carts";
15
15
  }
16
16
 
17
- registerRoutes(parent: Router) {
17
+ registerRoutes(parent: FastifyInstance) {
18
18
  const basePath = this.getBasePath();
19
- const router = Router({ mergeParams: true });
19
+ parent.register(
20
+ (instance, opts, done) => {
21
+ this.extraRoutes(instance);
20
22
 
21
- this.extraRoutes(router);
23
+ instance.get("/", this.get.bind(this));
24
+ instance.get("/:id", this.getWithId.bind(this));
22
25
 
23
- router.get("/", this.get.bind(this));
24
- router.get("/:id", this.getWithId.bind(this));
26
+ instance.delete("/:id", this.deleteWithId.bind(this));
25
27
 
26
- router.delete("/:id", this.deleteWithId.bind(this));
28
+ instance.post("/", this.post.bind(this));
29
+ instance.post("/:id", this.postWithId.bind(this));
27
30
 
28
- router.post("/", this.post.bind(this));
29
- router.post("/:id", this.postWithId.bind(this));
30
-
31
- parent.use(`/${basePath}`, router);
31
+ done();
32
+ },
33
+ { prefix: `/${basePath}` },
34
+ );
32
35
  }
33
36
  }
@@ -1,64 +1,57 @@
1
1
  import assert from "node:assert";
2
2
  import type { Order } from "@commercetools/platform-sdk";
3
- import supertest from "supertest";
4
3
  import { afterEach, beforeEach, describe, expect, test } from "vitest";
4
+ import { cartDraftFactory, orderDraftFactory } from "#src/testing/index.ts";
5
5
  import { CommercetoolsMock } from "../index.ts";
6
6
 
7
7
  describe("Order Query", () => {
8
8
  const ctMock = new CommercetoolsMock();
9
+ const cartFactory = cartDraftFactory(ctMock);
10
+ const orderFactory = orderDraftFactory(ctMock);
9
11
  let order: Order | undefined;
10
12
  const projectKey = "dummy";
11
13
  const customerId = "5fac8fca-2484-4b14-a1d1-cfdce2f8d3c4";
12
14
  const businessUnitKey = "business-unit";
13
15
 
14
16
  beforeEach(async () => {
15
- let response = await supertest(ctMock.app)
16
- .post(
17
- `/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/carts`,
18
- )
19
- .send({
20
- currency: "EUR",
21
- custom: {
22
- type: {
23
- key: "my-cart",
24
- },
25
- fields: {
26
- description: "example description",
27
- },
17
+ const cart = await cartFactory.create({
18
+ currency: "EUR",
19
+ custom: {
20
+ type: {
21
+ key: "my-cart",
28
22
  },
29
- });
30
- expect(response.status).toBe(201);
31
- const cart = response.body;
32
-
33
- response = await supertest(ctMock.app)
34
- .post(
35
- `/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/orders`,
36
- )
37
- .send({
38
- cart: {
39
- typeId: "cart",
40
- id: cart.id,
23
+ fields: {
24
+ description: "example description",
41
25
  },
42
- orderNumber: "foobar",
43
- });
44
- expect(response.status).toBe(201);
45
- order = response.body;
26
+ },
27
+ });
28
+
29
+ order = await orderFactory.create({
30
+ cart: {
31
+ typeId: "cart",
32
+ id: cart.id,
33
+ },
34
+ version: cart.version,
35
+ orderNumber: "foobar",
36
+ });
46
37
  });
47
38
 
48
- afterEach(() => {
49
- ctMock.clear();
39
+ afterEach(async () => {
40
+ await ctMock.clear();
50
41
  });
51
42
 
52
43
  test("no filter", async () => {
53
44
  assert(order, "order not created");
54
45
 
55
- const response = await supertest(ctMock.app).get(
56
- `/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/orders`,
57
- );
58
- expect(response.status).toBe(200);
59
- expect(response.body.count).toBe(1);
60
- expect(response.body.total).toBe(1);
61
- expect(response.body.offset).toBe(0);
62
- expect(response.body.limit).toBe(20);
46
+ const response = await ctMock.app.inject({
47
+ method: "GET",
48
+ url: `/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/orders`,
49
+ });
50
+ expect(response.statusCode).toBe(200);
51
+ const body = response.json();
52
+ expect(body.count).toBe(1);
53
+ expect(body.total).toBe(1);
54
+ expect(body.offset).toBe(0);
55
+ expect(body.limit).toBe(20);
63
56
  });
64
57
  });
@@ -1,11 +1,11 @@
1
- import { Router } from "express";
1
+ import type { FastifyInstance } from "fastify";
2
2
  import type { MyOrderRepository } from "../repositories/my-order.ts";
3
3
  import AbstractService from "./abstract.ts";
4
4
 
5
5
  export class AsAssociateOrderService extends AbstractService {
6
6
  public repository: MyOrderRepository;
7
7
 
8
- constructor(parent: Router, repository: MyOrderRepository) {
8
+ constructor(parent: FastifyInstance, repository: MyOrderRepository) {
9
9
  super(parent);
10
10
  this.repository = repository;
11
11
  }
@@ -14,20 +14,23 @@ export class AsAssociateOrderService extends AbstractService {
14
14
  return "orders";
15
15
  }
16
16
 
17
- registerRoutes(parent: Router) {
17
+ registerRoutes(parent: FastifyInstance) {
18
18
  const basePath = this.getBasePath();
19
- const router = Router({ mergeParams: true });
19
+ parent.register(
20
+ (instance, opts, done) => {
21
+ this.extraRoutes(instance);
20
22
 
21
- this.extraRoutes(router);
23
+ instance.get("/", this.get.bind(this));
24
+ instance.get("/:id", this.getWithId.bind(this));
22
25
 
23
- router.get("/", this.get.bind(this));
24
- router.get("/:id", this.getWithId.bind(this));
26
+ instance.delete("/:id", this.deleteWithId.bind(this));
25
27
 
26
- router.delete("/:id", this.deleteWithId.bind(this));
28
+ instance.post("/", this.post.bind(this));
29
+ instance.post("/:id", this.postWithId.bind(this));
27
30
 
28
- router.post("/", this.post.bind(this));
29
- router.post("/:id", this.postWithId.bind(this));
30
-
31
- parent.use(`/${basePath}`, router);
31
+ done();
32
+ },
33
+ { prefix: `/${basePath}` },
34
+ );
32
35
  }
33
36
  }
@@ -1,11 +1,11 @@
1
- import { Router } from "express";
1
+ import type { FastifyInstance } from "fastify";
2
2
  import type { MyQuoteRequestRepository } from "#src/repositories/my-quote-request.ts";
3
3
  import AbstractService from "./abstract.ts";
4
4
 
5
5
  export class AsAssociateQuoteRequestService extends AbstractService {
6
6
  public repository: MyQuoteRequestRepository;
7
7
 
8
- constructor(parent: Router, repository: MyQuoteRequestRepository) {
8
+ constructor(parent: FastifyInstance, repository: MyQuoteRequestRepository) {
9
9
  super(parent);
10
10
  this.repository = repository;
11
11
  }
@@ -14,20 +14,23 @@ export class AsAssociateQuoteRequestService extends AbstractService {
14
14
  return "quote-requests";
15
15
  }
16
16
 
17
- registerRoutes(parent: Router) {
17
+ registerRoutes(parent: FastifyInstance) {
18
18
  const basePath = this.getBasePath();
19
- const router = Router({ mergeParams: true });
19
+ parent.register(
20
+ (instance, opts, done) => {
21
+ this.extraRoutes(instance);
20
22
 
21
- this.extraRoutes(router);
23
+ instance.get("/", this.get.bind(this));
24
+ instance.get("/:id", this.getWithId.bind(this));
22
25
 
23
- router.get("/", this.get.bind(this));
24
- router.get("/:id", this.getWithId.bind(this));
26
+ instance.delete("/:id", this.deleteWithId.bind(this));
25
27
 
26
- router.delete("/:id", this.deleteWithId.bind(this));
28
+ instance.post("/", this.post.bind(this));
29
+ instance.post("/:id", this.postWithId.bind(this));
27
30
 
28
- router.post("/", this.post.bind(this));
29
- router.post("/:id", this.postWithId.bind(this));
30
-
31
- parent.use(`/${basePath}`, router);
31
+ done();
32
+ },
33
+ { prefix: `/${basePath}` },
34
+ );
32
35
  }
33
36
  }
@@ -1,5 +1,5 @@
1
- import supertest from "supertest";
2
1
  import { describe, expect, test } from "vitest";
2
+ import { shoppingListDraftFactory } from "#src/testing/index.ts";
3
3
  import { CommercetoolsMock } from "../index.ts";
4
4
 
5
5
  const ctMock = new CommercetoolsMock();
@@ -8,51 +8,41 @@ const customerId = "5fac8fca-2484-4b14-a1d1-cfdce2f8d3c4";
8
8
  const businessUnitKey = "test-business-unit";
9
9
 
10
10
  describe("AsAssociateShoppingList", () => {
11
+ const factory = shoppingListDraftFactory(ctMock);
12
+
11
13
  test("Create shopping list", async () => {
12
- const draft = {
14
+ const shoppingList = await factory.create({
13
15
  name: { en: "My list" },
14
- };
15
- const response = await supertest(ctMock.app)
16
- .post(
17
- `/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/shopping-lists`,
18
- )
19
- .send(draft);
20
-
21
- expect(response.status).toBe(201);
22
- expect(response.body.id).toBeDefined();
16
+ });
17
+
18
+ expect(shoppingList.id).toBeDefined();
23
19
  });
24
20
 
25
21
  test("Get shopping list", async () => {
26
- const createResponse = await supertest(ctMock.app)
27
- .post(
28
- `/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/shopping-lists`,
29
- )
30
- .send({ name: { en: "Groceries" } });
22
+ const shoppingList = await factory.create({
23
+ name: { en: "Groceries" },
24
+ });
31
25
 
32
- expect(createResponse.status).toBe(201);
26
+ const response = await ctMock.app.inject({
27
+ method: "GET",
28
+ url: `/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/shopping-lists/${shoppingList.id}`,
29
+ });
33
30
 
34
- const response = await supertest(ctMock.app).get(
35
- `/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/shopping-lists/${createResponse.body.id}`,
36
- );
37
-
38
- expect(response.status).toBe(200);
39
- expect(response.body).toEqual(createResponse.body);
31
+ expect(response.statusCode).toBe(200);
32
+ expect(response.json()).toEqual(shoppingList);
40
33
  });
41
34
 
42
35
  test("Query shopping lists", async () => {
43
- const createResponse = await supertest(ctMock.app)
44
- .post(
45
- `/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/shopping-lists`,
46
- )
47
- .send({ name: { en: "Errands" } });
48
-
49
- expect(createResponse.status).toBe(201);
36
+ await factory.create({
37
+ name: { en: "Errands" },
38
+ });
50
39
 
51
- const response = await supertest(ctMock.app).get(
52
- `/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/shopping-lists`,
53
- );
40
+ const response = await ctMock.app.inject({
41
+ method: "GET",
42
+ url: `/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/shopping-lists`,
43
+ });
54
44
 
55
- expect(response.status).toBe(200);
56
- expect(response.body.count).toBeGreaterThan(0);
45
+ expect(response.statusCode).toBe(200);
46
+ expect(response.json().count).toBeGreaterThan(0);
57
47
  });
58
48
  });
@@ -1,11 +1,11 @@
1
- import { Router } from "express";
1
+ import type { FastifyInstance } from "fastify";
2
2
  import type { ShoppingListRepository } from "#src/repositories/shopping-list/index.ts";
3
3
  import AbstractService from "./abstract.ts";
4
4
 
5
5
  export class AsAssociateShoppingListService extends AbstractService {
6
6
  public repository: ShoppingListRepository;
7
7
 
8
- constructor(parent: Router, repository: ShoppingListRepository) {
8
+ constructor(parent: FastifyInstance, repository: ShoppingListRepository) {
9
9
  super(parent);
10
10
  this.repository = repository;
11
11
  }
@@ -14,20 +14,23 @@ export class AsAssociateShoppingListService extends AbstractService {
14
14
  return "shopping-lists";
15
15
  }
16
16
 
17
- registerRoutes(parent: Router) {
17
+ registerRoutes(parent: FastifyInstance) {
18
18
  const basePath = this.getBasePath();
19
- const router = Router({ mergeParams: true });
19
+ parent.register(
20
+ (instance, opts, done) => {
21
+ this.extraRoutes(instance);
20
22
 
21
- this.extraRoutes(router);
23
+ instance.get("/", this.get.bind(this));
24
+ instance.get("/:id", this.getWithId.bind(this));
22
25
 
23
- router.get("/", this.get.bind(this));
24
- router.get("/:id", this.getWithId.bind(this));
26
+ instance.delete("/:id", this.deleteWithId.bind(this));
25
27
 
26
- router.delete("/:id", this.deleteWithId.bind(this));
28
+ instance.post("/", this.post.bind(this));
29
+ instance.post("/:id", this.postWithId.bind(this));
27
30
 
28
- router.post("/", this.post.bind(this));
29
- router.post("/:id", this.postWithId.bind(this));
30
-
31
- parent.use(`/${basePath}`, router);
31
+ done();
32
+ },
33
+ { prefix: `/${basePath}` },
34
+ );
32
35
  }
33
36
  }
@@ -1,5 +1,5 @@
1
- import supertest from "supertest";
2
1
  import { describe, expect, test } from "vitest";
2
+ import { cartDraftFactory } from "#src/testing/index.ts";
3
3
  import { CommercetoolsMock } from "../index.ts";
4
4
 
5
5
  const ctMock = new CommercetoolsMock();
@@ -8,27 +8,33 @@ const customerId = "5fac8fca-2484-4b14-a1d1-cfdce2f8d3c4";
8
8
  const businessUnitKey = "test-business-unit";
9
9
 
10
10
  describe("AsAssociate", () => {
11
+ const cartFactory = cartDraftFactory(ctMock);
12
+
11
13
  test("Access as-associate service routes", async () => {
12
14
  // Test that the as-associate service sets up routes correctly by testing cart endpoint
13
- const response = await supertest(ctMock.app).get(
14
- `/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/carts`,
15
- );
15
+ const response = await ctMock.app.inject({
16
+ method: "GET",
17
+ url: `/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/carts`,
18
+ });
16
19
 
17
20
  // Should return 200 with empty results or 404 if not configured
18
- expect([200, 404]).toContain(response.status);
21
+ expect([200, 404]).toContain(response.statusCode);
19
22
  });
20
23
 
21
24
  test("Create cart via as-associate", async () => {
22
- const draft = {
25
+ const draft = cartFactory.build({
23
26
  currency: "EUR",
24
- };
25
- const response = await supertest(ctMock.app)
26
- .post(
27
- `/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/carts`,
28
- )
29
- .send(draft);
30
-
31
- expect(response.status).toBe(201);
32
- expect(response.body.id).toBeDefined();
27
+ });
28
+
29
+ const response = await ctMock.app.inject({
30
+ method: "POST",
31
+ url: `/${projectKey}/as-associate/${customerId}/in-business-unit/key=${businessUnitKey}/carts`,
32
+ payload: draft,
33
+ });
34
+
35
+ expect(response.statusCode).toBe(201);
36
+
37
+ const cart = response.json();
38
+ expect(cart.id).toBeDefined();
33
39
  });
34
40
  });
@@ -1,4 +1,4 @@
1
- import { Router } from "express";
1
+ import type { FastifyInstance } from "fastify";
2
2
  import type {
3
3
  AsAssociateCartRepository,
4
4
  AsAssociateOrderRepository,
@@ -18,33 +18,34 @@ type Repositories = {
18
18
  };
19
19
 
20
20
  export class AsAssociateService {
21
- router: Router;
22
-
23
- subServices: {
21
+ subServices!: {
24
22
  cart: AsAssociateCartService;
25
23
  order: AsAssociateOrderService;
26
24
  "quote-request": AsAssociateQuoteRequestService;
27
25
  "shopping-list": AsAssociateShoppingListService;
28
26
  };
29
27
 
30
- constructor(parent: Router, repositories: Repositories) {
31
- this.router = Router({ mergeParams: true });
32
-
33
- this.subServices = {
34
- order: new AsAssociateOrderService(this.router, repositories.order),
35
- cart: new AsAssociateCartService(this.router, repositories.cart),
36
- "quote-request": new AsAssociateQuoteRequestService(
37
- this.router,
38
- repositories["quote-request"],
39
- ),
40
- "shopping-list": new AsAssociateShoppingListService(
41
- this.router,
42
- repositories["shopping-list"],
43
- ),
44
- };
45
- parent.use(
46
- "/as-associate/:associateId/in-business-unit/key=:businessUnitId",
47
- this.router,
28
+ constructor(parent: FastifyInstance, repositories: Repositories) {
29
+ parent.register(
30
+ (instance, opts, done) => {
31
+ this.subServices = {
32
+ order: new AsAssociateOrderService(instance, repositories.order),
33
+ cart: new AsAssociateCartService(instance, repositories.cart),
34
+ "quote-request": new AsAssociateQuoteRequestService(
35
+ instance,
36
+ repositories["quote-request"],
37
+ ),
38
+ "shopping-list": new AsAssociateShoppingListService(
39
+ instance,
40
+ repositories["shopping-list"],
41
+ ),
42
+ };
43
+ done();
44
+ },
45
+ {
46
+ prefix:
47
+ "/as-associate/:associateId/in-business-unit/key=:businessUnitId",
48
+ },
48
49
  );
49
50
  }
50
51
  }
@@ -1,41 +1,35 @@
1
1
  import type { AssociateRole } from "@commercetools/platform-sdk";
2
- import supertest from "supertest";
3
2
  import { afterEach, beforeEach, describe, expect, test } from "vitest";
3
+ import { associateRoleDraftFactory } from "#src/testing/index.ts";
4
4
  import { CommercetoolsMock } from "../ctMock.ts";
5
5
 
6
6
  describe("Associate roles query", () => {
7
7
  const ctMock = new CommercetoolsMock();
8
+ const associateRoleDraft = associateRoleDraftFactory(ctMock);
8
9
  let associateRole: AssociateRole | undefined;
9
10
 
10
11
  beforeEach(async () => {
11
- const response = await supertest(ctMock.app)
12
- .post("/dummy/associate-roles")
13
- .send({
14
- name: "example-role",
15
- buyerAssignable: false,
16
- key: "example-role-associate-role",
17
- permissions: ["ViewMyQuotes", "ViewMyOrders", "ViewMyCarts"],
18
- });
19
-
20
- expect(response.status).toBe(201);
21
-
22
- associateRole = response.body as AssociateRole;
12
+ associateRole = await associateRoleDraft.create({
13
+ name: "example-role",
14
+ key: "example-role-associate-role",
15
+ });
23
16
  });
24
17
 
25
- afterEach(() => {
26
- ctMock.clear();
18
+ afterEach(async () => {
19
+ await ctMock.clear();
27
20
  });
28
21
 
29
22
  test("no filter", async () => {
30
- const response = await supertest(ctMock.app)
31
- .get("/dummy/associate-roles")
32
- .query("{}")
33
- .send();
23
+ const response = await ctMock.app.inject({
24
+ method: "GET",
25
+ url: "/dummy/associate-roles?{}",
26
+ });
34
27
 
35
- expect(response.status).toBe(200);
36
- expect(response.body.count).toBe(1);
28
+ expect(response.statusCode).toBe(200);
29
+ const body = response.json();
30
+ expect(body.count).toBe(1);
37
31
 
38
- associateRole = response.body.results[0] as AssociateRole;
32
+ associateRole = body.results[0] as AssociateRole;
39
33
 
40
34
  expect(associateRole.key).toBe("example-role-associate-role");
41
35
  });
@@ -1,11 +1,11 @@
1
- import type { Router } from "express";
1
+ import type { FastifyInstance } from "fastify";
2
2
  import type { AssociateRoleRepository } from "../repositories/associate-role.ts";
3
3
  import AbstractService from "./abstract.ts";
4
4
 
5
5
  export class AssociateRoleServices extends AbstractService {
6
6
  public repository: AssociateRoleRepository;
7
7
 
8
- constructor(parent: Router, repository: AssociateRoleRepository) {
8
+ constructor(parent: FastifyInstance, repository: AssociateRoleRepository) {
9
9
  super(parent);
10
10
 
11
11
  this.repository = repository;