@labdigital/commercetools-mock 2.65.1 → 3.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -8
- package/dist/abstract-BKFcva6S.mjs +1044 -0
- package/dist/abstract-BKFcva6S.mjs.map +1 -0
- package/dist/config-BcNSzPZz.d.mts +1718 -0
- package/dist/index.d.mts +50 -1633
- package/dist/index.mjs +3771 -2654
- package/dist/index.mjs.map +1 -1
- package/dist/storage/sqlite.d.mts +59 -0
- package/dist/storage/sqlite.mjs +234 -0
- package/dist/storage/sqlite.mjs.map +1 -0
- package/package.json +26 -29
- package/src/ctMock.ts +125 -136
- package/src/helpers.ts +14 -6
- package/src/index.ts +5 -0
- package/src/lib/masking.ts +4 -5
- package/src/lib/product-review-statistics.test.ts +257 -294
- package/src/lib/review-statistics.ts +17 -4
- package/src/oauth/helpers.ts +7 -4
- package/src/oauth/server.test.ts +102 -62
- package/src/oauth/server.ts +215 -213
- package/src/oauth/store.ts +20 -6
- package/src/orderSearch.ts +3 -3
- package/src/product-projection-search.ts +38 -20
- package/src/product-search-availability.test.ts +31 -52
- package/src/product-search.ts +19 -10
- package/src/projectAPI.ts +6 -22
- package/src/repositories/abstract.ts +182 -48
- package/src/repositories/as-associate.test.ts +19 -19
- package/src/repositories/associate-role.ts +12 -23
- package/src/repositories/attribute-group.test.ts +23 -23
- package/src/repositories/attribute-group.ts +6 -4
- package/src/repositories/business-unit.test.ts +63 -57
- package/src/repositories/business-unit.ts +107 -55
- package/src/repositories/cart/actions.ts +96 -65
- package/src/repositories/cart/helpers.ts +15 -11
- package/src/repositories/cart/index.test.ts +136 -30
- package/src/repositories/cart/index.ts +76 -59
- package/src/repositories/cart-discount/actions.ts +12 -44
- package/src/repositories/cart-discount/index.ts +20 -8
- package/src/repositories/category/actions.ts +27 -27
- package/src/repositories/category/index.test.ts +13 -9
- package/src/repositories/category/index.ts +40 -23
- package/src/repositories/channel.test.ts +53 -51
- package/src/repositories/channel.ts +12 -22
- package/src/repositories/custom-object.ts +34 -25
- package/src/repositories/customer/actions.ts +47 -25
- package/src/repositories/customer/index.test.ts +11 -11
- package/src/repositories/customer/index.ts +65 -35
- package/src/repositories/customer-group.test.ts +44 -42
- package/src/repositories/customer-group.ts +12 -22
- package/src/repositories/discount-code/actions.ts +3 -19
- package/src/repositories/discount-code/index.ts +9 -4
- package/src/repositories/discount-group/index.ts +8 -3
- package/src/repositories/extension.test.ts +27 -27
- package/src/repositories/extension.ts +10 -5
- package/src/repositories/helpers.ts +126 -47
- package/src/repositories/inventory-entry/actions.ts +3 -24
- package/src/repositories/inventory-entry/index.ts +19 -11
- package/src/repositories/my-customer.ts +13 -12
- package/src/repositories/my-order.ts +5 -2
- package/src/repositories/order/actions.ts +89 -56
- package/src/repositories/order/index.test.ts +36 -31
- package/src/repositories/order/index.ts +83 -49
- package/src/repositories/order-edit.ts +8 -3
- package/src/repositories/payment/actions.ts +64 -44
- package/src/repositories/payment/helpers.ts +3 -3
- package/src/repositories/payment/index.ts +28 -12
- package/src/repositories/product/actions.ts +133 -98
- package/src/repositories/product/helpers.ts +29 -16
- package/src/repositories/product/index.ts +42 -25
- package/src/repositories/product-discount.ts +6 -4
- package/src/repositories/product-projection.ts +41 -21
- package/src/repositories/product-selection.ts +8 -15
- package/src/repositories/product-tailoring.ts +22 -3
- package/src/repositories/product-type.ts +45 -4
- package/src/repositories/project.ts +57 -13
- package/src/repositories/quote/actions.ts +5 -28
- package/src/repositories/quote/index.ts +29 -6
- package/src/repositories/quote-request/actions.ts +5 -28
- package/src/repositories/quote-request/index.test.ts +3 -3
- package/src/repositories/quote-request/index.ts +31 -11
- package/src/repositories/quote-staged/actions.ts +5 -28
- package/src/repositories/quote-staged/index.ts +22 -8
- package/src/repositories/recurrence-policy/index.ts +6 -4
- package/src/repositories/recurring-order/actions.ts +7 -32
- package/src/repositories/recurring-order/index.ts +8 -6
- package/src/repositories/review.test.ts +147 -142
- package/src/repositories/review.ts +31 -37
- package/src/repositories/shipping-method/actions.ts +11 -28
- package/src/repositories/shipping-method/index.ts +26 -15
- package/src/repositories/shopping-list/actions.ts +21 -31
- package/src/repositories/shopping-list/index.ts +44 -22
- package/src/repositories/standalone-price.ts +6 -4
- package/src/repositories/state.ts +15 -9
- package/src/repositories/store.ts +21 -32
- package/src/repositories/subscription.test.ts +22 -22
- package/src/repositories/subscription.ts +8 -3
- package/src/repositories/tax-category/index.ts +8 -3
- package/src/repositories/type/actions.ts +21 -3
- package/src/repositories/type/index.ts +5 -3
- package/src/repositories/zone.test.ts +112 -77
- package/src/repositories/zone.ts +5 -3
- package/src/schemas/generated/associate-role.ts +13 -0
- package/src/schemas/generated/attribute-group.ts +12 -0
- package/src/schemas/generated/business-unit.ts +38 -0
- package/src/schemas/generated/cart-discount.ts +33 -0
- package/src/schemas/generated/cart.ts +61 -0
- package/src/schemas/generated/category.ts +25 -0
- package/src/schemas/generated/channel.ts +21 -0
- package/src/schemas/generated/common.ts +1372 -0
- package/src/schemas/generated/custom-object.ts +11 -0
- package/src/schemas/generated/customer-group.ts +11 -0
- package/src/schemas/generated/customer.ts +47 -0
- package/src/schemas/generated/discount-code.ts +25 -0
- package/src/schemas/generated/discount-group.ts +13 -0
- package/src/schemas/generated/extension.ts +15 -0
- package/src/schemas/generated/index.ts +42 -0
- package/src/schemas/generated/inventory-entry.ts +20 -0
- package/src/schemas/generated/my-quote-request.ts +10 -0
- package/src/schemas/generated/order-edit.ts +18 -0
- package/src/schemas/generated/order-from-cart.ts +25 -0
- package/src/schemas/generated/payment.ts +30 -0
- package/src/schemas/generated/product-discount.ts +20 -0
- package/src/schemas/generated/product-selection.ts +18 -0
- package/src/schemas/generated/product-tailoring.ts +26 -0
- package/src/schemas/generated/product-type.ts +12 -0
- package/src/schemas/generated/product.ts +37 -0
- package/src/schemas/generated/quote-request.ts +19 -0
- package/src/schemas/generated/quote.ts +18 -0
- package/src/schemas/generated/recurrence-policy.ts +15 -0
- package/src/schemas/generated/recurring-order.ts +19 -0
- package/src/schemas/generated/review.ts +24 -0
- package/src/schemas/generated/shipping-method.ts +24 -0
- package/src/schemas/generated/shopping-list.ts +28 -0
- package/src/schemas/generated/staged-quote.ts +18 -0
- package/src/schemas/generated/standalone-price.ts +32 -0
- package/src/schemas/generated/state.ts +20 -0
- package/src/schemas/generated/store.ts +23 -0
- package/src/schemas/generated/subscription.ts +20 -0
- package/src/schemas/generated/tax-category.ts +12 -0
- package/src/schemas/generated/type.ts +17 -0
- package/src/schemas/generated/zone.ts +12 -0
- package/src/schemas/update-request.ts +3 -5
- package/src/server.ts +32 -4
- package/src/services/abstract.ts +207 -101
- package/src/services/as-associate-cart.test.ts +28 -36
- package/src/services/as-associate-cart.ts +15 -12
- package/src/services/as-associate-order.test.ts +33 -40
- package/src/services/as-associate-order.ts +15 -12
- package/src/services/as-associate-quote-request.ts +15 -12
- package/src/services/as-associate-shopping-list.test.ts +25 -35
- package/src/services/as-associate-shopping-list.ts +15 -12
- package/src/services/as-associate.test.ts +21 -15
- package/src/services/as-associate.ts +23 -22
- package/src/services/associate-roles.test.ts +16 -22
- package/src/services/associate-roles.ts +2 -2
- package/src/services/attribute-group.test.ts +40 -44
- package/src/services/attribute-group.ts +2 -2
- package/src/services/business-units.test.ts +227 -163
- package/src/services/business-units.ts +2 -2
- package/src/services/cart-discount.test.ts +253 -187
- package/src/services/cart-discount.ts +2 -2
- package/src/services/cart.test.ts +833 -832
- package/src/services/cart.ts +31 -12
- package/src/services/category.test.ts +208 -130
- package/src/services/category.ts +2 -2
- package/src/services/channel.test.ts +39 -44
- package/src/services/channel.ts +2 -2
- package/src/services/custom-object.test.ts +103 -79
- package/src/services/custom-object.ts +106 -38
- package/src/services/customer-group.test.ts +39 -44
- package/src/services/customer-group.ts +2 -2
- package/src/services/customer.test.ts +357 -292
- package/src/services/customer.ts +70 -23
- package/src/services/discount-code.test.ts +57 -68
- package/src/services/discount-code.ts +2 -2
- package/src/services/discount-group.test.ts +111 -134
- package/src/services/discount-group.ts +2 -2
- package/src/services/draft-validation.test.ts +255 -0
- package/src/services/extension.test.ts +39 -44
- package/src/services/extension.ts +2 -2
- package/src/services/inventory-entry.test.ts +106 -87
- package/src/services/inventory-entry.ts +2 -2
- package/src/services/my-business-unit.test.ts +82 -112
- package/src/services/my-business-unit.ts +25 -19
- package/src/services/my-cart.test.ts +46 -41
- package/src/services/my-cart.ts +32 -28
- package/src/services/my-customer.test.ts +153 -88
- package/src/services/my-customer.ts +130 -61
- package/src/services/my-order.ts +15 -12
- package/src/services/my-payment.test.ts +30 -24
- package/src/services/my-payment.ts +2 -2
- package/src/services/my-shopping-list.ts +2 -2
- package/src/services/order.test.ts +332 -276
- package/src/services/order.ts +45 -27
- package/src/services/payment.test.ts +31 -29
- package/src/services/payment.ts +2 -2
- package/src/services/product-discount.test.ts +39 -46
- package/src/services/product-discount.ts +2 -2
- package/src/services/product-projection.test.ts +176 -166
- package/src/services/product-projection.ts +31 -15
- package/src/services/product-selection.test.ts +17 -9
- package/src/services/product-selection.ts +2 -2
- package/src/services/product-type.test.ts +80 -21
- package/src/services/product-type.ts +2 -2
- package/src/services/product.test.ts +569 -534
- package/src/services/product.ts +14 -7
- package/src/services/project.test.ts +22 -12
- package/src/services/project.ts +28 -13
- package/src/services/quote-request.test.ts +36 -39
- package/src/services/quote-request.ts +2 -2
- package/src/services/quote-staged.ts +2 -2
- package/src/services/quote.ts +2 -2
- package/src/services/recurrence-policy.test.ts +114 -139
- package/src/services/recurrence-policy.ts +2 -2
- package/src/services/recurring-order.test.ts +149 -194
- package/src/services/recurring-order.ts +2 -2
- package/src/services/reviews.test.ts +127 -106
- package/src/services/reviews.ts +2 -2
- package/src/services/shipping-method.test.ts +96 -125
- package/src/services/shipping-method.ts +24 -12
- package/src/services/shopping-list.test.ts +183 -141
- package/src/services/shopping-list.ts +2 -2
- package/src/services/standalone-price.test.ts +60 -46
- package/src/services/standalone-price.ts +2 -2
- package/src/services/state.test.ts +20 -25
- package/src/services/state.ts +2 -2
- package/src/services/store.test.ts +26 -45
- package/src/services/store.ts +2 -2
- package/src/services/subscription.test.ts +39 -44
- package/src/services/subscription.ts +2 -2
- package/src/services/tax-category.test.ts +33 -36
- package/src/services/tax-category.ts +2 -2
- package/src/services/type.test.ts +45 -44
- package/src/services/type.ts +2 -2
- package/src/services/zone.test.ts +40 -44
- package/src/services/zone.ts +2 -2
- package/src/shipping.ts +41 -11
- package/src/storage/abstract.ts +248 -17
- package/src/storage/in-memory.ts +147 -290
- package/src/storage/sqlite.ts +429 -0
- package/src/storage/storage-map.ts +75 -0
- package/src/storage/storage.test-helpers.ts +97 -0
- package/src/storage/storage.test.ts +802 -0
- package/src/testing/associate-role.ts +28 -0
- package/src/testing/attribute-group.ts +27 -0
- package/src/testing/business-unit.ts +9 -8
- package/src/testing/cart-discount.ts +34 -0
- package/src/testing/cart.ts +20 -0
- package/src/testing/category.ts +25 -0
- package/src/testing/channel.ts +23 -0
- package/src/testing/custom-object.ts +27 -0
- package/src/testing/customer-group.ts +26 -0
- package/src/testing/customer.ts +36 -33
- package/src/testing/discount-code.ts +29 -0
- package/src/testing/discount-group.ts +27 -0
- package/src/testing/extension.ts +32 -0
- package/src/testing/index.ts +33 -0
- package/src/testing/inventory-entry.ts +26 -0
- package/src/testing/order.ts +27 -0
- package/src/testing/payment.ts +23 -0
- package/src/testing/product-discount.ts +33 -0
- package/src/testing/product-selection.ts +28 -0
- package/src/testing/product-type.ts +27 -0
- package/src/testing/product.ts +38 -0
- package/src/testing/quote-request.ts +29 -0
- package/src/testing/recurrence-policy.ts +33 -0
- package/src/testing/recurring-order.ts +32 -0
- package/src/testing/review.ts +24 -0
- package/src/testing/shipping-method.ts +31 -0
- package/src/testing/shopping-list.ts +25 -0
- package/src/testing/standalone-price.ts +31 -0
- package/src/testing/state.ts +21 -0
- package/src/testing/store.ts +26 -0
- package/src/testing/subscription.ts +38 -0
- package/src/testing/tax-category.ts +27 -0
- package/src/testing/type.ts +9 -6
- package/src/testing/zone.ts +22 -0
- package/src/validate.test.ts +122 -0
- package/src/validate.ts +78 -7
- package/src/.env +0 -0
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import type {
|
|
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:
|
|
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:
|
|
21
|
+
extraRoutes(parent: FastifyInstance) {
|
|
21
22
|
parent.get("/matching-cart", this.matchingCart.bind(this));
|
|
22
23
|
}
|
|
23
24
|
|
|
24
|
-
matchingCart(
|
|
25
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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(
|
|
47
|
+
expand: this._parseParam(query.expand),
|
|
35
48
|
},
|
|
36
49
|
);
|
|
37
|
-
|
|
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().
|
|
83
|
-
ctMock.project().
|
|
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
|
|
83
|
+
const draft = shoppingListDraftFactory(ctMock).build({
|
|
88
84
|
name: {},
|
|
89
85
|
lineItems: [{ sku: "22241940260" }],
|
|
90
|
-
};
|
|
91
|
-
const response = await
|
|
92
|
-
|
|
93
|
-
|
|
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.
|
|
96
|
-
expect(response.
|
|
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
|
|
101
|
-
|
|
102
|
-
.
|
|
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.
|
|
105
|
-
expect(response.
|
|
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
|
|
111
|
+
const draft = shoppingListDraftFactory(ctMock).build({
|
|
113
112
|
name: {},
|
|
114
113
|
lineItems: [{ sku: "22241940260" }],
|
|
115
|
-
};
|
|
116
|
-
const response = await
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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.
|
|
122
|
-
expect(response.
|
|
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().
|
|
136
|
-
ctMock.project().
|
|
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().
|
|
146
|
-
ctMock
|
|
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
|
|
149
|
-
|
|
150
|
-
.
|
|
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
|
-
|
|
161
|
-
expect(response.
|
|
162
|
-
|
|
163
|
-
expect(
|
|
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().
|
|
169
|
-
ctMock
|
|
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
|
|
172
|
-
|
|
173
|
-
.
|
|
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
|
-
|
|
183
|
-
expect(response.
|
|
184
|
-
|
|
185
|
-
expect(
|
|
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().
|
|
191
|
-
ctMock
|
|
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
|
|
194
|
-
|
|
195
|
-
.
|
|
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
|
-
|
|
205
|
-
expect(response.
|
|
206
|
-
|
|
207
|
-
expect(
|
|
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
|
|
212
|
-
|
|
213
|
-
.
|
|
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
|
-
|
|
223
|
-
expect(response.
|
|
224
|
-
|
|
225
|
-
expect(
|
|
226
|
-
expect(
|
|
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
|
|
231
|
-
|
|
232
|
-
.
|
|
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
|
-
|
|
237
|
-
expect(response.
|
|
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().
|
|
243
|
-
ctMock
|
|
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
|
|
246
|
-
|
|
247
|
-
.
|
|
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
|
-
|
|
258
|
-
expect(response.
|
|
259
|
-
|
|
260
|
-
expect(
|
|
261
|
-
expect(
|
|
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
|
|
266
|
-
|
|
267
|
-
.
|
|
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
|
-
|
|
277
|
-
expect(response.
|
|
278
|
-
|
|
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
|
|
283
|
-
|
|
284
|
-
.
|
|
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
|
|
295
|
-
|
|
296
|
-
.
|
|
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
|
-
|
|
307
|
-
expect(response.
|
|
308
|
-
|
|
309
|
-
expect(
|
|
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
|
|
314
|
-
|
|
315
|
-
.
|
|
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
|
-
|
|
326
|
-
expect(response.
|
|
327
|
-
|
|
328
|
-
expect(
|
|
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
|
|
333
|
-
|
|
334
|
-
.
|
|
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
|
-
|
|
345
|
-
expect(response.
|
|
346
|
-
|
|
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
|
|
351
|
-
|
|
352
|
-
.
|
|
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
|
-
|
|
384
|
-
expect(response.
|
|
385
|
-
|
|
386
|
-
expect(
|
|
387
|
-
expect(
|
|
388
|
-
expect(
|
|
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(
|
|
393
|
-
expect(
|
|
394
|
-
expect(
|
|
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 {
|
|
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:
|
|
8
|
+
constructor(parent: FastifyInstance, repository: ShoppingListRepository) {
|
|
9
9
|
super(parent);
|
|
10
10
|
this.repository = repository;
|
|
11
11
|
}
|