@reactionary/source 0.0.41 → 0.0.48
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/.claude/settings.local.json +28 -0
- package/.env-template +8 -5
- package/.vscode/settings.json +5 -0
- package/README.md +41 -0
- package/core/package.json +3 -1
- package/core/src/cache/cache.interface.ts +14 -18
- package/core/src/cache/memory-cache.ts +56 -0
- package/core/src/cache/noop-cache.ts +5 -23
- package/core/src/cache/redis-cache.ts +28 -38
- package/core/src/client/client-builder.ts +3 -3
- package/core/src/client/client.ts +11 -9
- package/core/src/decorators/reactionary.decorator.ts +80 -8
- package/core/src/index.ts +5 -29
- package/core/src/initialization.ts +43 -0
- package/core/src/providers/analytics.provider.ts +1 -1
- package/core/src/providers/base.provider.ts +61 -25
- package/core/src/providers/cart-payment.provider.ts +57 -0
- package/core/src/providers/cart.provider.ts +131 -8
- package/core/src/providers/category.provider.ts +9 -9
- package/core/src/providers/identity.provider.ts +8 -7
- package/core/src/providers/index.ts +12 -0
- package/core/src/providers/inventory.provider.ts +4 -4
- package/core/src/providers/price.provider.ts +7 -7
- package/core/src/providers/product.provider.ts +17 -5
- package/core/src/providers/profile.provider.ts +22 -0
- package/core/src/providers/search.provider.ts +4 -4
- package/core/src/providers/store.provider.ts +14 -0
- package/core/src/schemas/capabilities.schema.ts +3 -1
- package/core/src/schemas/models/analytics.model.ts +1 -1
- package/core/src/schemas/models/cart.model.ts +16 -3
- package/core/src/schemas/models/identifiers.model.ts +90 -22
- package/core/src/schemas/models/identity.model.ts +23 -7
- package/core/src/schemas/models/index.ts +15 -0
- package/core/src/schemas/models/payment.model.ts +41 -0
- package/core/src/schemas/models/profile.model.ts +35 -0
- package/core/src/schemas/models/shipping-method.model.ts +14 -0
- package/core/src/schemas/models/store.model.ts +11 -0
- package/core/src/schemas/mutations/cart-payment.mutation.ts +21 -0
- package/core/src/schemas/mutations/cart.mutation.ts +62 -3
- package/core/src/schemas/mutations/identity.mutation.ts +8 -1
- package/core/src/schemas/mutations/index.ts +10 -0
- package/core/src/schemas/mutations/profile.mutation.ts +9 -0
- package/core/src/schemas/queries/cart-payment.query.ts +12 -0
- package/core/src/schemas/queries/cart.query.ts +1 -1
- package/core/src/schemas/queries/identity.query.ts +1 -1
- package/core/src/schemas/queries/index.ts +3 -0
- package/core/src/schemas/queries/inventory.query.ts +4 -12
- package/core/src/schemas/queries/price.query.ts +1 -1
- package/core/src/schemas/queries/profile.query.ts +7 -0
- package/core/src/schemas/queries/search.query.ts +1 -1
- package/core/src/schemas/queries/store.query.ts +11 -0
- package/core/src/schemas/session.schema.ts +31 -6
- package/eslint.config.mjs +7 -0
- package/examples/next/src/app/page.tsx +4 -12
- package/examples/node/package.json +1 -3
- package/examples/node/src/basic/basic-node-provider-model-extension.spec.ts +9 -8
- package/examples/node/src/basic/basic-node-provider-query-extension.spec.ts +4 -3
- package/examples/node/src/basic/basic-node-setup.spec.ts +4 -5
- package/nx.json +1 -0
- package/otel/src/metrics.ts +2 -1
- package/otel/src/provider-instrumentation.ts +2 -1
- package/otel/src/tracer.ts +7 -6
- package/otel/src/trpc-middleware.ts +3 -2
- package/package.json +2 -1
- package/providers/algolia/src/core/initialize.ts +4 -3
- package/providers/algolia/src/providers/product.provider.ts +15 -13
- package/providers/algolia/src/providers/search.provider.ts +9 -9
- package/providers/algolia/src/schema/capabilities.schema.ts +1 -1
- package/providers/algolia/src/test/search.provider.spec.ts +10 -10
- package/providers/algolia/src/test/test-utils.ts +9 -4
- package/providers/commercetools/README.md +27 -0
- package/providers/commercetools/src/core/client.ts +164 -117
- package/providers/commercetools/src/core/initialize.ts +24 -14
- package/providers/commercetools/src/providers/cart-payment.provider.ts +193 -0
- package/providers/commercetools/src/providers/cart.provider.ts +402 -125
- package/providers/commercetools/src/providers/category.provider.ts +35 -35
- package/providers/commercetools/src/providers/identity.provider.ts +23 -75
- package/providers/commercetools/src/providers/index.ts +2 -0
- package/providers/commercetools/src/providers/inventory.provider.ts +69 -40
- package/providers/commercetools/src/providers/price.provider.ts +79 -47
- package/providers/commercetools/src/providers/product.provider.ts +36 -30
- package/providers/commercetools/src/providers/profile.provider.ts +61 -0
- package/providers/commercetools/src/providers/search.provider.ts +16 -12
- package/providers/commercetools/src/providers/store.provider.ts +78 -0
- package/providers/commercetools/src/schema/capabilities.schema.ts +3 -1
- package/providers/commercetools/src/schema/commercetools.schema.ts +18 -0
- package/providers/commercetools/src/schema/configuration.schema.ts +2 -1
- package/providers/commercetools/src/test/cart-payment.provider.spec.ts +145 -0
- package/providers/commercetools/src/test/cart.provider.spec.ts +82 -22
- package/providers/commercetools/src/test/category.provider.spec.ts +18 -17
- package/providers/commercetools/src/test/identity.provider.spec.ts +88 -0
- package/providers/commercetools/src/test/inventory.provider.spec.ts +41 -0
- package/providers/commercetools/src/test/price.provider.spec.ts +9 -8
- package/providers/commercetools/src/test/product.provider.spec.ts +33 -5
- package/providers/commercetools/src/test/profile.provider.spec.ts +49 -0
- package/providers/commercetools/src/test/search.provider.spec.ts +8 -7
- package/providers/commercetools/src/test/store.provider.spec.ts +37 -0
- package/providers/commercetools/src/test/test-utils.ts +7 -31
- package/providers/fake/src/core/initialize.ts +96 -38
- package/providers/fake/src/providers/analytics.provider.ts +6 -5
- package/providers/fake/src/providers/cart.provider.ts +66 -19
- package/providers/fake/src/providers/category.provider.ts +12 -12
- package/providers/fake/src/providers/identity.provider.ts +22 -14
- package/providers/fake/src/providers/index.ts +1 -0
- package/providers/fake/src/providers/inventory.provider.ts +13 -13
- package/providers/fake/src/providers/price.provider.ts +13 -13
- package/providers/fake/src/providers/product.provider.ts +13 -10
- package/providers/fake/src/providers/search.provider.ts +7 -5
- package/providers/fake/src/providers/store.provider.ts +47 -0
- package/providers/fake/src/schema/capabilities.schema.ts +4 -1
- package/providers/fake/src/test/cart.provider.spec.ts +18 -18
- package/providers/fake/src/test/category.provider.spec.ts +55 -37
- package/providers/fake/src/test/price.provider.spec.ts +9 -14
- package/providers/fake/src/test/product.provider.spec.ts +27 -0
- package/providers/fake/src/test/test-utils.ts +2 -28
- package/providers/posthog/src/core/initialize.ts +3 -3
- package/providers/posthog/src/schema/capabilities.schema.ts +1 -1
- package/trpc/src/client.ts +42 -41
- package/trpc/src/index.ts +4 -3
- package/trpc/src/integration.spec.ts +11 -11
- package/trpc/src/server.ts +26 -24
- package/trpc/src/test-utils.ts +9 -4
- package/trpc/src/types.ts +24 -22
- package/core/src/cache/cache-evaluation.interface.ts +0 -19
- package/examples/node/src/test-utils.ts +0 -26
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import 'dotenv/config';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import type { RequestContext} from '@reactionary/core';
|
|
3
|
+
import { CartSchema, IdentitySchema, NoOpCache, createInitialRequestContext } from '@reactionary/core';
|
|
4
|
+
import { getCommercetoolsTestConfiguration } from './test-utils';
|
|
4
5
|
import { CommercetoolsCartProvider } from '../providers/cart.provider';
|
|
5
6
|
import { CommercetoolsIdentityProvider } from '../providers/identity.provider';
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
const testData = {
|
|
10
|
+
skuWithoutTiers: 'SGB-01',
|
|
11
|
+
skuWithTiers: 'GMCT-01'
|
|
12
|
+
}
|
|
13
|
+
|
|
6
14
|
describe('Commercetools Cart Provider', () => {
|
|
7
15
|
let provider: CommercetoolsCartProvider;
|
|
8
16
|
let identityProvider: CommercetoolsIdentityProvider;
|
|
9
|
-
let
|
|
17
|
+
let reqCtx: RequestContext;
|
|
10
18
|
|
|
11
19
|
beforeAll( () => {
|
|
12
20
|
provider = new CommercetoolsCartProvider(getCommercetoolsTestConfiguration(), CartSchema, new NoOpCache());
|
|
@@ -14,14 +22,14 @@ describe('Commercetools Cart Provider', () => {
|
|
|
14
22
|
});
|
|
15
23
|
|
|
16
24
|
beforeEach( () => {
|
|
17
|
-
|
|
25
|
+
reqCtx = createInitialRequestContext()
|
|
18
26
|
});
|
|
19
27
|
|
|
20
28
|
describe('anonymous sessions', () => {
|
|
21
29
|
it('should be able to get an empty cart', async () => {
|
|
22
30
|
const cart = await provider.getById({
|
|
23
31
|
cart: { key: '' },
|
|
24
|
-
},
|
|
32
|
+
}, reqCtx);
|
|
25
33
|
|
|
26
34
|
expect(cart.identifier.key).toBeFalsy();
|
|
27
35
|
expect(cart.items.length).toBe(0);
|
|
@@ -32,22 +40,22 @@ describe('Commercetools Cart Provider', () => {
|
|
|
32
40
|
it('should be able to add an item to a cart', async () => {
|
|
33
41
|
const cart = await provider.add({
|
|
34
42
|
cart: { key: '' },
|
|
35
|
-
|
|
36
|
-
key:
|
|
43
|
+
sku: {
|
|
44
|
+
key: testData.skuWithoutTiers,
|
|
37
45
|
},
|
|
38
46
|
quantity: 1
|
|
39
|
-
},
|
|
47
|
+
}, reqCtx);
|
|
40
48
|
|
|
41
49
|
expect(cart.identifier.key).toBeDefined();
|
|
42
50
|
expect(cart.items.length).toBe(1);
|
|
43
|
-
expect(cart.items[0].
|
|
51
|
+
expect(cart.items[0].sku.key).toBe(testData.skuWithoutTiers);
|
|
44
52
|
expect(cart.items[0].quantity).toBe(1);
|
|
45
53
|
|
|
46
54
|
expect(cart.items[0].price.totalPrice.value).toBeGreaterThan(0);
|
|
47
|
-
expect(cart.items[0].price.totalPrice.currency).toBe(
|
|
55
|
+
expect(cart.items[0].price.totalPrice.currency).toBe(reqCtx.languageContext.currencyCode);
|
|
48
56
|
|
|
49
57
|
expect(cart.price.grandTotal.value).toBeGreaterThan(0);
|
|
50
|
-
expect(cart.price.grandTotal.currency).toBe(
|
|
58
|
+
expect(cart.price.grandTotal.currency).toBe(reqCtx.languageContext.currencyCode);
|
|
51
59
|
|
|
52
60
|
expect(cart.price.grandTotal.value).toBe(cart.items[0].price.totalPrice.value);
|
|
53
61
|
|
|
@@ -56,26 +64,51 @@ describe('Commercetools Cart Provider', () => {
|
|
|
56
64
|
|
|
57
65
|
});
|
|
58
66
|
|
|
67
|
+
it('can add multiple different items to a cart', async () => {
|
|
68
|
+
|
|
69
|
+
const cart = await provider.add({
|
|
70
|
+
cart: { key: '' },
|
|
71
|
+
sku: {
|
|
72
|
+
key: testData.skuWithoutTiers,
|
|
73
|
+
},
|
|
74
|
+
quantity: 1
|
|
75
|
+
}, reqCtx);
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
const updatedCart = await provider.add({
|
|
79
|
+
cart: cart.identifier,
|
|
80
|
+
sku: {
|
|
81
|
+
key: testData.skuWithTiers,
|
|
82
|
+
},
|
|
83
|
+
quantity: 2
|
|
84
|
+
}, reqCtx);
|
|
85
|
+
|
|
86
|
+
expect(updatedCart.items.length).toBe(2);
|
|
87
|
+
expect(updatedCart.items[0].sku.key).toBe(testData.skuWithoutTiers);
|
|
88
|
+
expect(updatedCart.items[0].quantity).toBe(1);
|
|
89
|
+
expect(updatedCart.items[1].sku.key).toBe(testData.skuWithTiers);
|
|
90
|
+
expect(updatedCart.items[1].quantity).toBe(2);
|
|
91
|
+
});
|
|
59
92
|
|
|
60
93
|
it('should be able to change quantity of an item in a cart', async () => {
|
|
61
94
|
|
|
62
95
|
const cart = await provider.add({
|
|
63
96
|
cart: { key: '' },
|
|
64
|
-
|
|
65
|
-
key:
|
|
97
|
+
sku: {
|
|
98
|
+
key: testData.skuWithoutTiers,
|
|
66
99
|
},
|
|
67
100
|
quantity: 1
|
|
68
|
-
},
|
|
101
|
+
}, reqCtx);
|
|
69
102
|
|
|
70
103
|
const updatedCart = await provider.changeQuantity({
|
|
71
104
|
cart: cart.identifier,
|
|
72
105
|
item: cart.items[0].identifier,
|
|
73
106
|
quantity: 3
|
|
74
|
-
},
|
|
107
|
+
}, reqCtx);
|
|
108
|
+
|
|
75
109
|
|
|
76
|
-
expect(updatedCart.identifier.key).toBe(cart.identifier.key);
|
|
77
110
|
expect(updatedCart.items.length).toBe(1);
|
|
78
|
-
expect(updatedCart.items[0].
|
|
111
|
+
expect(updatedCart.items[0].sku.key).toBe(testData.skuWithoutTiers);
|
|
79
112
|
expect(updatedCart.items[0].quantity).toBe(3);
|
|
80
113
|
|
|
81
114
|
expect(updatedCart.items[0].price.totalPrice.value).toBe(cart.items[0].price.totalPrice.value * 3);
|
|
@@ -88,20 +121,47 @@ describe('Commercetools Cart Provider', () => {
|
|
|
88
121
|
|
|
89
122
|
const cart = await provider.add({
|
|
90
123
|
cart: { key: '' },
|
|
91
|
-
|
|
92
|
-
key:
|
|
124
|
+
sku: {
|
|
125
|
+
key: testData.skuWithoutTiers,
|
|
93
126
|
},
|
|
94
127
|
quantity: 1
|
|
95
|
-
},
|
|
128
|
+
}, reqCtx);
|
|
96
129
|
|
|
97
130
|
const updatedCart = await provider.remove({
|
|
98
131
|
cart: cart.identifier,
|
|
99
132
|
item: cart.items[0].identifier,
|
|
100
|
-
},
|
|
101
|
-
|
|
133
|
+
}, reqCtx);
|
|
134
|
+
|
|
102
135
|
expect(updatedCart.items.length).toBe(0);
|
|
103
136
|
});
|
|
104
137
|
|
|
138
|
+
it('should be able to delete a cart', async () => {
|
|
139
|
+
|
|
140
|
+
const cart = await provider.add({
|
|
141
|
+
cart: { key: '' },
|
|
142
|
+
sku: {
|
|
143
|
+
key: testData.skuWithoutTiers,
|
|
144
|
+
},
|
|
145
|
+
quantity: 1
|
|
146
|
+
}, reqCtx);
|
|
147
|
+
|
|
148
|
+
expect(cart.items.length).toBe(1);
|
|
149
|
+
expect(cart.identifier.key).toBeTruthy();
|
|
150
|
+
|
|
151
|
+
const deletedCart = await provider.deleteCart({
|
|
152
|
+
cart: cart.identifier,
|
|
153
|
+
}, reqCtx);
|
|
154
|
+
|
|
155
|
+
expect(deletedCart.items.length).toBe(0);
|
|
156
|
+
expect(deletedCart.identifier.key).toBe('');
|
|
157
|
+
|
|
158
|
+
const originalCart = await provider.getById({
|
|
159
|
+
cart: cart.identifier,
|
|
160
|
+
}, reqCtx);
|
|
161
|
+
|
|
162
|
+
expect(originalCart.items.length).toBe(0);
|
|
163
|
+
});
|
|
164
|
+
|
|
105
165
|
/**
|
|
106
166
|
it('should be able to create a cart for an anonymous user, then login and merge the cart', async () => {
|
|
107
167
|
});
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import 'dotenv/config'
|
|
2
|
-
import {
|
|
2
|
+
import type { RequestContext} from '@reactionary/core';
|
|
3
|
+
import { CategorySchema, NoOpCache, Session , createInitialRequestContext} from '@reactionary/core';
|
|
3
4
|
import { CommercetoolsCategoryProvider } from '../providers/category.provider';
|
|
4
|
-
import {
|
|
5
|
+
import { getCommercetoolsTestConfiguration } from './test-utils';
|
|
5
6
|
|
|
6
7
|
const testData = {
|
|
7
8
|
topCategories: [
|
|
@@ -24,18 +25,18 @@ const testData = {
|
|
|
24
25
|
|
|
25
26
|
describe('Commercetools Category Provider', () => {
|
|
26
27
|
let provider: CommercetoolsCategoryProvider;
|
|
27
|
-
let
|
|
28
|
+
let reqCtx: RequestContext;
|
|
28
29
|
|
|
29
30
|
beforeAll( () => {
|
|
30
31
|
provider = new CommercetoolsCategoryProvider(getCommercetoolsTestConfiguration(), CategorySchema, new NoOpCache());
|
|
31
32
|
});
|
|
32
33
|
|
|
33
34
|
beforeEach( () => {
|
|
34
|
-
|
|
35
|
+
reqCtx = createInitialRequestContext()
|
|
35
36
|
})
|
|
36
37
|
|
|
37
38
|
it('should be able to get top-categories', async () => {
|
|
38
|
-
const result = await provider.findTopCategories({ paginationOptions: { pageSize: 10, pageNumber: 1 }},
|
|
39
|
+
const result = await provider.findTopCategories({ paginationOptions: { pageSize: 10, pageNumber: 1 }}, reqCtx);
|
|
39
40
|
|
|
40
41
|
expect(result.items.length).toBeGreaterThan(0);
|
|
41
42
|
expect(result.items[0].identifier.key).toBe(testData.topCategories[0].key);
|
|
@@ -46,7 +47,7 @@ describe('Commercetools Category Provider', () => {
|
|
|
46
47
|
});
|
|
47
48
|
|
|
48
49
|
it('should be able to get child categories for a category', async () => {
|
|
49
|
-
const result = await provider.findChildCategories({ parentId: { key: testData.topCategories[0].key }, paginationOptions: { pageSize: 10, pageNumber: 1 }},
|
|
50
|
+
const result = await provider.findChildCategories({ parentId: { key: testData.topCategories[0].key }, paginationOptions: { pageSize: 10, pageNumber: 1 }}, reqCtx);
|
|
50
51
|
|
|
51
52
|
expect(result.items.length).toBeGreaterThan(0);
|
|
52
53
|
expect(result.items[0].identifier.key).toBe(testData.childCategoriesOfFirstTopcategory[0].key);
|
|
@@ -59,7 +60,7 @@ describe('Commercetools Category Provider', () => {
|
|
|
59
60
|
|
|
60
61
|
|
|
61
62
|
it('should be able to get child categories for a category, paged', async () => {
|
|
62
|
-
let result = await provider.findChildCategories({ parentId: { key: testData.topCategories[0].key }, paginationOptions: { pageSize: 1, pageNumber: 1 }},
|
|
63
|
+
let result = await provider.findChildCategories({ parentId: { key: testData.topCategories[0].key }, paginationOptions: { pageSize: 1, pageNumber: 1 }}, reqCtx);
|
|
63
64
|
|
|
64
65
|
expect(result.items.length).toBeGreaterThan(0);
|
|
65
66
|
expect(result.items[0].identifier.key).toBe(testData.childCategoriesOfFirstTopcategory[0].key);
|
|
@@ -69,7 +70,7 @@ describe('Commercetools Category Provider', () => {
|
|
|
69
70
|
expect(result.pageSize).toBe(1);
|
|
70
71
|
expect(result.pageNumber).toBe(1);
|
|
71
72
|
|
|
72
|
-
result = await provider.findChildCategories({ parentId: { key: testData.topCategories[0].key }, paginationOptions: { pageSize: 1, pageNumber: 2 }},
|
|
73
|
+
result = await provider.findChildCategories({ parentId: { key: testData.topCategories[0].key }, paginationOptions: { pageSize: 1, pageNumber: 2 }}, reqCtx);
|
|
73
74
|
|
|
74
75
|
expect(result.items.length).toBeGreaterThan(0);
|
|
75
76
|
expect(result.items[0].identifier.key).toBe(testData.childCategoriesOfFirstTopcategory[1].key);
|
|
@@ -83,7 +84,7 @@ describe('Commercetools Category Provider', () => {
|
|
|
83
84
|
|
|
84
85
|
it('can load all breadcrumbs for a category', async () => {
|
|
85
86
|
const leaf = testData.breadCrumb[testData.breadCrumb.length -1];
|
|
86
|
-
const result = await provider.getBreadcrumbPathToCategory({ id: { key: leaf! } },
|
|
87
|
+
const result = await provider.getBreadcrumbPathToCategory({ id: { key: leaf! } }, reqCtx);
|
|
87
88
|
|
|
88
89
|
expect(result.length).toBe(testData.breadCrumb.length);
|
|
89
90
|
for(let i = 0 ; i < testData.breadCrumb.length; i++) {
|
|
@@ -94,7 +95,7 @@ describe('Commercetools Category Provider', () => {
|
|
|
94
95
|
|
|
95
96
|
it('should be able to get a category by slug', async () => {
|
|
96
97
|
|
|
97
|
-
const result = await provider.getBySlug({ slug: testData.topCategories[0].slug! },
|
|
98
|
+
const result = await provider.getBySlug({ slug: testData.topCategories[0].slug! }, reqCtx);
|
|
98
99
|
expect(result).toBeTruthy();
|
|
99
100
|
if (result) {
|
|
100
101
|
expect(result.identifier.key).toBe(testData.topCategories[0].key);
|
|
@@ -107,14 +108,14 @@ describe('Commercetools Category Provider', () => {
|
|
|
107
108
|
});
|
|
108
109
|
|
|
109
110
|
it('returns null if looking for slug that does not exist', async () => {
|
|
110
|
-
const result = await provider.getBySlug({ slug: 'non-existent-slug' },
|
|
111
|
+
const result = await provider.getBySlug({ slug: 'non-existent-slug' }, reqCtx);
|
|
111
112
|
expect(result).toBeNull();
|
|
112
113
|
});
|
|
113
114
|
|
|
114
115
|
|
|
115
116
|
|
|
116
117
|
it('should be able to get a category by id', async () => {
|
|
117
|
-
const result = await provider.getById({ id: { key: 'home-decor'}},
|
|
118
|
+
const result = await provider.getById({ id: { key: 'home-decor'}}, reqCtx);
|
|
118
119
|
|
|
119
120
|
expect(result.identifier.key).toBe('home-decor');
|
|
120
121
|
expect(result.name).toBe('Home Decor');
|
|
@@ -128,8 +129,8 @@ describe('Commercetools Category Provider', () => {
|
|
|
128
129
|
|
|
129
130
|
it('should be able to get a category by id in alternate language', async () => {
|
|
130
131
|
|
|
131
|
-
|
|
132
|
-
const result = await provider.getById({ id: { key: 'home-decor'}},
|
|
132
|
+
reqCtx.languageContext.locale = 'de-DE';
|
|
133
|
+
const result = await provider.getById({ id: { key: 'home-decor'}}, reqCtx);
|
|
133
134
|
|
|
134
135
|
expect(result.identifier.key).toBe('home-decor');
|
|
135
136
|
expect(result.name).toBe('Dekoration');
|
|
@@ -144,8 +145,8 @@ describe('Commercetools Category Provider', () => {
|
|
|
144
145
|
|
|
145
146
|
it('returns empty values if you choose a language that is not available', async () => {
|
|
146
147
|
|
|
147
|
-
|
|
148
|
-
const result = await provider.getById({ id: { key: 'home-decor'}},
|
|
148
|
+
reqCtx.languageContext.locale = 'fr-FR';
|
|
149
|
+
const result = await provider.getById({ id: { key: 'home-decor'}}, reqCtx);
|
|
149
150
|
|
|
150
151
|
expect(result.identifier.key).toBe('home-decor');
|
|
151
152
|
expect(result.name).toBe('No Name');
|
|
@@ -159,7 +160,7 @@ describe('Commercetools Category Provider', () => {
|
|
|
159
160
|
|
|
160
161
|
|
|
161
162
|
it('returns a placeholder if you search for a category that does not exist', async () => {
|
|
162
|
-
const result = await provider.getById({ id: { key: 'non-existent-category'}},
|
|
163
|
+
const result = await provider.getById({ id: { key: 'non-existent-category'}}, reqCtx);
|
|
163
164
|
expect(result.identifier.key).toBe('non-existent-category');
|
|
164
165
|
expect(result.meta.placeholder).toBe(true);
|
|
165
166
|
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import 'dotenv/config';
|
|
2
|
+
import type { RequestContext } from '@reactionary/core';
|
|
3
|
+
import {
|
|
4
|
+
CartSchema,
|
|
5
|
+
IdentitySchema,
|
|
6
|
+
NoOpCache,
|
|
7
|
+
createInitialRequestContext,
|
|
8
|
+
} from '@reactionary/core';
|
|
9
|
+
import { getCommercetoolsTestConfiguration } from './test-utils';
|
|
10
|
+
import { CommercetoolsIdentityProvider } from '../providers/identity.provider';
|
|
11
|
+
import { CommercetoolsCartProvider } from '../providers/cart.provider';
|
|
12
|
+
|
|
13
|
+
describe('Commercetools Identity Provider', () => {
|
|
14
|
+
let provider: CommercetoolsIdentityProvider;
|
|
15
|
+
let cartProvider: CommercetoolsCartProvider;
|
|
16
|
+
let reqCtx: RequestContext;
|
|
17
|
+
|
|
18
|
+
beforeAll(() => {
|
|
19
|
+
provider = new CommercetoolsIdentityProvider(
|
|
20
|
+
getCommercetoolsTestConfiguration(),
|
|
21
|
+
IdentitySchema,
|
|
22
|
+
new NoOpCache()
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
cartProvider = new CommercetoolsCartProvider(
|
|
26
|
+
getCommercetoolsTestConfiguration(),
|
|
27
|
+
CartSchema,
|
|
28
|
+
new NoOpCache()
|
|
29
|
+
);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
beforeEach(async () => {
|
|
33
|
+
reqCtx = createInitialRequestContext();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('should default to an anonymous identity if no operations have been performed', async () => {
|
|
37
|
+
const identity = await provider.getSelf({}, reqCtx);
|
|
38
|
+
|
|
39
|
+
expect(identity.type).toBe('Anonymous');
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('should automatically upgrade to guest the moment an operation is performed', async () => {
|
|
43
|
+
const cart = await cartProvider.getActiveCartId(reqCtx);
|
|
44
|
+
const updatedCart = await cartProvider.add(
|
|
45
|
+
{
|
|
46
|
+
cart,
|
|
47
|
+
quantity: 1,
|
|
48
|
+
sku: {
|
|
49
|
+
key: 'SGB-01',
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
reqCtx
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
const identity = await provider.getSelf({}, reqCtx);
|
|
56
|
+
|
|
57
|
+
expect(identity.type).toBe('Guest');
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('should be able to register a new customer', async () => {
|
|
61
|
+
const time = new Date().getTime();
|
|
62
|
+
const identity = await provider.register(
|
|
63
|
+
{
|
|
64
|
+
username: `test-user+${time}@example.com`,
|
|
65
|
+
password: 'love2test',
|
|
66
|
+
},
|
|
67
|
+
reqCtx
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
expect(identity.type).toBe('Registered');
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('should be able to log out from a Registered identity', async () => {
|
|
74
|
+
const time = new Date().getTime();
|
|
75
|
+
const identity = await provider.register(
|
|
76
|
+
{
|
|
77
|
+
username: `test-user+${time}@example.com`,
|
|
78
|
+
password: 'love2test',
|
|
79
|
+
},
|
|
80
|
+
reqCtx
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
expect(identity.type).toBe('Registered');
|
|
84
|
+
|
|
85
|
+
const loggedOutIdentity = await provider.logout({}, reqCtx);
|
|
86
|
+
expect(loggedOutIdentity.type).toBe('Anonymous');
|
|
87
|
+
});
|
|
88
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import 'dotenv/config';
|
|
2
|
+
import type { RequestContext } from '@reactionary/core';
|
|
3
|
+
import {
|
|
4
|
+
InventorySchema,
|
|
5
|
+
NoOpCache,
|
|
6
|
+
createInitialRequestContext,
|
|
7
|
+
} from '@reactionary/core';
|
|
8
|
+
import { getCommercetoolsTestConfiguration } from './test-utils';
|
|
9
|
+
import { CommercetoolsInventoryProvider } from '../providers/inventory.provider';
|
|
10
|
+
|
|
11
|
+
describe('Commercetools Inventory Provider', () => {
|
|
12
|
+
let provider: CommercetoolsInventoryProvider;
|
|
13
|
+
let reqCtx: RequestContext;
|
|
14
|
+
|
|
15
|
+
beforeAll(() => {
|
|
16
|
+
provider = new CommercetoolsInventoryProvider(
|
|
17
|
+
getCommercetoolsTestConfiguration(),
|
|
18
|
+
InventorySchema,
|
|
19
|
+
new NoOpCache()
|
|
20
|
+
);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
reqCtx = createInitialRequestContext();
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('should be able to fetch inventory for a given SKU and Fulfillment Center', async () => {
|
|
28
|
+
const inventory = await provider.getBySKU({
|
|
29
|
+
sku: {
|
|
30
|
+
key: 'GMCT-01'
|
|
31
|
+
},
|
|
32
|
+
fulfilmentCenter: {
|
|
33
|
+
key: 'solteqPhysicalStore'
|
|
34
|
+
}
|
|
35
|
+
}, reqCtx);
|
|
36
|
+
|
|
37
|
+
expect(inventory.identifier.sku.key).toBe('GMCT-01');
|
|
38
|
+
expect(inventory.identifier.fulfillmentCenter.key).toBe('solteqPhysicalStore');
|
|
39
|
+
expect(inventory.quantity).toBe(42);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import 'dotenv/config';
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import type { RequestContext} from '@reactionary/core';
|
|
5
|
+
import { NoOpCache, PriceSchema, Session, createInitialRequestContext,} from '@reactionary/core';
|
|
6
|
+
import { getCommercetoolsTestConfiguration } from './test-utils';
|
|
6
7
|
|
|
7
8
|
import { CommercetoolsPriceProvider } from '../providers/price.provider';
|
|
8
9
|
|
|
@@ -14,7 +15,7 @@ const testData = {
|
|
|
14
15
|
|
|
15
16
|
describe('Commercetools Price Provider', () => {
|
|
16
17
|
let provider: CommercetoolsPriceProvider;
|
|
17
|
-
let
|
|
18
|
+
let reqCtx: RequestContext;
|
|
18
19
|
|
|
19
20
|
|
|
20
21
|
|
|
@@ -23,11 +24,11 @@ describe('Commercetools Price Provider', () => {
|
|
|
23
24
|
});
|
|
24
25
|
|
|
25
26
|
beforeEach( () => {
|
|
26
|
-
|
|
27
|
+
reqCtx = createInitialRequestContext()
|
|
27
28
|
})
|
|
28
29
|
|
|
29
30
|
it('should be able to get prices for a product without tiers', async () => {
|
|
30
|
-
const result = await provider.getBySKU({ sku: { key: testData.skuWithoutTiers }},
|
|
31
|
+
const result = await provider.getBySKU({ sku: { key: testData.skuWithoutTiers }}, reqCtx);
|
|
31
32
|
|
|
32
33
|
expect(result).toBeTruthy();
|
|
33
34
|
if (result) {
|
|
@@ -39,7 +40,7 @@ describe('Commercetools Price Provider', () => {
|
|
|
39
40
|
});
|
|
40
41
|
|
|
41
42
|
it('should be able to get prices for a product with tiers', async () => {
|
|
42
|
-
const result = await provider.getBySKU({ sku: { key: testData.skuWithTiers }},
|
|
43
|
+
const result = await provider.getBySKU({ sku: { key: testData.skuWithTiers }}, reqCtx);
|
|
43
44
|
|
|
44
45
|
expect(result).toBeTruthy();
|
|
45
46
|
if (result) {
|
|
@@ -56,7 +57,7 @@ describe('Commercetools Price Provider', () => {
|
|
|
56
57
|
});
|
|
57
58
|
|
|
58
59
|
it('should return a placeholder price for an unknown SKU', async () => {
|
|
59
|
-
const result = await provider.getBySKU({ sku: { key: 'unknown-sku' }},
|
|
60
|
+
const result = await provider.getBySKU({ sku: { key: 'unknown-sku' }}, reqCtx);
|
|
60
61
|
|
|
61
62
|
expect(result).toBeTruthy();
|
|
62
63
|
if (result) {
|
|
@@ -70,7 +71,7 @@ describe('Commercetools Price Provider', () => {
|
|
|
70
71
|
|
|
71
72
|
it('can look up multiple prices at once', async () => {
|
|
72
73
|
const skus = [testData.skuWithTiers, testData.skuWithoutTiers, 'unknown-sku'];
|
|
73
|
-
const results = await Promise.all(skus.map( sku => provider.getBySKU({ sku: { key: sku }},
|
|
74
|
+
const results = await Promise.all(skus.map( sku => provider.getBySKU({ sku: { key: sku }}, reqCtx)));
|
|
74
75
|
|
|
75
76
|
expect(results).toHaveLength(skus.length);
|
|
76
77
|
expect(results[0].identifier.sku.key).toBe(testData.skuWithTiers);
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import 'dotenv/config';
|
|
2
|
-
import {
|
|
2
|
+
import type { RequestContext} from '@reactionary/core';
|
|
3
|
+
import { NoOpCache, ProductSchema, Session, createInitialRequestContext } from '@reactionary/core';
|
|
3
4
|
import { CommercetoolsProductProvider } from '../providers/product.provider';
|
|
4
|
-
import {
|
|
5
|
+
import { getCommercetoolsTestConfiguration } from './test-utils';
|
|
5
6
|
|
|
6
7
|
const testData = {
|
|
7
8
|
product : {
|
|
@@ -14,22 +15,49 @@ const testData = {
|
|
|
14
15
|
describe('Commercetools Product Provider', () => {
|
|
15
16
|
|
|
16
17
|
let provider: CommercetoolsProductProvider;
|
|
17
|
-
let
|
|
18
|
+
let reqCtx: RequestContext;
|
|
18
19
|
|
|
19
20
|
beforeAll( () => {
|
|
20
21
|
provider = new CommercetoolsProductProvider(getCommercetoolsTestConfiguration(), ProductSchema, new NoOpCache());
|
|
21
22
|
});
|
|
22
23
|
|
|
23
24
|
beforeEach( () => {
|
|
24
|
-
|
|
25
|
+
reqCtx = createInitialRequestContext()
|
|
25
26
|
})
|
|
26
27
|
|
|
27
28
|
|
|
28
29
|
it('should be able to get a product by id', async () => {
|
|
29
|
-
const result = await provider.getById( { id: testData.product.id },
|
|
30
|
+
const result = await provider.getById( { id: testData.product.id }, reqCtx);
|
|
30
31
|
|
|
32
|
+
expect(result).toBeTruthy();
|
|
31
33
|
expect(result.identifier.key).toBe(testData.product.id);
|
|
34
|
+
expect(result.meta.placeholder).toBe(false);
|
|
32
35
|
expect(result.name).toBe(testData.product.name);
|
|
33
36
|
expect(result.image).toBe(testData.product.image);
|
|
34
37
|
});
|
|
38
|
+
|
|
39
|
+
it('should be able to get a product by slug', async () => {
|
|
40
|
+
const result = await provider.getBySlug( { slug: 'sunnai-glass-bowl' }, reqCtx);
|
|
41
|
+
|
|
42
|
+
expect(result).toBeTruthy();
|
|
43
|
+
if (result) {
|
|
44
|
+
expect(result.meta.placeholder).toBe(false);
|
|
45
|
+
expect(result.identifier.key).toBe(testData.product.id);
|
|
46
|
+
expect(result.name).toBe(testData.product.name);
|
|
47
|
+
expect(result.image).toBe(testData.product.image);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('should return null for unknown slug', async () => {
|
|
52
|
+
const result = await provider.getBySlug( { slug: 'unknown-slug' }, reqCtx);
|
|
53
|
+
|
|
54
|
+
expect(result).toBeNull();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('should return a placeholder product for unknown id', async () => {
|
|
58
|
+
const result = await provider.getById( { id: 'unknown-id' }, reqCtx);
|
|
59
|
+
|
|
60
|
+
expect(result).toBeTruthy();
|
|
61
|
+
expect(result.meta.placeholder).toBe(true);
|
|
62
|
+
});
|
|
35
63
|
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import 'dotenv/config';
|
|
2
|
+
import type { RequestContext } from '@reactionary/core';
|
|
3
|
+
import {
|
|
4
|
+
IdentitySchema,
|
|
5
|
+
NoOpCache,
|
|
6
|
+
ProfileSchema,
|
|
7
|
+
createInitialRequestContext,
|
|
8
|
+
} from '@reactionary/core';
|
|
9
|
+
import { getCommercetoolsTestConfiguration } from './test-utils';
|
|
10
|
+
import { CommercetoolsProfileProvider } from '../providers/profile.provider';
|
|
11
|
+
import { CommercetoolsIdentityProvider } from '../providers/identity.provider';
|
|
12
|
+
|
|
13
|
+
describe('Commercetools Profile Provider', () => {
|
|
14
|
+
let provider: CommercetoolsProfileProvider;
|
|
15
|
+
let identityProvider: CommercetoolsIdentityProvider;
|
|
16
|
+
let reqCtx: RequestContext;
|
|
17
|
+
|
|
18
|
+
beforeAll(() => {
|
|
19
|
+
provider = new CommercetoolsProfileProvider(
|
|
20
|
+
getCommercetoolsTestConfiguration(),
|
|
21
|
+
ProfileSchema,
|
|
22
|
+
new NoOpCache()
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
identityProvider = new CommercetoolsIdentityProvider(
|
|
26
|
+
getCommercetoolsTestConfiguration(),
|
|
27
|
+
IdentitySchema,
|
|
28
|
+
new NoOpCache()
|
|
29
|
+
);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
beforeEach(async () => {
|
|
33
|
+
reqCtx = createInitialRequestContext();
|
|
34
|
+
|
|
35
|
+
const time = new Date().getTime();
|
|
36
|
+
|
|
37
|
+
await identityProvider.register({
|
|
38
|
+
username: `martin.rogne+test-${ time }@solteq.com`,
|
|
39
|
+
password: 'love2test'
|
|
40
|
+
}, reqCtx);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('should be able to fetch the profile for the current user', async () => {
|
|
44
|
+
const profile = await provider.getSelf({}, reqCtx);
|
|
45
|
+
|
|
46
|
+
expect(profile).toBeDefined();
|
|
47
|
+
expect(profile.email).toContain('martin.rogne');
|
|
48
|
+
});
|
|
49
|
+
});
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import 'dotenv/config';
|
|
2
|
-
import {
|
|
2
|
+
import type { RequestContext} from '@reactionary/core';
|
|
3
|
+
import { NoOpCache, SearchResultSchema, createInitialRequestContext } from '@reactionary/core';
|
|
3
4
|
import { CommercetoolsSearchProvider } from '../providers/search.provider';
|
|
4
|
-
import { getCommercetoolsTestConfiguration
|
|
5
|
+
import { getCommercetoolsTestConfiguration } from './test-utils';
|
|
5
6
|
|
|
6
7
|
const testData = {
|
|
7
8
|
searchTerm: 'bowl'
|
|
@@ -10,14 +11,14 @@ const testData = {
|
|
|
10
11
|
describe('Commercetools Search Provider', () => {
|
|
11
12
|
|
|
12
13
|
let provider: CommercetoolsSearchProvider;
|
|
13
|
-
let
|
|
14
|
+
let reqCtx: RequestContext;
|
|
14
15
|
|
|
15
16
|
beforeAll( () => {
|
|
16
17
|
provider = new CommercetoolsSearchProvider(getCommercetoolsTestConfiguration(), SearchResultSchema, new NoOpCache());
|
|
17
18
|
});
|
|
18
19
|
|
|
19
20
|
beforeEach( () => {
|
|
20
|
-
|
|
21
|
+
reqCtx = createInitialRequestContext()
|
|
21
22
|
})
|
|
22
23
|
|
|
23
24
|
it('should be able to get a result by term', async () => {
|
|
@@ -27,7 +28,7 @@ describe('Commercetools Search Provider', () => {
|
|
|
27
28
|
facets: [],
|
|
28
29
|
page: 1,
|
|
29
30
|
pageSize: 10,
|
|
30
|
-
}},
|
|
31
|
+
}}, reqCtx);
|
|
31
32
|
|
|
32
33
|
expect(result.products.length).toBeGreaterThan(0);
|
|
33
34
|
});
|
|
@@ -40,7 +41,7 @@ describe('Commercetools Search Provider', () => {
|
|
|
40
41
|
facets: [],
|
|
41
42
|
page: 1,
|
|
42
43
|
pageSize: 1,
|
|
43
|
-
}},
|
|
44
|
+
}}, reqCtx);
|
|
44
45
|
|
|
45
46
|
expect(result.products.length).toBeGreaterThan(0);
|
|
46
47
|
expect(result.pages).toBeGreaterThan(1);
|
|
@@ -51,7 +52,7 @@ describe('Commercetools Search Provider', () => {
|
|
|
51
52
|
facets: [],
|
|
52
53
|
page: 2,
|
|
53
54
|
pageSize: 1,
|
|
54
|
-
}},
|
|
55
|
+
}}, reqCtx);
|
|
55
56
|
|
|
56
57
|
expect(result2.products.length).toBeGreaterThan(0);
|
|
57
58
|
expect(result2.pages).toBeGreaterThan(2);
|