@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.
Files changed (125) hide show
  1. package/.claude/settings.local.json +28 -0
  2. package/.env-template +8 -5
  3. package/.vscode/settings.json +5 -0
  4. package/README.md +41 -0
  5. package/core/package.json +3 -1
  6. package/core/src/cache/cache.interface.ts +14 -18
  7. package/core/src/cache/memory-cache.ts +56 -0
  8. package/core/src/cache/noop-cache.ts +5 -23
  9. package/core/src/cache/redis-cache.ts +28 -38
  10. package/core/src/client/client-builder.ts +3 -3
  11. package/core/src/client/client.ts +11 -9
  12. package/core/src/decorators/reactionary.decorator.ts +80 -8
  13. package/core/src/index.ts +5 -29
  14. package/core/src/initialization.ts +43 -0
  15. package/core/src/providers/analytics.provider.ts +1 -1
  16. package/core/src/providers/base.provider.ts +61 -25
  17. package/core/src/providers/cart-payment.provider.ts +57 -0
  18. package/core/src/providers/cart.provider.ts +131 -8
  19. package/core/src/providers/category.provider.ts +9 -9
  20. package/core/src/providers/identity.provider.ts +8 -7
  21. package/core/src/providers/index.ts +12 -0
  22. package/core/src/providers/inventory.provider.ts +4 -4
  23. package/core/src/providers/price.provider.ts +7 -7
  24. package/core/src/providers/product.provider.ts +17 -5
  25. package/core/src/providers/profile.provider.ts +22 -0
  26. package/core/src/providers/search.provider.ts +4 -4
  27. package/core/src/providers/store.provider.ts +14 -0
  28. package/core/src/schemas/capabilities.schema.ts +3 -1
  29. package/core/src/schemas/models/analytics.model.ts +1 -1
  30. package/core/src/schemas/models/cart.model.ts +16 -3
  31. package/core/src/schemas/models/identifiers.model.ts +90 -22
  32. package/core/src/schemas/models/identity.model.ts +23 -7
  33. package/core/src/schemas/models/index.ts +15 -0
  34. package/core/src/schemas/models/payment.model.ts +41 -0
  35. package/core/src/schemas/models/profile.model.ts +35 -0
  36. package/core/src/schemas/models/shipping-method.model.ts +14 -0
  37. package/core/src/schemas/models/store.model.ts +11 -0
  38. package/core/src/schemas/mutations/cart-payment.mutation.ts +21 -0
  39. package/core/src/schemas/mutations/cart.mutation.ts +62 -3
  40. package/core/src/schemas/mutations/identity.mutation.ts +8 -1
  41. package/core/src/schemas/mutations/index.ts +10 -0
  42. package/core/src/schemas/mutations/profile.mutation.ts +9 -0
  43. package/core/src/schemas/queries/cart-payment.query.ts +12 -0
  44. package/core/src/schemas/queries/cart.query.ts +1 -1
  45. package/core/src/schemas/queries/identity.query.ts +1 -1
  46. package/core/src/schemas/queries/index.ts +3 -0
  47. package/core/src/schemas/queries/inventory.query.ts +4 -12
  48. package/core/src/schemas/queries/price.query.ts +1 -1
  49. package/core/src/schemas/queries/profile.query.ts +7 -0
  50. package/core/src/schemas/queries/search.query.ts +1 -1
  51. package/core/src/schemas/queries/store.query.ts +11 -0
  52. package/core/src/schemas/session.schema.ts +31 -6
  53. package/eslint.config.mjs +7 -0
  54. package/examples/next/src/app/page.tsx +4 -12
  55. package/examples/node/package.json +1 -3
  56. package/examples/node/src/basic/basic-node-provider-model-extension.spec.ts +9 -8
  57. package/examples/node/src/basic/basic-node-provider-query-extension.spec.ts +4 -3
  58. package/examples/node/src/basic/basic-node-setup.spec.ts +4 -5
  59. package/nx.json +1 -0
  60. package/otel/src/metrics.ts +2 -1
  61. package/otel/src/provider-instrumentation.ts +2 -1
  62. package/otel/src/tracer.ts +7 -6
  63. package/otel/src/trpc-middleware.ts +3 -2
  64. package/package.json +2 -1
  65. package/providers/algolia/src/core/initialize.ts +4 -3
  66. package/providers/algolia/src/providers/product.provider.ts +15 -13
  67. package/providers/algolia/src/providers/search.provider.ts +9 -9
  68. package/providers/algolia/src/schema/capabilities.schema.ts +1 -1
  69. package/providers/algolia/src/test/search.provider.spec.ts +10 -10
  70. package/providers/algolia/src/test/test-utils.ts +9 -4
  71. package/providers/commercetools/README.md +27 -0
  72. package/providers/commercetools/src/core/client.ts +164 -117
  73. package/providers/commercetools/src/core/initialize.ts +24 -14
  74. package/providers/commercetools/src/providers/cart-payment.provider.ts +193 -0
  75. package/providers/commercetools/src/providers/cart.provider.ts +402 -125
  76. package/providers/commercetools/src/providers/category.provider.ts +35 -35
  77. package/providers/commercetools/src/providers/identity.provider.ts +23 -75
  78. package/providers/commercetools/src/providers/index.ts +2 -0
  79. package/providers/commercetools/src/providers/inventory.provider.ts +69 -40
  80. package/providers/commercetools/src/providers/price.provider.ts +79 -47
  81. package/providers/commercetools/src/providers/product.provider.ts +36 -30
  82. package/providers/commercetools/src/providers/profile.provider.ts +61 -0
  83. package/providers/commercetools/src/providers/search.provider.ts +16 -12
  84. package/providers/commercetools/src/providers/store.provider.ts +78 -0
  85. package/providers/commercetools/src/schema/capabilities.schema.ts +3 -1
  86. package/providers/commercetools/src/schema/commercetools.schema.ts +18 -0
  87. package/providers/commercetools/src/schema/configuration.schema.ts +2 -1
  88. package/providers/commercetools/src/test/cart-payment.provider.spec.ts +145 -0
  89. package/providers/commercetools/src/test/cart.provider.spec.ts +82 -22
  90. package/providers/commercetools/src/test/category.provider.spec.ts +18 -17
  91. package/providers/commercetools/src/test/identity.provider.spec.ts +88 -0
  92. package/providers/commercetools/src/test/inventory.provider.spec.ts +41 -0
  93. package/providers/commercetools/src/test/price.provider.spec.ts +9 -8
  94. package/providers/commercetools/src/test/product.provider.spec.ts +33 -5
  95. package/providers/commercetools/src/test/profile.provider.spec.ts +49 -0
  96. package/providers/commercetools/src/test/search.provider.spec.ts +8 -7
  97. package/providers/commercetools/src/test/store.provider.spec.ts +37 -0
  98. package/providers/commercetools/src/test/test-utils.ts +7 -31
  99. package/providers/fake/src/core/initialize.ts +96 -38
  100. package/providers/fake/src/providers/analytics.provider.ts +6 -5
  101. package/providers/fake/src/providers/cart.provider.ts +66 -19
  102. package/providers/fake/src/providers/category.provider.ts +12 -12
  103. package/providers/fake/src/providers/identity.provider.ts +22 -14
  104. package/providers/fake/src/providers/index.ts +1 -0
  105. package/providers/fake/src/providers/inventory.provider.ts +13 -13
  106. package/providers/fake/src/providers/price.provider.ts +13 -13
  107. package/providers/fake/src/providers/product.provider.ts +13 -10
  108. package/providers/fake/src/providers/search.provider.ts +7 -5
  109. package/providers/fake/src/providers/store.provider.ts +47 -0
  110. package/providers/fake/src/schema/capabilities.schema.ts +4 -1
  111. package/providers/fake/src/test/cart.provider.spec.ts +18 -18
  112. package/providers/fake/src/test/category.provider.spec.ts +55 -37
  113. package/providers/fake/src/test/price.provider.spec.ts +9 -14
  114. package/providers/fake/src/test/product.provider.spec.ts +27 -0
  115. package/providers/fake/src/test/test-utils.ts +2 -28
  116. package/providers/posthog/src/core/initialize.ts +3 -3
  117. package/providers/posthog/src/schema/capabilities.schema.ts +1 -1
  118. package/trpc/src/client.ts +42 -41
  119. package/trpc/src/index.ts +4 -3
  120. package/trpc/src/integration.spec.ts +11 -11
  121. package/trpc/src/server.ts +26 -24
  122. package/trpc/src/test-utils.ts +9 -4
  123. package/trpc/src/types.ts +24 -22
  124. package/core/src/cache/cache-evaluation.interface.ts +0 -19
  125. package/examples/node/src/test-utils.ts +0 -26
@@ -1,12 +1,20 @@
1
1
  import 'dotenv/config';
2
- import { CartSchema, CategorySchema, IdentitySchema, NoOpCache, ProductSchema, Session } from '@reactionary/core';
3
- import { createAnonymousTestSession, getCommercetoolsTestConfiguration } from './test-utils';
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 session: Session;
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
- session = createAnonymousTestSession()
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
- }, session);
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
- product: {
36
- key: '4d28f98d-c446-446e-b59a-d9f718e5b98a',
43
+ sku: {
44
+ key: testData.skuWithoutTiers,
37
45
  },
38
46
  quantity: 1
39
- }, session);
47
+ }, reqCtx);
40
48
 
41
49
  expect(cart.identifier.key).toBeDefined();
42
50
  expect(cart.items.length).toBe(1);
43
- expect(cart.items[0].product.key).toBe('4d28f98d-c446-446e-b59a-d9f718e5b98a');
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(session.languageContext.currencyCode);
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(session.languageContext.currencyCode);
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
- product: {
65
- key: '4d28f98d-c446-446e-b59a-d9f718e5b98a',
97
+ sku: {
98
+ key: testData.skuWithoutTiers,
66
99
  },
67
100
  quantity: 1
68
- }, session);
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
- }, session);
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].product.key).toBe('4d28f98d-c446-446e-b59a-d9f718e5b98a');
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
- product: {
92
- key: '4d28f98d-c446-446e-b59a-d9f718e5b98a',
124
+ sku: {
125
+ key: testData.skuWithoutTiers,
93
126
  },
94
127
  quantity: 1
95
- }, session);
128
+ }, reqCtx);
96
129
 
97
130
  const updatedCart = await provider.remove({
98
131
  cart: cart.identifier,
99
132
  item: cart.items[0].identifier,
100
- }, session);
101
- expect(updatedCart.identifier.key).toBe(cart.identifier.key);
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 { CategorySchema, NoOpCache, Session } from '@reactionary/core';
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 { createAnonymousTestSession, getCommercetoolsTestConfiguration } from './test-utils';
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 session: Session;
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
- session = createAnonymousTestSession()
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 }}, session);
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 }}, session);
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 }}, session);
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 }}, session);
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! } }, session);
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! }, session);
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' }, session);
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'}}, session);
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
- session.languageContext.locale = 'de-DE';
132
- const result = await provider.getById({ id: { key: 'home-decor'}}, session);
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
- session.languageContext.locale = 'fr-FR';
148
- const result = await provider.getById({ id: { key: 'home-decor'}}, session);
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'}}, session);
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 { NoOpCache, PriceSchema, Session } from '@reactionary/core';
5
- import { createAnonymousTestSession, getCommercetoolsTestConfiguration } from './test-utils';
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 session: Session;
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
- session = createAnonymousTestSession()
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 }}, session);
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 }}, session);
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' }}, session);
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 }}, session)));
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 { NoOpCache, ProductSchema, Session } from '@reactionary/core';
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 { createAnonymousTestSession, getCommercetoolsTestConfiguration } from './test-utils';
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 session: Session;
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
- session = createAnonymousTestSession()
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 }, session);
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 { NoOpCache, SearchResultSchema, Session } from '@reactionary/core';
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, createAnonymousTestSession } from './test-utils';
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 session: Session;
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
- session = createAnonymousTestSession()
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
- }}, session);
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
- }}, session);
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
- }}, session);
55
+ }}, reqCtx);
55
56
 
56
57
  expect(result2.products.length).toBeGreaterThan(0);
57
58
  expect(result2.pages).toBeGreaterThan(2);