@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,96 +0,0 @@
1
- import { SearchProvider } from '@reactionary/core';
2
- import type {
3
- SearchResult,
4
- SearchResultProduct,
5
- Cache,
6
- SearchQueryByTerm,
7
- RequestContext,
8
- } from '@reactionary/core';
9
-
10
- import { CommercetoolsClient } from '../core/client.js';
11
- import type z from 'zod';
12
- import type { CommercetoolsConfiguration } from '../schema/configuration.schema.js';
13
-
14
- export class CommercetoolsSearchProvider<
15
- T extends SearchResult = SearchResult
16
- > extends SearchProvider<T> {
17
- protected config: CommercetoolsConfiguration;
18
-
19
- constructor(
20
- config: CommercetoolsConfiguration,
21
- schema: z.ZodType<T>,
22
- cache: Cache
23
- ) {
24
- super(schema, cache);
25
-
26
- this.config = config;
27
- }
28
-
29
- protected async getClient(reqCtx: RequestContext) {
30
- const client = await new CommercetoolsClient(this.config).getClient(reqCtx);
31
- return client.withProjectKey({ projectKey: this.config.projectKey }).productProjections();
32
- }
33
-
34
-
35
- public override async queryByTerm(
36
- payload: SearchQueryByTerm,
37
- reqCtx: RequestContext
38
- ): Promise<T> {
39
- const client = await this.getClient(reqCtx);
40
-
41
- const remote = await client
42
- .search()
43
- .get({
44
- queryArgs: {
45
- limit: payload.search.pageSize,
46
- offset: (payload.search.page - 1) * payload.search.pageSize,
47
- [`text.${reqCtx.languageContext.locale}`]: payload.search.term,
48
- },
49
- })
50
- .execute();
51
-
52
- return this.parseSearchResult(remote, payload, reqCtx);
53
- }
54
-
55
- protected parseSearchResult(
56
- remote: unknown,
57
- payload: SearchQueryByTerm,
58
- reqCtx: RequestContext
59
- ): T {
60
- const result = this.newModel();
61
- const remoteData = remote as {
62
- body: {
63
- results: Array<{
64
- id: string;
65
- name: Record<string, string>;
66
- slug?: Record<string, string>;
67
- masterVariant: { images?: Array<{ url?: string }> };
68
- }>;
69
- total?: number;
70
- };
71
- };
72
-
73
- result.identifier = payload.search;
74
-
75
- for (const p of remoteData.body.results) {
76
- const product: SearchResultProduct = {
77
- identifier: { key: p.id },
78
- name: p.name[reqCtx.languageContext.locale] || p.id,
79
- slug: p.slug?.[reqCtx.languageContext.locale] || p.id,
80
- image: p.masterVariant.images?.[0]?.url || 'https://placehold.co/400',
81
- };
82
-
83
- result.products.push(product);
84
- }
85
-
86
- result.pages = Math.ceil(
87
- (remoteData.body.total || 0) / payload.search.pageSize
88
- );
89
- result.meta = {
90
- cache: { hit: false, key: payload.search.term },
91
- placeholder: false,
92
- };
93
-
94
- return this.assert(result);
95
- }
96
- }
@@ -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
- });