@reactionary/source 0.0.51 → 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 (325) 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 -2
  8. package/core/src/cache/cache.interface.ts +2 -1
  9. package/core/src/cache/index.ts +4 -0
  10. package/core/src/cache/memory-cache.ts +32 -4
  11. package/core/src/cache/noop-cache.ts +16 -2
  12. package/core/src/cache/redis-cache.ts +21 -1
  13. package/core/src/client/client-builder.ts +71 -54
  14. package/core/src/client/client.ts +17 -55
  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 +210 -21
  18. package/core/src/index.ts +6 -19
  19. package/core/src/initialization.ts +2 -19
  20. package/core/src/metrics/metrics.ts +67 -0
  21. package/core/src/providers/analytics.provider.ts +2 -7
  22. package/core/src/providers/base.provider.ts +6 -70
  23. package/core/src/providers/cart.provider.ts +17 -57
  24. package/core/src/providers/category.provider.ts +9 -18
  25. package/core/src/providers/checkout.provider.ts +21 -19
  26. package/core/src/providers/identity.provider.ts +10 -12
  27. package/core/src/providers/index.ts +14 -13
  28. package/core/src/providers/inventory.provider.ts +18 -8
  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 +32 -38
  32. package/core/src/providers/product-search.provider.ts +61 -0
  33. package/core/src/providers/product.provider.ts +75 -16
  34. package/core/src/providers/profile.provider.ts +77 -17
  35. package/core/src/providers/store.provider.ts +6 -8
  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 +3 -2
  44. package/core/src/schemas/models/base.model.ts +6 -24
  45. package/core/src/schemas/models/cart.model.ts +7 -16
  46. package/core/src/schemas/models/category.model.ts +6 -11
  47. package/core/src/schemas/models/checkout.model.ts +11 -14
  48. package/core/src/schemas/models/cost.model.ts +5 -4
  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 +12 -21
  52. package/core/src/schemas/models/index.ts +20 -19
  53. package/core/src/schemas/models/inventory.model.ts +10 -7
  54. package/core/src/schemas/models/order-search.model.ts +28 -0
  55. package/core/src/schemas/models/order.model.ts +25 -32
  56. package/core/src/schemas/models/payment.model.ts +17 -20
  57. package/core/src/schemas/models/price.model.ts +14 -14
  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 +21 -24
  61. package/core/src/schemas/models/shipping-method.model.ts +28 -33
  62. package/core/src/schemas/models/store.model.ts +10 -6
  63. package/core/src/schemas/mutations/analytics.mutation.ts +9 -8
  64. package/core/src/schemas/mutations/base.mutation.ts +2 -1
  65. package/core/src/schemas/mutations/cart.mutation.ts +37 -37
  66. package/core/src/schemas/mutations/checkout.mutation.ts +24 -31
  67. package/core/src/schemas/mutations/identity.mutation.ts +5 -4
  68. package/core/src/schemas/mutations/index.ts +10 -10
  69. package/core/src/schemas/mutations/profile.mutation.ts +39 -4
  70. package/core/src/schemas/queries/base.query.ts +2 -1
  71. package/core/src/schemas/queries/cart.query.ts +5 -5
  72. package/core/src/schemas/queries/category.query.ts +21 -21
  73. package/core/src/schemas/queries/checkout.query.ts +9 -11
  74. package/core/src/schemas/queries/identity.query.ts +3 -2
  75. package/core/src/schemas/queries/index.ts +14 -13
  76. package/core/src/schemas/queries/inventory.query.ts +6 -6
  77. package/core/src/schemas/queries/order-search.query.ts +10 -0
  78. package/core/src/schemas/queries/order.query.ts +5 -4
  79. package/core/src/schemas/queries/price.query.ts +11 -5
  80. package/core/src/schemas/queries/product-search.query.ts +16 -0
  81. package/core/src/schemas/queries/product.query.ts +14 -7
  82. package/core/src/schemas/queries/profile.query.ts +6 -3
  83. package/core/src/schemas/queries/store.query.ts +7 -6
  84. package/core/src/schemas/result.ts +107 -0
  85. package/core/src/schemas/session.schema.ts +6 -6
  86. package/core/src/test/reactionary.decorator.spec.ts +249 -0
  87. package/core/src/zod-utils.ts +19 -0
  88. package/core/tsconfig.json +3 -2
  89. package/core/tsconfig.spec.json +2 -26
  90. package/core/vitest.config.ts +14 -0
  91. package/documentation/1-purpose.md +114 -0
  92. package/documentation/2-getting-started.md +229 -0
  93. package/documentation/3-querying-and-changing-data.md +74 -0
  94. package/documentation/4-product-data.md +107 -0
  95. package/documentation/5-cart-and-checkout.md +211 -0
  96. package/documentation/6-product-search.md +143 -0
  97. package/documentation/7-marketing.md +3 -0
  98. package/eslint.config.mjs +1 -0
  99. package/examples/node/eslint.config.mjs +1 -4
  100. package/examples/node/package.json +11 -3
  101. package/examples/node/project.json +4 -1
  102. package/examples/node/src/basic/basic-node-provider-model-extension.spec.ts +22 -23
  103. package/examples/node/src/basic/basic-node-provider-query-extension.spec.ts +15 -11
  104. package/examples/node/src/basic/basic-node-setup.spec.ts +44 -28
  105. package/examples/node/src/basic/client-creation.spec.ts +53 -0
  106. package/examples/node/src/capabilities/cart.spec.ts +255 -0
  107. package/examples/node/src/capabilities/category.spec.ts +193 -0
  108. package/examples/node/src/capabilities/checkout.spec.ts +341 -0
  109. package/examples/node/src/capabilities/identity.spec.ts +93 -0
  110. package/examples/node/src/capabilities/inventory.spec.ts +66 -0
  111. package/examples/node/src/capabilities/order-search.spec.ts +159 -0
  112. package/examples/node/src/capabilities/order.spec.ts +91 -0
  113. package/examples/node/src/capabilities/price.spec.ts +51 -0
  114. package/examples/node/src/capabilities/product-search.spec.ts +293 -0
  115. package/examples/node/src/capabilities/product.spec.ts +122 -0
  116. package/examples/node/src/capabilities/profile.spec.ts +316 -0
  117. package/examples/node/src/capabilities/store.spec.ts +26 -0
  118. package/examples/node/src/utils.ts +137 -0
  119. package/examples/node/tsconfig.json +9 -11
  120. package/examples/node/tsconfig.lib.json +1 -2
  121. package/examples/node/tsconfig.spec.json +2 -13
  122. package/examples/node/vitest.config.ts +14 -0
  123. package/migrations.json +22 -5
  124. package/nx.json +8 -47
  125. package/package.json +24 -96
  126. package/providers/algolia/README.md +39 -2
  127. package/providers/algolia/package.json +3 -1
  128. package/providers/algolia/src/core/initialize.ts +9 -16
  129. package/providers/algolia/src/index.ts +4 -6
  130. package/providers/algolia/src/providers/index.ts +1 -0
  131. package/providers/algolia/src/providers/product-search.provider.ts +241 -0
  132. package/providers/algolia/src/schema/capabilities.schema.ts +2 -3
  133. package/providers/algolia/src/schema/index.ts +3 -0
  134. package/providers/algolia/src/schema/search.schema.ts +8 -8
  135. package/providers/algolia/tsconfig.json +2 -1
  136. package/providers/algolia/tsconfig.lib.json +1 -1
  137. package/providers/algolia/tsconfig.spec.json +2 -13
  138. package/providers/algolia/vitest.config.ts +14 -0
  139. package/providers/commercetools/README.md +30 -3
  140. package/providers/commercetools/package.json +3 -2
  141. package/providers/commercetools/src/core/client.ts +179 -100
  142. package/providers/commercetools/src/core/initialize.ts +131 -75
  143. package/providers/commercetools/src/core/token-cache.ts +45 -0
  144. package/providers/commercetools/src/index.ts +11 -10
  145. package/providers/commercetools/src/providers/cart.provider.ts +282 -356
  146. package/providers/commercetools/src/providers/category.provider.ts +223 -147
  147. package/providers/commercetools/src/providers/checkout.provider.ts +631 -449
  148. package/providers/commercetools/src/providers/identity.provider.ts +51 -30
  149. package/providers/commercetools/src/providers/index.ts +12 -12
  150. package/providers/commercetools/src/providers/inventory.provider.ts +77 -77
  151. package/providers/commercetools/src/providers/order-search.provider.ts +220 -0
  152. package/providers/commercetools/src/providers/order.provider.ts +97 -64
  153. package/providers/commercetools/src/providers/price.provider.ts +148 -118
  154. package/providers/commercetools/src/providers/product-search.provider.ts +528 -0
  155. package/providers/commercetools/src/providers/product.provider.ts +251 -81
  156. package/providers/commercetools/src/providers/profile.provider.ts +446 -29
  157. package/providers/commercetools/src/providers/store.provider.ts +56 -42
  158. package/providers/commercetools/src/schema/capabilities.schema.ts +3 -1
  159. package/providers/commercetools/src/schema/commercetools.schema.ts +17 -3
  160. package/providers/commercetools/src/schema/configuration.schema.ts +1 -0
  161. package/providers/commercetools/src/schema/session.schema.ts +7 -0
  162. package/providers/commercetools/src/test/caching.spec.ts +82 -0
  163. package/providers/commercetools/src/test/identity.spec.ts +109 -0
  164. package/providers/commercetools/src/test/test-utils.ts +21 -19
  165. package/providers/commercetools/tsconfig.json +2 -1
  166. package/providers/commercetools/tsconfig.lib.json +1 -1
  167. package/providers/commercetools/tsconfig.spec.json +2 -13
  168. package/providers/commercetools/vitest.config.ts +15 -0
  169. package/providers/fake/README.md +20 -4
  170. package/providers/fake/package.json +3 -2
  171. package/providers/fake/src/core/initialize.ts +52 -54
  172. package/providers/fake/src/index.ts +4 -4
  173. package/providers/fake/src/providers/analytics.provider.ts +6 -8
  174. package/providers/fake/src/providers/cart.provider.ts +165 -94
  175. package/providers/fake/src/providers/category.provider.ts +79 -51
  176. package/providers/fake/src/providers/checkout.provider.ts +254 -0
  177. package/providers/fake/src/providers/identity.provider.ts +58 -66
  178. package/providers/fake/src/providers/index.ts +13 -9
  179. package/providers/fake/src/providers/inventory.provider.ts +41 -37
  180. package/providers/fake/src/providers/order-search.provider.ts +78 -0
  181. package/providers/fake/src/providers/order.provider.ts +106 -0
  182. package/providers/fake/src/providers/price.provider.ts +94 -42
  183. package/providers/fake/src/providers/product-search.provider.ts +206 -0
  184. package/providers/fake/src/providers/product.provider.ts +57 -42
  185. package/providers/fake/src/providers/profile.provider.ts +147 -0
  186. package/providers/fake/src/providers/store.provider.ts +31 -22
  187. package/providers/fake/src/schema/capabilities.schema.ts +5 -1
  188. package/providers/fake/src/test/cart.provider.spec.ts +62 -83
  189. package/providers/fake/src/test/category.provider.spec.ts +147 -89
  190. package/providers/fake/src/test/checkout.provider.spec.ts +222 -0
  191. package/providers/fake/src/test/order-search.provider.spec.ts +50 -0
  192. package/providers/fake/src/test/order.provider.spec.ts +44 -0
  193. package/providers/fake/src/test/price.provider.spec.ts +52 -47
  194. package/providers/fake/src/test/product.provider.spec.ts +18 -10
  195. package/providers/fake/src/test/profile.provider.spec.ts +167 -0
  196. package/providers/fake/src/test/test-utils.ts +1 -1
  197. package/providers/fake/tsconfig.json +2 -1
  198. package/providers/fake/tsconfig.lib.json +1 -1
  199. package/providers/fake/tsconfig.spec.json +2 -14
  200. package/providers/fake/vitest.config.ts +14 -0
  201. package/providers/medusa/README.md +30 -0
  202. package/providers/medusa/TESTING.md +98 -0
  203. package/{trpc → providers/medusa}/eslint.config.mjs +1 -1
  204. package/providers/medusa/package.json +22 -0
  205. package/providers/medusa/project.json +34 -0
  206. package/providers/medusa/src/core/client.ts +370 -0
  207. package/providers/medusa/src/core/initialize.ts +78 -0
  208. package/providers/medusa/src/index.ts +13 -0
  209. package/providers/medusa/src/providers/cart.provider.ts +575 -0
  210. package/providers/medusa/src/providers/category.provider.ts +247 -0
  211. package/providers/medusa/src/providers/checkout.provider.ts +636 -0
  212. package/providers/medusa/src/providers/identity.provider.ts +137 -0
  213. package/providers/medusa/src/providers/inventory.provider.ts +173 -0
  214. package/providers/medusa/src/providers/order-search.provider.ts +201 -0
  215. package/providers/medusa/src/providers/order.provider.ts +226 -0
  216. package/providers/medusa/src/providers/price.provider.ts +140 -0
  217. package/providers/medusa/src/providers/product-search.provider.ts +243 -0
  218. package/providers/medusa/src/providers/product.provider.ts +261 -0
  219. package/providers/medusa/src/providers/profile.provider.ts +392 -0
  220. package/providers/medusa/src/schema/capabilities.schema.ts +18 -0
  221. package/providers/medusa/src/schema/configuration.schema.ts +11 -0
  222. package/providers/medusa/src/schema/medusa.schema.ts +31 -0
  223. package/providers/medusa/src/test/cart.provider.spec.ts +240 -0
  224. package/providers/medusa/src/test/category.provider.spec.ts +231 -0
  225. package/providers/medusa/src/test/checkout.spec.ts +349 -0
  226. package/providers/medusa/src/test/identity.provider.spec.ts +122 -0
  227. package/providers/medusa/src/test/inventory.provider.spec.ts +88 -0
  228. package/providers/medusa/src/test/large-cart.provider.spec.ts +103 -0
  229. package/providers/medusa/src/test/price.provider.spec.ts +104 -0
  230. package/providers/medusa/src/test/product.provider.spec.ts +146 -0
  231. package/providers/medusa/src/test/search.provider.spec.ts +203 -0
  232. package/providers/medusa/src/test/test-utils.ts +13 -0
  233. package/providers/medusa/src/utils/medusa-helpers.ts +89 -0
  234. package/providers/medusa/tsconfig.json +21 -0
  235. package/providers/medusa/tsconfig.lib.json +9 -0
  236. package/providers/medusa/tsconfig.spec.json +4 -0
  237. package/providers/medusa/vitest.config.ts +15 -0
  238. package/providers/meilisearch/README.md +48 -0
  239. package/{otel → providers/meilisearch}/eslint.config.mjs +1 -2
  240. package/providers/meilisearch/package.json +13 -0
  241. package/providers/meilisearch/project.json +34 -0
  242. package/providers/meilisearch/src/core/initialize.ts +16 -0
  243. package/providers/meilisearch/src/index.ts +5 -0
  244. package/providers/meilisearch/src/providers/index.ts +1 -0
  245. package/providers/meilisearch/src/providers/product-search.provider.ts +251 -0
  246. package/providers/meilisearch/src/schema/capabilities.schema.ts +9 -0
  247. package/providers/meilisearch/src/schema/configuration.schema.ts +10 -0
  248. package/providers/meilisearch/src/schema/index.ts +3 -0
  249. package/providers/meilisearch/src/schema/search.schema.ts +14 -0
  250. package/{otel → providers/meilisearch}/tsconfig.json +3 -2
  251. package/{trpc → providers/meilisearch}/tsconfig.lib.json +2 -2
  252. package/providers/meilisearch/tsconfig.spec.json +4 -0
  253. package/providers/meilisearch/vitest.config.ts +14 -0
  254. package/providers/posthog/package.json +5 -4
  255. package/providers/posthog/project.json +2 -2
  256. package/providers/posthog/src/core/initialize.ts +2 -2
  257. package/providers/posthog/src/index.ts +3 -3
  258. package/providers/posthog/tsconfig.json +2 -1
  259. package/tsconfig.base.json +7 -3
  260. package/vitest.config.ts +10 -0
  261. package/core/src/providers/search.provider.ts +0 -18
  262. package/core/src/schemas/models/search.model.ts +0 -37
  263. package/core/src/schemas/queries/search.query.ts +0 -9
  264. package/examples/next/.swcrc +0 -30
  265. package/examples/next/eslint.config.mjs +0 -21
  266. package/examples/next/index.d.ts +0 -6
  267. package/examples/next/next-env.d.ts +0 -5
  268. package/examples/next/next.config.js +0 -20
  269. package/examples/next/project.json +0 -9
  270. package/examples/next/public/.gitkeep +0 -0
  271. package/examples/next/public/favicon.ico +0 -0
  272. package/examples/next/src/app/global.css +0 -0
  273. package/examples/next/src/app/layout.tsx +0 -18
  274. package/examples/next/src/app/page.module.scss +0 -2
  275. package/examples/next/src/app/page.tsx +0 -48
  276. package/examples/next/src/instrumentation.ts +0 -9
  277. package/examples/next/tsconfig.json +0 -44
  278. package/examples/node/jest.config.ts +0 -10
  279. package/jest.config.ts +0 -6
  280. package/jest.preset.js +0 -3
  281. package/otel/README.md +0 -227
  282. package/otel/package.json +0 -11
  283. package/otel/pnpm-lock.yaml +0 -805
  284. package/otel/project.json +0 -33
  285. package/otel/src/index.ts +0 -22
  286. package/otel/src/metrics.ts +0 -76
  287. package/otel/src/provider-instrumentation.ts +0 -108
  288. package/otel/src/test/otel.spec.ts +0 -8
  289. package/otel/src/trace-decorator.ts +0 -226
  290. package/otel/src/tracer.ts +0 -83
  291. package/otel/src/trpc-middleware.ts +0 -128
  292. package/otel/tsconfig.lib.json +0 -23
  293. package/otel/tsconfig.spec.json +0 -28
  294. package/otel/vite.config.ts +0 -24
  295. package/providers/algolia/jest.config.ts +0 -10
  296. package/providers/algolia/src/providers/product.provider.ts +0 -66
  297. package/providers/algolia/src/providers/search.provider.ts +0 -106
  298. package/providers/algolia/src/test/search.provider.spec.ts +0 -91
  299. package/providers/commercetools/jest.config.ts +0 -10
  300. package/providers/commercetools/src/providers/search.provider.ts +0 -98
  301. package/providers/commercetools/src/test/cart.provider.spec.ts +0 -199
  302. package/providers/commercetools/src/test/category.provider.spec.ts +0 -168
  303. package/providers/commercetools/src/test/checkout.provider.spec.ts +0 -312
  304. package/providers/commercetools/src/test/identity.provider.spec.ts +0 -88
  305. package/providers/commercetools/src/test/inventory.provider.spec.ts +0 -41
  306. package/providers/commercetools/src/test/price.provider.spec.ts +0 -81
  307. package/providers/commercetools/src/test/product.provider.spec.ts +0 -80
  308. package/providers/commercetools/src/test/profile.provider.spec.ts +0 -49
  309. package/providers/commercetools/src/test/search.provider.spec.ts +0 -61
  310. package/providers/commercetools/src/test/store.provider.spec.ts +0 -37
  311. package/providers/fake/jest.config.ts +0 -10
  312. package/providers/fake/src/providers/search.provider.ts +0 -135
  313. package/trpc/README.md +0 -7
  314. package/trpc/__mocks__/superjson.js +0 -25
  315. package/trpc/jest.config.ts +0 -14
  316. package/trpc/package.json +0 -14
  317. package/trpc/project.json +0 -31
  318. package/trpc/src/client.ts +0 -175
  319. package/trpc/src/index.ts +0 -44
  320. package/trpc/src/integration.spec.ts +0 -223
  321. package/trpc/src/server.ts +0 -125
  322. package/trpc/src/transparent-client.spec.ts +0 -161
  323. package/trpc/src/types.ts +0 -144
  324. package/trpc/tsconfig.json +0 -16
  325. package/trpc/tsconfig.spec.json +0 -15
@@ -1,168 +0,0 @@
1
- import 'dotenv/config'
2
- import type { RequestContext} from '@reactionary/core';
3
- import { CategorySchema, NoOpCache, Session , createInitialRequestContext} from '@reactionary/core';
4
- import { CommercetoolsCategoryProvider } from '../providers/category.provider';
5
- import { getCommercetoolsTestConfiguration } from './test-utils';
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';
13
- import { CommercetoolsCartProvider } from '../providers/cart.provider';
14
- import { CommercetoolsIdentityProvider } from '../providers/identity.provider';
15
- import { CommercetoolsCheckoutProvider } from '../providers/checkout.provider';
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';
10
- import { CommercetoolsIdentityProvider } from '../providers/identity.provider';
11
- import { CommercetoolsCartProvider } from '../providers/cart.provider';
12
-
13
- describe('Commercetools Identity Provider', () => {
14
- let provider: CommercetoolsIdentityProvider;
15
- let cartProvider: CommercetoolsCartProvider;
16
- let reqCtx: RequestContext;
17
-
18
- beforeAll(() => {
19
- provider = new CommercetoolsIdentityProvider(
20
- getCommercetoolsTestConfiguration(),
21
- IdentitySchema,
22
- new NoOpCache()
23
- );
24
-
25
- cartProvider = new CommercetoolsCartProvider(
26
- getCommercetoolsTestConfiguration(),
27
- CartSchema,
28
- new NoOpCache()
29
- );
30
- });
31
-
32
- beforeEach(async () => {
33
- reqCtx = createInitialRequestContext();
34
- });
35
-
36
- it('should default to an anonymous identity if no operations have been performed', async () => {
37
- const identity = await provider.getSelf({}, reqCtx);
38
-
39
- expect(identity.type).toBe('Anonymous');
40
- });
41
-
42
- it('should automatically upgrade to guest the moment an operation is performed', async () => {
43
- const cart = await cartProvider.getActiveCartId(reqCtx);
44
- const updatedCart = await cartProvider.add(
45
- {
46
- cart,
47
- quantity: 1,
48
- sku: {
49
- key: 'SGB-01',
50
- },
51
- },
52
- reqCtx
53
- );
54
-
55
- const identity = await provider.getSelf({}, reqCtx);
56
-
57
- expect(identity.type).toBe('Guest');
58
- });
59
-
60
- it('should be able to register a new customer', async () => {
61
- const time = new Date().getTime();
62
- const identity = await provider.register(
63
- {
64
- username: `test-user+${time}@example.com`,
65
- password: 'love2test',
66
- },
67
- reqCtx
68
- );
69
-
70
- expect(identity.type).toBe('Registered');
71
- });
72
-
73
- it('should be able to log out from a Registered identity', async () => {
74
- const time = new Date().getTime();
75
- const identity = await provider.register(
76
- {
77
- username: `test-user+${time}@example.com`,
78
- password: 'love2test',
79
- },
80
- reqCtx
81
- );
82
-
83
- expect(identity.type).toBe('Registered');
84
-
85
- const loggedOutIdentity = await provider.logout({}, reqCtx);
86
- expect(loggedOutIdentity.type).toBe('Anonymous');
87
- });
88
- });
@@ -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';
9
- import { CommercetoolsInventoryProvider } from '../providers/inventory.provider';
10
-
11
- describe('Commercetools Inventory Provider', () => {
12
- let provider: CommercetoolsInventoryProvider;
13
- let reqCtx: RequestContext;
14
-
15
- beforeAll(() => {
16
- provider = new CommercetoolsInventoryProvider(
17
- getCommercetoolsTestConfiguration(),
18
- InventorySchema,
19
- new NoOpCache()
20
- );
21
- });
22
-
23
- beforeEach(() => {
24
- reqCtx = createInitialRequestContext();
25
- });
26
-
27
- it('should be able to fetch inventory for a given SKU and Fulfillment Center', async () => {
28
- const inventory = await provider.getBySKU({
29
- sku: {
30
- key: 'GMCT-01'
31
- },
32
- fulfilmentCenter: {
33
- key: 'solteqPhysicalStore'
34
- }
35
- }, reqCtx);
36
-
37
- expect(inventory.identifier.sku.key).toBe('GMCT-01');
38
- expect(inventory.identifier.fulfillmentCenter.key).toBe('solteqPhysicalStore');
39
- expect(inventory.quantity).toBe(42);
40
- });
41
- });
@@ -1,81 +0,0 @@
1
- import 'dotenv/config';
2
-
3
-
4
- import type { RequestContext} from '@reactionary/core';
5
- import { NoOpCache, PriceSchema, Session, createInitialRequestContext,} from '@reactionary/core';
6
- import { getCommercetoolsTestConfiguration } from './test-utils';
7
-
8
- import { CommercetoolsPriceProvider } from '../providers/price.provider';
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
- });