@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,5 +1,12 @@
1
- import type { Cart, CartDraft, Order } from "@commercetools/platform-sdk";
2
- import type { Request, Response, Router } from "express";
1
+ import type {
2
+ Cart,
3
+ CartDraft,
4
+ InvalidInputError,
5
+ Order,
6
+ ReplicaCartDraft,
7
+ } from "@commercetools/platform-sdk";
8
+ import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
9
+ import { CommercetoolsError } from "#src/exceptions.ts";
3
10
  import type { CartRepository } from "../repositories/cart/index.ts";
4
11
  import { getRepositoryContext } from "../repositories/helpers.ts";
5
12
  import type { OrderRepository } from "../repositories/order/index.ts";
@@ -11,7 +18,7 @@ export class CartService extends AbstractService {
11
18
  public orderRepository: OrderRepository;
12
19
 
13
20
  constructor(
14
- parent: Router,
21
+ parent: FastifyInstance,
15
22
  cartRepository: CartRepository,
16
23
  orderRepository: OrderRepository,
17
24
  ) {
@@ -24,21 +31,33 @@ export class CartService extends AbstractService {
24
31
  return "carts";
25
32
  }
26
33
 
27
- extraRoutes(parent: Router) {
34
+ extraRoutes(parent: FastifyInstance) {
28
35
  parent.post("/replicate", this.replicate.bind(this));
29
36
  }
30
37
 
31
- replicate(request: Request, response: Response) {
38
+ async replicate(
39
+ request: FastifyRequest<{
40
+ Params: Record<string, string>;
41
+ Body: ReplicaCartDraft;
42
+ }>,
43
+ reply: FastifyReply,
44
+ ) {
32
45
  const context = getRepositoryContext(request);
46
+ const body = request.body;
33
47
 
34
48
  const cartOrOrder: Cart | Order | null =
35
- request.body.reference.typeId === "order"
36
- ? this.orderRepository.get(context, request.body.reference.id)
37
- : this.repository.get(context, request.body.reference.id);
49
+ body.reference.typeId === "order"
50
+ ? await this.orderRepository.get(context, body.reference.id)
51
+ : await this.repository.get(context, body.reference.id);
38
52
 
39
53
  if (!cartOrOrder) {
40
- response.status(400).send();
41
- return;
54
+ throw new CommercetoolsError<InvalidInputError>(
55
+ {
56
+ code: "InvalidInput",
57
+ message: `The referenced ${body.reference.typeId} with ID '${body.reference.id}' was not found.`,
58
+ },
59
+ 400,
60
+ );
42
61
  }
43
62
 
44
63
  const cartDraft: CartDraft = {
@@ -53,8 +72,8 @@ export class CartService extends AbstractService {
53
72
  })),
54
73
  };
55
74
 
56
- const newCart = this.repository.create(context, cartDraft);
75
+ const newCart = await this.repository.create(context, cartDraft);
57
76
 
58
- response.status(200).send(newCart);
77
+ return reply.status(200).send(newCart);
59
78
  }
60
79
  }
@@ -4,45 +4,41 @@ import type {
4
4
  CategoryAddAssetAction,
5
5
  CategoryRemoveAssetAction,
6
6
  } from "@commercetools/platform-sdk";
7
- import supertest from "supertest";
8
7
  import { afterEach, beforeEach, describe, expect, test } from "vitest";
8
+ import { categoryDraftFactory } from "#src/testing/index.ts";
9
9
  import { CommercetoolsMock } from "../index.ts";
10
10
 
11
11
  describe("Categories Query", () => {
12
12
  const ctMock = new CommercetoolsMock();
13
+ const categoryDraft = categoryDraftFactory(ctMock);
13
14
  let category: Category | undefined;
14
15
 
15
16
  beforeEach(async () => {
16
- const response = await supertest(ctMock.app)
17
- .post("/dummy/categories")
18
- .send({
19
- name: {
20
- en: "Top hat",
21
- },
22
- slug: {
23
- en: "top-hat",
24
- },
25
- orderHint: "0.1",
26
- });
27
- expect(response.status).toBe(201);
28
-
29
- category = response.body as Category;
17
+ category = await categoryDraft.create({
18
+ name: {
19
+ en: "Top hat",
20
+ },
21
+ slug: {
22
+ en: "top-hat",
23
+ },
24
+ orderHint: "0.1",
25
+ });
30
26
  });
31
27
 
32
- afterEach(() => {
33
- ctMock.clear();
28
+ afterEach(async () => {
29
+ await ctMock.clear();
34
30
  });
35
31
 
36
32
  test("no filter", async () => {
37
- const response = await supertest(ctMock.app)
38
- .get("/dummy/categories")
39
- .query({})
40
- .send();
33
+ const response = await ctMock.app.inject({
34
+ method: "GET",
35
+ url: "/dummy/categories",
36
+ });
41
37
 
42
- expect(response.status).toBe(200);
43
- expect(response.body.count).toBe(1);
38
+ expect(response.statusCode).toBe(200);
39
+ expect(response.json().count).toBe(1);
44
40
 
45
- category = response.body.results[0] as Category;
41
+ category = response.json().results[0] as Category;
46
42
 
47
43
  expect(category.name.en).toBe("Top hat");
48
44
  });
@@ -50,28 +46,26 @@ describe("Categories Query", () => {
50
46
 
51
47
  describe("categories changeName", () => {
52
48
  const ctMock = new CommercetoolsMock();
49
+ const categoryDraft = categoryDraftFactory(ctMock);
53
50
  let category: Category | undefined;
54
51
 
55
52
  beforeEach(async () => {
56
- const response = await supertest(ctMock.app)
57
- .post("/dummy/categories")
58
- .send({
59
- name: {
60
- en: "Top hat",
61
- },
62
- slug: {
63
- en: "top-hat",
64
- },
65
- orderHint: "0.1",
66
- });
67
- expect(response.status).toBe(201);
68
- category = response.body as Category;
53
+ category = await categoryDraft.create({
54
+ name: {
55
+ en: "Top hat",
56
+ },
57
+ slug: {
58
+ en: "top-hat",
59
+ },
60
+ orderHint: "0.1",
61
+ });
69
62
  });
70
63
 
71
64
  test("changeName", async () => {
72
- const changeNameResponse = await supertest(ctMock.app)
73
- .post(`/dummy/categories/${category?.id}`)
74
- .send({
65
+ const changeNameResponse = await ctMock.app.inject({
66
+ method: "POST",
67
+ url: `/dummy/categories/${category?.id}`,
68
+ payload: {
75
69
  version: 1,
76
70
  actions: [
77
71
  {
@@ -81,52 +75,133 @@ describe("categories changeName", () => {
81
75
  },
82
76
  },
83
77
  ],
84
- });
78
+ },
79
+ });
80
+
81
+ expect(changeNameResponse.statusCode).toBe(200);
82
+ expect(changeNameResponse.json().name.en).toBe("Top hat - new name");
83
+ });
84
+ });
85
+
86
+ describe("Categories create with parent by key", () => {
87
+ const ctMock = new CommercetoolsMock();
88
+ const categoryDraft = categoryDraftFactory(ctMock);
89
+
90
+ afterEach(async () => {
91
+ await ctMock.clear();
92
+ });
93
+
94
+ test("create child category with parent specified by key", async () => {
95
+ const parentCategory = await categoryDraft.create({
96
+ key: "parent-key",
97
+ name: {
98
+ en: "Parent",
99
+ },
100
+ slug: {
101
+ en: "parent",
102
+ },
103
+ orderHint: "0.1",
104
+ });
105
+
106
+ const childCategory = await categoryDraft.create({
107
+ name: {
108
+ en: "Child",
109
+ },
110
+ slug: {
111
+ en: "child",
112
+ },
113
+ orderHint: "0.2",
114
+ parent: {
115
+ typeId: "category",
116
+ key: "parent-key",
117
+ },
118
+ });
119
+
120
+ expect(childCategory.parent).toEqual({
121
+ typeId: "category",
122
+ id: parentCategory.id,
123
+ });
124
+ expect(childCategory.ancestors).toHaveLength(1);
125
+ expect(childCategory.ancestors[0].id).toEqual(parentCategory.id);
126
+ });
127
+
128
+ test("get child category by key resolves ancestors from parent specified by key", async () => {
129
+ const parentCategory = await categoryDraft.create({
130
+ key: "parent-key",
131
+ name: {
132
+ en: "Parent",
133
+ },
134
+ slug: {
135
+ en: "parent",
136
+ },
137
+ orderHint: "0.1",
138
+ });
139
+
140
+ await categoryDraft.create({
141
+ key: "child-key",
142
+ name: {
143
+ en: "Child",
144
+ },
145
+ slug: {
146
+ en: "child",
147
+ },
148
+ orderHint: "0.2",
149
+ parent: {
150
+ typeId: "category",
151
+ key: "parent-key",
152
+ },
153
+ });
85
154
 
86
- expect(changeNameResponse.status).toBe(200);
87
- expect(changeNameResponse.body.name.en).toBe("Top hat - new name");
155
+ const response = await ctMock.app.inject({
156
+ method: "GET",
157
+ url: "/dummy/categories/key=child-key",
158
+ });
159
+
160
+ expect(response.statusCode).toBe(200);
161
+
162
+ const result = response.json();
163
+ expect(result.parent).toEqual({
164
+ typeId: "category",
165
+ id: parentCategory.id,
166
+ });
167
+ expect(result.ancestors).toHaveLength(1);
168
+ expect(result.ancestors[0].id).toEqual(parentCategory.id);
88
169
  });
89
170
  });
90
171
 
91
172
  describe("categories changeParent", () => {
92
173
  const ctMock = new CommercetoolsMock();
174
+ const categoryDraft = categoryDraftFactory(ctMock);
93
175
  let category1: Category | undefined;
94
176
  let category2: Category | undefined;
95
177
 
96
178
  beforeEach(async () => {
97
- const response1 = await supertest(ctMock.app)
98
- .post("/dummy/categories")
99
- .send({
100
- name: {
101
- en: "Top hat",
102
- },
103
- slug: {
104
- en: "top-hat",
105
- },
106
- orderHint: "0.1",
107
- });
108
- expect(response1.status).toBe(201);
109
- category1 = response1.body as Category;
110
-
111
- const response2 = await supertest(ctMock.app)
112
- .post("/dummy/categories")
113
- .send({
114
- name: {
115
- en: "Top hat",
116
- },
117
- slug: {
118
- en: "top-hat",
119
- },
120
- orderHint: "0.1",
121
- });
122
- expect(response2.status).toBe(201);
123
- category2 = response2.body as Category;
179
+ category1 = await categoryDraft.create({
180
+ name: {
181
+ en: "Top hat",
182
+ },
183
+ slug: {
184
+ en: "top-hat",
185
+ },
186
+ orderHint: "0.1",
187
+ });
188
+
189
+ category2 = await categoryDraft.create({
190
+ name: {
191
+ en: "Top hat",
192
+ },
193
+ slug: {
194
+ en: "top-hat",
195
+ },
196
+ orderHint: "0.1",
197
+ });
124
198
  });
125
199
 
126
200
  test("changeParent", async () => {
127
- const changeNameResponse = await supertest(ctMock.app)
128
- .post(`/dummy/categories/${category2?.id}`)
129
- .send({
201
+ const changeNameResponse = await ctMock.app.inject({
202
+ method: "POST",
203
+ url: `/dummy/categories/${category2?.id}`,
204
+ payload: {
130
205
  version: 1,
131
206
  actions: [
132
207
  {
@@ -137,50 +212,50 @@ describe("categories changeParent", () => {
137
212
  },
138
213
  },
139
214
  ],
140
- });
215
+ },
216
+ });
141
217
 
142
- expect(changeNameResponse.status).toBe(200);
143
- expect(changeNameResponse.body.parent).toEqual({
218
+ expect(changeNameResponse.statusCode).toBe(200);
219
+ expect(changeNameResponse.json().parent).toEqual({
144
220
  typeId: "category",
145
221
  id: category1?.id,
146
222
  });
147
- expect(changeNameResponse.body.ancestors).toHaveLength(1);
148
- expect(changeNameResponse.body.ancestors[0].id).toEqual(category1?.id);
223
+ expect(changeNameResponse.json().ancestors).toHaveLength(1);
224
+ expect(changeNameResponse.json().ancestors[0].id).toEqual(category1?.id);
149
225
  });
150
226
  });
151
227
 
152
228
  describe("Categories add asset", () => {
153
229
  const ctMock = new CommercetoolsMock();
230
+ const categoryDraft = categoryDraftFactory(ctMock);
154
231
  let category: Category | undefined;
155
232
 
156
233
  beforeEach(async () => {
157
- const response = await supertest(ctMock.app)
158
- .post("/dummy/categories")
159
- .send({
160
- name: {
161
- en: "Top hat",
162
- },
163
- slug: {
164
- en: "top-hat",
234
+ category = await categoryDraft.create({
235
+ name: {
236
+ en: "Top hat",
237
+ },
238
+ slug: {
239
+ en: "top-hat",
240
+ },
241
+ orderHint: "0.1",
242
+ assets: [
243
+ {
244
+ key: "some-key",
245
+ sources: [],
246
+ name: { en: "Some Asset" },
165
247
  },
166
- orderHint: "0.1",
167
- assets: [
168
- {
169
- key: "some-key",
170
- },
171
- ],
172
- });
173
- expect(response.status).toBe(201);
174
-
175
- category = response.body as Category;
248
+ ],
249
+ });
176
250
  });
177
251
 
178
252
  test("add second asset", async () => {
179
253
  assert(category, "category not created");
180
254
 
181
- const response = await supertest(ctMock.app)
182
- .post(`/dummy/categories/${category.id}`)
183
- .send({
255
+ const response = await ctMock.app.inject({
256
+ method: "POST",
257
+ url: `/dummy/categories/${category.id}`,
258
+ payload: {
184
259
  version: 1,
185
260
  actions: [
186
261
  {
@@ -190,50 +265,52 @@ describe("Categories add asset", () => {
190
265
  },
191
266
  } as CategoryAddAssetAction,
192
267
  ],
193
- });
268
+ },
269
+ });
194
270
 
195
- expect(response.status).toBe(200);
196
- expect(response.body.assets).toHaveLength(2);
197
- expect(response.body.assets[0].key).toEqual("some-key");
198
- expect(response.body.assets[1].key).toEqual("some-other-key");
271
+ expect(response.statusCode).toBe(200);
272
+ expect(response.json().assets).toHaveLength(2);
273
+ expect(response.json().assets[0].key).toEqual("some-key");
274
+ expect(response.json().assets[1].key).toEqual("some-other-key");
199
275
  });
200
276
  });
201
277
 
202
278
  describe("Categories remove asset", () => {
203
279
  const ctMock = new CommercetoolsMock();
280
+ const categoryDraft = categoryDraftFactory(ctMock);
204
281
  let category: Category | undefined;
205
282
 
206
283
  beforeEach(async () => {
207
- const response = await supertest(ctMock.app)
208
- .post("/dummy/categories")
209
- .send({
210
- name: {
211
- en: "Top hat",
284
+ category = await categoryDraft.create({
285
+ name: {
286
+ en: "Top hat",
287
+ },
288
+ slug: {
289
+ en: "top-hat",
290
+ },
291
+ orderHint: "0.1",
292
+ assets: [
293
+ {
294
+ key: "some-key",
295
+ sources: [],
296
+ name: { en: "Some Asset" },
212
297
  },
213
- slug: {
214
- en: "top-hat",
298
+ {
299
+ key: "some-other-key",
300
+ sources: [],
301
+ name: { en: "Some Other Asset" },
215
302
  },
216
- orderHint: "0.1",
217
- assets: [
218
- {
219
- key: "some-key",
220
- },
221
- {
222
- key: "some-other-key",
223
- },
224
- ],
225
- });
226
- expect(response.status).toBe(201);
227
-
228
- category = response.body as Category;
303
+ ],
304
+ });
229
305
  });
230
306
 
231
307
  test("remove assets by id and key", async () => {
232
308
  assert(category, "category not created");
233
309
 
234
- const response = await supertest(ctMock.app)
235
- .post(`/dummy/categories/${category.id}`)
236
- .send({
310
+ const response = await ctMock.app.inject({
311
+ method: "POST",
312
+ url: `/dummy/categories/${category.id}`,
313
+ payload: {
237
314
  version: 1,
238
315
  actions: [
239
316
  {
@@ -245,9 +322,10 @@ describe("Categories remove asset", () => {
245
322
  assetId: category.assets?.[0].id,
246
323
  } as CategoryRemoveAssetAction,
247
324
  ],
248
- });
325
+ },
326
+ });
249
327
 
250
- expect(response.status).toBe(200);
251
- expect(response.body.assets).toHaveLength(0);
328
+ expect(response.statusCode).toBe(200);
329
+ expect(response.json().assets).toHaveLength(0);
252
330
  });
253
331
  });
@@ -1,11 +1,11 @@
1
- import type { Router } from "express";
1
+ import type { FastifyInstance } from "fastify";
2
2
  import type { CategoryRepository } from "../repositories/category/index.ts";
3
3
  import AbstractService from "./abstract.ts";
4
4
 
5
5
  export class CategoryServices extends AbstractService {
6
6
  public repository: CategoryRepository;
7
7
 
8
- constructor(parent: Router, repository: CategoryRepository) {
8
+ constructor(parent: FastifyInstance, repository: CategoryRepository) {
9
9
  super(parent);
10
10
  this.repository = repository;
11
11
  }
@@ -1,31 +1,36 @@
1
- import type { ChannelDraft } from "@commercetools/platform-sdk";
2
- import supertest from "supertest";
3
1
  import { describe, expect, test } from "vitest";
2
+ import { channelDraftFactory } 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("Channel", () => {
8
+ const channelDraft = channelDraftFactory(ctMock);
9
+
9
10
  test("Create channel", async () => {
10
- const draft: ChannelDraft = {
11
+ const draft = channelDraft.build({
11
12
  key: "my-channel",
12
13
  roles: ["InventorySupply"],
13
- };
14
- const response = await supertest(ctMock.app)
15
- .post("/dummy/channels")
16
- .send(draft);
14
+ });
17
15
 
18
- expect(response.status).toBe(201);
16
+ const response = await ctMock.app.inject({
17
+ method: "POST",
18
+ url: "/dummy/channels",
19
+ payload: draft,
20
+ });
19
21
 
20
- expect(response.body).toEqual({
22
+ expect(response.statusCode).toBe(201);
23
+ expect(response.json()).toEqual({
21
24
  address: undefined,
22
25
  createdAt: expect.anything(),
26
+ createdBy: expect.anything(),
23
27
  custom: undefined,
24
28
  description: undefined,
25
29
  geoLocation: undefined,
26
30
  id: expect.anything(),
27
31
  key: "my-channel",
28
32
  lastModifiedAt: expect.anything(),
33
+ lastModifiedBy: expect.anything(),
29
34
  name: undefined,
30
35
  roles: ["InventorySupply"],
31
36
  version: 1,
@@ -33,58 +38,48 @@ describe("Channel", () => {
33
38
  });
34
39
 
35
40
  test("Get channel", async () => {
36
- const draft: ChannelDraft = {
41
+ const channel = await channelDraft.create({
37
42
  key: "my-channel",
38
43
  roles: ["InventorySupply"],
39
- };
40
- const createResponse = await supertest(ctMock.app)
41
- .post("/dummy/channels")
42
- .send(draft);
43
-
44
- expect(createResponse.status).toBe(201);
44
+ });
45
45
 
46
- const response = await supertest(ctMock.app).get(
47
- `/dummy/channels/${createResponse.body.id}`,
48
- );
46
+ const response = await ctMock.app.inject({
47
+ method: "GET",
48
+ url: `/dummy/channels/${channel.id}`,
49
+ });
49
50
 
50
- expect(response.status).toBe(200);
51
- expect(response.body).toEqual(createResponse.body);
51
+ expect(response.statusCode).toBe(200);
52
+ expect(response.json()).toEqual(channel);
52
53
  });
53
54
 
54
55
  test("Get channel by key", async () => {
55
- const draft: ChannelDraft = {
56
+ const channel = await channelDraft.create({
56
57
  key: "my-channel-key",
57
58
  roles: ["InventorySupply"],
58
- };
59
- const createResponse = await supertest(ctMock.app)
60
- .post("/dummy/channels")
61
- .send(draft);
62
-
63
- expect(createResponse.status).toBe(201);
59
+ });
64
60
 
65
- const response = await supertest(ctMock.app).get(
66
- "/dummy/channels/key=my-channel-key",
67
- );
61
+ const response = await ctMock.app.inject({
62
+ method: "GET",
63
+ url: "/dummy/channels/key=my-channel-key",
64
+ });
68
65
 
69
- expect(response.status).toBe(200);
70
- expect(response.body).toEqual(createResponse.body);
66
+ expect(response.statusCode).toBe(200);
67
+ expect(response.json()).toEqual(channel);
71
68
  });
72
69
 
73
70
  test("Query channels", async () => {
74
- const draft: ChannelDraft = {
71
+ const channel = await channelDraft.create({
75
72
  key: "test-channel",
76
73
  roles: ["InventorySupply"],
77
- };
78
- const createResponse = await supertest(ctMock.app)
79
- .post("/dummy/channels")
80
- .send(draft);
81
-
82
- expect(createResponse.status).toBe(201);
74
+ });
83
75
 
84
- const response = await supertest(ctMock.app).get("/dummy/channels");
76
+ const response = await ctMock.app.inject({
77
+ method: "GET",
78
+ url: "/dummy/channels",
79
+ });
85
80
 
86
- expect(response.status).toBe(200);
87
- expect(response.body.count).toBeGreaterThan(0);
88
- expect(response.body.results).toContainEqual(createResponse.body);
81
+ expect(response.statusCode).toBe(200);
82
+ expect(response.json().count).toBeGreaterThan(0);
83
+ expect(response.json().results).toContainEqual(channel);
89
84
  });
90
85
  });
@@ -1,11 +1,11 @@
1
- import type { Router } from "express";
1
+ import type { FastifyInstance } from "fastify";
2
2
  import type { ChannelRepository } from "../repositories/channel.ts";
3
3
  import AbstractService from "./abstract.ts";
4
4
 
5
5
  export class ChannelService extends AbstractService {
6
6
  public repository: ChannelRepository;
7
7
 
8
- constructor(parent: Router, repository: ChannelRepository) {
8
+ constructor(parent: FastifyInstance, repository: ChannelRepository) {
9
9
  super(parent);
10
10
  this.repository = repository;
11
11
  }