@reactionary/source 0.0.52 → 0.2.16

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 (293) 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 +265 -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 +147 -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 +202 -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 +21 -0
  240. package/providers/meilisearch/src/index.ts +6 -0
  241. package/providers/meilisearch/src/providers/index.ts +1 -0
  242. package/providers/meilisearch/src/providers/order-search.provider.ts +222 -0
  243. package/providers/meilisearch/src/providers/product-search.provider.ts +251 -0
  244. package/providers/meilisearch/src/schema/capabilities.schema.ts +10 -0
  245. package/providers/meilisearch/src/schema/configuration.schema.ts +11 -0
  246. package/providers/meilisearch/src/schema/index.ts +3 -0
  247. package/providers/meilisearch/src/schema/search.schema.ts +14 -0
  248. package/providers/meilisearch/tsconfig.json +24 -0
  249. package/providers/meilisearch/tsconfig.lib.json +10 -0
  250. package/providers/meilisearch/tsconfig.spec.json +4 -0
  251. package/providers/meilisearch/vitest.config.ts +14 -0
  252. package/providers/posthog/package.json +2 -1
  253. package/providers/posthog/tsconfig.json +1 -1
  254. package/tsconfig.base.json +5 -0
  255. package/vitest.config.ts +10 -0
  256. package/core/src/providers/search.provider.ts +0 -18
  257. package/core/src/schemas/models/search.model.ts +0 -36
  258. package/core/src/schemas/queries/search.query.ts +0 -9
  259. package/examples/next/.swcrc +0 -30
  260. package/examples/next/eslint.config.mjs +0 -21
  261. package/examples/next/index.d.ts +0 -6
  262. package/examples/next/next-env.d.ts +0 -5
  263. package/examples/next/next.config.js +0 -31
  264. package/examples/next/project.json +0 -9
  265. package/examples/next/public/.gitkeep +0 -0
  266. package/examples/next/public/favicon.ico +0 -0
  267. package/examples/next/src/app/global.css +0 -0
  268. package/examples/next/src/app/layout.tsx +0 -18
  269. package/examples/next/src/app/page.module.scss +0 -2
  270. package/examples/next/src/app/page.tsx +0 -47
  271. package/examples/next/src/instrumentation.ts +0 -9
  272. package/examples/next/tsconfig.json +0 -44
  273. package/examples/node/jest.config.ts +0 -10
  274. package/jest.config.ts +0 -6
  275. package/jest.preset.js +0 -3
  276. package/providers/algolia/jest.config.ts +0 -10
  277. package/providers/algolia/src/providers/product.provider.ts +0 -66
  278. package/providers/algolia/src/providers/search.provider.ts +0 -106
  279. package/providers/algolia/src/test/search.provider.spec.ts +0 -91
  280. package/providers/commercetools/jest.config.cjs +0 -10
  281. package/providers/commercetools/src/providers/search.provider.ts +0 -96
  282. package/providers/commercetools/src/test/cart.provider.spec.ts +0 -199
  283. package/providers/commercetools/src/test/category.provider.spec.ts +0 -168
  284. package/providers/commercetools/src/test/checkout.provider.spec.ts +0 -312
  285. package/providers/commercetools/src/test/identity.provider.spec.ts +0 -88
  286. package/providers/commercetools/src/test/inventory.provider.spec.ts +0 -41
  287. package/providers/commercetools/src/test/price.provider.spec.ts +0 -81
  288. package/providers/commercetools/src/test/product.provider.spec.ts +0 -80
  289. package/providers/commercetools/src/test/profile.provider.spec.ts +0 -49
  290. package/providers/commercetools/src/test/search.provider.spec.ts +0 -61
  291. package/providers/commercetools/src/test/store.provider.spec.ts +0 -37
  292. package/providers/fake/jest.config.cjs +0 -10
  293. package/providers/fake/src/providers/search.provider.ts +0 -132
@@ -1,312 +0,0 @@
1
- import 'dotenv/config';
2
- import type { Cart, Checkout, RequestContext } from '@reactionary/core';
3
- import {
4
- CartSchema,
5
- CheckoutSchema,
6
- IdentitySchema,
7
- NoOpCache,
8
- PaymentInstructionSchema,
9
- ShippingInstructionSchema,
10
- createInitialRequestContext,
11
- } from '@reactionary/core';
12
- import { getCommercetoolsTestConfiguration } from './test-utils.js';
13
- import { CommercetoolsCartProvider } from '../providers/cart.provider.js';
14
- import { CommercetoolsIdentityProvider } from '../providers/identity.provider.js';
15
- import { CommercetoolsCheckoutProvider } from '../providers/checkout.provider.js';
16
-
17
- const testData = {
18
- skuWithoutTiers: 'SGB-01',
19
- skuWithTiers: 'GMCT-01',
20
- };
21
-
22
- describe('Commercetools Checkout Provider', () => {
23
- let provider: CommercetoolsCheckoutProvider;
24
- let cartProvider: CommercetoolsCartProvider;
25
- let identityProvider: CommercetoolsIdentityProvider;
26
- let reqCtx: RequestContext;
27
-
28
- beforeAll(() => {
29
- provider = new CommercetoolsCheckoutProvider(
30
- getCommercetoolsTestConfiguration(),
31
- CheckoutSchema,
32
- new NoOpCache()
33
- );
34
- cartProvider = new CommercetoolsCartProvider(
35
- getCommercetoolsTestConfiguration(),
36
- CartSchema,
37
- new NoOpCache()
38
- );
39
- identityProvider = new CommercetoolsIdentityProvider(
40
- getCommercetoolsTestConfiguration(),
41
- IdentitySchema,
42
- new NoOpCache()
43
- );
44
- });
45
-
46
- beforeEach(() => {
47
- reqCtx = createInitialRequestContext();
48
- });
49
-
50
- describe('anonymous sessions', () => {
51
- let cart: Cart;
52
-
53
- beforeEach(async () => {
54
- cart = await cartProvider.add(
55
- {
56
- cart: { key: '', version: 0 },
57
- sku: {
58
- key: testData.skuWithoutTiers,
59
- },
60
- quantity: 1,
61
- },
62
- reqCtx
63
- );
64
- });
65
-
66
- it('can create a checkout session from a cart', async () => {
67
- // we have either an anonymous user, or an authenticated user.
68
- // if it is anonymous, we assume you will have collected some basic info by now ?
69
-
70
- const checkout = await provider.initiateCheckoutForCart(
71
- {
72
- cart: cart.identifier,
73
- billingAddress: {
74
- countryCode: 'US',
75
- firstName: 'John',
76
- lastName: 'Doe',
77
- streetAddress: '123 Main St',
78
- streetNumber: '1A',
79
- postalCode: '12345',
80
- city: 'Anytown',
81
- region: '',
82
- },
83
- notificationEmail: 'sample@example.com',
84
- notificationPhone: '+4512345678',
85
- },
86
- reqCtx
87
- );
88
-
89
- expect(checkout.identifier.key).toBeDefined();
90
- expect(checkout.originalCartReference.key).toBe(cart.identifier.key);
91
- expect(checkout.billingAddress?.firstName).toBe('John');
92
- expect(checkout.items.length).toBe(1);
93
- expect(checkout.items[0].sku.key).toBe(testData.skuWithoutTiers);
94
- });
95
-
96
- describe('checkout actions', () => {
97
- let checkout: Checkout;
98
- beforeEach(async () => {
99
- checkout = await provider.initiateCheckoutForCart(
100
- {
101
- cart: cart.identifier,
102
- billingAddress: {
103
- countryCode: 'US',
104
- firstName: 'John',
105
- lastName: 'Doe',
106
- streetAddress: '123 Main St',
107
- streetNumber: '1A',
108
- postalCode: '12345',
109
- city: 'Anytown',
110
- region: '',
111
- },
112
- notificationEmail: 'sample@example.com',
113
- notificationPhone: '+4512345678',
114
- },
115
- reqCtx
116
- );
117
- });
118
-
119
- it('can list payment methods', async () => {
120
- const paymentMethods = await provider.getAvailablePaymentMethods(
121
- {
122
- checkout: checkout.identifier,
123
- },
124
- reqCtx
125
- );
126
- expect(paymentMethods.length).toBeGreaterThan(0);
127
- expect(
128
- paymentMethods.find((x) => x.identifier.method === 'stripe')
129
- ).toBeDefined();
130
- });
131
-
132
- it('can list shipping methods', async () => {
133
- const shippingMethods = await provider.getAvailableShippingMethods(
134
- {
135
- checkout: checkout.identifier,
136
- },
137
- reqCtx
138
- );
139
- expect(shippingMethods.length).toBeGreaterThan(0);
140
- expect(
141
- shippingMethods.find((x) => x.identifier.key === 'us-delivery')
142
- ).toBeDefined();
143
- });
144
-
145
- it('can add a payment instruction', async () => {
146
- const paymentMethods = await provider.getAvailablePaymentMethods(
147
- {
148
- checkout: checkout.identifier,
149
- },
150
- reqCtx
151
- );
152
- const pm = paymentMethods.find((x) => x.identifier.method === 'stripe');
153
- expect(pm).toBeDefined();
154
-
155
- const checkoutWithPi = await provider.addPaymentInstruction(
156
- {
157
- checkout: checkout.identifier,
158
- paymentInstruction: PaymentInstructionSchema.parse({
159
- paymentMethod: pm?.identifier,
160
- amount: checkout.price.grandTotal,
161
- protocolData: [{ key: 'test-key', value: 'test-value' }],
162
- }),
163
- },
164
- reqCtx
165
- );
166
-
167
- expect(checkoutWithPi.paymentInstructions.length).toBe(1);
168
- expect(checkoutWithPi.paymentInstructions[0].paymentMethod.method).toBe(
169
- 'stripe'
170
- );
171
- expect(checkoutWithPi.paymentInstructions[0].protocolData.find(x => x.key === 'stripe_clientSecret')?.value).toBeDefined();
172
-
173
- });
174
-
175
- xit('can cancel an in-progress payment', async () => {
176
- const paymentMethods = await provider.getAvailablePaymentMethods(
177
- {
178
- checkout: checkout.identifier,
179
- },
180
- reqCtx
181
- );
182
- const pm = paymentMethods.find((x) => x.identifier.method === 'stripe');
183
- expect(pm).toBeDefined();
184
-
185
- const checkoutWithPi = await provider.addPaymentInstruction(
186
- {
187
- checkout: checkout.identifier,
188
- paymentInstruction: PaymentInstructionSchema.parse({
189
- paymentMethod: pm?.identifier,
190
- amount: checkout.price.grandTotal,
191
- protocolData: [{ key: 'test-key', value: 'test-value' }],
192
- }),
193
- },
194
- reqCtx
195
- );
196
-
197
- expect(checkoutWithPi.paymentInstructions.length).toBe(1);
198
-
199
- const checkoutAfterCancel = await provider.removePaymentInstruction(
200
- {
201
- checkout: checkout.identifier,
202
- paymentInstruction:
203
- checkoutWithPi.paymentInstructions[0].identifier,
204
- },
205
- reqCtx
206
- );
207
-
208
- expect(checkoutAfterCancel.paymentInstructions.length).toBe(0);
209
- });
210
-
211
- it('can set shipping address', async () => {
212
- const checkoutWithShipping = await provider.setShippingAddress(
213
- {
214
- checkout: checkout.identifier,
215
- shippingAddress: {
216
- countryCode: 'US',
217
- firstName: 'Jane',
218
- lastName: 'Doe',
219
- streetAddress: '456 Other St',
220
- streetNumber: '2B',
221
- postalCode: '54321',
222
- city: 'Othertown',
223
- region: '',
224
- },
225
- },
226
- reqCtx
227
- );
228
-
229
- expect(checkoutWithShipping.shippingAddress).toBeDefined();
230
- expect(checkoutWithShipping.shippingAddress?.firstName).toBe('Jane');
231
- });
232
-
233
- it('can set shipping instructions', async () => {
234
- const shippingMethods = await provider.getAvailableShippingMethods(
235
- {
236
- checkout: checkout.identifier,
237
- },
238
- reqCtx
239
- );
240
- const sm = shippingMethods.find((x) => x.identifier.key === 'us-delivery');
241
- expect(sm).toBeDefined();
242
-
243
- const shippingInstruction = ShippingInstructionSchema.parse({
244
- shippingMethod: sm?.identifier || { key: '' },
245
- amount: checkout.price.totalShipping,
246
- instructions: 'Leave at front door if not home',
247
- consentForUnattendedDelivery: true,
248
- pickupPoint: '4190asx141', // this would be a real pickup point ID in a real scenario
249
- });
250
-
251
- const checkoutWithShipping = await provider.setShippingInstruction(
252
- {
253
- checkout: checkout.identifier,
254
- shippingInstruction,
255
- },
256
- reqCtx
257
- );
258
-
259
- expect(checkout.price.totalShipping.value).toBe(0);
260
- expect(checkoutWithShipping.price.totalShipping.value).toBeGreaterThan(0);
261
- expect(checkoutWithShipping.shippingInstruction).toBeDefined();
262
- expect(
263
- checkoutWithShipping.shippingInstruction?.shippingMethod.key
264
- ).toBe('us-delivery');
265
- expect(checkoutWithShipping.shippingInstruction?.instructions).toBe(
266
- 'Leave at front door if not home'
267
- );
268
- expect(checkoutWithShipping.shippingInstruction?.pickupPoint).toBe(
269
- '4190asx141'
270
- );
271
- expect(
272
- checkoutWithShipping.shippingInstruction?.consentForUnattendedDelivery
273
- ).toBe(true);
274
- });
275
-
276
- xit('wont report it finalizable until everything is paid/authorized', async () => {
277
- expect(checkout.readyForFinalization).toBe(false);
278
- const pm = (
279
- await provider.getAvailablePaymentMethods(
280
- {
281
- checkout: checkout.identifier,
282
- },
283
- reqCtx
284
- )
285
- ).find((x) => x.identifier.method === 'stripe');
286
- expect(pm).toBeDefined();
287
-
288
- const checkoutWithPi = await provider.addPaymentInstruction(
289
- {
290
- checkout: checkout.identifier,
291
- paymentInstruction: PaymentInstructionSchema.parse({
292
- paymentMethod: pm?.identifier,
293
- amount: checkout.price.grandTotal,
294
- protocolData: [{ key: 'test-key', value: 'test-value' }],
295
- }),
296
- },
297
- reqCtx
298
- );
299
-
300
- // do something to simulate payment authorization ?
301
- const checkoutReady = await provider.getById(
302
- { identifier: checkoutWithPi.identifier },
303
- reqCtx
304
- );
305
- if (!checkoutReady) {
306
- fail('checkout not found');
307
- }
308
- expect(checkoutReady.readyForFinalization).toBe(true);
309
- });
310
- });
311
- });
312
- });
@@ -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
- });