@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,199 +0,0 @@
1
- import 'dotenv/config';
2
- import type { RequestContext} from '@reactionary/core';
3
- import { CartSchema, IdentitySchema, NoOpCache, ProductSchema, createInitialRequestContext } from '@reactionary/core';
4
- import { getCommercetoolsTestConfiguration } from './test-utils.js';
5
- import { CommercetoolsCartProvider } from '../providers/cart.provider.js';
6
- import { CommercetoolsIdentityProvider } from '../providers/identity.provider.js';
7
- import { CommercetoolsProductProvider } from '../providers/product.provider.js';
8
-
9
-
10
- const testData = {
11
- skuWithoutTiers: 'SGB-01',
12
- skuWithTiers: 'GMCT-01'
13
- }
14
-
15
- describe('Commercetools Cart Provider', () => {
16
- let provider: CommercetoolsCartProvider;
17
- let productProvider: CommercetoolsProductProvider;
18
- let identityProvider: CommercetoolsIdentityProvider;
19
- let reqCtx: RequestContext;
20
-
21
- beforeAll( () => {
22
- provider = new CommercetoolsCartProvider(getCommercetoolsTestConfiguration(), CartSchema, new NoOpCache());
23
- identityProvider = new CommercetoolsIdentityProvider(getCommercetoolsTestConfiguration(), IdentitySchema, new NoOpCache());
24
- productProvider = new CommercetoolsProductProvider(getCommercetoolsTestConfiguration(), ProductSchema, new NoOpCache());
25
- });
26
-
27
- beforeEach( () => {
28
- reqCtx = createInitialRequestContext()
29
- });
30
-
31
- describe('anonymous sessions', () => {
32
- it('should be able to get an empty cart', async () => {
33
- const cart = await provider.getById({
34
- cart: { key: '' },
35
- }, reqCtx);
36
-
37
- expect(cart.identifier.key).toBeFalsy();
38
- expect(cart.items.length).toBe(0);
39
- expect(cart.meta?.placeholder).toBe(true);
40
-
41
- });
42
-
43
- it('should be able to add an item to a cart', async () => {
44
- const cart = await provider.add({
45
- cart: { key: '' },
46
- sku: {
47
- key: testData.skuWithoutTiers,
48
- },
49
- quantity: 1
50
- }, reqCtx);
51
-
52
- expect(cart.identifier.key).toBeDefined();
53
- expect(cart.items.length).toBe(1);
54
- expect(cart.items[0].sku.key).toBe(testData.skuWithoutTiers);
55
- expect(cart.items[0].quantity).toBe(1);
56
-
57
- expect(cart.items[0].price.totalPrice.value).toBeGreaterThan(0);
58
- expect(cart.items[0].price.totalPrice.currency).toBe(reqCtx.languageContext.currencyCode);
59
-
60
- expect(cart.price.grandTotal.value).toBeGreaterThan(0);
61
- expect(cart.price.grandTotal.currency).toBe(reqCtx.languageContext.currencyCode);
62
-
63
- expect(cart.price.grandTotal.value).toBe(cart.items[0].price.totalPrice.value);
64
-
65
-
66
- expect(cart.meta?.placeholder).toBeFalsy();
67
-
68
- });
69
-
70
- it('can add multiple different items to a cart', async () => {
71
-
72
- const cart = await provider.add({
73
- cart: { key: '' },
74
- sku: {
75
- key: testData.skuWithoutTiers,
76
- },
77
- quantity: 1
78
- }, reqCtx);
79
-
80
-
81
- const updatedCart = await provider.add({
82
- cart: cart.identifier,
83
- sku: {
84
- key: testData.skuWithTiers,
85
- },
86
- quantity: 2
87
- }, reqCtx);
88
-
89
- expect(updatedCart.items.length).toBe(2);
90
- expect(updatedCart.items[0].sku.key).toBe(testData.skuWithoutTiers);
91
- expect(updatedCart.items[0].quantity).toBe(1);
92
- expect(updatedCart.items[1].sku.key).toBe(testData.skuWithTiers);
93
- expect(updatedCart.items[1].quantity).toBe(2);
94
- });
95
-
96
- it('should be able to change quantity of an item in a cart', async () => {
97
-
98
- const cart = await provider.add({
99
- cart: { key: '' },
100
- sku: {
101
- key: testData.skuWithoutTiers,
102
- },
103
- quantity: 1
104
- }, reqCtx);
105
-
106
- const updatedCart = await provider.changeQuantity({
107
- cart: cart.identifier,
108
- item: cart.items[0].identifier,
109
- quantity: 3
110
- }, reqCtx);
111
-
112
-
113
- expect(updatedCart.items.length).toBe(1);
114
- expect(updatedCart.items[0].sku.key).toBe(testData.skuWithoutTiers);
115
- expect(updatedCart.items[0].quantity).toBe(3);
116
-
117
- expect(updatedCart.items[0].price.totalPrice.value).toBe(cart.items[0].price.totalPrice.value * 3);
118
- expect(updatedCart.items[0].price.unitPrice.value).toBe(cart.items[0].price.unitPrice.value);
119
-
120
-
121
- });
122
-
123
- it('should be able to remove an item from a cart', async () => {
124
-
125
- const cart = await provider.add({
126
- cart: { key: '' },
127
- sku: {
128
- key: testData.skuWithoutTiers,
129
- },
130
- quantity: 1
131
- }, reqCtx);
132
-
133
- const updatedCart = await provider.remove({
134
- cart: cart.identifier,
135
- item: cart.items[0].identifier,
136
- }, reqCtx);
137
-
138
- expect(updatedCart.items.length).toBe(0);
139
- });
140
-
141
- it('should be able to delete a cart', async () => {
142
-
143
- const cart = await provider.add({
144
- cart: { key: '' },
145
- sku: {
146
- key: testData.skuWithoutTiers,
147
- },
148
- quantity: 1
149
- }, reqCtx);
150
-
151
- expect(cart.items.length).toBe(1);
152
- expect(cart.identifier.key).toBeTruthy();
153
-
154
- const deletedCart = await provider.deleteCart({
155
- cart: cart.identifier,
156
- }, reqCtx);
157
-
158
- expect(deletedCart.items.length).toBe(0);
159
- expect(deletedCart.identifier.key).toBe('');
160
-
161
- const originalCart = await provider.getById({
162
- cart: cart.identifier,
163
- }, reqCtx);
164
-
165
- expect(originalCart.items.length).toBe(0);
166
- });
167
-
168
- it('can load the product information for cart items', async () => {
169
-
170
- const cart = await provider.add({
171
- cart: { key: '' },
172
- sku: {
173
- key: testData.skuWithoutTiers,
174
- },
175
- quantity: 1
176
- }, reqCtx);
177
- expect(cart.items[0].sku).toBeDefined();
178
-
179
- const product = await productProvider.getBySKU( { sku: cart.items[0].sku }, reqCtx);
180
- expect(product).toBeTruthy();
181
- if (product) {
182
- expect(product.skus.some(s => s.identifier.key === cart.items[0].sku.key)).toBe(true);
183
- }
184
- });
185
- /**
186
- it('should be able to create a cart for an anonymous user, then login and merge the cart', async () => {
187
- });
188
-
189
- it('should be able to create a cart for an anonymous user, then register and merge the cart', async () => {
190
- });
191
-
192
- it('should be able to clear the cart', async () => { });
193
-
194
- it('should be able to check out the cart', async () => { });
195
- */
196
-
197
- });
198
-
199
- });
@@ -1,168 +0,0 @@
1
- import 'dotenv/config'
2
- import type { RequestContext} from '@reactionary/core';
3
- import { CategorySchema, NoOpCache , createInitialRequestContext} from '@reactionary/core';
4
- import { CommercetoolsCategoryProvider } from '../providers/category.provider.js';
5
- import { getCommercetoolsTestConfiguration } from './test-utils.js';
6
-
7
- const testData = {
8
- topCategories: [
9
- {
10
- key: 'home-decor', name: 'Home Decor', slug: 'home-decor'
11
- },
12
- {
13
- key: 'furniture', name: 'Furniture'
14
- }
15
- ],
16
-
17
- childCategoriesOfFirstTopcategory: [
18
- { key: 'bedding', name: 'Bedding' },
19
- { key: 'room-decor', name: 'Room Decor' }
20
- ],
21
-
22
- breadCrumb: [ 'home-decor', 'room-decor', 'home-accents' ],
23
- }
24
-
25
-
26
- describe('Commercetools Category Provider', () => {
27
- let provider: CommercetoolsCategoryProvider;
28
- let reqCtx: RequestContext;
29
-
30
- beforeAll( () => {
31
- provider = new CommercetoolsCategoryProvider(getCommercetoolsTestConfiguration(), CategorySchema, new NoOpCache());
32
- });
33
-
34
- beforeEach( () => {
35
- reqCtx = createInitialRequestContext()
36
- })
37
-
38
- it('should be able to get top-categories', async () => {
39
- const result = await provider.findTopCategories({ paginationOptions: { pageSize: 10, pageNumber: 1 }}, reqCtx);
40
-
41
- expect(result.items.length).toBeGreaterThan(0);
42
- expect(result.items[0].identifier.key).toBe(testData.topCategories[0].key);
43
- expect(result.items[0].name).toBe(testData.topCategories[0].name);
44
-
45
- expect(result.items[1].identifier.key).toBe(testData.topCategories[1].key);
46
- expect(result.items[1].name).toBe(testData.topCategories[1].name);
47
- });
48
-
49
- it('should be able to get child categories for a category', async () => {
50
- const result = await provider.findChildCategories({ parentId: { key: testData.topCategories[0].key }, paginationOptions: { pageSize: 10, pageNumber: 1 }}, reqCtx);
51
-
52
- expect(result.items.length).toBeGreaterThan(0);
53
- expect(result.items[0].identifier.key).toBe(testData.childCategoriesOfFirstTopcategory[0].key);
54
- expect(result.items[0].name).toBe(testData.childCategoriesOfFirstTopcategory[0].name);
55
-
56
- expect(result.items[1].identifier.key).toBe(testData.childCategoriesOfFirstTopcategory[1].key);
57
- expect(result.items[1].name).toBe(testData.childCategoriesOfFirstTopcategory[1].name);
58
-
59
- });
60
-
61
-
62
- it('should be able to get child categories for a category, paged', async () => {
63
- let result = await provider.findChildCategories({ parentId: { key: testData.topCategories[0].key }, paginationOptions: { pageSize: 1, pageNumber: 1 }}, reqCtx);
64
-
65
- expect(result.items.length).toBeGreaterThan(0);
66
- expect(result.items[0].identifier.key).toBe(testData.childCategoriesOfFirstTopcategory[0].key);
67
- expect(result.items[0].name).toBe(testData.childCategoriesOfFirstTopcategory[0].name);
68
- expect(result.totalCount).toBe(2);
69
- expect(result.totalPages).toBe(2);
70
- expect(result.pageSize).toBe(1);
71
- expect(result.pageNumber).toBe(1);
72
-
73
- result = await provider.findChildCategories({ parentId: { key: testData.topCategories[0].key }, paginationOptions: { pageSize: 1, pageNumber: 2 }}, reqCtx);
74
-
75
- expect(result.items.length).toBeGreaterThan(0);
76
- expect(result.items[0].identifier.key).toBe(testData.childCategoriesOfFirstTopcategory[1].key);
77
- expect(result.items[0].name).toBe(testData.childCategoriesOfFirstTopcategory[1].name);
78
- expect(result.totalCount).toBe(2);
79
- expect(result.totalPages).toBe(2);
80
- expect(result.pageSize).toBe(1);
81
- expect(result.pageNumber).toBe(2);
82
- });
83
-
84
-
85
- it('can load all breadcrumbs for a category', async () => {
86
- const leaf = testData.breadCrumb[testData.breadCrumb.length -1];
87
- const result = await provider.getBreadcrumbPathToCategory({ id: { key: leaf! } }, reqCtx);
88
-
89
- expect(result.length).toBe(testData.breadCrumb.length);
90
- for(let i = 0 ; i < testData.breadCrumb.length; i++) {
91
- expect(result[i].identifier.key).toBe(testData.breadCrumb[i]);
92
- }
93
- });
94
-
95
-
96
- it('should be able to get a category by slug', async () => {
97
-
98
- const result = await provider.getBySlug({ slug: testData.topCategories[0].slug! }, reqCtx);
99
- expect(result).toBeTruthy();
100
- if (result) {
101
- expect(result.identifier.key).toBe(testData.topCategories[0].key);
102
- expect(result.name).toBe(testData.topCategories[0].name);
103
- expect(result.slug).toBe(testData.topCategories[0].slug);
104
- expect(result.parentCategory).toBeUndefined();
105
- expect(result.text).not.toBe("");
106
- expect(result.meta.placeholder).toBe(false);
107
- }
108
- });
109
-
110
- it('returns null if looking for slug that does not exist', async () => {
111
- const result = await provider.getBySlug({ slug: 'non-existent-slug' }, reqCtx);
112
- expect(result).toBeNull();
113
- });
114
-
115
-
116
-
117
- it('should be able to get a category by id', async () => {
118
- const result = await provider.getById({ id: { key: 'home-decor'}}, reqCtx);
119
-
120
- expect(result.identifier.key).toBe('home-decor');
121
- expect(result.name).toBe('Home Decor');
122
- expect(result.slug).toBe('home-decor');
123
- expect(result.parentCategory).toBeUndefined();
124
-
125
- expect(result.text).toBe('A test description');
126
- expect(result.meta.placeholder).toBe(false);
127
-
128
- });
129
-
130
- it('should be able to get a category by id in alternate language', async () => {
131
-
132
- reqCtx.languageContext.locale = 'de-DE';
133
- const result = await provider.getById({ id: { key: 'home-decor'}}, reqCtx);
134
-
135
- expect(result.identifier.key).toBe('home-decor');
136
- expect(result.name).toBe('Dekoration');
137
- expect(result.slug).toBe('home-decor');
138
- expect(result.parentCategory).toBeUndefined();
139
-
140
- expect(result.text).toBe('Eine Testbeschreibung');
141
- expect(result.meta.placeholder).toBe(false);
142
-
143
- });
144
-
145
-
146
- it('returns empty values if you choose a language that is not available', async () => {
147
-
148
- reqCtx.languageContext.locale = 'fr-FR';
149
- const result = await provider.getById({ id: { key: 'home-decor'}}, reqCtx);
150
-
151
- expect(result.identifier.key).toBe('home-decor');
152
- expect(result.name).toBe('No Name');
153
- expect(result.slug).toBe('');
154
- expect(result.parentCategory).toBeUndefined();
155
-
156
- expect(result.meta.placeholder).toBe(false);
157
-
158
- });
159
-
160
-
161
-
162
- it('returns a placeholder if you search for a category that does not exist', async () => {
163
- const result = await provider.getById({ id: { key: 'non-existent-category'}}, reqCtx);
164
- expect(result.identifier.key).toBe('non-existent-category');
165
- expect(result.meta.placeholder).toBe(true);
166
-
167
- });
168
- });
@@ -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
- });