@reactionary/source 0.0.52 → 0.2.15

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 (292) hide show
  1. package/.env-template +19 -0
  2. package/.github/workflows/pull-request.yml +3 -1
  3. package/.github/workflows/release.yml +9 -0
  4. package/.vscode/extensions.json +0 -2
  5. package/LICENSE +21 -0
  6. package/README.md +175 -23
  7. package/core/package.json +6 -3
  8. package/core/src/cache/cache.interface.ts +1 -0
  9. package/core/src/cache/index.ts +4 -0
  10. package/core/src/cache/memory-cache.ts +30 -2
  11. package/core/src/cache/noop-cache.ts +15 -1
  12. package/core/src/cache/redis-cache.ts +20 -0
  13. package/core/src/client/client-builder.ts +71 -54
  14. package/core/src/client/client.ts +9 -47
  15. package/core/src/client/index.ts +2 -0
  16. package/core/src/decorators/index.ts +1 -0
  17. package/core/src/decorators/reactionary.decorator.ts +203 -34
  18. package/core/src/index.ts +6 -19
  19. package/core/src/initialization.ts +1 -18
  20. package/core/src/metrics/metrics.ts +67 -0
  21. package/core/src/providers/analytics.provider.ts +1 -6
  22. package/core/src/providers/base.provider.ts +5 -69
  23. package/core/src/providers/cart.provider.ts +15 -55
  24. package/core/src/providers/category.provider.ts +7 -11
  25. package/core/src/providers/checkout.provider.ts +17 -15
  26. package/core/src/providers/identity.provider.ts +6 -8
  27. package/core/src/providers/index.ts +2 -1
  28. package/core/src/providers/inventory.provider.ts +15 -5
  29. package/core/src/providers/order-search.provider.ts +29 -0
  30. package/core/src/providers/order.provider.ts +47 -15
  31. package/core/src/providers/price.provider.ts +30 -36
  32. package/core/src/providers/product-search.provider.ts +61 -0
  33. package/core/src/providers/product.provider.ts +71 -12
  34. package/core/src/providers/profile.provider.ts +74 -14
  35. package/core/src/providers/store.provider.ts +3 -5
  36. package/core/src/schemas/capabilities.schema.ts +10 -3
  37. package/core/src/schemas/errors/generic.error.ts +9 -0
  38. package/core/src/schemas/errors/index.ts +4 -0
  39. package/core/src/schemas/errors/invalid-input.error.ts +9 -0
  40. package/core/src/schemas/errors/invalid-output.error.ts +9 -0
  41. package/core/src/schemas/errors/not-found.error.ts +9 -0
  42. package/core/src/schemas/index.ts +7 -0
  43. package/core/src/schemas/models/analytics.model.ts +2 -1
  44. package/core/src/schemas/models/base.model.ts +6 -24
  45. package/core/src/schemas/models/cart.model.ts +5 -8
  46. package/core/src/schemas/models/category.model.ts +4 -9
  47. package/core/src/schemas/models/checkout.model.ts +6 -7
  48. package/core/src/schemas/models/cost.model.ts +4 -3
  49. package/core/src/schemas/models/currency.model.ts +2 -1
  50. package/core/src/schemas/models/identifiers.model.ts +106 -62
  51. package/core/src/schemas/models/identity.model.ts +10 -19
  52. package/core/src/schemas/models/index.ts +2 -1
  53. package/core/src/schemas/models/inventory.model.ts +8 -5
  54. package/core/src/schemas/models/order-search.model.ts +28 -0
  55. package/core/src/schemas/models/order.model.ts +20 -26
  56. package/core/src/schemas/models/payment.model.ts +14 -17
  57. package/core/src/schemas/models/price.model.ts +11 -11
  58. package/core/src/schemas/models/product-search.model.ts +42 -0
  59. package/core/src/schemas/models/product.model.ts +64 -22
  60. package/core/src/schemas/models/profile.model.ts +19 -22
  61. package/core/src/schemas/models/shipping-method.model.ts +24 -29
  62. package/core/src/schemas/models/store.model.ts +9 -5
  63. package/core/src/schemas/mutations/analytics.mutation.ts +8 -7
  64. package/core/src/schemas/mutations/base.mutation.ts +2 -1
  65. package/core/src/schemas/mutations/cart.mutation.ts +33 -33
  66. package/core/src/schemas/mutations/checkout.mutation.ts +23 -30
  67. package/core/src/schemas/mutations/identity.mutation.ts +4 -3
  68. package/core/src/schemas/mutations/profile.mutation.ts +38 -3
  69. package/core/src/schemas/queries/base.query.ts +2 -1
  70. package/core/src/schemas/queries/cart.query.ts +3 -3
  71. package/core/src/schemas/queries/category.query.ts +18 -18
  72. package/core/src/schemas/queries/checkout.query.ts +7 -9
  73. package/core/src/schemas/queries/identity.query.ts +2 -1
  74. package/core/src/schemas/queries/index.ts +2 -1
  75. package/core/src/schemas/queries/inventory.query.ts +5 -5
  76. package/core/src/schemas/queries/order-search.query.ts +10 -0
  77. package/core/src/schemas/queries/order.query.ts +3 -2
  78. package/core/src/schemas/queries/price.query.ts +10 -4
  79. package/core/src/schemas/queries/product-search.query.ts +16 -0
  80. package/core/src/schemas/queries/product.query.ts +13 -6
  81. package/core/src/schemas/queries/profile.query.ts +5 -2
  82. package/core/src/schemas/queries/store.query.ts +6 -5
  83. package/core/src/schemas/result.ts +107 -0
  84. package/core/src/schemas/session.schema.ts +4 -4
  85. package/core/src/test/reactionary.decorator.spec.ts +249 -0
  86. package/core/src/zod-utils.ts +19 -0
  87. package/core/tsconfig.json +1 -1
  88. package/core/tsconfig.spec.json +2 -26
  89. package/core/vitest.config.ts +14 -0
  90. package/documentation/1-purpose.md +114 -0
  91. package/documentation/2-getting-started.md +229 -0
  92. package/documentation/3-querying-and-changing-data.md +74 -0
  93. package/documentation/4-product-data.md +107 -0
  94. package/documentation/5-cart-and-checkout.md +211 -0
  95. package/documentation/6-product-search.md +143 -0
  96. package/documentation/7-marketing.md +3 -0
  97. package/eslint.config.mjs +1 -0
  98. package/examples/node/eslint.config.mjs +1 -4
  99. package/examples/node/package.json +10 -3
  100. package/examples/node/project.json +4 -1
  101. package/examples/node/src/basic/basic-node-provider-model-extension.spec.ts +22 -23
  102. package/examples/node/src/basic/basic-node-provider-query-extension.spec.ts +15 -11
  103. package/examples/node/src/basic/basic-node-setup.spec.ts +44 -28
  104. package/examples/node/src/basic/client-creation.spec.ts +53 -0
  105. package/examples/node/src/capabilities/cart.spec.ts +255 -0
  106. package/examples/node/src/capabilities/category.spec.ts +193 -0
  107. package/examples/node/src/capabilities/checkout.spec.ts +341 -0
  108. package/examples/node/src/capabilities/identity.spec.ts +93 -0
  109. package/examples/node/src/capabilities/inventory.spec.ts +66 -0
  110. package/examples/node/src/capabilities/order-search.spec.ts +159 -0
  111. package/examples/node/src/capabilities/order.spec.ts +91 -0
  112. package/examples/node/src/capabilities/price.spec.ts +51 -0
  113. package/examples/node/src/capabilities/product-search.spec.ts +293 -0
  114. package/examples/node/src/capabilities/product.spec.ts +122 -0
  115. package/examples/node/src/capabilities/profile.spec.ts +316 -0
  116. package/examples/node/src/capabilities/store.spec.ts +26 -0
  117. package/examples/node/src/utils.ts +137 -0
  118. package/examples/node/tsconfig.json +9 -12
  119. package/examples/node/tsconfig.lib.json +1 -2
  120. package/examples/node/tsconfig.spec.json +2 -14
  121. package/examples/node/vitest.config.ts +14 -0
  122. package/migrations.json +22 -5
  123. package/nx.json +8 -47
  124. package/package.json +24 -96
  125. package/providers/algolia/README.md +39 -2
  126. package/providers/algolia/package.json +2 -1
  127. package/providers/algolia/src/core/initialize.ts +7 -14
  128. package/providers/algolia/src/index.ts +2 -4
  129. package/providers/algolia/src/providers/index.ts +1 -0
  130. package/providers/algolia/src/providers/product-search.provider.ts +241 -0
  131. package/providers/algolia/src/schema/capabilities.schema.ts +2 -3
  132. package/providers/algolia/src/schema/index.ts +3 -0
  133. package/providers/algolia/src/schema/search.schema.ts +8 -8
  134. package/providers/algolia/tsconfig.json +1 -1
  135. package/providers/algolia/tsconfig.lib.json +1 -1
  136. package/providers/algolia/tsconfig.spec.json +2 -14
  137. package/providers/algolia/vitest.config.ts +14 -0
  138. package/providers/commercetools/README.md +30 -3
  139. package/providers/commercetools/package.json +2 -1
  140. package/providers/commercetools/src/core/client.ts +178 -99
  141. package/providers/commercetools/src/core/initialize.ts +130 -74
  142. package/providers/commercetools/src/core/token-cache.ts +45 -0
  143. package/providers/commercetools/src/index.ts +3 -2
  144. package/providers/commercetools/src/providers/cart.provider.ts +281 -341
  145. package/providers/commercetools/src/providers/category.provider.ts +223 -138
  146. package/providers/commercetools/src/providers/checkout.provider.ts +631 -449
  147. package/providers/commercetools/src/providers/identity.provider.ts +50 -29
  148. package/providers/commercetools/src/providers/index.ts +2 -2
  149. package/providers/commercetools/src/providers/inventory.provider.ts +76 -74
  150. package/providers/commercetools/src/providers/order-search.provider.ts +220 -0
  151. package/providers/commercetools/src/providers/order.provider.ts +96 -61
  152. package/providers/commercetools/src/providers/price.provider.ts +147 -117
  153. package/providers/commercetools/src/providers/product-search.provider.ts +528 -0
  154. package/providers/commercetools/src/providers/product.provider.ts +249 -74
  155. package/providers/commercetools/src/providers/profile.provider.ts +445 -28
  156. package/providers/commercetools/src/providers/store.provider.ts +54 -40
  157. package/providers/commercetools/src/schema/capabilities.schema.ts +3 -1
  158. package/providers/commercetools/src/schema/commercetools.schema.ts +17 -3
  159. package/providers/commercetools/src/schema/configuration.schema.ts +1 -0
  160. package/providers/commercetools/src/schema/session.schema.ts +7 -0
  161. package/providers/commercetools/src/test/caching.spec.ts +82 -0
  162. package/providers/commercetools/src/test/identity.spec.ts +109 -0
  163. package/providers/commercetools/src/test/test-utils.ts +21 -19
  164. package/providers/commercetools/tsconfig.json +1 -1
  165. package/providers/commercetools/tsconfig.lib.json +1 -1
  166. package/providers/commercetools/tsconfig.spec.json +2 -14
  167. package/providers/commercetools/vitest.config.ts +15 -0
  168. package/providers/fake/README.md +20 -4
  169. package/providers/fake/package.json +2 -1
  170. package/providers/fake/src/core/initialize.ts +47 -49
  171. package/providers/fake/src/providers/analytics.provider.ts +5 -7
  172. package/providers/fake/src/providers/cart.provider.ts +163 -92
  173. package/providers/fake/src/providers/category.provider.ts +78 -50
  174. package/providers/fake/src/providers/checkout.provider.ts +254 -0
  175. package/providers/fake/src/providers/identity.provider.ts +57 -65
  176. package/providers/fake/src/providers/index.ts +6 -2
  177. package/providers/fake/src/providers/inventory.provider.ts +40 -36
  178. package/providers/fake/src/providers/order-search.provider.ts +78 -0
  179. package/providers/fake/src/providers/order.provider.ts +106 -0
  180. package/providers/fake/src/providers/price.provider.ts +93 -41
  181. package/providers/fake/src/providers/product-search.provider.ts +206 -0
  182. package/providers/fake/src/providers/product.provider.ts +56 -41
  183. package/providers/fake/src/providers/profile.provider.ts +147 -0
  184. package/providers/fake/src/providers/store.provider.ts +30 -20
  185. package/providers/fake/src/schema/capabilities.schema.ts +5 -1
  186. package/providers/fake/src/test/cart.provider.spec.ts +59 -80
  187. package/providers/fake/src/test/category.provider.spec.ts +145 -87
  188. package/providers/fake/src/test/checkout.provider.spec.ts +222 -0
  189. package/providers/fake/src/test/order-search.provider.spec.ts +50 -0
  190. package/providers/fake/src/test/order.provider.spec.ts +44 -0
  191. package/providers/fake/src/test/price.provider.spec.ts +50 -45
  192. package/providers/fake/src/test/product.provider.spec.ts +15 -7
  193. package/providers/fake/src/test/profile.provider.spec.ts +167 -0
  194. package/providers/fake/tsconfig.json +1 -1
  195. package/providers/fake/tsconfig.lib.json +1 -1
  196. package/providers/fake/tsconfig.spec.json +2 -12
  197. package/providers/fake/vitest.config.ts +14 -0
  198. package/providers/medusa/README.md +30 -0
  199. package/providers/medusa/TESTING.md +98 -0
  200. package/providers/medusa/eslint.config.mjs +19 -0
  201. package/providers/medusa/package.json +22 -0
  202. package/providers/medusa/project.json +34 -0
  203. package/providers/medusa/src/core/client.ts +370 -0
  204. package/providers/medusa/src/core/initialize.ts +78 -0
  205. package/providers/medusa/src/index.ts +13 -0
  206. package/providers/medusa/src/providers/cart.provider.ts +575 -0
  207. package/providers/medusa/src/providers/category.provider.ts +247 -0
  208. package/providers/medusa/src/providers/checkout.provider.ts +636 -0
  209. package/providers/medusa/src/providers/identity.provider.ts +137 -0
  210. package/providers/medusa/src/providers/inventory.provider.ts +173 -0
  211. package/providers/medusa/src/providers/order-search.provider.ts +201 -0
  212. package/providers/medusa/src/providers/order.provider.ts +226 -0
  213. package/providers/medusa/src/providers/price.provider.ts +140 -0
  214. package/providers/medusa/src/providers/product-search.provider.ts +243 -0
  215. package/providers/medusa/src/providers/product.provider.ts +261 -0
  216. package/providers/medusa/src/providers/profile.provider.ts +392 -0
  217. package/providers/medusa/src/schema/capabilities.schema.ts +18 -0
  218. package/providers/medusa/src/schema/configuration.schema.ts +11 -0
  219. package/providers/medusa/src/schema/medusa.schema.ts +31 -0
  220. package/providers/medusa/src/test/cart.provider.spec.ts +240 -0
  221. package/providers/medusa/src/test/category.provider.spec.ts +231 -0
  222. package/providers/medusa/src/test/checkout.spec.ts +349 -0
  223. package/providers/medusa/src/test/identity.provider.spec.ts +122 -0
  224. package/providers/medusa/src/test/inventory.provider.spec.ts +88 -0
  225. package/providers/medusa/src/test/large-cart.provider.spec.ts +103 -0
  226. package/providers/medusa/src/test/price.provider.spec.ts +104 -0
  227. package/providers/medusa/src/test/product.provider.spec.ts +146 -0
  228. package/providers/medusa/src/test/search.provider.spec.ts +203 -0
  229. package/providers/medusa/src/test/test-utils.ts +13 -0
  230. package/providers/medusa/src/utils/medusa-helpers.ts +89 -0
  231. package/providers/medusa/tsconfig.json +21 -0
  232. package/providers/medusa/tsconfig.lib.json +9 -0
  233. package/providers/medusa/tsconfig.spec.json +4 -0
  234. package/providers/medusa/vitest.config.ts +15 -0
  235. package/providers/meilisearch/README.md +48 -0
  236. package/providers/meilisearch/eslint.config.mjs +22 -0
  237. package/providers/meilisearch/package.json +13 -0
  238. package/providers/meilisearch/project.json +34 -0
  239. package/providers/meilisearch/src/core/initialize.ts +16 -0
  240. package/providers/meilisearch/src/index.ts +5 -0
  241. package/providers/meilisearch/src/providers/index.ts +1 -0
  242. package/providers/meilisearch/src/providers/product-search.provider.ts +251 -0
  243. package/providers/meilisearch/src/schema/capabilities.schema.ts +9 -0
  244. package/providers/meilisearch/src/schema/configuration.schema.ts +10 -0
  245. package/providers/meilisearch/src/schema/index.ts +3 -0
  246. package/providers/meilisearch/src/schema/search.schema.ts +14 -0
  247. package/providers/meilisearch/tsconfig.json +24 -0
  248. package/providers/meilisearch/tsconfig.lib.json +10 -0
  249. package/providers/meilisearch/tsconfig.spec.json +4 -0
  250. package/providers/meilisearch/vitest.config.ts +14 -0
  251. package/providers/posthog/package.json +2 -1
  252. package/providers/posthog/tsconfig.json +1 -1
  253. package/tsconfig.base.json +5 -0
  254. package/vitest.config.ts +10 -0
  255. package/core/src/providers/search.provider.ts +0 -18
  256. package/core/src/schemas/models/search.model.ts +0 -36
  257. package/core/src/schemas/queries/search.query.ts +0 -9
  258. package/examples/next/.swcrc +0 -30
  259. package/examples/next/eslint.config.mjs +0 -21
  260. package/examples/next/index.d.ts +0 -6
  261. package/examples/next/next-env.d.ts +0 -5
  262. package/examples/next/next.config.js +0 -31
  263. package/examples/next/project.json +0 -9
  264. package/examples/next/public/.gitkeep +0 -0
  265. package/examples/next/public/favicon.ico +0 -0
  266. package/examples/next/src/app/global.css +0 -0
  267. package/examples/next/src/app/layout.tsx +0 -18
  268. package/examples/next/src/app/page.module.scss +0 -2
  269. package/examples/next/src/app/page.tsx +0 -47
  270. package/examples/next/src/instrumentation.ts +0 -9
  271. package/examples/next/tsconfig.json +0 -44
  272. package/examples/node/jest.config.ts +0 -10
  273. package/jest.config.ts +0 -6
  274. package/jest.preset.js +0 -3
  275. package/providers/algolia/jest.config.ts +0 -10
  276. package/providers/algolia/src/providers/product.provider.ts +0 -66
  277. package/providers/algolia/src/providers/search.provider.ts +0 -106
  278. package/providers/algolia/src/test/search.provider.spec.ts +0 -91
  279. package/providers/commercetools/jest.config.cjs +0 -10
  280. package/providers/commercetools/src/providers/search.provider.ts +0 -96
  281. package/providers/commercetools/src/test/cart.provider.spec.ts +0 -199
  282. package/providers/commercetools/src/test/category.provider.spec.ts +0 -168
  283. package/providers/commercetools/src/test/checkout.provider.spec.ts +0 -312
  284. package/providers/commercetools/src/test/identity.provider.spec.ts +0 -88
  285. package/providers/commercetools/src/test/inventory.provider.spec.ts +0 -41
  286. package/providers/commercetools/src/test/price.provider.spec.ts +0 -81
  287. package/providers/commercetools/src/test/product.provider.spec.ts +0 -80
  288. package/providers/commercetools/src/test/profile.provider.spec.ts +0 -49
  289. package/providers/commercetools/src/test/search.provider.spec.ts +0 -61
  290. package/providers/commercetools/src/test/store.provider.spec.ts +0 -37
  291. package/providers/fake/jest.config.cjs +0 -10
  292. package/providers/fake/src/providers/search.provider.ts +0 -132
@@ -1,88 +0,0 @@
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.js';
10
- import { CommercetoolsIdentityProvider } from '../providers/identity.provider.js';
11
- import { CommercetoolsCartProvider } from '../providers/cart.provider.js';
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
- });
@@ -1,41 +0,0 @@
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.js';
9
- import { CommercetoolsInventoryProvider } from '../providers/inventory.provider.js';
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,81 +0,0 @@
1
- import 'dotenv/config';
2
-
3
-
4
- import type { RequestContext} from '@reactionary/core';
5
- import { NoOpCache, PriceSchema, createInitialRequestContext,} from '@reactionary/core';
6
- import { getCommercetoolsTestConfiguration } from './test-utils.js';
7
-
8
- import { CommercetoolsPriceProvider } from '../providers/price.provider.js';
9
-
10
- const testData = {
11
- skuWithoutTiers: 'SGB-01',
12
- skuWithTiers: 'GMCT-01'
13
- }
14
-
15
-
16
- describe('Commercetools Price Provider', () => {
17
- let provider: CommercetoolsPriceProvider;
18
- let reqCtx: RequestContext;
19
-
20
-
21
-
22
- beforeAll( () => {
23
- provider = new CommercetoolsPriceProvider(getCommercetoolsTestConfiguration(), PriceSchema, new NoOpCache());
24
- });
25
-
26
- beforeEach( () => {
27
- reqCtx = createInitialRequestContext()
28
- })
29
-
30
- it('should be able to get prices for a product without tiers', async () => {
31
- const result = await provider.getBySKU({ sku: { key: testData.skuWithoutTiers }}, reqCtx);
32
-
33
- expect(result).toBeTruthy();
34
- if (result) {
35
- expect(result.identifier.sku.key).toBe(testData.skuWithoutTiers);
36
- expect(result.unitPrice.value).toBeGreaterThan(0);
37
- expect(result.unitPrice.currency).toBe('USD');
38
- expect(result.tieredPrices.length).toBe(0);
39
- }
40
- });
41
-
42
- xit('should be able to get prices for a product with tiers', async () => {
43
- const result = await provider.getBySKU({ sku: { key: testData.skuWithTiers }}, reqCtx);
44
-
45
- expect(result).toBeTruthy();
46
- if (result) {
47
- expect(result.identifier.sku.key).toBe(testData.skuWithTiers);
48
- expect(result.unitPrice.value).toBeGreaterThan(0);
49
- expect(result.unitPrice.currency).toBe('USD');
50
- expect(result.tieredPrices.length).toBeGreaterThan(0);
51
-
52
- expect(result.tieredPrices[0].minimumQuantity).toBeGreaterThan(0);
53
- expect(result.tieredPrices[0].price.value).toBeLessThanOrEqual(result.unitPrice.value);
54
- expect(result.tieredPrices[0].price.currency).toBe('USD');
55
-
56
- }
57
- });
58
-
59
- it('should return a placeholder price for an unknown SKU', async () => {
60
- const result = await provider.getBySKU({ sku: { key: 'unknown-sku' }}, reqCtx);
61
-
62
- expect(result).toBeTruthy();
63
- if (result) {
64
- expect(result.identifier.sku.key).toBe('unknown-sku');
65
- expect(result.unitPrice.value).toBe(-1);
66
- expect(result.unitPrice.currency).toBe('USD');
67
- expect(result.tieredPrices.length).toBe(0);
68
- expect(result.meta?.placeholder).toBe(true);
69
- }
70
- });
71
-
72
- it('can look up multiple prices at once', async () => {
73
- const skus = [testData.skuWithTiers, testData.skuWithoutTiers, 'unknown-sku'];
74
- const results = await Promise.all(skus.map( sku => provider.getBySKU({ sku: { key: sku }}, reqCtx)));
75
-
76
- expect(results).toHaveLength(skus.length);
77
- expect(results[0].identifier.sku.key).toBe(testData.skuWithTiers);
78
- expect(results[1].identifier.sku.key).toBe(testData.skuWithoutTiers);
79
- expect(results[2].identifier.sku.key).toBe('unknown-sku');
80
- });
81
- });
@@ -1,80 +0,0 @@
1
- import 'dotenv/config';
2
- import type { RequestContext} from '@reactionary/core';
3
- import { NoOpCache, ProductSchema, createInitialRequestContext } from '@reactionary/core';
4
- import { CommercetoolsProductProvider } from '../providers/product.provider.js';
5
- import { getCommercetoolsTestConfiguration } from './test-utils.js';
6
-
7
- const testData = {
8
- product : {
9
- id: '4d28f98d-c446-446e-b59a-d9f718e5b98a',
10
- name: 'Sunnai Glass Bowl',
11
- image: 'https://storage.googleapis.com/merchant-center-europe/sample-data/goodstore/Sunnai_Glass_Bowl-1.1.jpeg',
12
- sku: 'SGB-01',
13
-
14
- },
15
-
16
- }
17
-
18
- describe('Commercetools Product Provider', () => {
19
-
20
- let provider: CommercetoolsProductProvider;
21
- let reqCtx: RequestContext;
22
-
23
- beforeAll( () => {
24
- provider = new CommercetoolsProductProvider(getCommercetoolsTestConfiguration(), ProductSchema, new NoOpCache());
25
- });
26
-
27
- beforeEach( () => {
28
- reqCtx = createInitialRequestContext()
29
- })
30
-
31
-
32
- it('should be able to get a product by id', async () => {
33
- const result = await provider.getById( { id: testData.product.id }, reqCtx);
34
-
35
- expect(result).toBeTruthy();
36
- expect(result.identifier.key).toBe(testData.product.id);
37
- expect(result.meta.placeholder).toBe(false);
38
- expect(result.name).toBe(testData.product.name);
39
- expect(result.image).toBe(testData.product.image);
40
- });
41
-
42
- it('should be able to get a product by slug', async () => {
43
- const result = await provider.getBySlug( { slug: 'sunnai-glass-bowl' }, reqCtx);
44
-
45
- expect(result).toBeTruthy();
46
- if (result) {
47
- expect(result.meta.placeholder).toBe(false);
48
- expect(result.identifier.key).toBe(testData.product.id);
49
- expect(result.name).toBe(testData.product.name);
50
- expect(result.image).toBe(testData.product.image);
51
- }
52
- });
53
-
54
- it('should be able to get a product by sku', async () => {
55
- const result = await provider.getBySKU( { sku: { key: testData.product.sku } }, reqCtx);
56
-
57
- expect(result).toBeTruthy();
58
- if (result) {
59
- expect(result.meta.placeholder).toBe(false);
60
- expect(result.identifier.key).toBe(testData.product.id);
61
- expect(result.name).toBe(testData.product.name);
62
- expect(result.image).toBe(testData.product.image);
63
- }
64
- });
65
-
66
- it('should return null for unknown slug', async () => {
67
- const result = await provider.getBySlug( { slug: 'unknown-slug' }, reqCtx);
68
-
69
- expect(result).toBeNull();
70
- });
71
-
72
-
73
-
74
- it('should return a placeholder product for unknown id', async () => {
75
- const result = await provider.getById( { id: 'unknown-id' }, reqCtx);
76
-
77
- expect(result).toBeTruthy();
78
- expect(result.meta.placeholder).toBe(true);
79
- });
80
- });
@@ -1,49 +0,0 @@
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.js';
10
- import { CommercetoolsProfileProvider } from '../providers/profile.provider.js';
11
- import { CommercetoolsIdentityProvider } from '../providers/identity.provider.js';
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,61 +0,0 @@
1
- import 'dotenv/config';
2
- import type { RequestContext} from '@reactionary/core';
3
- import { NoOpCache, SearchResultSchema, createInitialRequestContext } from '@reactionary/core';
4
- import { CommercetoolsSearchProvider } from '../providers/search.provider.js';
5
- import { getCommercetoolsTestConfiguration } from './test-utils.js';
6
-
7
- const testData = {
8
- searchTerm: 'bowl'
9
- }
10
-
11
- describe('Commercetools Search Provider', () => {
12
-
13
- let provider: CommercetoolsSearchProvider;
14
- let reqCtx: RequestContext;
15
-
16
- beforeAll( () => {
17
- provider = new CommercetoolsSearchProvider(getCommercetoolsTestConfiguration(), SearchResultSchema, new NoOpCache());
18
- });
19
-
20
- beforeEach( () => {
21
- reqCtx = createInitialRequestContext()
22
- })
23
-
24
- it('should be able to get a result by term', async () => {
25
- const result = await provider.queryByTerm( {
26
- search: {
27
- term: testData.searchTerm,
28
- facets: [],
29
- page: 1,
30
- pageSize: 10,
31
- }}, reqCtx);
32
-
33
- expect(result.products.length).toBeGreaterThan(0);
34
- });
35
-
36
-
37
- it('should be able to get a result by term, paged', async () => {
38
- const result = await provider.queryByTerm( {
39
- search: {
40
- term: testData.searchTerm,
41
- facets: [],
42
- page: 1,
43
- pageSize: 1,
44
- }}, reqCtx);
45
-
46
- expect(result.products.length).toBeGreaterThan(0);
47
- expect(result.pages).toBeGreaterThan(1);
48
-
49
- const result2 = await provider.queryByTerm( {
50
- search: {
51
- term: testData.searchTerm,
52
- facets: [],
53
- page: 2,
54
- pageSize: 1,
55
- }}, reqCtx);
56
-
57
- expect(result2.products.length).toBeGreaterThan(0);
58
- expect(result2.pages).toBeGreaterThan(2);
59
- expect(result2.products[0].identifier.key).not.toBe(result.products[0].identifier.key);
60
- });
61
- });
@@ -1,37 +0,0 @@
1
- import 'dotenv/config';
2
- import type { RequestContext } from '@reactionary/core';
3
- import {
4
- NoOpCache,
5
- StoreSchema,
6
- createInitialRequestContext,
7
- } from '@reactionary/core';
8
- import { getCommercetoolsTestConfiguration } from './test-utils.js';
9
- import { CommercetoolsStoreProvider } from '../providers/store.provider.js';
10
-
11
- describe('Commercetools Store Provider', () => {
12
- let provider: CommercetoolsStoreProvider;
13
- let reqCtx: RequestContext;
14
-
15
- beforeAll(() => {
16
- provider = new CommercetoolsStoreProvider(
17
- getCommercetoolsTestConfiguration(),
18
- StoreSchema,
19
- new NoOpCache()
20
- );
21
- });
22
-
23
- beforeEach(() => {
24
- reqCtx = createInitialRequestContext();
25
- });
26
-
27
- it('should be able to query stores by longitude and latitude', async () => {
28
- const stores = await provider.queryByProximity({
29
- distance: 1000,
30
- latitude: 15,
31
- longitude: 15,
32
- limit: 10
33
- }, reqCtx);
34
-
35
- expect(stores.length).toBe(2);
36
- });
37
- });
@@ -1,10 +0,0 @@
1
- module.exports = {
2
- displayName: 'provider-faker',
3
- preset: '../../jest.preset.js',
4
- testEnvironment: 'node',
5
- transform: {
6
- '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }],
7
- },
8
- moduleFileExtensions: ['ts', 'js', 'html'],
9
- coverageDirectory: '../../coverage/providers/fake',
10
- };
@@ -1,132 +0,0 @@
1
- import {
2
- SearchProvider
3
- } from '@reactionary/core';
4
- import type {
5
- SearchResult,
6
- SearchResultFacet,
7
- SearchResultProduct,
8
- Cache as ReactionaryCache,
9
- } from '@reactionary/core';
10
- import type { RequestContext, SearchQueryByTerm } from '@reactionary/core';
11
- import type z from 'zod';
12
- import type { FakeConfiguration } from '../schema/configuration.schema.js';
13
- import { Faker, en, base } from '@faker-js/faker';
14
- import { jitter } from '../utilities/jitter.js';
15
-
16
- export class FakeSearchProvider<
17
- T extends SearchResult = SearchResult
18
- > extends SearchProvider<T> {
19
- protected config: FakeConfiguration;
20
-
21
- constructor(config: FakeConfiguration, schema: z.ZodType<T>, cache: ReactionaryCache) {
22
- super(schema, cache);
23
-
24
- this.config = config;
25
- }
26
-
27
- public override async queryByTerm(
28
- payload: SearchQueryByTerm,
29
- _reqCtx: RequestContext
30
- ): Promise<SearchResult> {
31
- await jitter(this.config.jitter.mean, this.config.jitter.deviation);
32
-
33
- const query = payload.search;
34
-
35
- const querySpecificity =
36
- 20 - query.term.length - query.page - query.facets.length;
37
- const totalProducts = 10 * querySpecificity;
38
- const totalPages = Math.ceil(totalProducts / query.pageSize);
39
- const productsOnPage = Math.min(totalProducts, query.pageSize);
40
-
41
- const productGenerator = new Faker({
42
- seed: querySpecificity,
43
- locale: [en, base],
44
- });
45
-
46
- const facetGenerator = new Faker({
47
- seed: 100,
48
- locale: [en, base],
49
- });
50
-
51
- const products = new Array<SearchResultProduct>();
52
- const facets = new Array<SearchResultFacet>();
53
-
54
- for (let i = 0; i < productsOnPage; i++) {
55
- products.push({
56
- identifier: {
57
- key: productGenerator.commerce.isbn(),
58
- },
59
- image: productGenerator.image.urlPicsumPhotos({
60
- height: 300,
61
- width: 300,
62
- grayscale: true,
63
- blur: 8,
64
- }),
65
- name: productGenerator.commerce.productName(),
66
- slug: productGenerator.lorem.slug(),
67
- });
68
- }
69
-
70
- const facetBase = ['color', 'size'];
71
-
72
- for (const base of facetBase) {
73
- const facet: SearchResultFacet = {
74
- identifier: {
75
- key: base,
76
- },
77
- name: base,
78
- values: [],
79
- };
80
-
81
- for (let i = 0; i < 10; i++) {
82
- const valueKey = i.toString();
83
- const isActive =
84
- query.facets.find(
85
- (x) => x.facet.key === facet.identifier.key && x.key === valueKey
86
- ) !== undefined;
87
-
88
- facet.values.push({
89
- active: isActive,
90
- count: facetGenerator.number.int({ min: 1, max: 50 }),
91
- identifier: {
92
- facet: {
93
- key: facet.identifier.key,
94
- },
95
- key: valueKey,
96
- },
97
- name: facetGenerator.color.human(),
98
- });
99
- }
100
-
101
- facets.push(facet);
102
- }
103
-
104
- const result = {
105
- pages: totalPages,
106
- identifier: {
107
- term: query.term,
108
- page: query.page,
109
- facets: query.facets,
110
- pageSize: query.pageSize,
111
- },
112
- facets: facets,
113
- products: products,
114
- meta: {
115
- cache: {
116
- hit: false,
117
- key: '',
118
- },
119
- placeholder: false,
120
- },
121
- } satisfies SearchResult;
122
-
123
- const foo = this.childFunction();
124
-
125
- return this.schema.parse(result);
126
- }
127
-
128
- protected childFunction() {
129
- const foo = 42;
130
- return foo;
131
- }
132
- }