@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.
- 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 +3769 -2653
- 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 +84 -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
package/src/services/cart.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
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:
|
|
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:
|
|
34
|
+
extraRoutes(parent: FastifyInstance) {
|
|
28
35
|
parent.post("/replicate", this.replicate.bind(this));
|
|
29
36
|
}
|
|
30
37
|
|
|
31
|
-
replicate(
|
|
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
|
-
|
|
36
|
-
? this.orderRepository.get(context,
|
|
37
|
-
: this.repository.get(context,
|
|
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
|
-
|
|
41
|
-
|
|
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
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
33
|
+
const response = await ctMock.app.inject({
|
|
34
|
+
method: "GET",
|
|
35
|
+
url: "/dummy/categories",
|
|
36
|
+
});
|
|
41
37
|
|
|
42
|
-
expect(response.
|
|
43
|
-
expect(response.
|
|
38
|
+
expect(response.statusCode).toBe(200);
|
|
39
|
+
expect(response.json().count).toBe(1);
|
|
44
40
|
|
|
45
|
-
category = response.
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
87
|
-
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
|
128
|
-
|
|
129
|
-
|
|
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.
|
|
143
|
-
expect(changeNameResponse.
|
|
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.
|
|
148
|
-
expect(changeNameResponse.
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
167
|
-
|
|
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
|
|
182
|
-
|
|
183
|
-
.
|
|
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.
|
|
196
|
-
expect(response.
|
|
197
|
-
expect(response.
|
|
198
|
-
expect(response.
|
|
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
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
-
|
|
214
|
-
|
|
298
|
+
{
|
|
299
|
+
key: "some-other-key",
|
|
300
|
+
sources: [],
|
|
301
|
+
name: { en: "Some Other Asset" },
|
|
215
302
|
},
|
|
216
|
-
|
|
217
|
-
|
|
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
|
|
235
|
-
|
|
236
|
-
.
|
|
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.
|
|
251
|
-
expect(response.
|
|
328
|
+
expect(response.statusCode).toBe(200);
|
|
329
|
+
expect(response.json().assets).toHaveLength(0);
|
|
252
330
|
});
|
|
253
331
|
});
|
package/src/services/category.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type {
|
|
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:
|
|
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
|
|
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
|
-
|
|
16
|
+
const response = await ctMock.app.inject({
|
|
17
|
+
method: "POST",
|
|
18
|
+
url: "/dummy/channels",
|
|
19
|
+
payload: draft,
|
|
20
|
+
});
|
|
19
21
|
|
|
20
|
-
expect(response.
|
|
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
|
|
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
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
const response = await ctMock.app.inject({
|
|
47
|
+
method: "GET",
|
|
48
|
+
url: `/dummy/channels/${channel.id}`,
|
|
49
|
+
});
|
|
49
50
|
|
|
50
|
-
expect(response.
|
|
51
|
-
expect(response.
|
|
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
|
|
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
|
|
66
|
-
"
|
|
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.
|
|
70
|
-
expect(response.
|
|
66
|
+
expect(response.statusCode).toBe(200);
|
|
67
|
+
expect(response.json()).toEqual(channel);
|
|
71
68
|
});
|
|
72
69
|
|
|
73
70
|
test("Query channels", async () => {
|
|
74
|
-
const
|
|
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
|
|
76
|
+
const response = await ctMock.app.inject({
|
|
77
|
+
method: "GET",
|
|
78
|
+
url: "/dummy/channels",
|
|
79
|
+
});
|
|
85
80
|
|
|
86
|
-
expect(response.
|
|
87
|
-
expect(response.
|
|
88
|
-
expect(response.
|
|
81
|
+
expect(response.statusCode).toBe(200);
|
|
82
|
+
expect(response.json().count).toBeGreaterThan(0);
|
|
83
|
+
expect(response.json().results).toContainEqual(channel);
|
|
89
84
|
});
|
|
90
85
|
});
|
package/src/services/channel.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type {
|
|
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:
|
|
8
|
+
constructor(parent: FastifyInstance, repository: ChannelRepository) {
|
|
9
9
|
super(parent);
|
|
10
10
|
this.repository = repository;
|
|
11
11
|
}
|