@labdigital/commercetools-mock 2.17.1 → 2.18.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/dist/index.cjs +4186 -3974
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +266 -413
- package/dist/index.d.ts +266 -413
- package/dist/index.js +4186 -3974
- package/dist/index.js.map +1 -1
- package/package.json +44 -46
- package/src/constants.ts +2 -2
- package/src/ctMock.test.ts +11 -11
- package/src/ctMock.ts +141 -127
- package/src/deprecation.ts +8 -0
- package/src/exceptions.ts +17 -15
- package/src/helpers.ts +32 -32
- package/src/index.test.ts +128 -128
- package/src/index.ts +3 -3
- package/src/lib/expandParser.ts +13 -13
- package/src/lib/haversine.test.ts +9 -9
- package/src/lib/haversine.ts +11 -11
- package/src/lib/masking.ts +11 -11
- package/src/lib/parser.ts +2 -2
- package/src/lib/password.ts +23 -3
- package/src/lib/predicateParser.test.ts +185 -183
- package/src/lib/predicateParser.ts +234 -234
- package/src/lib/projectionSearchFilter.test.ts +103 -101
- package/src/lib/projectionSearchFilter.ts +152 -150
- package/src/lib/proxy.ts +5 -5
- package/src/oauth/errors.ts +4 -4
- package/src/oauth/helpers.ts +6 -6
- package/src/oauth/server.test.ts +86 -86
- package/src/oauth/server.ts +158 -144
- package/src/oauth/store.ts +44 -43
- package/src/priceSelector.test.ts +35 -35
- package/src/priceSelector.ts +30 -30
- package/src/product-projection-search.ts +136 -134
- package/src/projectAPI.test.ts +7 -7
- package/src/projectAPI.ts +24 -22
- package/src/repositories/abstract.ts +168 -116
- package/src/repositories/associate-role.ts +90 -77
- package/src/repositories/attribute-group.ts +51 -40
- package/src/repositories/business-unit.ts +168 -148
- package/src/repositories/cart/actions.ts +489 -0
- package/src/repositories/cart/helpers.ts +30 -0
- package/src/repositories/cart/index.ts +180 -0
- package/src/repositories/cart-discount/actions.ts +148 -0
- package/src/repositories/cart-discount/index.ts +86 -0
- package/src/repositories/category/actions.ts +231 -0
- package/src/repositories/category/index.ts +52 -0
- package/src/repositories/channel.ts +88 -90
- package/src/repositories/custom-object.ts +46 -45
- package/src/repositories/customer/actions.ts +165 -0
- package/src/repositories/customer/index.ts +79 -0
- package/src/repositories/customer-group.ts +66 -55
- package/src/repositories/discount-code/actions.ts +149 -0
- package/src/repositories/discount-code/index.ts +50 -0
- package/src/repositories/errors.ts +10 -10
- package/src/repositories/extension.ts +64 -62
- package/src/repositories/helpers.ts +117 -118
- package/src/repositories/index.ts +80 -79
- package/src/repositories/inventory-entry/actions.ts +84 -0
- package/src/repositories/inventory-entry/index.ts +44 -0
- package/src/repositories/my-customer.ts +114 -0
- package/src/repositories/my-order.ts +8 -8
- package/src/repositories/order/actions.ts +281 -0
- package/src/repositories/{order.test.ts → order/index.test.ts} +77 -77
- package/src/repositories/order/index.ts +260 -0
- package/src/repositories/order-edit.ts +10 -23
- package/src/repositories/payment/actions.ts +305 -0
- package/src/repositories/payment/helpers.ts +17 -0
- package/src/repositories/payment/index.ts +56 -0
- package/src/repositories/product/actions.ts +943 -0
- package/src/repositories/product/helpers.ts +98 -0
- package/src/repositories/product/index.ts +130 -0
- package/src/repositories/product-discount.ts +127 -117
- package/src/repositories/product-projection.ts +56 -62
- package/src/repositories/product-selection.ts +31 -28
- package/src/repositories/product-type.ts +136 -134
- package/src/repositories/project.ts +133 -118
- package/src/repositories/quote-request.ts +7 -19
- package/src/repositories/quote.ts +7 -22
- package/src/repositories/review.ts +13 -26
- package/src/repositories/shipping-method/actions.ts +198 -0
- package/src/repositories/shipping-method/helpers.ts +10 -0
- package/src/repositories/shipping-method/index.ts +138 -0
- package/src/repositories/shopping-list/actions.ts +295 -0
- package/src/repositories/shopping-list/index.ts +122 -0
- package/src/repositories/staged-quote.ts +7 -20
- package/src/repositories/standalone-price.ts +57 -44
- package/src/repositories/state.ts +113 -68
- package/src/repositories/store.ts +106 -94
- package/src/repositories/subscription.ts +46 -22
- package/src/repositories/tax-category/actions.ts +94 -0
- package/src/repositories/tax-category/helpers.ts +8 -0
- package/src/repositories/tax-category/index.ts +25 -0
- package/src/repositories/type/actions.ts +162 -0
- package/src/repositories/type/index.ts +24 -0
- package/src/repositories/zone.ts +62 -58
- package/src/server.ts +9 -9
- package/src/services/abstract.ts +75 -72
- package/src/services/associate-roles.test.ts +27 -27
- package/src/services/associate-roles.ts +7 -7
- package/src/services/attribute-group.ts +7 -7
- package/src/services/business-units.test.ts +28 -28
- package/src/services/business-units.ts +7 -7
- package/src/services/cart-discount.test.ts +199 -199
- package/src/services/cart-discount.ts +7 -7
- package/src/services/cart.test.ts +261 -261
- package/src/services/cart.ts +22 -21
- package/src/services/category.test.ts +121 -121
- package/src/services/category.ts +7 -7
- package/src/services/channel.ts +7 -7
- package/src/services/custom-object.test.ts +130 -130
- package/src/services/custom-object.ts +34 -31
- package/src/services/customer-group.ts +7 -7
- package/src/services/customer.test.ts +205 -205
- package/src/services/customer.ts +23 -36
- package/src/services/discount-code.ts +7 -7
- package/src/services/extension.ts +7 -7
- package/src/services/index.ts +85 -81
- package/src/services/inventory-entry.test.ts +106 -106
- package/src/services/inventory-entry.ts +7 -7
- package/src/services/my-cart.test.ts +56 -56
- package/src/services/my-cart.ts +20 -20
- package/src/services/my-customer.test.ts +155 -104
- package/src/services/my-customer.ts +61 -75
- package/src/services/my-order.ts +16 -16
- package/src/services/my-payment.test.ts +40 -40
- package/src/services/my-payment.ts +7 -7
- package/src/services/my-shopping-list.ts +7 -7
- package/src/services/order.test.ts +243 -243
- package/src/services/order.ts +23 -18
- package/src/services/payment.test.ts +40 -40
- package/src/services/payment.ts +7 -7
- package/src/services/product-discount.ts +7 -7
- package/src/services/product-projection.test.ts +190 -190
- package/src/services/product-projection.ts +34 -32
- package/src/services/product-selection.test.ts +19 -19
- package/src/services/product-selection.ts +7 -7
- package/src/services/product-type.test.ts +38 -38
- package/src/services/product-type.ts +7 -7
- package/src/services/product.test.ts +658 -656
- package/src/services/product.ts +7 -7
- package/src/services/project.test.ts +24 -24
- package/src/services/project.ts +17 -17
- package/src/services/reviews.ts +7 -7
- package/src/services/shipping-method.test.ts +78 -78
- package/src/services/shipping-method.ts +16 -16
- package/src/services/shopping-list.test.ts +170 -170
- package/src/services/shopping-list.ts +7 -7
- package/src/services/standalone-price.test.ts +112 -112
- package/src/services/standalone-price.ts +7 -7
- package/src/services/state.test.ts +30 -30
- package/src/services/state.ts +7 -7
- package/src/services/store.test.ts +40 -40
- package/src/services/store.ts +7 -7
- package/src/services/subscription.ts +7 -7
- package/src/services/tax-category.test.ts +43 -43
- package/src/services/tax-category.ts +7 -7
- package/src/services/type.ts +7 -7
- package/src/services/zone.ts +7 -7
- package/src/shippingCalculator.test.ts +43 -43
- package/src/shippingCalculator.ts +23 -23
- package/src/storage/abstract.ts +36 -34
- package/src/storage/in-memory.ts +237 -233
- package/src/storage/index.ts +2 -2
- package/src/types.ts +91 -91
- package/src/repositories/cart-discount.ts +0 -219
- package/src/repositories/cart.ts +0 -659
- package/src/repositories/category.ts +0 -256
- package/src/repositories/customer.ts +0 -228
- package/src/repositories/discount-code.ts +0 -181
- package/src/repositories/inventory-entry.ts +0 -109
- package/src/repositories/order.ts +0 -514
- package/src/repositories/payment.ts +0 -342
- package/src/repositories/product.ts +0 -1106
- package/src/repositories/shipping-method.ts +0 -312
- package/src/repositories/shopping-list.ts +0 -392
- package/src/repositories/tax-category.ts +0 -111
- package/src/repositories/type.ts +0 -172
package/src/helpers.ts
CHANGED
|
@@ -1,79 +1,79 @@
|
|
|
1
|
-
import { OutgoingHttpHeaders } from
|
|
2
|
-
import { ParsedQs } from
|
|
3
|
-
import { v4 as uuidv4 } from
|
|
1
|
+
import { OutgoingHttpHeaders } from "node:http";
|
|
2
|
+
import { ParsedQs } from "qs";
|
|
3
|
+
import { v4 as uuidv4 } from "uuid";
|
|
4
4
|
|
|
5
5
|
export const getBaseResourceProperties = () => ({
|
|
6
6
|
id: uuidv4(),
|
|
7
7
|
createdAt: new Date().toISOString(),
|
|
8
8
|
lastModifiedAt: new Date().toISOString(),
|
|
9
9
|
version: 0,
|
|
10
|
-
})
|
|
10
|
+
});
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* Do a nested lookup by using a path. For example `foo.bar.value` will
|
|
14
14
|
* return obj['foo']['bar']['value']
|
|
15
15
|
*/
|
|
16
16
|
export const nestedLookup = (obj: any, path: string): any => {
|
|
17
|
-
if (!path || path ===
|
|
18
|
-
return obj
|
|
17
|
+
if (!path || path === "") {
|
|
18
|
+
return obj;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
const parts = path.split(
|
|
22
|
-
let val = obj
|
|
21
|
+
const parts = path.split(".");
|
|
22
|
+
let val = obj;
|
|
23
23
|
|
|
24
24
|
for (let i = 0; i < parts.length; i++) {
|
|
25
|
-
const part = parts[i]
|
|
25
|
+
const part = parts[i];
|
|
26
26
|
if (val == undefined) {
|
|
27
|
-
return undefined
|
|
27
|
+
return undefined;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
val = val[part]
|
|
30
|
+
val = val[part];
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
return val
|
|
34
|
-
}
|
|
33
|
+
return val;
|
|
34
|
+
};
|
|
35
35
|
|
|
36
36
|
export const queryParamsArray = (
|
|
37
|
-
input: string | ParsedQs | string[] | ParsedQs[] | undefined
|
|
37
|
+
input: string | ParsedQs | string[] | ParsedQs[] | undefined,
|
|
38
38
|
): string[] | undefined => {
|
|
39
39
|
if (input == undefined) {
|
|
40
|
-
return undefined
|
|
40
|
+
return undefined;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
const values: string[] = Array.isArray(input)
|
|
44
44
|
? (input as string[])
|
|
45
|
-
: ([input] as string[])
|
|
45
|
+
: ([input] as string[]);
|
|
46
46
|
if (values.length < 1) {
|
|
47
|
-
return undefined
|
|
47
|
+
return undefined;
|
|
48
48
|
}
|
|
49
|
-
return values
|
|
50
|
-
}
|
|
49
|
+
return values;
|
|
50
|
+
};
|
|
51
51
|
|
|
52
52
|
export const queryParamsValue = (
|
|
53
|
-
value: string | ParsedQs | string[] | ParsedQs[] | undefined
|
|
53
|
+
value: string | ParsedQs | string[] | ParsedQs[] | undefined,
|
|
54
54
|
): string | undefined => {
|
|
55
|
-
const values = queryParamsArray(value)
|
|
55
|
+
const values = queryParamsArray(value);
|
|
56
56
|
if (values && values.length > 0) {
|
|
57
|
-
return values[0]
|
|
57
|
+
return values[0];
|
|
58
58
|
}
|
|
59
|
-
return undefined
|
|
60
|
-
}
|
|
59
|
+
return undefined;
|
|
60
|
+
};
|
|
61
61
|
|
|
62
|
-
export const cloneObject = <T>(o: T): T => JSON.parse(JSON.stringify(o))
|
|
62
|
+
export const cloneObject = <T>(o: T): T => JSON.parse(JSON.stringify(o));
|
|
63
63
|
|
|
64
64
|
export const mapHeaderType = (
|
|
65
|
-
outgoingHttpHeaders: OutgoingHttpHeaders
|
|
65
|
+
outgoingHttpHeaders: OutgoingHttpHeaders,
|
|
66
66
|
): HeadersInit => {
|
|
67
|
-
const headersInit: HeadersInit = {}
|
|
67
|
+
const headersInit: HeadersInit = {};
|
|
68
68
|
for (const key in outgoingHttpHeaders) {
|
|
69
|
-
const value = outgoingHttpHeaders[key]
|
|
69
|
+
const value = outgoingHttpHeaders[key];
|
|
70
70
|
if (Array.isArray(value)) {
|
|
71
71
|
// Join multiple values for the same header with a comma
|
|
72
|
-
headersInit[key] = value.join(
|
|
72
|
+
headersInit[key] = value.join(", ");
|
|
73
73
|
} else if (value !== undefined) {
|
|
74
74
|
// Single value or undefined
|
|
75
|
-
headersInit[key] = value.toString()
|
|
75
|
+
headersInit[key] = value.toString();
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
|
-
return headersInit
|
|
79
|
-
}
|
|
78
|
+
return headersInit;
|
|
79
|
+
};
|
package/src/index.test.ts
CHANGED
|
@@ -1,238 +1,238 @@
|
|
|
1
|
-
import { type InvalidTokenError } from
|
|
2
|
-
import
|
|
3
|
-
import { expect, test } from
|
|
4
|
-
import
|
|
1
|
+
import { type InvalidTokenError } from "@commercetools/platform-sdk";
|
|
2
|
+
import got from "got";
|
|
3
|
+
import { expect, test } from "vitest";
|
|
4
|
+
import { CommercetoolsMock } from "./index";
|
|
5
5
|
|
|
6
|
-
test(
|
|
6
|
+
test("node:fetch client", async () => {
|
|
7
7
|
const ctMock = new CommercetoolsMock({
|
|
8
8
|
enableAuthentication: true,
|
|
9
9
|
validateCredentials: true,
|
|
10
|
-
apiHost:
|
|
11
|
-
authHost:
|
|
12
|
-
})
|
|
13
|
-
ctMock.start()
|
|
14
|
-
|
|
15
|
-
const authHeader =
|
|
16
|
-
let response = await fetch(
|
|
17
|
-
method:
|
|
10
|
+
apiHost: "https://localhost",
|
|
11
|
+
authHost: "https://localhost:8080",
|
|
12
|
+
});
|
|
13
|
+
ctMock.start();
|
|
14
|
+
|
|
15
|
+
const authHeader = "Basic " + Buffer.from("foo:bar").toString("base64");
|
|
16
|
+
let response = await fetch("https://localhost:8080/oauth/token", {
|
|
17
|
+
method: "POST",
|
|
18
18
|
headers: {
|
|
19
|
-
|
|
20
|
-
Authorization: authHeader,
|
|
19
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
20
|
+
"Authorization": authHeader,
|
|
21
21
|
},
|
|
22
22
|
body: new URLSearchParams({
|
|
23
|
-
grant_type:
|
|
24
|
-
scope:
|
|
23
|
+
grant_type: "client_credentials",
|
|
24
|
+
scope: "manage_project:commercetools-node-mock",
|
|
25
25
|
}),
|
|
26
|
-
})
|
|
26
|
+
});
|
|
27
27
|
|
|
28
|
-
const authBody = await response.json()
|
|
29
|
-
expect(response.status).toBe(200)
|
|
28
|
+
const authBody = await response.json();
|
|
29
|
+
expect(response.status).toBe(200);
|
|
30
30
|
|
|
31
|
-
const token = authBody.access_token
|
|
32
|
-
response = await fetch(
|
|
31
|
+
const token = authBody.access_token;
|
|
32
|
+
response = await fetch("https://localhost/my-project/orders", {
|
|
33
33
|
headers: {
|
|
34
34
|
Authorization: `Bearer ${token}`,
|
|
35
35
|
},
|
|
36
|
-
})
|
|
36
|
+
});
|
|
37
37
|
|
|
38
|
-
const body = await response.json()
|
|
39
|
-
expect(response.status).toBe(200)
|
|
38
|
+
const body = await response.json();
|
|
39
|
+
expect(response.status).toBe(200);
|
|
40
40
|
expect(body).toStrictEqual({
|
|
41
41
|
count: 0,
|
|
42
42
|
total: 0,
|
|
43
43
|
offset: 0,
|
|
44
44
|
limit: 20,
|
|
45
45
|
results: [],
|
|
46
|
-
})
|
|
47
|
-
ctMock.stop()
|
|
48
|
-
})
|
|
46
|
+
});
|
|
47
|
+
ctMock.stop();
|
|
48
|
+
});
|
|
49
49
|
|
|
50
|
-
test(
|
|
50
|
+
test("got client", async () => {
|
|
51
51
|
const ctMock = new CommercetoolsMock({
|
|
52
52
|
enableAuthentication: true,
|
|
53
53
|
validateCredentials: true,
|
|
54
|
-
apiHost:
|
|
55
|
-
authHost:
|
|
56
|
-
})
|
|
57
|
-
ctMock.start()
|
|
54
|
+
apiHost: "https://localhost",
|
|
55
|
+
authHost: "https://localhost:8080",
|
|
56
|
+
});
|
|
57
|
+
ctMock.start();
|
|
58
58
|
|
|
59
59
|
let response = await got.post<{ access_token: string }>(
|
|
60
|
-
|
|
60
|
+
"https://localhost:8080/oauth/token",
|
|
61
61
|
{
|
|
62
62
|
searchParams: {
|
|
63
|
-
grant_type:
|
|
64
|
-
scope:
|
|
63
|
+
grant_type: "client_credentials",
|
|
64
|
+
scope: "manage_project:commercetools-node-mock",
|
|
65
65
|
},
|
|
66
|
-
username:
|
|
67
|
-
password:
|
|
68
|
-
responseType:
|
|
69
|
-
}
|
|
70
|
-
)
|
|
71
|
-
expect(response.statusCode).toBe(200)
|
|
72
|
-
|
|
73
|
-
const token = response.body.access_token
|
|
74
|
-
expect(response.body.access_token).toBeDefined()
|
|
75
|
-
response = await got.get(
|
|
66
|
+
username: "foo",
|
|
67
|
+
password: "bar",
|
|
68
|
+
responseType: "json",
|
|
69
|
+
},
|
|
70
|
+
);
|
|
71
|
+
expect(response.statusCode).toBe(200);
|
|
72
|
+
|
|
73
|
+
const token = response.body.access_token;
|
|
74
|
+
expect(response.body.access_token).toBeDefined();
|
|
75
|
+
response = await got.get("https://localhost/my-project/orders", {
|
|
76
76
|
headers: {
|
|
77
77
|
Authorization: `Bearer ${token}`,
|
|
78
78
|
},
|
|
79
|
-
responseType:
|
|
80
|
-
})
|
|
81
|
-
expect(response.statusCode).toBe(200)
|
|
79
|
+
responseType: "json",
|
|
80
|
+
});
|
|
81
|
+
expect(response.statusCode).toBe(200);
|
|
82
82
|
expect(response.body).toStrictEqual({
|
|
83
83
|
count: 0,
|
|
84
84
|
total: 0,
|
|
85
85
|
offset: 0,
|
|
86
86
|
limit: 20,
|
|
87
87
|
results: [],
|
|
88
|
-
})
|
|
89
|
-
ctMock.stop()
|
|
90
|
-
})
|
|
88
|
+
});
|
|
89
|
+
ctMock.stop();
|
|
90
|
+
});
|
|
91
91
|
|
|
92
|
-
test(
|
|
92
|
+
test("Options.validateCredentials: true (error)", async () => {
|
|
93
93
|
const ctMock = new CommercetoolsMock({
|
|
94
94
|
enableAuthentication: true,
|
|
95
95
|
validateCredentials: true,
|
|
96
|
-
})
|
|
97
|
-
ctMock.start()
|
|
96
|
+
});
|
|
97
|
+
ctMock.start();
|
|
98
98
|
|
|
99
99
|
const response = await got.get<InvalidTokenError>(
|
|
100
|
-
|
|
100
|
+
"https://api.europe-west1.gcp.commercetools.com/my-project/orders",
|
|
101
101
|
{
|
|
102
102
|
headers: {
|
|
103
103
|
Authorization: `Bearer foobar`,
|
|
104
104
|
},
|
|
105
|
-
responseType:
|
|
105
|
+
responseType: "json",
|
|
106
106
|
throwHttpErrors: false,
|
|
107
|
-
}
|
|
108
|
-
)
|
|
109
|
-
expect(response.statusCode).toBe(401)
|
|
110
|
-
expect(response.body.message).toBe(
|
|
111
|
-
ctMock.stop()
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
test(
|
|
107
|
+
},
|
|
108
|
+
);
|
|
109
|
+
expect(response.statusCode).toBe(401);
|
|
110
|
+
expect(response.body.message).toBe("invalid_token");
|
|
111
|
+
ctMock.stop();
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
test("Options.validateCredentials: false", async () => {
|
|
115
115
|
const ctMock = new CommercetoolsMock({
|
|
116
116
|
enableAuthentication: true,
|
|
117
117
|
validateCredentials: false,
|
|
118
|
-
})
|
|
119
|
-
ctMock.start()
|
|
118
|
+
});
|
|
119
|
+
ctMock.start();
|
|
120
120
|
|
|
121
121
|
const response = await got.get(
|
|
122
|
-
|
|
122
|
+
"https://api.europe-west1.gcp.commercetools.com/my-project/orders",
|
|
123
123
|
{
|
|
124
124
|
headers: {
|
|
125
125
|
Authorization: `Bearer foobar`,
|
|
126
126
|
},
|
|
127
|
-
responseType:
|
|
128
|
-
}
|
|
129
|
-
)
|
|
130
|
-
expect(response.statusCode).toBe(200)
|
|
127
|
+
responseType: "json",
|
|
128
|
+
},
|
|
129
|
+
);
|
|
130
|
+
expect(response.statusCode).toBe(200);
|
|
131
131
|
expect(response.body).toStrictEqual({
|
|
132
132
|
count: 0,
|
|
133
133
|
total: 0,
|
|
134
134
|
offset: 0,
|
|
135
135
|
limit: 20,
|
|
136
136
|
results: [],
|
|
137
|
-
})
|
|
138
|
-
ctMock.stop()
|
|
139
|
-
})
|
|
137
|
+
});
|
|
138
|
+
ctMock.stop();
|
|
139
|
+
});
|
|
140
140
|
|
|
141
|
-
test(
|
|
141
|
+
test("Options.enableAuthentication: false", async () => {
|
|
142
142
|
const ctMock = new CommercetoolsMock({
|
|
143
143
|
enableAuthentication: false,
|
|
144
144
|
validateCredentials: false,
|
|
145
|
-
})
|
|
146
|
-
ctMock.start()
|
|
145
|
+
});
|
|
146
|
+
ctMock.start();
|
|
147
147
|
|
|
148
148
|
const response = await got.get(
|
|
149
|
-
|
|
149
|
+
"https://api.europe-west1.gcp.commercetools.com/my-project/orders",
|
|
150
150
|
{
|
|
151
|
-
responseType:
|
|
152
|
-
}
|
|
153
|
-
)
|
|
154
|
-
expect(response.statusCode).toBe(200)
|
|
151
|
+
responseType: "json",
|
|
152
|
+
},
|
|
153
|
+
);
|
|
154
|
+
expect(response.statusCode).toBe(200);
|
|
155
155
|
expect(response.body).toStrictEqual({
|
|
156
156
|
count: 0,
|
|
157
157
|
total: 0,
|
|
158
158
|
offset: 0,
|
|
159
159
|
limit: 20,
|
|
160
160
|
results: [],
|
|
161
|
-
})
|
|
162
|
-
ctMock.stop()
|
|
163
|
-
})
|
|
161
|
+
});
|
|
162
|
+
ctMock.stop();
|
|
163
|
+
});
|
|
164
164
|
|
|
165
|
-
test(
|
|
165
|
+
test("Options.apiHost: is overridden is set", async () => {
|
|
166
166
|
const ctMock = new CommercetoolsMock({
|
|
167
167
|
enableAuthentication: false,
|
|
168
168
|
validateCredentials: false,
|
|
169
|
-
apiHost:
|
|
170
|
-
})
|
|
171
|
-
ctMock.start()
|
|
172
|
-
|
|
173
|
-
const response = await got.get(
|
|
174
|
-
responseType:
|
|
175
|
-
})
|
|
176
|
-
expect(response.statusCode).toBe(200)
|
|
169
|
+
apiHost: "http://api.localhost",
|
|
170
|
+
});
|
|
171
|
+
ctMock.start();
|
|
172
|
+
|
|
173
|
+
const response = await got.get("http://api.localhost/my-project/orders", {
|
|
174
|
+
responseType: "json",
|
|
175
|
+
});
|
|
176
|
+
expect(response.statusCode).toBe(200);
|
|
177
177
|
expect(response.body).toStrictEqual({
|
|
178
178
|
count: 0,
|
|
179
179
|
total: 0,
|
|
180
180
|
offset: 0,
|
|
181
181
|
limit: 20,
|
|
182
182
|
results: [],
|
|
183
|
-
})
|
|
184
|
-
ctMock.stop()
|
|
185
|
-
})
|
|
183
|
+
});
|
|
184
|
+
ctMock.stop();
|
|
185
|
+
});
|
|
186
186
|
|
|
187
|
-
test(
|
|
187
|
+
test("Options.authHost: is set", async () => {
|
|
188
188
|
const ctMock = new CommercetoolsMock({
|
|
189
189
|
enableAuthentication: true,
|
|
190
190
|
validateCredentials: true,
|
|
191
|
-
authHost:
|
|
192
|
-
})
|
|
193
|
-
ctMock.start()
|
|
191
|
+
authHost: "http://auth.localhost",
|
|
192
|
+
});
|
|
193
|
+
ctMock.start();
|
|
194
194
|
|
|
195
195
|
const response = await got.post<{ access_token: string }>(
|
|
196
|
-
|
|
196
|
+
"http://auth.localhost/oauth/token",
|
|
197
197
|
{
|
|
198
198
|
searchParams: {
|
|
199
|
-
grant_type:
|
|
200
|
-
scope:
|
|
199
|
+
grant_type: "client_credentials",
|
|
200
|
+
scope: "manage_project:commercetools-node-mock",
|
|
201
201
|
},
|
|
202
|
-
username:
|
|
203
|
-
password:
|
|
204
|
-
responseType:
|
|
205
|
-
}
|
|
206
|
-
)
|
|
207
|
-
expect(response.statusCode).toBe(200)
|
|
208
|
-
|
|
209
|
-
const token = response.body.access_token
|
|
210
|
-
expect(token).toBeDefined()
|
|
211
|
-
})
|
|
212
|
-
|
|
213
|
-
test(
|
|
202
|
+
username: "foo",
|
|
203
|
+
password: "bar",
|
|
204
|
+
responseType: "json",
|
|
205
|
+
},
|
|
206
|
+
);
|
|
207
|
+
expect(response.statusCode).toBe(200);
|
|
208
|
+
|
|
209
|
+
const token = response.body.access_token;
|
|
210
|
+
expect(token).toBeDefined();
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
test("apiHost mock proxy: querystring", async () => {
|
|
214
214
|
const ctMock = new CommercetoolsMock({
|
|
215
215
|
enableAuthentication: false,
|
|
216
216
|
validateCredentials: false,
|
|
217
|
-
apiHost:
|
|
218
|
-
})
|
|
219
|
-
ctMock.start()
|
|
217
|
+
apiHost: "http://api.localhost",
|
|
218
|
+
});
|
|
219
|
+
ctMock.start();
|
|
220
220
|
|
|
221
|
-
const response = await got.get(
|
|
222
|
-
responseType:
|
|
221
|
+
const response = await got.get("http://api.localhost/my-project/orders", {
|
|
222
|
+
responseType: "json",
|
|
223
223
|
searchParams: {
|
|
224
224
|
where: 'orderNumber="foobar"',
|
|
225
|
-
expand:
|
|
225
|
+
expand: "custom.type",
|
|
226
226
|
},
|
|
227
|
-
})
|
|
227
|
+
});
|
|
228
228
|
|
|
229
|
-
expect(response.statusCode).toBe(200)
|
|
229
|
+
expect(response.statusCode).toBe(200);
|
|
230
230
|
expect(response.body).toStrictEqual({
|
|
231
231
|
count: 0,
|
|
232
232
|
total: 0,
|
|
233
233
|
offset: 0,
|
|
234
234
|
limit: 20,
|
|
235
235
|
results: [],
|
|
236
|
-
})
|
|
237
|
-
ctMock.stop()
|
|
238
|
-
})
|
|
236
|
+
});
|
|
237
|
+
ctMock.stop();
|
|
238
|
+
});
|
package/src/index.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { CommercetoolsMock, CommercetoolsMockOptions } from
|
|
2
|
-
import { getBaseResourceProperties } from
|
|
1
|
+
import { CommercetoolsMock, CommercetoolsMockOptions } from "./ctMock";
|
|
2
|
+
import { getBaseResourceProperties } from "./helpers";
|
|
3
3
|
|
|
4
4
|
export {
|
|
5
5
|
CommercetoolsMock,
|
|
6
6
|
getBaseResourceProperties,
|
|
7
7
|
type CommercetoolsMockOptions,
|
|
8
|
-
}
|
|
8
|
+
};
|
package/src/lib/expandParser.ts
CHANGED
|
@@ -7,28 +7,28 @@
|
|
|
7
7
|
* TODO: implement support for multi-dimensional array
|
|
8
8
|
*/
|
|
9
9
|
type ExpandResult = {
|
|
10
|
-
element: string
|
|
11
|
-
index?: string | number
|
|
12
|
-
rest?: string
|
|
13
|
-
}
|
|
10
|
+
element: string;
|
|
11
|
+
index?: string | number;
|
|
12
|
+
rest?: string;
|
|
13
|
+
};
|
|
14
14
|
|
|
15
15
|
export const parseExpandClause = (clause: string): ExpandResult => {
|
|
16
16
|
const result: ExpandResult = {
|
|
17
17
|
element: clause,
|
|
18
18
|
index: undefined,
|
|
19
19
|
rest: undefined,
|
|
20
|
-
}
|
|
20
|
+
};
|
|
21
21
|
|
|
22
|
-
const pos = clause.indexOf(
|
|
22
|
+
const pos = clause.indexOf(".");
|
|
23
23
|
if (pos > 0) {
|
|
24
|
-
result.element = clause.substring(0, pos)
|
|
25
|
-
result.rest = clause.substring(pos + 1)
|
|
24
|
+
result.element = clause.substring(0, pos);
|
|
25
|
+
result.rest = clause.substring(pos + 1);
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
const match = result.element.match(/\[([^\]+])]/)
|
|
28
|
+
const match = result.element.match(/\[([^\]+])]/);
|
|
29
29
|
if (match) {
|
|
30
|
-
result.index = match[1] ===
|
|
31
|
-
result.element = result.element.substring(0, match.index)
|
|
30
|
+
result.index = match[1] === "*" ? "*" : parseInt(match[1], 10);
|
|
31
|
+
result.element = result.element.substring(0, match.index);
|
|
32
32
|
}
|
|
33
|
-
return result
|
|
34
|
-
}
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { expect, test } from
|
|
2
|
-
import {
|
|
1
|
+
import { expect, test } from "vitest";
|
|
2
|
+
import { Location, haversineDistance } from "./haversine";
|
|
3
3
|
|
|
4
|
-
test(
|
|
4
|
+
test("haversine", () => {
|
|
5
5
|
// Lab Digital
|
|
6
6
|
const src: Location = {
|
|
7
7
|
latitude: 5.110230209615395,
|
|
8
8
|
longitude: 52.06969591642097,
|
|
9
|
-
}
|
|
9
|
+
};
|
|
10
10
|
|
|
11
11
|
// Dom Tower
|
|
12
12
|
const dst: Location = {
|
|
13
13
|
latitude: 5.121310867198959,
|
|
14
14
|
longitude: 52.09068804569714,
|
|
15
|
-
}
|
|
15
|
+
};
|
|
16
16
|
|
|
17
|
-
const dist = haversineDistance(src, dst)
|
|
18
|
-
expect(dist).toBeGreaterThan(2631)
|
|
19
|
-
expect(dist).toBeLessThan(2632)
|
|
20
|
-
})
|
|
17
|
+
const dist = haversineDistance(src, dst);
|
|
18
|
+
expect(dist).toBeGreaterThan(2631);
|
|
19
|
+
expect(dist).toBeLessThan(2632);
|
|
20
|
+
});
|
package/src/lib/haversine.ts
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
export type Location = {
|
|
2
|
-
latitude: number
|
|
3
|
-
longitude: number
|
|
4
|
-
}
|
|
2
|
+
latitude: number;
|
|
3
|
+
longitude: number;
|
|
4
|
+
};
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Returns the distance between src and dst as meters
|
|
8
8
|
*/
|
|
9
9
|
export const haversineDistance = (src: Location, dst: Location) => {
|
|
10
|
-
const RADIUS_OF_EARTH_IN_KM = 6371
|
|
11
|
-
const toRadian = (deg: number) => deg * (Math.PI / 180)
|
|
10
|
+
const RADIUS_OF_EARTH_IN_KM = 6371;
|
|
11
|
+
const toRadian = (deg: number) => deg * (Math.PI / 180);
|
|
12
12
|
|
|
13
|
-
const dLat = toRadian(dst.latitude - src.latitude)
|
|
14
|
-
const dLon = toRadian(dst.longitude - src.longitude)
|
|
13
|
+
const dLat = toRadian(dst.latitude - src.latitude);
|
|
14
|
+
const dLon = toRadian(dst.longitude - src.longitude);
|
|
15
15
|
|
|
16
16
|
const a =
|
|
17
17
|
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
|
|
18
18
|
Math.cos(toRadian(src.latitude)) *
|
|
19
19
|
Math.cos(toRadian(dst.latitude)) *
|
|
20
20
|
Math.sin(dLon / 2) *
|
|
21
|
-
Math.sin(dLon / 2)
|
|
22
|
-
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
|
|
23
|
-
return RADIUS_OF_EARTH_IN_KM * c * 1000
|
|
24
|
-
}
|
|
21
|
+
Math.sin(dLon / 2);
|
|
22
|
+
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
23
|
+
return RADIUS_OF_EARTH_IN_KM * c * 1000;
|
|
24
|
+
};
|
package/src/lib/masking.ts
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import { cloneObject } from
|
|
1
|
+
import { cloneObject } from "../helpers";
|
|
2
2
|
|
|
3
3
|
export const maskSecretValue = <T>(resource: T, path: string): T => {
|
|
4
|
-
const parts = path.split(
|
|
5
|
-
const clone = cloneObject(resource) as any
|
|
6
|
-
let val = clone
|
|
4
|
+
const parts = path.split(".");
|
|
5
|
+
const clone = cloneObject(resource) as any;
|
|
6
|
+
let val = clone;
|
|
7
7
|
|
|
8
|
-
const target = parts.pop()
|
|
8
|
+
const target = parts.pop();
|
|
9
9
|
for (let i = 0; i < parts.length; i++) {
|
|
10
|
-
const part = parts[i]
|
|
11
|
-
val = val[part]
|
|
10
|
+
const part = parts[i];
|
|
11
|
+
val = val[part];
|
|
12
12
|
|
|
13
13
|
if (val === undefined) {
|
|
14
|
-
return resource
|
|
14
|
+
return resource;
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
if (val && target && val[target]) {
|
|
19
|
-
val[target] =
|
|
19
|
+
val[target] = "****";
|
|
20
20
|
}
|
|
21
|
-
return clone
|
|
22
|
-
}
|
|
21
|
+
return clone;
|
|
22
|
+
};
|
package/src/lib/parser.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Lexer } from
|
|
2
|
-
export { Parser, type ITokenPosition } from
|
|
1
|
+
export { Lexer } from "~vendor/perplex/lexer";
|
|
2
|
+
export { Parser, type ITokenPosition } from "~vendor/pratt";
|
package/src/lib/password.ts
CHANGED
|
@@ -1,7 +1,27 @@
|
|
|
1
|
+
import { Customer } from "@commercetools/platform-sdk";
|
|
2
|
+
import { v4 as uuidv4 } from "uuid";
|
|
3
|
+
|
|
4
|
+
const PWRESET_SECRET = "pwreset";
|
|
5
|
+
|
|
1
6
|
export const validatePassword = (
|
|
2
7
|
clearPassword: string,
|
|
3
|
-
hashedPassword: string
|
|
4
|
-
) => hashPassword(clearPassword) === hashedPassword
|
|
8
|
+
hashedPassword: string,
|
|
9
|
+
) => hashPassword(clearPassword) === hashedPassword;
|
|
5
10
|
|
|
6
11
|
export const hashPassword = (clearPassword: string) =>
|
|
7
|
-
Buffer.from(clearPassword).toString(
|
|
12
|
+
Buffer.from(clearPassword).toString("base64");
|
|
13
|
+
|
|
14
|
+
export const createPasswordResetToken = (customer: Customer) =>
|
|
15
|
+
Buffer.from(`${customer.id}:${PWRESET_SECRET}:${uuidv4()}`).toString(
|
|
16
|
+
"base64",
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
export const validatePasswordResetToken = (token: string) => {
|
|
20
|
+
const items = Buffer.from(token, "base64").toString("utf-8").split(":");
|
|
21
|
+
const [customerId, secret] = items;
|
|
22
|
+
if (secret !== PWRESET_SECRET) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return customerId;
|
|
27
|
+
};
|