@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,30 +1,35 @@
|
|
|
1
|
-
import type { TaxCategoryDraft } from "@commercetools/platform-sdk";
|
|
2
|
-
import supertest from "supertest";
|
|
3
1
|
import { afterEach, describe, expect, test } from "vitest";
|
|
2
|
+
import { taxCategoryDraftFactory } 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("Tax Category", () => {
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
const taxCategoryDraft = taxCategoryDraftFactory(ctMock);
|
|
9
|
+
|
|
10
|
+
afterEach(async () => {
|
|
11
|
+
await ctMock.clear();
|
|
11
12
|
});
|
|
12
13
|
test("Create tax category", async () => {
|
|
13
|
-
const draft
|
|
14
|
+
const draft = taxCategoryDraft.build({
|
|
14
15
|
name: "foo",
|
|
15
16
|
key: "standard",
|
|
16
17
|
rates: [],
|
|
17
|
-
};
|
|
18
|
-
const response = await supertest(ctMock.app)
|
|
19
|
-
.post("/dummy/tax-categories")
|
|
20
|
-
.send(draft);
|
|
18
|
+
});
|
|
21
19
|
|
|
22
|
-
|
|
20
|
+
const response = await ctMock.app.inject({
|
|
21
|
+
method: "POST",
|
|
22
|
+
url: "/dummy/tax-categories",
|
|
23
|
+
payload: draft,
|
|
24
|
+
});
|
|
23
25
|
|
|
24
|
-
expect(response.
|
|
26
|
+
expect(response.statusCode).toBe(201);
|
|
27
|
+
expect(response.json()).toEqual({
|
|
25
28
|
createdAt: expect.anything(),
|
|
29
|
+
createdBy: expect.anything(),
|
|
26
30
|
id: expect.anything(),
|
|
27
31
|
lastModifiedAt: expect.anything(),
|
|
32
|
+
lastModifiedBy: expect.anything(),
|
|
28
33
|
name: "foo",
|
|
29
34
|
rates: [],
|
|
30
35
|
key: "standard",
|
|
@@ -33,48 +38,40 @@ describe("Tax Category", () => {
|
|
|
33
38
|
});
|
|
34
39
|
|
|
35
40
|
test("Get tax category", async () => {
|
|
36
|
-
const
|
|
41
|
+
const taxCategory = await taxCategoryDraft.create({
|
|
37
42
|
name: "foo",
|
|
38
43
|
key: "standard",
|
|
39
44
|
rates: [],
|
|
40
|
-
};
|
|
41
|
-
const createResponse = await supertest(ctMock.app)
|
|
42
|
-
.post("/dummy/tax-categories")
|
|
43
|
-
.send(draft);
|
|
44
|
-
|
|
45
|
-
expect(createResponse.status).toBe(201);
|
|
45
|
+
});
|
|
46
46
|
|
|
47
|
-
const response = await
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
const response = await ctMock.app.inject({
|
|
48
|
+
method: "GET",
|
|
49
|
+
url: `/dummy/tax-categories/${taxCategory.id}`,
|
|
50
|
+
});
|
|
50
51
|
|
|
51
|
-
expect(response.
|
|
52
|
-
expect(response.
|
|
52
|
+
expect(response.statusCode).toBe(200);
|
|
53
|
+
expect(response.json()).toEqual(taxCategory);
|
|
53
54
|
});
|
|
54
55
|
|
|
55
56
|
test("Get tax category with key", async () => {
|
|
56
|
-
const
|
|
57
|
+
const taxCategory = await taxCategoryDraft.create({
|
|
57
58
|
name: "foo",
|
|
58
59
|
key: "standard",
|
|
59
60
|
rates: [],
|
|
60
|
-
};
|
|
61
|
-
const createResponse = await supertest(ctMock.app)
|
|
62
|
-
.post("/dummy/tax-categories")
|
|
63
|
-
.send(draft);
|
|
64
|
-
|
|
65
|
-
expect(createResponse.status).toBe(201);
|
|
61
|
+
});
|
|
66
62
|
|
|
67
|
-
const response = await
|
|
68
|
-
|
|
69
|
-
|
|
63
|
+
const response = await ctMock.app.inject({
|
|
64
|
+
method: "GET",
|
|
65
|
+
url: `/dummy/tax-categories/?where=${encodeURIComponent(`key="${taxCategory.key}"`)}`,
|
|
66
|
+
});
|
|
70
67
|
|
|
71
|
-
expect(response.
|
|
72
|
-
expect(response.
|
|
68
|
+
expect(response.statusCode).toBe(200);
|
|
69
|
+
expect(response.json()).toEqual({
|
|
73
70
|
count: 1,
|
|
74
71
|
limit: 20,
|
|
75
72
|
offset: 0,
|
|
76
73
|
total: 1,
|
|
77
|
-
results: [
|
|
74
|
+
results: [taxCategory],
|
|
78
75
|
});
|
|
79
76
|
});
|
|
80
77
|
});
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { FastifyInstance } from "fastify";
|
|
2
2
|
import type { TaxCategoryRepository } from "../repositories/tax-category/index.ts";
|
|
3
3
|
import AbstractService from "./abstract.ts";
|
|
4
4
|
|
|
5
5
|
export class TaxCategoryService extends AbstractService {
|
|
6
6
|
public repository: TaxCategoryRepository;
|
|
7
7
|
|
|
8
|
-
constructor(parent:
|
|
8
|
+
constructor(parent: FastifyInstance, repository: TaxCategoryRepository) {
|
|
9
9
|
super(parent);
|
|
10
10
|
this.repository = repository;
|
|
11
11
|
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import type { TypeDraft } from "@commercetools/platform-sdk";
|
|
2
|
-
import supertest from "supertest";
|
|
3
1
|
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { typeDraftFactory } 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("Type", () => {
|
|
8
|
+
const factory = typeDraftFactory(ctMock);
|
|
9
|
+
|
|
9
10
|
test("Create type", async () => {
|
|
10
|
-
const draft
|
|
11
|
+
const draft = factory.build({
|
|
11
12
|
key: "my-custom-type",
|
|
12
13
|
name: {
|
|
13
14
|
en: "My Custom Type",
|
|
@@ -25,15 +26,23 @@ describe("Type", () => {
|
|
|
25
26
|
},
|
|
26
27
|
},
|
|
27
28
|
],
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const response = await ctMock.app.inject({
|
|
32
|
+
method: "POST",
|
|
33
|
+
url: "/dummy/types",
|
|
34
|
+
payload: draft,
|
|
35
|
+
});
|
|
32
36
|
|
|
33
|
-
expect(response.
|
|
37
|
+
expect(response.statusCode).toBe(201);
|
|
34
38
|
|
|
35
|
-
|
|
39
|
+
const type = response.json();
|
|
40
|
+
expect(type).toEqual({
|
|
36
41
|
createdAt: expect.anything(),
|
|
42
|
+
createdBy: expect.anything(),
|
|
43
|
+
description: {
|
|
44
|
+
en: "Type description",
|
|
45
|
+
},
|
|
37
46
|
fieldDefinitions: [
|
|
38
47
|
{
|
|
39
48
|
label: {
|
|
@@ -49,6 +58,7 @@ describe("Type", () => {
|
|
|
49
58
|
id: expect.anything(),
|
|
50
59
|
key: "my-custom-type",
|
|
51
60
|
lastModifiedAt: expect.anything(),
|
|
61
|
+
lastModifiedBy: expect.anything(),
|
|
52
62
|
name: {
|
|
53
63
|
en: "My Custom Type",
|
|
54
64
|
},
|
|
@@ -58,70 +68,61 @@ describe("Type", () => {
|
|
|
58
68
|
});
|
|
59
69
|
|
|
60
70
|
test("Get type", async () => {
|
|
61
|
-
const
|
|
71
|
+
const type = await factory.create({
|
|
62
72
|
key: "test-type",
|
|
63
73
|
name: {
|
|
64
74
|
en: "Test Type",
|
|
65
75
|
},
|
|
66
76
|
resourceTypeIds: ["product"],
|
|
67
77
|
fieldDefinitions: [],
|
|
68
|
-
};
|
|
69
|
-
const createResponse = await supertest(ctMock.app)
|
|
70
|
-
.post("/dummy/types")
|
|
71
|
-
.send(draft);
|
|
72
|
-
|
|
73
|
-
expect(createResponse.status).toBe(201);
|
|
78
|
+
});
|
|
74
79
|
|
|
75
|
-
const response = await
|
|
76
|
-
|
|
77
|
-
|
|
80
|
+
const response = await ctMock.app.inject({
|
|
81
|
+
method: "GET",
|
|
82
|
+
url: `/dummy/types/${type.id}`,
|
|
83
|
+
});
|
|
78
84
|
|
|
79
|
-
expect(response.
|
|
80
|
-
expect(response.
|
|
85
|
+
expect(response.statusCode).toBe(200);
|
|
86
|
+
expect(response.json()).toEqual(type);
|
|
81
87
|
});
|
|
82
88
|
|
|
83
89
|
test("Get type by key", async () => {
|
|
84
|
-
const
|
|
90
|
+
const type = await factory.create({
|
|
85
91
|
key: "key-type",
|
|
86
92
|
name: {
|
|
87
93
|
en: "Key Type",
|
|
88
94
|
},
|
|
89
95
|
resourceTypeIds: ["customer"],
|
|
90
96
|
fieldDefinitions: [],
|
|
91
|
-
};
|
|
92
|
-
const createResponse = await supertest(ctMock.app)
|
|
93
|
-
.post("/dummy/types")
|
|
94
|
-
.send(draft);
|
|
95
|
-
|
|
96
|
-
expect(createResponse.status).toBe(201);
|
|
97
|
+
});
|
|
97
98
|
|
|
98
|
-
const response = await
|
|
99
|
-
"
|
|
100
|
-
|
|
99
|
+
const response = await ctMock.app.inject({
|
|
100
|
+
method: "GET",
|
|
101
|
+
url: "/dummy/types/key=key-type",
|
|
102
|
+
});
|
|
101
103
|
|
|
102
|
-
expect(response.
|
|
103
|
-
expect(response.
|
|
104
|
+
expect(response.statusCode).toBe(200);
|
|
105
|
+
expect(response.json()).toEqual(type);
|
|
104
106
|
});
|
|
105
107
|
|
|
106
108
|
test("Query types", async () => {
|
|
107
|
-
const
|
|
109
|
+
const type = await factory.create({
|
|
108
110
|
key: "query-type",
|
|
109
111
|
name: {
|
|
110
112
|
en: "Query Type",
|
|
111
113
|
},
|
|
112
114
|
resourceTypeIds: ["order"],
|
|
113
115
|
fieldDefinitions: [],
|
|
114
|
-
};
|
|
115
|
-
const createResponse = await supertest(ctMock.app)
|
|
116
|
-
.post("/dummy/types")
|
|
117
|
-
.send(draft);
|
|
118
|
-
|
|
119
|
-
expect(createResponse.status).toBe(201);
|
|
116
|
+
});
|
|
120
117
|
|
|
121
|
-
const response = await
|
|
118
|
+
const response = await ctMock.app.inject({
|
|
119
|
+
method: "GET",
|
|
120
|
+
url: "/dummy/types",
|
|
121
|
+
});
|
|
122
122
|
|
|
123
|
-
expect(response.
|
|
124
|
-
|
|
125
|
-
expect(
|
|
123
|
+
expect(response.statusCode).toBe(200);
|
|
124
|
+
const body = response.json();
|
|
125
|
+
expect(body.count).toBeGreaterThan(0);
|
|
126
|
+
expect(body.results).toContainEqual(type);
|
|
126
127
|
});
|
|
127
128
|
});
|
package/src/services/type.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { FastifyInstance } from "fastify";
|
|
2
2
|
import type { TypeRepository } from "../repositories/type/index.ts";
|
|
3
3
|
import AbstractService from "./abstract.ts";
|
|
4
4
|
|
|
5
5
|
export class TypeService extends AbstractService {
|
|
6
6
|
public repository: TypeRepository;
|
|
7
7
|
|
|
8
|
-
constructor(parent:
|
|
8
|
+
constructor(parent: FastifyInstance, repository: TypeRepository) {
|
|
9
9
|
super(parent);
|
|
10
10
|
this.repository = repository;
|
|
11
11
|
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import type { ZoneDraft } from "@commercetools/platform-sdk";
|
|
2
|
-
import supertest from "supertest";
|
|
3
1
|
import { describe, expect, test } from "vitest";
|
|
2
|
+
import { zoneDraftFactory } 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("Zone", () => {
|
|
8
|
+
const zoneDraft = zoneDraftFactory(ctMock);
|
|
9
|
+
|
|
9
10
|
test("Create zone", async () => {
|
|
10
|
-
const draft
|
|
11
|
+
const draft = zoneDraft.build({
|
|
11
12
|
key: "europe-zone",
|
|
12
13
|
name: "Europe",
|
|
13
14
|
locations: [
|
|
@@ -18,19 +19,23 @@ describe("Zone", () => {
|
|
|
18
19
|
country: "NL",
|
|
19
20
|
},
|
|
20
21
|
],
|
|
21
|
-
};
|
|
22
|
-
const response = await supertest(ctMock.app)
|
|
23
|
-
.post("/dummy/zones")
|
|
24
|
-
.send(draft);
|
|
22
|
+
});
|
|
25
23
|
|
|
26
|
-
|
|
24
|
+
const response = await ctMock.app.inject({
|
|
25
|
+
method: "POST",
|
|
26
|
+
url: "/dummy/zones",
|
|
27
|
+
payload: draft,
|
|
28
|
+
});
|
|
27
29
|
|
|
28
|
-
expect(response.
|
|
30
|
+
expect(response.statusCode).toBe(201);
|
|
31
|
+
expect(response.json()).toEqual({
|
|
29
32
|
createdAt: expect.anything(),
|
|
33
|
+
createdBy: expect.anything(),
|
|
30
34
|
description: undefined,
|
|
31
35
|
id: expect.anything(),
|
|
32
36
|
key: "europe-zone",
|
|
33
37
|
lastModifiedAt: expect.anything(),
|
|
38
|
+
lastModifiedBy: expect.anything(),
|
|
34
39
|
locations: [
|
|
35
40
|
{
|
|
36
41
|
country: "DE",
|
|
@@ -45,7 +50,7 @@ describe("Zone", () => {
|
|
|
45
50
|
});
|
|
46
51
|
|
|
47
52
|
test("Get zone", async () => {
|
|
48
|
-
const
|
|
53
|
+
const zone = await zoneDraft.create({
|
|
49
54
|
key: "test-zone",
|
|
50
55
|
name: "Test Zone",
|
|
51
56
|
locations: [
|
|
@@ -53,23 +58,19 @@ describe("Zone", () => {
|
|
|
53
58
|
country: "US",
|
|
54
59
|
},
|
|
55
60
|
],
|
|
56
|
-
};
|
|
57
|
-
const createResponse = await supertest(ctMock.app)
|
|
58
|
-
.post("/dummy/zones")
|
|
59
|
-
.send(draft);
|
|
60
|
-
|
|
61
|
-
expect(createResponse.status).toBe(201);
|
|
61
|
+
});
|
|
62
62
|
|
|
63
|
-
const response = await
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
const response = await ctMock.app.inject({
|
|
64
|
+
method: "GET",
|
|
65
|
+
url: `/dummy/zones/${zone.id}`,
|
|
66
|
+
});
|
|
66
67
|
|
|
67
|
-
expect(response.
|
|
68
|
-
expect(response.
|
|
68
|
+
expect(response.statusCode).toBe(200);
|
|
69
|
+
expect(response.json()).toEqual(zone);
|
|
69
70
|
});
|
|
70
71
|
|
|
71
72
|
test("Get zone by key", async () => {
|
|
72
|
-
const
|
|
73
|
+
const zone = await zoneDraft.create({
|
|
73
74
|
key: "key-zone",
|
|
74
75
|
name: "Key Zone",
|
|
75
76
|
locations: [
|
|
@@ -77,23 +78,19 @@ describe("Zone", () => {
|
|
|
77
78
|
country: "CA",
|
|
78
79
|
},
|
|
79
80
|
],
|
|
80
|
-
};
|
|
81
|
-
const createResponse = await supertest(ctMock.app)
|
|
82
|
-
.post("/dummy/zones")
|
|
83
|
-
.send(draft);
|
|
84
|
-
|
|
85
|
-
expect(createResponse.status).toBe(201);
|
|
81
|
+
});
|
|
86
82
|
|
|
87
|
-
const response = await
|
|
88
|
-
"
|
|
89
|
-
|
|
83
|
+
const response = await ctMock.app.inject({
|
|
84
|
+
method: "GET",
|
|
85
|
+
url: "/dummy/zones/key=key-zone",
|
|
86
|
+
});
|
|
90
87
|
|
|
91
|
-
expect(response.
|
|
92
|
-
expect(response.
|
|
88
|
+
expect(response.statusCode).toBe(200);
|
|
89
|
+
expect(response.json()).toEqual(zone);
|
|
93
90
|
});
|
|
94
91
|
|
|
95
92
|
test("Query zones", async () => {
|
|
96
|
-
const
|
|
93
|
+
const zone = await zoneDraft.create({
|
|
97
94
|
key: "query-zone",
|
|
98
95
|
name: "Query Zone",
|
|
99
96
|
locations: [
|
|
@@ -101,17 +98,16 @@ describe("Zone", () => {
|
|
|
101
98
|
country: "FR",
|
|
102
99
|
},
|
|
103
100
|
],
|
|
104
|
-
};
|
|
105
|
-
const createResponse = await supertest(ctMock.app)
|
|
106
|
-
.post("/dummy/zones")
|
|
107
|
-
.send(draft);
|
|
108
|
-
|
|
109
|
-
expect(createResponse.status).toBe(201);
|
|
101
|
+
});
|
|
110
102
|
|
|
111
|
-
const response = await
|
|
103
|
+
const response = await ctMock.app.inject({
|
|
104
|
+
method: "GET",
|
|
105
|
+
url: "/dummy/zones",
|
|
106
|
+
});
|
|
112
107
|
|
|
113
|
-
expect(response.
|
|
114
|
-
|
|
115
|
-
expect(
|
|
108
|
+
expect(response.statusCode).toBe(200);
|
|
109
|
+
const body = response.json();
|
|
110
|
+
expect(body.count).toBeGreaterThan(0);
|
|
111
|
+
expect(body.results).toContainEqual(zone);
|
|
116
112
|
});
|
|
117
113
|
});
|
package/src/services/zone.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { FastifyInstance } from "fastify";
|
|
2
2
|
import type { ZoneRepository } from "../repositories/zone.ts";
|
|
3
3
|
import AbstractService from "./abstract.ts";
|
|
4
4
|
|
|
5
5
|
export class ZoneService extends AbstractService {
|
|
6
6
|
public repository: ZoneRepository;
|
|
7
7
|
|
|
8
|
-
constructor(parent:
|
|
8
|
+
constructor(parent: FastifyInstance, repository: ZoneRepository) {
|
|
9
9
|
super(parent);
|
|
10
10
|
this.repository = repository;
|
|
11
11
|
}
|
package/src/shipping.ts
CHANGED
|
@@ -42,7 +42,13 @@ export const markMatchingShippingRatePriceTiers = (
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
if (new Set(tiers.map((tier) => tier.type)).size > 1) {
|
|
45
|
-
throw new
|
|
45
|
+
throw new CommercetoolsError<InvalidOperationError>(
|
|
46
|
+
{
|
|
47
|
+
code: "InvalidOperation",
|
|
48
|
+
message: "Can't handle multiple types of tiers",
|
|
49
|
+
},
|
|
50
|
+
400,
|
|
51
|
+
);
|
|
46
52
|
}
|
|
47
53
|
|
|
48
54
|
const tierType = tiers[0].type;
|
|
@@ -54,7 +60,13 @@ export const markMatchingShippingRatePriceTiers = (
|
|
|
54
60
|
// case 'CartScore':
|
|
55
61
|
// return markMatchingCartScoreTiers(cart, tiers)
|
|
56
62
|
default:
|
|
57
|
-
throw new
|
|
63
|
+
throw new CommercetoolsError<InvalidOperationError>(
|
|
64
|
+
{
|
|
65
|
+
code: "InvalidOperation",
|
|
66
|
+
message: `Unsupported tier type: ${tierType}`,
|
|
67
|
+
},
|
|
68
|
+
400,
|
|
69
|
+
);
|
|
58
70
|
}
|
|
59
71
|
};
|
|
60
72
|
|
|
@@ -94,7 +106,7 @@ const markMatchingCartValueTiers = (
|
|
|
94
106
|
* the flag isMatching set to true. This ShippingRate is used when the
|
|
95
107
|
* ShippingMethod is added to the Cart.
|
|
96
108
|
*/
|
|
97
|
-
export const getShippingMethodsMatchingCart = (
|
|
109
|
+
export const getShippingMethodsMatchingCart = async (
|
|
98
110
|
context: RepositoryContext,
|
|
99
111
|
storage: AbstractStorage,
|
|
100
112
|
cart: Cart,
|
|
@@ -108,12 +120,12 @@ export const getShippingMethodsMatchingCart = (
|
|
|
108
120
|
}
|
|
109
121
|
|
|
110
122
|
// Get all shipping methods that have a zone that matches the shipping address
|
|
111
|
-
const zones = storage.query<"zone">(context.projectKey, "zone", {
|
|
123
|
+
const zones = await storage.query<"zone">(context.projectKey, "zone", {
|
|
112
124
|
where: [`locations(country="${cart.shippingAddress.country}"))`],
|
|
113
125
|
limit: 100,
|
|
114
126
|
});
|
|
115
127
|
const zoneIds = zones.results.map((zone) => zone.id);
|
|
116
|
-
const shippingMethods = storage.query<"shipping-method">(
|
|
128
|
+
const shippingMethods = await storage.query<"shipping-method">(
|
|
117
129
|
context.projectKey,
|
|
118
130
|
"shipping-method",
|
|
119
131
|
{
|
|
@@ -173,12 +185,12 @@ interface ShippingCalculationSource {
|
|
|
173
185
|
/**
|
|
174
186
|
* Creates shipping info from a shipping method, handling all tax calculations and pricing logic.
|
|
175
187
|
*/
|
|
176
|
-
export const createShippingInfoFromMethod = (
|
|
188
|
+
export const createShippingInfoFromMethod = async (
|
|
177
189
|
context: RepositoryContext,
|
|
178
190
|
storage: AbstractStorage,
|
|
179
191
|
resource: ShippingCalculationSource,
|
|
180
192
|
method: ShippingMethod,
|
|
181
|
-
): Omit<ShippingInfo, "deliveries"
|
|
193
|
+
): Promise<Omit<ShippingInfo, "deliveries">> => {
|
|
182
194
|
const country = resource.shippingAddress!.country;
|
|
183
195
|
|
|
184
196
|
// There should only be one zone rate matching the address, since
|
|
@@ -191,7 +203,13 @@ export const createShippingInfoFromMethod = (
|
|
|
191
203
|
if (!zoneRate) {
|
|
192
204
|
// This shouldn't happen because getShippingMethodsMatchingCart already
|
|
193
205
|
// filtered out shipping methods without any zones matching the address
|
|
194
|
-
throw new
|
|
206
|
+
throw new CommercetoolsError<InvalidOperationError>(
|
|
207
|
+
{
|
|
208
|
+
code: "InvalidOperation",
|
|
209
|
+
message: "Zone rate not found",
|
|
210
|
+
},
|
|
211
|
+
400,
|
|
212
|
+
);
|
|
195
213
|
}
|
|
196
214
|
|
|
197
215
|
// Shipping rates are defined by currency, and getShippingMethodsMatchingCart
|
|
@@ -201,10 +219,16 @@ export const createShippingInfoFromMethod = (
|
|
|
201
219
|
if (!shippingRate) {
|
|
202
220
|
// This shouldn't happen because getShippingMethodsMatchingCart already
|
|
203
221
|
// filtered out shipping methods without any matching rates
|
|
204
|
-
throw new
|
|
222
|
+
throw new CommercetoolsError<InvalidOperationError>(
|
|
223
|
+
{
|
|
224
|
+
code: "InvalidOperation",
|
|
225
|
+
message: "Shipping rate not found",
|
|
226
|
+
},
|
|
227
|
+
400,
|
|
228
|
+
);
|
|
205
229
|
}
|
|
206
230
|
|
|
207
|
-
const taxCategory = storage.getByResourceIdentifier<"tax-category">(
|
|
231
|
+
const taxCategory = await storage.getByResourceIdentifier<"tax-category">(
|
|
208
232
|
context.projectKey,
|
|
209
233
|
method.taxCategory,
|
|
210
234
|
);
|
|
@@ -222,7 +246,13 @@ export const createShippingInfoFromMethod = (
|
|
|
222
246
|
|
|
223
247
|
const shippingRateTier = shippingRate.tiers.find((tier) => tier.isMatching);
|
|
224
248
|
if (shippingRateTier && shippingRateTier.type !== "CartValue") {
|
|
225
|
-
throw new
|
|
249
|
+
throw new CommercetoolsError<InvalidOperationError>(
|
|
250
|
+
{
|
|
251
|
+
code: "InvalidOperation",
|
|
252
|
+
message: "Non-CartValue shipping rate tier is not supported",
|
|
253
|
+
},
|
|
254
|
+
400,
|
|
255
|
+
);
|
|
226
256
|
}
|
|
227
257
|
|
|
228
258
|
let shippingPrice = shippingRateTier
|