@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,4 +1,6 @@
1
- import type { Request, Response, Router } from "express";
1
+ import type { InvalidInputError } from "@commercetools/platform-sdk";
2
+ import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
3
+ import { CommercetoolsError } from "#src/exceptions.ts";
2
4
  import { queryParamsValue } from "../helpers.ts";
3
5
  import { getRepositoryContext } from "../repositories/helpers.ts";
4
6
  import type { ShippingMethodRepository } from "../repositories/shipping-method/index.ts";
@@ -7,34 +9,44 @@ import AbstractService from "./abstract.ts";
7
9
  export class ShippingMethodService extends AbstractService {
8
10
  public repository: ShippingMethodRepository;
9
11
 
10
- constructor(parent: Router, repository: ShippingMethodRepository) {
12
+ constructor(parent: FastifyInstance, repository: ShippingMethodRepository) {
11
13
  super(parent);
12
14
  this.repository = repository;
13
- this.registerRoutes(parent);
14
15
  }
15
16
 
16
17
  getBasePath() {
17
18
  return "shipping-methods";
18
19
  }
19
20
 
20
- extraRoutes(parent: Router) {
21
+ extraRoutes(parent: FastifyInstance) {
21
22
  parent.get("/matching-cart", this.matchingCart.bind(this));
22
23
  }
23
24
 
24
- matchingCart(request: Request, response: Response) {
25
- const cartId = queryParamsValue(request.query.cartId);
25
+ async matchingCart(
26
+ request: FastifyRequest<{
27
+ Params: Record<string, string>;
28
+ Querystring: Record<string, any>;
29
+ }>,
30
+ reply: FastifyReply,
31
+ ) {
32
+ const query = request.query;
33
+ const cartId = queryParamsValue(query.cartId);
26
34
  if (!cartId) {
27
- response.status(400).send();
28
- return;
35
+ throw new CommercetoolsError<InvalidInputError>(
36
+ {
37
+ code: "InvalidInput",
38
+ message: "Missing required parameter: cartId.",
39
+ },
40
+ 400,
41
+ );
29
42
  }
30
- const result = this.repository.matchingCart(
43
+ const result = await this.repository.matchingCart(
31
44
  getRepositoryContext(request),
32
45
  cartId,
33
46
  {
34
- expand: this._parseParam(request.query.expand),
47
+ expand: this._parseParam(query.expand),
35
48
  },
36
49
  );
37
- response.status(200).send(result);
38
- return;
50
+ return reply.status(200).send(result);
39
51
  }
40
52
  }
@@ -1,10 +1,6 @@
1
- import type {
2
- Product,
3
- ShoppingList,
4
- ShoppingListDraft,
5
- } from "@commercetools/platform-sdk";
6
- import supertest from "supertest";
1
+ import type { Product, ShoppingList } from "@commercetools/platform-sdk";
7
2
  import { afterEach, beforeEach, describe, expect, test } from "vitest";
3
+ import { shoppingListDraftFactory } from "#src/testing/shopping-list.ts";
8
4
  import { CommercetoolsMock } from "../ctMock.ts";
9
5
 
10
6
  const shoppingList: ShoppingList = {
@@ -78,48 +74,52 @@ describe("Shopping List", () => {
78
74
  defaultProjectKey: "dummy",
79
75
  });
80
76
 
81
- beforeEach(() => {
82
- ctMock.project().add("product", product);
83
- ctMock.project().add("shopping-list", shoppingList);
77
+ beforeEach(async () => {
78
+ await ctMock.project().unsafeAdd("product", product);
79
+ await ctMock.project().unsafeAdd("shopping-list", shoppingList);
84
80
  });
85
81
 
86
82
  test("Adds variant ID on lineItems when creating", async () => {
87
- const draft: ShoppingListDraft = {
83
+ const draft = shoppingListDraftFactory(ctMock).build({
88
84
  name: {},
89
85
  lineItems: [{ sku: "22241940260" }],
90
- };
91
- const response = await supertest(ctMock.app)
92
- .post("/dummy/shopping-lists")
93
- .send(draft);
86
+ });
87
+ const response = await ctMock.app.inject({
88
+ method: "POST",
89
+ url: "/dummy/shopping-lists",
90
+ payload: draft,
91
+ });
94
92
 
95
- expect(response.status).toBe(201);
96
- expect(response.body.lineItems[0].variantId).toBe(2);
93
+ expect(response.statusCode).toBe(201);
94
+ expect(response.json().lineItems[0].variantId).toBe(2);
97
95
  });
98
96
 
99
97
  test("Expands variant on lineItems when getting", async () => {
100
- const response = await supertest(ctMock.app)
101
- .get(`/dummy/shopping-lists/${shoppingList.id}`)
102
- .query({ expand: "lineItems[*].variant" });
98
+ const response = await ctMock.app.inject({
99
+ method: "GET",
100
+ url: `/dummy/shopping-lists/${shoppingList.id}?expand=lineItems[*].variant`,
101
+ });
103
102
 
104
- expect(response.status).toBe(200);
105
- expect(response.body.lineItems[0].variant).toEqual({
103
+ expect(response.statusCode).toBe(200);
104
+ expect(response.json().lineItems[0].variant).toEqual({
106
105
  id: 2,
107
106
  sku: "22241940260",
108
107
  });
109
108
  });
110
109
 
111
110
  test("Expands variant on lineItems when creating", async () => {
112
- const draft: ShoppingListDraft = {
111
+ const draft = shoppingListDraftFactory(ctMock).build({
113
112
  name: {},
114
113
  lineItems: [{ sku: "22241940260" }],
115
- };
116
- const response = await supertest(ctMock.app)
117
- .post("/dummy/shopping-lists")
118
- .query({ expand: "lineItems[*].variant" })
119
- .send(draft);
114
+ });
115
+ const response = await ctMock.app.inject({
116
+ method: "POST",
117
+ url: "/dummy/shopping-lists?expand=lineItems[*].variant",
118
+ payload: draft,
119
+ });
120
120
 
121
- expect(response.status).toBe(201);
122
- expect(response.body.lineItems[0].variant).toEqual({
121
+ expect(response.statusCode).toBe(201);
122
+ expect(response.json().lineItems[0].variant).toEqual({
123
123
  id: 2,
124
124
  sku: "22241940260",
125
125
  });
@@ -131,23 +131,26 @@ describe("Shopping List Update Actions", () => {
131
131
  defaultProjectKey: "dummy",
132
132
  });
133
133
 
134
- beforeEach(() => {
135
- ctMock.project().add("product", product);
136
- ctMock.project().add("shopping-list", shoppingList);
134
+ beforeEach(async () => {
135
+ await ctMock.project().unsafeAdd("product", product);
136
+ await ctMock.project().unsafeAdd("shopping-list", shoppingList);
137
137
  });
138
138
 
139
- afterEach(() => {
140
- ctMock.clear();
139
+ afterEach(async () => {
140
+ await ctMock.clear();
141
141
  });
142
142
 
143
143
  test("addLineItem by productID & variantID", async () => {
144
- ctMock.clear();
145
- ctMock.project().add("product", product);
146
- ctMock.project().add("shopping-list", { ...shoppingList, lineItems: [] });
144
+ await ctMock.clear();
145
+ await ctMock.project().unsafeAdd("product", product);
146
+ await ctMock
147
+ .project()
148
+ .unsafeAdd("shopping-list", { ...shoppingList, lineItems: [] });
147
149
 
148
- const response = await supertest(ctMock.app)
149
- .post(`/dummy/shopping-lists/${shoppingList.id}`)
150
- .send({
150
+ const response = await ctMock.app.inject({
151
+ method: "POST",
152
+ url: `/dummy/shopping-lists/${shoppingList.id}`,
153
+ payload: {
151
154
  version: 1,
152
155
  actions: [
153
156
  {
@@ -156,21 +159,26 @@ describe("Shopping List Update Actions", () => {
156
159
  variantId: product.masterData.current.variants[0].id,
157
160
  },
158
161
  ],
159
- });
160
- expect(response.status).toBe(200);
161
- expect(response.body.version).toBe(2);
162
- expect(response.body.lineItems).toHaveLength(1);
163
- expect(response.body.lineItems[0].variantId).toEqual(2);
162
+ },
163
+ });
164
+ expect(response.statusCode).toBe(200);
165
+ const body = response.json();
166
+ expect(body.version).toBe(2);
167
+ expect(body.lineItems).toHaveLength(1);
168
+ expect(body.lineItems[0].variantId).toEqual(2);
164
169
  });
165
170
 
166
171
  test("addLineItem by productID", async () => {
167
- ctMock.clear();
168
- ctMock.project().add("product", product);
169
- ctMock.project().add("shopping-list", { ...shoppingList, lineItems: [] });
172
+ await ctMock.clear();
173
+ await ctMock.project().unsafeAdd("product", product);
174
+ await ctMock
175
+ .project()
176
+ .unsafeAdd("shopping-list", { ...shoppingList, lineItems: [] });
170
177
 
171
- const response = await supertest(ctMock.app)
172
- .post(`/dummy/shopping-lists/${shoppingList.id}`)
173
- .send({
178
+ const response = await ctMock.app.inject({
179
+ method: "POST",
180
+ url: `/dummy/shopping-lists/${shoppingList.id}`,
181
+ payload: {
174
182
  version: 1,
175
183
  actions: [
176
184
  {
@@ -178,21 +186,26 @@ describe("Shopping List Update Actions", () => {
178
186
  productId: product.id,
179
187
  },
180
188
  ],
181
- });
182
- expect(response.status).toBe(200);
183
- expect(response.body.version).toBe(2);
184
- expect(response.body.lineItems).toHaveLength(1);
185
- expect(response.body.lineItems[0].variantId).toEqual(1);
189
+ },
190
+ });
191
+ expect(response.statusCode).toBe(200);
192
+ const body = response.json();
193
+ expect(body.version).toBe(2);
194
+ expect(body.lineItems).toHaveLength(1);
195
+ expect(body.lineItems[0].variantId).toEqual(1);
186
196
  });
187
197
 
188
198
  test("addLineItem by sku", async () => {
189
- ctMock.clear();
190
- ctMock.project().add("product", product);
191
- ctMock.project().add("shopping-list", { ...shoppingList, lineItems: [] });
199
+ await ctMock.clear();
200
+ await ctMock.project().unsafeAdd("product", product);
201
+ await ctMock
202
+ .project()
203
+ .unsafeAdd("shopping-list", { ...shoppingList, lineItems: [] });
192
204
 
193
- const response = await supertest(ctMock.app)
194
- .post(`/dummy/shopping-lists/${shoppingList.id}`)
195
- .send({
205
+ const response = await ctMock.app.inject({
206
+ method: "POST",
207
+ url: `/dummy/shopping-lists/${shoppingList.id}`,
208
+ payload: {
196
209
  version: 1,
197
210
  actions: [
198
211
  {
@@ -200,17 +213,20 @@ describe("Shopping List Update Actions", () => {
200
213
  sku: "22241940260",
201
214
  },
202
215
  ],
203
- });
204
- expect(response.status).toBe(200);
205
- expect(response.body.version).toBe(2);
206
- expect(response.body.lineItems).toHaveLength(1);
207
- expect(response.body.lineItems[0].variantId).toEqual(2);
216
+ },
217
+ });
218
+ expect(response.statusCode).toBe(200);
219
+ const body = response.json();
220
+ expect(body.version).toBe(2);
221
+ expect(body.lineItems).toHaveLength(1);
222
+ expect(body.lineItems[0].variantId).toEqual(2);
208
223
  });
209
224
 
210
225
  test("addLineItem increases quantity", async () => {
211
- const response = await supertest(ctMock.app)
212
- .post(`/dummy/shopping-lists/${shoppingList.id}`)
213
- .send({
226
+ const response = await ctMock.app.inject({
227
+ method: "POST",
228
+ url: `/dummy/shopping-lists/${shoppingList.id}`,
229
+ payload: {
214
230
  version: 1,
215
231
  actions: [
216
232
  {
@@ -218,33 +234,40 @@ describe("Shopping List Update Actions", () => {
218
234
  sku: "22241940260",
219
235
  },
220
236
  ],
221
- });
222
- expect(response.status).toBe(200);
223
- expect(response.body.version).toBe(2);
224
- expect(response.body.lineItems).toHaveLength(1);
225
- expect(response.body.lineItems[0].variantId).toEqual(2);
226
- expect(response.body.lineItems[0].quantity).toEqual(2);
237
+ },
238
+ });
239
+ expect(response.statusCode).toBe(200);
240
+ const body = response.json();
241
+ expect(body.version).toBe(2);
242
+ expect(body.lineItems).toHaveLength(1);
243
+ expect(body.lineItems[0].variantId).toEqual(2);
244
+ expect(body.lineItems[0].quantity).toEqual(2);
227
245
  });
228
246
 
229
247
  test("addLineItem unknown product", async () => {
230
- const response = await supertest(ctMock.app)
231
- .post(`/dummy/shopping-lists/${shoppingList.id}`)
232
- .send({
248
+ const response = await ctMock.app.inject({
249
+ method: "POST",
250
+ url: `/dummy/shopping-lists/${shoppingList.id}`,
251
+ payload: {
233
252
  version: 1,
234
253
  actions: [{ action: "addLineItem", productId: "123", variantId: 1 }],
235
- });
236
- expect(response.status).toBe(400);
237
- expect(response.body.message).toBe("A product with ID '123' not found.");
254
+ },
255
+ });
256
+ expect(response.statusCode).toBe(400);
257
+ expect(response.json().message).toBe("A product with ID '123' not found.");
238
258
  });
239
259
 
240
260
  test("addLineItem by productID", async () => {
241
- ctMock.clear();
242
- ctMock.project().add("product", product);
243
- ctMock.project().add("shopping-list", { ...shoppingList, lineItems: [] });
261
+ await ctMock.clear();
262
+ await ctMock.project().unsafeAdd("product", product);
263
+ await ctMock
264
+ .project()
265
+ .unsafeAdd("shopping-list", { ...shoppingList, lineItems: [] });
244
266
 
245
- const response = await supertest(ctMock.app)
246
- .post(`/dummy/shopping-lists/${shoppingList.id}`)
247
- .send({
267
+ const response = await ctMock.app.inject({
268
+ method: "POST",
269
+ url: `/dummy/shopping-lists/${shoppingList.id}`,
270
+ payload: {
248
271
  version: 1,
249
272
  actions: [
250
273
  {
@@ -253,18 +276,21 @@ describe("Shopping List Update Actions", () => {
253
276
  key: "my-key",
254
277
  },
255
278
  ],
256
- });
257
- expect(response.status).toBe(200);
258
- expect(response.body.version).toBe(2);
259
- expect(response.body.lineItems).toHaveLength(1);
260
- expect(response.body.lineItems[0].key).toBeDefined();
261
- expect(response.body.lineItems[0].key).toEqual("my-key");
279
+ },
280
+ });
281
+ expect(response.statusCode).toBe(200);
282
+ const body = response.json();
283
+ expect(body.version).toBe(2);
284
+ expect(body.lineItems).toHaveLength(1);
285
+ expect(body.lineItems[0].key).toBeDefined();
286
+ expect(body.lineItems[0].key).toEqual("my-key");
262
287
  });
263
288
 
264
289
  test("removeLineItem", async () => {
265
- const response = await supertest(ctMock.app)
266
- .post(`/dummy/shopping-lists/${shoppingList.id}`)
267
- .send({
290
+ const response = await ctMock.app.inject({
291
+ method: "POST",
292
+ url: `/dummy/shopping-lists/${shoppingList.id}`,
293
+ payload: {
268
294
  version: 1,
269
295
  actions: [
270
296
  {
@@ -272,16 +298,19 @@ describe("Shopping List Update Actions", () => {
272
298
  lineItemId: shoppingList.lineItems[0].id,
273
299
  },
274
300
  ],
275
- });
276
- expect(response.status).toBe(200);
277
- expect(response.body.version).toBe(2);
278
- expect(response.body.lineItems).toHaveLength(0);
301
+ },
302
+ });
303
+ expect(response.statusCode).toBe(200);
304
+ const body = response.json();
305
+ expect(body.version).toBe(2);
306
+ expect(body.lineItems).toHaveLength(0);
279
307
  });
280
308
 
281
309
  test("removeLineItem decreases quantity", async () => {
282
- await supertest(ctMock.app)
283
- .post(`/dummy/shopping-lists/${shoppingList.id}`)
284
- .send({
310
+ await ctMock.app.inject({
311
+ method: "POST",
312
+ url: `/dummy/shopping-lists/${shoppingList.id}`,
313
+ payload: {
285
314
  version: 1,
286
315
  actions: [
287
316
  {
@@ -289,11 +318,13 @@ describe("Shopping List Update Actions", () => {
289
318
  sku: "22241940260",
290
319
  },
291
320
  ],
292
- });
321
+ },
322
+ });
293
323
 
294
- const response = await supertest(ctMock.app)
295
- .post(`/dummy/shopping-lists/${shoppingList.id}`)
296
- .send({
324
+ const response = await ctMock.app.inject({
325
+ method: "POST",
326
+ url: `/dummy/shopping-lists/${shoppingList.id}`,
327
+ payload: {
297
328
  version: 2,
298
329
  actions: [
299
330
  {
@@ -302,17 +333,20 @@ describe("Shopping List Update Actions", () => {
302
333
  quantity: 1,
303
334
  },
304
335
  ],
305
- });
306
- expect(response.status).toBe(200);
307
- expect(response.body.version).toBe(3);
308
- expect(response.body.lineItems).toHaveLength(1);
309
- expect(response.body.lineItems[0].quantity).toBe(1);
336
+ },
337
+ });
338
+ expect(response.statusCode).toBe(200);
339
+ const body = response.json();
340
+ expect(body.version).toBe(3);
341
+ expect(body.lineItems).toHaveLength(1);
342
+ expect(body.lineItems[0].quantity).toBe(1);
310
343
  });
311
344
 
312
345
  test("changeLineItemQuantity sets quantity", async () => {
313
- const response = await supertest(ctMock.app)
314
- .post(`/dummy/shopping-lists/${shoppingList.id}`)
315
- .send({
346
+ const response = await ctMock.app.inject({
347
+ method: "POST",
348
+ url: `/dummy/shopping-lists/${shoppingList.id}`,
349
+ payload: {
316
350
  version: 1,
317
351
  actions: [
318
352
  {
@@ -321,17 +355,20 @@ describe("Shopping List Update Actions", () => {
321
355
  quantity: 2,
322
356
  },
323
357
  ],
324
- });
325
- expect(response.status).toBe(200);
326
- expect(response.body.version).toBe(2);
327
- expect(response.body.lineItems.length).toBe(1);
328
- expect(response.body.lineItems[0].quantity).toBe(2);
358
+ },
359
+ });
360
+ expect(response.statusCode).toBe(200);
361
+ const body = response.json();
362
+ expect(body.version).toBe(2);
363
+ expect(body.lineItems.length).toBe(1);
364
+ expect(body.lineItems[0].quantity).toBe(2);
329
365
  });
330
366
 
331
367
  test("changeLineItemQuantity removes line item if quantity is 0", async () => {
332
- const response = await supertest(ctMock.app)
333
- .post(`/dummy/shopping-lists/${shoppingList.id}`)
334
- .send({
368
+ const response = await ctMock.app.inject({
369
+ method: "POST",
370
+ url: `/dummy/shopping-lists/${shoppingList.id}`,
371
+ payload: {
335
372
  version: 1,
336
373
  actions: [
337
374
  {
@@ -340,16 +377,19 @@ describe("Shopping List Update Actions", () => {
340
377
  quantity: 0,
341
378
  },
342
379
  ],
343
- });
344
- expect(response.status).toBe(200);
345
- expect(response.body.version).toBe(2);
346
- expect(response.body.lineItems.length).toBe(0);
380
+ },
381
+ });
382
+ expect(response.statusCode).toBe(200);
383
+ const body = response.json();
384
+ expect(body.version).toBe(2);
385
+ expect(body.lineItems.length).toBe(0);
347
386
  });
348
387
 
349
388
  test("various setters", async () => {
350
- const response = await supertest(ctMock.app)
351
- .post(`/dummy/shopping-lists/${shoppingList.id}`)
352
- .send({
389
+ const response = await ctMock.app.inject({
390
+ method: "POST",
391
+ url: `/dummy/shopping-lists/${shoppingList.id}`,
392
+ payload: {
353
393
  version: 1,
354
394
  actions: [
355
395
  {
@@ -379,18 +419,20 @@ describe("Shopping List Update Actions", () => {
379
419
  deleteDaysAfterLastModification: 1,
380
420
  },
381
421
  ],
382
- });
383
- expect(response.status).toBe(200);
384
- expect(response.body.key).toBe("new-key");
385
- expect(response.body.slug).toBe("new-slug");
386
- expect(response.body.name).toEqual({ en: "new name" });
387
- expect(response.body.description).toEqual({ en: "new description" });
388
- expect(response.body.customer).toEqual({
422
+ },
423
+ });
424
+ expect(response.statusCode).toBe(200);
425
+ const body = response.json();
426
+ expect(body.key).toBe("new-key");
427
+ expect(body.slug).toBe("new-slug");
428
+ expect(body.name).toEqual({ en: "new name" });
429
+ expect(body.description).toEqual({ en: "new description" });
430
+ expect(body.customer).toEqual({
389
431
  typeId: "customer",
390
432
  id: "customer-id",
391
433
  });
392
- expect(response.body.store).toEqual({ typeId: "store", key: "store-key" });
393
- expect(response.body.anonymousId).toEqual("new-anonymous-id");
394
- expect(response.body.deleteDaysAfterLastModification).toEqual(1);
434
+ expect(body.store).toEqual({ typeId: "store", key: "store-key" });
435
+ expect(body.anonymousId).toEqual("new-anonymous-id");
436
+ expect(body.deleteDaysAfterLastModification).toEqual(1);
395
437
  });
396
438
  });
@@ -1,11 +1,11 @@
1
- import type { Router } from "express";
1
+ import type { FastifyInstance } from "fastify";
2
2
  import type { ShoppingListRepository } from "../repositories/shopping-list/index.ts";
3
3
  import AbstractService from "./abstract.ts";
4
4
 
5
5
  export class ShoppingListService 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
  }