@shopgate/pwa-common-commerce 7.30.0-alpha.6 → 7.30.0-alpha.8

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 (315) hide show
  1. package/cart/action-creators/addCouponsToCart.js +9 -2
  2. package/cart/action-creators/addProductsToCart.js +9 -2
  3. package/cart/action-creators/deleteCouponsFromCart.js +9 -2
  4. package/cart/action-creators/deleteProductsFromCart.js +9 -2
  5. package/cart/action-creators/errorAddCouponsToCart.js +10 -2
  6. package/cart/action-creators/errorAddProductsToCart.js +10 -2
  7. package/cart/action-creators/errorCart.js +8 -2
  8. package/cart/action-creators/errorDeleteCouponsFromCart.js +10 -2
  9. package/cart/action-creators/errorDeleteProductsFromCart.js +10 -2
  10. package/cart/action-creators/errorUpdateProductsInCart.js +10 -2
  11. package/cart/action-creators/receiveCart.js +9 -2
  12. package/cart/action-creators/requestCart.js +8 -2
  13. package/cart/action-creators/setCartProductPendingCount.js +9 -2
  14. package/cart/action-creators/setCouponFieldError.js +9 -2
  15. package/cart/action-creators/setCouponFieldValue.js +9 -2
  16. package/cart/action-creators/setFulfillmentSlot.js +9 -2
  17. package/cart/action-creators/successAddCouponsToCart.js +10 -2
  18. package/cart/action-creators/successAddProductsToCart.js +8 -2
  19. package/cart/action-creators/successDeleteCouponsFromCart.js +8 -2
  20. package/cart/action-creators/successDeleteProductsFromCart.js +8 -2
  21. package/cart/action-creators/successUpdateProductsInCart.js +8 -2
  22. package/cart/action-creators/updateProductsInCart.js +9 -2
  23. package/cart/actions/addCouponsToCart.js +52 -8
  24. package/cart/actions/addProductsToCart.js +80 -11
  25. package/cart/actions/deleteCouponsFromCart.js +39 -6
  26. package/cart/actions/deleteProductsFromCart.js +38 -6
  27. package/cart/actions/fetchCart.js +52 -8
  28. package/cart/actions/updateProductsInCart.js +44 -6
  29. package/cart/constants/PipelineErrors.js +6 -1
  30. package/cart/constants/Pipelines.js +6 -1
  31. package/cart/constants/Portals.js +85 -1
  32. package/cart/constants/index.js +39 -2
  33. package/cart/helpers/config.js +47 -2
  34. package/cart/helpers/createPipelineErrorList.js +30 -4
  35. package/cart/helpers/fulfillmentSlots.js +37 -4
  36. package/cart/helpers/index.js +14 -3
  37. package/cart/helpers/quantity.js +23 -4
  38. package/cart/helpers/shipping.js +57 -2
  39. package/cart/helpers/tax.js +26 -2
  40. package/cart/index.js +25 -5
  41. package/cart/mock.js +130 -1
  42. package/cart/reducers/couponField.js +30 -2
  43. package/cart/reducers/data.js +98 -6
  44. package/cart/reducers/index.js +7 -1
  45. package/cart/selectors/index.js +181 -31
  46. package/cart/selectors/spec.js +189 -2
  47. package/cart/streams/index.js +176 -29
  48. package/cart/subscriptions/index.js +307 -30
  49. package/category/action-creators/errorCategory.js +10 -2
  50. package/category/action-creators/errorCategoryChildren.js +9 -2
  51. package/category/action-creators/errorRootCategories.js +8 -2
  52. package/category/action-creators/receiveCategory.js +12 -2
  53. package/category/action-creators/receiveCategoryChildren.js +10 -2
  54. package/category/action-creators/receiveRootCategories.js +9 -2
  55. package/category/action-creators/requestCategory.js +9 -2
  56. package/category/action-creators/requestCategoryChildren.js +9 -2
  57. package/category/action-creators/requestRootCategories.js +8 -2
  58. package/category/actions/fetchCategory.js +47 -5
  59. package/category/actions/fetchCategoryChildren.js +30 -2
  60. package/category/actions/fetchCategoryOrRootCategories.js +16 -2
  61. package/category/actions/fetchCategoryProducts.js +36 -2
  62. package/category/actions/fetchRootCategories.js +31 -2
  63. package/category/actions/getCategory.js +10 -2
  64. package/category/constants/Pipelines.js +3 -1
  65. package/category/constants/Portals.js +56 -3
  66. package/category/constants/index.js +17 -2
  67. package/category/helpers/index.js +27 -3
  68. package/category/index.js +19 -5
  69. package/category/mock.js +176 -1
  70. package/category/reducers/categoriesById.js +65 -3
  71. package/category/reducers/childrenByCategoryId.js +55 -4
  72. package/category/reducers/helpers/handleCategoryCollection.js +24 -3
  73. package/category/reducers/helpers/handleReceivedCategories.js +3 -1
  74. package/category/reducers/index.js +12 -2
  75. package/category/reducers/rootCategories.js +31 -2
  76. package/category/selectors/index.js +115 -16
  77. package/category/streams/index.js +82 -4
  78. package/category/subscriptions/index.js +96 -3
  79. package/checkout/action-creators/successCheckout.js +9 -2
  80. package/checkout/actions/fetchCheckoutUrl.js +28 -3
  81. package/checkout/constants/Pipelines.js +1 -1
  82. package/checkout/constants/index.js +3 -2
  83. package/checkout/index.js +11 -4
  84. package/checkout/selectors/index.js +7 -2
  85. package/checkout/streams/index.js +8 -2
  86. package/checkout/subscriptions/index.js +35 -6
  87. package/favorites/action-creators/index.js +206 -24
  88. package/favorites/actions/addFavorites.js +41 -3
  89. package/favorites/actions/addFavoritesList.js +27 -2
  90. package/favorites/actions/fetchFavoriteIds.js +49 -5
  91. package/favorites/actions/fetchFavorites.js +60 -5
  92. package/favorites/actions/fetchFavoritesList.js +47 -3
  93. package/favorites/actions/fetchFavoritesListsWithItems.js +32 -3
  94. package/favorites/actions/getFavorites.js +6 -2
  95. package/favorites/actions/removeFavorites.js +32 -3
  96. package/favorites/actions/removeFavoritesList.js +24 -2
  97. package/favorites/actions/toggleFavorites.js +68 -10
  98. package/favorites/actions/updateFavorites.js +39 -3
  99. package/favorites/actions/updateFavoritesList.js +26 -2
  100. package/favorites/constants/Pipelines.js +9 -1
  101. package/favorites/constants/Portals.js +32 -4
  102. package/favorites/constants/index.js +37 -5
  103. package/favorites/index.js +14 -4
  104. package/favorites/mock.js +89 -4
  105. package/favorites/reducers/index.js +7 -1
  106. package/favorites/reducers/lists.js +74 -2
  107. package/favorites/reducers/products.js +231 -24
  108. package/favorites/selectors/index.js +188 -24
  109. package/favorites/streams/index.js +135 -23
  110. package/favorites/streams/spec.js +517 -8
  111. package/favorites/subscriptions/index.js +260 -25
  112. package/favorites/subscriptions/spec.js +701 -28
  113. package/filter/action-creators/errorFilters.js +9 -2
  114. package/filter/action-creators/index.js +4 -1
  115. package/filter/action-creators/receiveFilters.js +10 -2
  116. package/filter/action-creators/requestFilters.js +9 -2
  117. package/filter/action-creators/updateFilters.js +8 -2
  118. package/filter/actions/fetchFilters.js +46 -3
  119. package/filter/actions/getFilters.js +6 -2
  120. package/filter/actions/helpers/buildFilterParams.js +34 -2
  121. package/filter/actions/helpers/buildRequestFilters.js +35 -2
  122. package/filter/actions/helpers/processFilters.js +10 -2
  123. package/filter/actions/helpers/processParams.js +26 -2
  124. package/filter/constants/Pipelines.js +1 -1
  125. package/filter/constants/Portals.js +39 -3
  126. package/filter/constants/index.js +8 -1
  127. package/filter/index.js +12 -4
  128. package/filter/reducers/helpers/enrichFilters.js +11 -3
  129. package/filter/reducers/index.js +5 -1
  130. package/filter/reducers/resultsByHash.js +43 -3
  131. package/filter/selectors/index.js +47 -6
  132. package/filter/streams/index.js +30 -1
  133. package/filter/subscriptions/index.js +34 -2
  134. package/market/constants/Portals.js +22 -4
  135. package/market/constants/index.js +2 -1
  136. package/market/helpers/showReturnPolicy.js +3 -1
  137. package/market/helpers/showTaxDisclaimer.js +3 -1
  138. package/market/index.js +6 -2
  139. package/orders/constants.js +2 -1
  140. package/package.json +3 -3
  141. package/product/action-creators/deleteProductsByIds.js +10 -2
  142. package/product/action-creators/errorProduct.js +10 -2
  143. package/product/action-creators/errorProductDescription.js +10 -2
  144. package/product/action-creators/errorProductImages.js +10 -2
  145. package/product/action-creators/errorProductMedia.js +10 -2
  146. package/product/action-creators/errorProductOptions.js +10 -2
  147. package/product/action-creators/errorProductProperties.js +10 -2
  148. package/product/action-creators/errorProductRelations.js +9 -2
  149. package/product/action-creators/errorProductShipping.js +10 -2
  150. package/product/action-creators/errorProductVariants.js +10 -2
  151. package/product/action-creators/errorProducts.js +9 -2
  152. package/product/action-creators/expireProductById.js +10 -2
  153. package/product/action-creators/expireProductData.js +11 -2
  154. package/product/action-creators/expireProductsByHash.js +9 -2
  155. package/product/action-creators/productNotAvailable.js +10 -2
  156. package/product/action-creators/provideProduct.js +9 -2
  157. package/product/action-creators/receiveProduct.js +10 -2
  158. package/product/action-creators/receiveProductCached.js +9 -2
  159. package/product/action-creators/receiveProductDescription.js +10 -2
  160. package/product/action-creators/receiveProductImages.js +10 -2
  161. package/product/action-creators/receiveProductMedia.js +10 -2
  162. package/product/action-creators/receiveProductOptions.js +10 -2
  163. package/product/action-creators/receiveProductProperties.js +10 -2
  164. package/product/action-creators/receiveProductRelations.js +12 -2
  165. package/product/action-creators/receiveProductShipping.js +10 -2
  166. package/product/action-creators/receiveProductVariants.js +10 -2
  167. package/product/action-creators/receiveProducts.js +16 -2
  168. package/product/action-creators/receiveProductsCached.js +9 -2
  169. package/product/action-creators/refreshExpiredPDPData.js +8 -2
  170. package/product/action-creators/requestProduct.js +10 -2
  171. package/product/action-creators/requestProductDescription.js +9 -2
  172. package/product/action-creators/requestProductImages.js +9 -2
  173. package/product/action-creators/requestProductMedia.js +9 -2
  174. package/product/action-creators/requestProductOptions.js +9 -2
  175. package/product/action-creators/requestProductProperties.js +9 -2
  176. package/product/action-creators/requestProductRelations.js +10 -2
  177. package/product/action-creators/requestProductShipping.js +9 -2
  178. package/product/action-creators/requestProductVariants.js +9 -2
  179. package/product/action-creators/requestProducts.js +9 -2
  180. package/product/action-creators/setProductId.js +9 -2
  181. package/product/action-creators/setProductQuantity.js +9 -2
  182. package/product/action-creators/setProductVariantId.js +9 -2
  183. package/product/actions/changeSortOrder.js +21 -2
  184. package/product/actions/fetchHighlightProducts.js +18 -2
  185. package/product/actions/fetchLiveshoppingProducts.js +14 -2
  186. package/product/actions/fetchProduct.js +52 -3
  187. package/product/actions/fetchProductDescription.js +30 -2
  188. package/product/actions/fetchProductImages.js +31 -2
  189. package/product/actions/fetchProductMedia.js +35 -2
  190. package/product/actions/fetchProductOptions.js +31 -2
  191. package/product/actions/fetchProductProperties.js +30 -2
  192. package/product/actions/fetchProductRelations.js +63 -2
  193. package/product/actions/fetchProductShipping.js +31 -2
  194. package/product/actions/fetchProductVariants.js +31 -2
  195. package/product/actions/fetchProducts.js +189 -17
  196. package/product/actions/fetchProductsById.js +68 -8
  197. package/product/actions/fetchProductsByQuery.js +102 -18
  198. package/product/actions/getHighlightProducts.js +6 -2
  199. package/product/actions/getLiveshoppingProducts.js +6 -2
  200. package/product/actions/getProduct.js +6 -2
  201. package/product/actions/getProductDescription.js +6 -2
  202. package/product/actions/getProductImages.js +6 -2
  203. package/product/actions/getProductOptions.js +6 -2
  204. package/product/actions/getProductProperties.js +6 -2
  205. package/product/actions/getProductRelations.js +6 -2
  206. package/product/actions/getProductShipping.js +6 -2
  207. package/product/actions/getProductVariants.js +6 -2
  208. package/product/actions/getProducts.js +6 -2
  209. package/product/actions/getProductsById.js +6 -2
  210. package/product/actions/getProductsByQuery.js +6 -2
  211. package/product/actions/processProductFlags.js +35 -3
  212. package/product/actions/updateMetadata.js +17 -2
  213. package/product/collections/ProductImageFormats.js +48 -8
  214. package/product/collections/index.js +1 -1
  215. package/product/constants/Pipelines.js +12 -1
  216. package/product/constants/Portals.js +200 -33
  217. package/product/constants/index.js +90 -18
  218. package/product/helpers/index.js +61 -8
  219. package/product/index.js +36 -6
  220. package/product/mock.js +1002 -2
  221. package/product/reducers/descriptionsByProductId.js +54 -5
  222. package/product/reducers/helpers/formatOptions.js +17 -2
  223. package/product/reducers/helpers/handleProductCollection.js +19 -2
  224. package/product/reducers/imagesByProductId.js +51 -4
  225. package/product/reducers/index.js +23 -1
  226. package/product/reducers/mediaByProductId.js +55 -3
  227. package/product/reducers/optionsByProductId.js +41 -2
  228. package/product/reducers/productRelationsByHash.js +43 -2
  229. package/product/reducers/productsById.js +122 -7
  230. package/product/reducers/propertiesByProductId.js +48 -2
  231. package/product/reducers/resultsByHash.js +125 -9
  232. package/product/reducers/shippingByProductId.js +37 -2
  233. package/product/reducers/variantsByProductId.js +56 -2
  234. package/product/selectors/options.js +90 -13
  235. package/product/selectors/page.js +62 -13
  236. package/product/selectors/price.js +81 -18
  237. package/product/selectors/product.js +549 -59
  238. package/product/selectors/product.mock.js +327 -12
  239. package/product/selectors/relations.js +35 -5
  240. package/product/selectors/variants.js +91 -15
  241. package/product/streams/index.js +167 -13
  242. package/product/subscriptions/index.js +210 -4
  243. package/reviews/action-creators/errorProductReviews.js +9 -2
  244. package/reviews/action-creators/errorReviews.js +9 -2
  245. package/reviews/action-creators/errorSubmitReview.js +9 -2
  246. package/reviews/action-creators/errorUserReview.js +9 -2
  247. package/reviews/action-creators/flushUserReview.js +8 -2
  248. package/reviews/action-creators/receiveProductReviews.js +11 -2
  249. package/reviews/action-creators/receiveReviews.js +12 -2
  250. package/reviews/action-creators/receiveSubmitReview.js +9 -2
  251. package/reviews/action-creators/receiveUserReview.js +10 -2
  252. package/reviews/action-creators/requestProductReviews.js +10 -2
  253. package/reviews/action-creators/requestReviews.js +9 -2
  254. package/reviews/action-creators/requestSubmitReview.js +9 -2
  255. package/reviews/action-creators/requestUserReview.js +9 -2
  256. package/reviews/action-creators/resetSubmittedReview.js +9 -2
  257. package/reviews/action-creators/spec.js +40 -1
  258. package/reviews/actions/fetchProductReviews.js +37 -2
  259. package/reviews/actions/fetchReviews.js +38 -2
  260. package/reviews/actions/fetchUserReview.js +31 -2
  261. package/reviews/actions/flushUserReview.js +5 -1
  262. package/reviews/actions/getProductReviews.js +6 -2
  263. package/reviews/actions/getUserReview.js +6 -2
  264. package/reviews/actions/spec.js +241 -4
  265. package/reviews/actions/submitReview.js +63 -3
  266. package/reviews/constants/Pipelines.js +4 -1
  267. package/reviews/constants/Portals.js +4 -1
  268. package/reviews/constants/index.js +26 -7
  269. package/reviews/index.js +15 -4
  270. package/reviews/mock.js +172 -11
  271. package/reviews/reducers/index.js +11 -1
  272. package/reviews/reducers/mock.js +14 -2
  273. package/reviews/reducers/reviewsByHash.js +52 -6
  274. package/reviews/reducers/reviewsById.js +27 -2
  275. package/reviews/reducers/reviewsByProductId.js +47 -2
  276. package/reviews/reducers/spec.js +211 -2
  277. package/reviews/reducers/userReviewsByProductId.js +68 -2
  278. package/reviews/selectors/index.js +123 -19
  279. package/reviews/selectors/mock.js +100 -1
  280. package/reviews/selectors/spec.js +100 -1
  281. package/reviews/streams/index.js +37 -5
  282. package/reviews/streams/spec.js +25 -1
  283. package/reviews/subscriptions/index.js +27 -2
  284. package/scanner/action-creators/errorHandleScanner.js +11 -2
  285. package/scanner/action-creators/scannerFinished.js +11 -2
  286. package/scanner/action-creators/startScanner.js +8 -2
  287. package/scanner/action-creators/successHandleScanner.js +11 -2
  288. package/scanner/actions/handleBarCode.js +22 -2
  289. package/scanner/actions/handleNoResults.js +23 -2
  290. package/scanner/actions/handleQrCode.js +116 -6
  291. package/scanner/actions/handleSearch.js +33 -2
  292. package/scanner/constants/Portals.js +22 -1
  293. package/scanner/constants/index.js +17 -1
  294. package/scanner/helpers/index.js +115 -5
  295. package/scanner/index.js +19 -5
  296. package/scanner/streams/index.js +36 -1
  297. package/scanner/subscriptions/index.js +78 -8
  298. package/search/action-creators/errorSearchResults.js +10 -2
  299. package/search/action-creators/receiveSearchResults.js +11 -2
  300. package/search/action-creators/receiveSearchSuggestions.js +10 -2
  301. package/search/action-creators/requestSearchResults.js +10 -2
  302. package/search/action-creators/requestSearchSuggestions.js +9 -2
  303. package/search/actions/fetchSearchResults.js +66 -8
  304. package/search/actions/fetchSearchSuggestions.js +36 -2
  305. package/search/constants/Pipelines.js +1 -1
  306. package/search/constants/Portals.js +9 -2
  307. package/search/constants/index.js +10 -2
  308. package/search/helpers/index.js +5 -2
  309. package/search/helpers/removeHighlightingPlaceholders.js +4 -1
  310. package/search/helpers/spec.js +19 -1
  311. package/search/index.js +17 -5
  312. package/search/reducers/index.js +38 -2
  313. package/search/selectors/index.js +23 -4
  314. package/search/streams/index.js +51 -3
  315. package/search/subscriptions/index.js +132 -5
@@ -1,2 +1,189 @@
1
- /* eslint-disable extra-rules/no-single-line-objects */import{mockedState as mockedProductState,mockedProductMetadata,mockedVariantProductMetadata,mockedVariantMetadata}from"../../product/selectors/product.mock";import{getFlags,getAddToCartMetadata,hasCouponSupport,getIsFetching,getSubTotal,getDiscounts,getDiscountsAmount,getTax,getGrandTotal}from"./index";import{CART_TOTALS_TYPE_DISCOUNT,CART_TOTALS_TYPE_GRAND,CART_TOTALS_TYPE_SUB,CART_TOTALS_TYPE_TAX}from"../constants";describe('Cart selectors',function(){describe('getFlags()',function(){it('should return an empty object if no flags are available',function(){var result=getFlags({cart:{data:{}}});expect(result).toEqual({});});it('should return the flags if available',function(){var flags={coupons:true,orderable:true};var result=getFlags({cart:{data:{flags:flags}}});expect(result).toEqual(flags);});});describe('getAddToCartMetadata()',function(){var mockedState;beforeEach(function(){// Create a deep copy of the state to avoid unintended selector caching.
2
- mockedState=JSON.parse(JSON.stringify(mockedProductState));});it('should return the metadata of the variant product',function(){var productId='product_1';var variantId='product_2';var result=getAddToCartMetadata(mockedState,{productId:productId,variantId:variantId});expect(result).toEqual(mockedVariantProductMetadata);});it('should return the metadata of the base product',function(){var productId='product_1';var variantId='product_2';delete mockedState.product.productsById[variantId].productData.metadata;var result=getAddToCartMetadata(mockedState,{productId:productId,variantId:variantId});expect(result).toEqual(mockedProductMetadata);});it('should return the metadata of the variant data assigned to the variant product',function(){var productId='product_1';var variantId='product_3';var result=getAddToCartMetadata(mockedState,{productId:productId,variantId:variantId});expect(result).toEqual(mockedVariantMetadata);});it('should return null when no metadata can be determined',function(){var productId='product_10';var variantId='product_11';var result=getAddToCartMetadata(mockedState,{productId:productId,variantId:variantId});expect(result).toBeNull();});});describe('hasCouponSupport()',function(){it('should return true if no flags are available',function(){var result=hasCouponSupport({cart:{data:{}}});expect(result).toEqual(true);});it('should return true if the coupons flag is not available',function(){var result=hasCouponSupport({cart:{data:{flags:{}}}});expect(result).toEqual(true);});it('should return true if the flag is true',function(){var result=hasCouponSupport({cart:{data:{flags:{coupons:true}}}});expect(result).toEqual(true);});it('should return false if the flag is false',function(){var result=hasCouponSupport({cart:{data:{flags:{coupons:false}}}});expect(result).toEqual(false);});});describe('isFetching()',function(){it('should return true if cart is fetching',function(){var result=getIsFetching({cart:{data:{isFetching:true}}});expect(result).toEqual(true);});it('should return false when no store information is given',function(){var result=getIsFetching({cart:{data:{}}});expect(result).toEqual(false);});it('should return false if cart is not fetching',function(){var result=getIsFetching({cart:{data:{isFetching:false}}});expect(result).toEqual(false);});});describe('getTotals',function(){var mockedState={cart:{data:{totals:[{type:CART_TOTALS_TYPE_SUB,amount:100},{type:CART_TOTALS_TYPE_DISCOUNT,amount:5},{type:CART_TOTALS_TYPE_DISCOUNT,amount:2},{type:CART_TOTALS_TYPE_TAX,label:'inkl. 26% MwSt.',amount:5},{type:CART_TOTALS_TYPE_GRAND,amount:105}]}}};it('should return subtotal',function(){expect(getSubTotal(mockedState)).toEqual(100);});it('should return discount',function(){expect(getDiscounts(mockedState)).toEqual([mockedState.cart.data.totals[1],mockedState.cart.data.totals[2]]);});it('should return discount amount',function(){expect(getDiscountsAmount(mockedState)).toEqual(7);});it('should return tax',function(){expect(getTax(mockedState)).toEqual(mockedState.cart.data.totals[3]);});it('should return grand total',function(){expect(getGrandTotal(mockedState)).toEqual(105);});});});/* eslint-enable extra-rules/no-single-line-objects */
1
+ /* eslint-disable extra-rules/no-single-line-objects */
2
+ import { mockedState as mockedProductState, mockedProductMetadata, mockedVariantProductMetadata, mockedVariantMetadata } from "../../product/selectors/product.mock";
3
+ import { getFlags, getAddToCartMetadata, hasCouponSupport, getIsFetching, getSubTotal, getDiscounts, getDiscountsAmount, getTax, getGrandTotal } from "./index";
4
+ import { CART_TOTALS_TYPE_DISCOUNT, CART_TOTALS_TYPE_GRAND, CART_TOTALS_TYPE_SUB, CART_TOTALS_TYPE_TAX } from "../constants";
5
+ describe('Cart selectors', () => {
6
+ describe('getFlags()', () => {
7
+ it('should return an empty object if no flags are available', () => {
8
+ const result = getFlags({
9
+ cart: {
10
+ data: {}
11
+ }
12
+ });
13
+ expect(result).toEqual({});
14
+ });
15
+ it('should return the flags if available', () => {
16
+ const flags = {
17
+ coupons: true,
18
+ orderable: true
19
+ };
20
+ const result = getFlags({
21
+ cart: {
22
+ data: {
23
+ flags
24
+ }
25
+ }
26
+ });
27
+ expect(result).toEqual(flags);
28
+ });
29
+ });
30
+ describe('getAddToCartMetadata()', () => {
31
+ let mockedState;
32
+ beforeEach(() => {
33
+ // Create a deep copy of the state to avoid unintended selector caching.
34
+ mockedState = JSON.parse(JSON.stringify(mockedProductState));
35
+ });
36
+ it('should return the metadata of the variant product', () => {
37
+ const productId = 'product_1';
38
+ const variantId = 'product_2';
39
+ const result = getAddToCartMetadata(mockedState, {
40
+ productId,
41
+ variantId
42
+ });
43
+ expect(result).toEqual(mockedVariantProductMetadata);
44
+ });
45
+ it('should return the metadata of the base product', () => {
46
+ const productId = 'product_1';
47
+ const variantId = 'product_2';
48
+ delete mockedState.product.productsById[variantId].productData.metadata;
49
+ const result = getAddToCartMetadata(mockedState, {
50
+ productId,
51
+ variantId
52
+ });
53
+ expect(result).toEqual(mockedProductMetadata);
54
+ });
55
+ it('should return the metadata of the variant data assigned to the variant product', () => {
56
+ const productId = 'product_1';
57
+ const variantId = 'product_3';
58
+ const result = getAddToCartMetadata(mockedState, {
59
+ productId,
60
+ variantId
61
+ });
62
+ expect(result).toEqual(mockedVariantMetadata);
63
+ });
64
+ it('should return null when no metadata can be determined', () => {
65
+ const productId = 'product_10';
66
+ const variantId = 'product_11';
67
+ const result = getAddToCartMetadata(mockedState, {
68
+ productId,
69
+ variantId
70
+ });
71
+ expect(result).toBeNull();
72
+ });
73
+ });
74
+ describe('hasCouponSupport()', () => {
75
+ it('should return true if no flags are available', () => {
76
+ const result = hasCouponSupport({
77
+ cart: {
78
+ data: {}
79
+ }
80
+ });
81
+ expect(result).toEqual(true);
82
+ });
83
+ it('should return true if the coupons flag is not available', () => {
84
+ const result = hasCouponSupport({
85
+ cart: {
86
+ data: {
87
+ flags: {}
88
+ }
89
+ }
90
+ });
91
+ expect(result).toEqual(true);
92
+ });
93
+ it('should return true if the flag is true', () => {
94
+ const result = hasCouponSupport({
95
+ cart: {
96
+ data: {
97
+ flags: {
98
+ coupons: true
99
+ }
100
+ }
101
+ }
102
+ });
103
+ expect(result).toEqual(true);
104
+ });
105
+ it('should return false if the flag is false', () => {
106
+ const result = hasCouponSupport({
107
+ cart: {
108
+ data: {
109
+ flags: {
110
+ coupons: false
111
+ }
112
+ }
113
+ }
114
+ });
115
+ expect(result).toEqual(false);
116
+ });
117
+ });
118
+ describe('isFetching()', () => {
119
+ it('should return true if cart is fetching', () => {
120
+ const result = getIsFetching({
121
+ cart: {
122
+ data: {
123
+ isFetching: true
124
+ }
125
+ }
126
+ });
127
+ expect(result).toEqual(true);
128
+ });
129
+ it('should return false when no store information is given', () => {
130
+ const result = getIsFetching({
131
+ cart: {
132
+ data: {}
133
+ }
134
+ });
135
+ expect(result).toEqual(false);
136
+ });
137
+ it('should return false if cart is not fetching', () => {
138
+ const result = getIsFetching({
139
+ cart: {
140
+ data: {
141
+ isFetching: false
142
+ }
143
+ }
144
+ });
145
+ expect(result).toEqual(false);
146
+ });
147
+ });
148
+ describe('getTotals', () => {
149
+ const mockedState = {
150
+ cart: {
151
+ data: {
152
+ totals: [{
153
+ type: CART_TOTALS_TYPE_SUB,
154
+ amount: 100
155
+ }, {
156
+ type: CART_TOTALS_TYPE_DISCOUNT,
157
+ amount: 5
158
+ }, {
159
+ type: CART_TOTALS_TYPE_DISCOUNT,
160
+ amount: 2
161
+ }, {
162
+ type: CART_TOTALS_TYPE_TAX,
163
+ label: 'inkl. 26% MwSt.',
164
+ amount: 5
165
+ }, {
166
+ type: CART_TOTALS_TYPE_GRAND,
167
+ amount: 105
168
+ }]
169
+ }
170
+ }
171
+ };
172
+ it('should return subtotal', () => {
173
+ expect(getSubTotal(mockedState)).toEqual(100);
174
+ });
175
+ it('should return discount', () => {
176
+ expect(getDiscounts(mockedState)).toEqual([mockedState.cart.data.totals[1], mockedState.cart.data.totals[2]]);
177
+ });
178
+ it('should return discount amount', () => {
179
+ expect(getDiscountsAmount(mockedState)).toEqual(7);
180
+ });
181
+ it('should return tax', () => {
182
+ expect(getTax(mockedState)).toEqual(mockedState.cart.data.totals[3]);
183
+ });
184
+ it('should return grand total', () => {
185
+ expect(getGrandTotal(mockedState)).toEqual(105);
186
+ });
187
+ });
188
+ });
189
+ /* eslint-enable extra-rules/no-single-line-objects */
@@ -1,56 +1,203 @@
1
- function _extends(){_extends=Object.assign||function(target){for(var i=1;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(Object.prototype.hasOwnProperty.call(source,key)){target[key]=source[key];}}}return target;};return _extends.apply(this,arguments);}function _slicedToArray(arr,i){return _arrayWithHoles(arr)||_iterableToArrayLimit(arr,i)||_nonIterableRest();}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance");}function _iterableToArrayLimit(arr,i){var _arr=[];var _n=true;var _d=false;var _e=undefined;try{for(var _i=arr[Symbol.iterator](),_s;!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break;}}catch(err){_d=true;_e=err;}finally{try{if(!_n&&_i["return"]!=null)_i["return"]();}finally{if(_d)throw _e;}}return _arr;}function _arrayWithHoles(arr){if(Array.isArray(arr))return arr;}import queryString from'query-string';import{ACTION_PUSH,ACTION_REPLACE}from'@virtuous/conductor';import{main$}from'@shopgate/pwa-common/streams/main';import{routeWillEnter$,routeDidEnter$,routeWillLeave$,routeDidLeave$,navigate$}from'@shopgate/pwa-common/streams/router';import{getCurrentPathname}from'@shopgate/pwa-common/selectors/router';import{pushNotificationOpened$}from'@shopgate/pwa-common/streams/app';import{INDEX_PATH_DEEPLINK,INDEX_PATH}from'@shopgate/pwa-common/constants/RoutePaths';import{getIsFetching}from"../selectors";import{CART_PATH,REQUEST_CART,RECEIVE_CART,ERROR_CART,ADD_PRODUCTS_TO_CART,SUCCESS_ADD_PRODUCTS_TO_CART,ERROR_ADD_PRODUCTS_TO_CART,UPDATE_PRODUCTS_IN_CART,SUCCESS_UPDATE_PRODUCTS_IN_CART,ERROR_UPDATE_PRODUCTS_IN_CART,DELETE_PRODUCTS_FROM_CART,SUCCESS_DELETE_PRODUCTS_FROM_CART,ERROR_DELETE_PRODUCTS_FROM_CART,ADD_COUPONS_TO_CART,SUCCESS_ADD_COUPONS_TO_CART,ERROR_ADD_COUPONS_TO_CART,DELETE_COUPONS_FROM_CART,ERROR_DELETE_COUPONS_FROM_CART,SUCCESS_DELETE_COUPONS_FROM_CART,DEEPLINK_CART_ADD_PRODUCT_PATTERN,SET_FULFILLMENT_SLOT}from"../constants";/**
1
+ import queryString from 'query-string';
2
+ import { ACTION_PUSH, ACTION_REPLACE } from '@virtuous/conductor';
3
+ import { main$ } from '@shopgate/pwa-common/streams/main';
4
+ import { routeWillEnter$, routeDidEnter$, routeWillLeave$, routeDidLeave$, navigate$ } from '@shopgate/pwa-common/streams/router';
5
+ import { getCurrentPathname } from '@shopgate/pwa-common/selectors/router';
6
+ import { pushNotificationOpened$ } from '@shopgate/pwa-common/streams/app';
7
+ import { INDEX_PATH_DEEPLINK, INDEX_PATH } from '@shopgate/pwa-common/constants/RoutePaths';
8
+ import { getIsFetching } from "../selectors";
9
+ import { CART_PATH, REQUEST_CART, RECEIVE_CART, ERROR_CART, ADD_PRODUCTS_TO_CART, SUCCESS_ADD_PRODUCTS_TO_CART, ERROR_ADD_PRODUCTS_TO_CART, UPDATE_PRODUCTS_IN_CART, SUCCESS_UPDATE_PRODUCTS_IN_CART, ERROR_UPDATE_PRODUCTS_IN_CART, DELETE_PRODUCTS_FROM_CART, SUCCESS_DELETE_PRODUCTS_FROM_CART, ERROR_DELETE_PRODUCTS_FROM_CART, ADD_COUPONS_TO_CART, SUCCESS_ADD_COUPONS_TO_CART, ERROR_ADD_COUPONS_TO_CART, DELETE_COUPONS_FROM_CART, ERROR_DELETE_COUPONS_FROM_CART, SUCCESS_DELETE_COUPONS_FROM_CART, DEEPLINK_CART_ADD_PRODUCT_PATTERN, SET_FULFILLMENT_SLOT } from "../constants";
10
+
11
+ /**
2
12
  * Specialized stream to handle push notifications that redirect to index screen with a coupon code.
3
13
  * Default logic would dispatch a historyReset in that case without link in the action payload,
4
14
  * so we need to hook onto the pushNotificationOpen stream to inspect the link.
5
15
  * @type {Observable}
6
- */var pushNotificationWithIndexCouponOpened$=pushNotificationOpened$.filter(function(_ref){var action=_ref.action;if(!action.link){// stop execution when push contains no link
7
- return false;}var _action$link$split=action.link.split('?'),_action$link$split2=_slicedToArray(_action$link$split,1),pathname=_action$link$split2[0];if(pathname!==INDEX_PATH&&pathname!==INDEX_PATH_DEEPLINK){// stop execution when link doesn't reference index path
8
- return false;}var parsed=queryString.parseUrl(action.link);if(!parsed||!parsed.query||!parsed.query.coupon){// stop execution when link doesn't contain a coupon
9
- return false;}return true;}).map(function(input){return _extends({},input,{action:{historyAction:ACTION_PUSH,route:{query:{coupon:queryString.parseUrl(input.action.link).query.coupon}}}});});/**
10
- * @type {Observable}
11
- */export var routeWithCouponWillEnter$=routeWillEnter$.merge(pushNotificationWithIndexCouponOpened$).filter(function(_ref2){var action=_ref2.action;return[ACTION_PUSH,ACTION_REPLACE].includes(action.historyAction)&&action.route.query.coupon;});/**
12
- * @type {Observable}
13
- */export var cartWillEnter$=routeWillEnter$.filter(function(_ref3){var action=_ref3.action;return action.route.pattern===CART_PATH;});/**
16
+ */
17
+ const pushNotificationWithIndexCouponOpened$ = pushNotificationOpened$.filter(({
18
+ action
19
+ }) => {
20
+ if (!action.link) {
21
+ // stop execution when push contains no link
22
+ return false;
23
+ }
24
+ const [pathname] = action.link.split('?');
25
+ if (pathname !== INDEX_PATH && pathname !== INDEX_PATH_DEEPLINK) {
26
+ // stop execution when link doesn't reference index path
27
+ return false;
28
+ }
29
+ const parsed = queryString.parseUrl(action.link);
30
+ if (!parsed || !parsed.query || !parsed.query.coupon) {
31
+ // stop execution when link doesn't contain a coupon
32
+ return false;
33
+ }
34
+ return true;
35
+ }).map(input => ({
36
+ // mock payload of navigation action to keep further handling simple
37
+ ...input,
38
+ action: {
39
+ historyAction: ACTION_PUSH,
40
+ route: {
41
+ query: {
42
+ coupon: queryString.parseUrl(input.action.link).query.coupon
43
+ }
44
+ }
45
+ }
46
+ }));
47
+
48
+ /**
49
+ * @type {Observable}
50
+ */
51
+ export const routeWithCouponWillEnter$ = routeWillEnter$.merge(pushNotificationWithIndexCouponOpened$).filter(({
52
+ action
53
+ }) => [ACTION_PUSH, ACTION_REPLACE].includes(action.historyAction) && action.route.query.coupon);
54
+
55
+ /**
56
+ * @type {Observable}
57
+ */
58
+ export const cartWillEnter$ = routeWillEnter$.filter(({
59
+ action
60
+ }) => action.route.pattern === CART_PATH);
61
+
62
+ /**
14
63
  * @type {Observable}
15
- */export var cartDidEnter$=routeDidEnter$.filter(function(_ref4){var action=_ref4.action;return action.route.pattern===CART_PATH;});/**
16
- * @type {Observable}
17
- */export var cartWillLeave$=routeWillLeave$.filter(function(_ref5){var action=_ref5.action;return action.route.pattern===CART_PATH;});/**
18
- * @type {Observable}
19
- */export var cartDidLeave$=routeDidLeave$.filter(function(_ref6){var action=_ref6.action;return action.route.pattern===CART_PATH;});/**
20
- * @type {Observable}
21
- */export var cartRequesting$=main$.filter(function(_ref7){var action=_ref7.action;return action.type===REQUEST_CART;});export var cartWillEnterIdle$=cartWillEnter$.filter(function(_ref8){var getState=_ref8.getState;return!getIsFetching(getState());});/**
22
- * @type {Observable}
23
- */export var cartReceived$=main$.filter(function(_ref9){var action=_ref9.action;return action.type===RECEIVE_CART||action.type===ERROR_CART;});/**
64
+ */
65
+ export const cartDidEnter$ = routeDidEnter$.filter(({
66
+ action
67
+ }) => action.route.pattern === CART_PATH);
68
+
69
+ /**
70
+ * @type {Observable}
71
+ */
72
+ export const cartWillLeave$ = routeWillLeave$.filter(({
73
+ action
74
+ }) => action.route.pattern === CART_PATH);
75
+
76
+ /**
77
+ * @type {Observable}
78
+ */
79
+ export const cartDidLeave$ = routeDidLeave$.filter(({
80
+ action
81
+ }) => action.route.pattern === CART_PATH);
82
+
83
+ /**
84
+ * @type {Observable}
85
+ */
86
+ export const cartRequesting$ = main$.filter(({
87
+ action
88
+ }) => action.type === REQUEST_CART);
89
+ export const cartWillEnterIdle$ = cartWillEnter$.filter(({
90
+ getState
91
+ }) => !getIsFetching(getState()));
92
+
93
+ /**
94
+ * @type {Observable}
95
+ */
96
+ export const cartReceived$ = main$.filter(({
97
+ action
98
+ }) => action.type === RECEIVE_CART || action.type === ERROR_CART);
99
+
100
+ /**
24
101
  * Gets triggered when the user tried to add a coupon to the cart.
25
102
  * @type {Observable}
26
- */export var couponsAdded$=main$.filter(function(_ref10){var action=_ref10.action;return action.type===ADD_COUPONS_TO_CART;});/**
103
+ */
104
+ export const couponsAdded$ = main$.filter(({
105
+ action
106
+ }) => action.type === ADD_COUPONS_TO_CART);
107
+
108
+ /**
27
109
  * Gets triggered when the user tried to add a coupon to the cart.
28
110
  * @type {Observable}
29
- */export var couponsDeleted$=main$.filter(function(_ref11){var action=_ref11.action;return action.type===DELETE_COUPONS_FROM_CART;});/**
111
+ */
112
+ export const couponsDeleted$ = main$.filter(({
113
+ action
114
+ }) => action.type === DELETE_COUPONS_FROM_CART);
115
+
116
+ /**
30
117
  * Gets triggered when the user tried to add a coupon to the cart.
31
118
  * @type {Observable}
32
- */export var couponsUpdated$=main$.filter(function(_ref12){var action=_ref12.action;return action.type===SUCCESS_ADD_COUPONS_TO_CART||action.type===ERROR_ADD_COUPONS_TO_CART||action.type===SUCCESS_DELETE_COUPONS_FROM_CART||action.type===ERROR_DELETE_COUPONS_FROM_CART;});/**
119
+ */
120
+ export const couponsUpdated$ = main$.filter(({
121
+ action
122
+ }) => action.type === SUCCESS_ADD_COUPONS_TO_CART || action.type === ERROR_ADD_COUPONS_TO_CART || action.type === SUCCESS_DELETE_COUPONS_FROM_CART || action.type === ERROR_DELETE_COUPONS_FROM_CART);
123
+
124
+ /**
33
125
  * Gets triggered when the user tried to add a product to the cart.
34
126
  * @type {Observable}
35
- */export var productsAdded$=main$.filter(function(_ref13){var action=_ref13.action;return action.type===ADD_PRODUCTS_TO_CART;});/**
127
+ */
128
+ export const productsAdded$ = main$.filter(({
129
+ action
130
+ }) => action.type === ADD_PRODUCTS_TO_CART);
131
+
132
+ /**
36
133
  * Gets triggered when the user tried to add a product to the cart.
37
134
  * @type {Observable}
38
- */export var productsModified$=main$.filter(function(_ref14){var action=_ref14.action;return action.type===UPDATE_PRODUCTS_IN_CART;});/**
135
+ */
136
+ export const productsModified$ = main$.filter(({
137
+ action
138
+ }) => action.type === UPDATE_PRODUCTS_IN_CART);
139
+
140
+ /**
39
141
  * Gets triggered when the user tried to add a product to the cart.
40
142
  * @type {Observable}
41
- */export var productsDeleted$=main$.filter(function(_ref15){var action=_ref15.action;return action.type===DELETE_PRODUCTS_FROM_CART;});/**
143
+ */
144
+ export const productsDeleted$ = main$.filter(({
145
+ action
146
+ }) => action.type === DELETE_PRODUCTS_FROM_CART);
147
+
148
+ /**
42
149
  * Gets triggered when the cart has been updated while the cart route was visible.
43
150
  * @type {Observable}
44
- */export var cartUpdatedWhileVisible$=cartReceived$.filter(function(_ref16){var getState=_ref16.getState;return getCurrentPathname(getState())===CART_PATH;});/**
151
+ */
152
+ export const cartUpdatedWhileVisible$ = cartReceived$.filter(({
153
+ getState
154
+ }) => getCurrentPathname(getState()) === CART_PATH);
155
+
156
+ /**
45
157
  * Gets triggered when the user tried to add a coupon to the cart.
46
158
  * @type {Observable}
47
- */export var productsUpdated$=main$.filter(function(_ref17){var action=_ref17.action;return action.type===SUCCESS_ADD_PRODUCTS_TO_CART||action.type===ERROR_ADD_PRODUCTS_TO_CART||action.type===SUCCESS_UPDATE_PRODUCTS_IN_CART||action.type===ERROR_UPDATE_PRODUCTS_IN_CART||action.type===SUCCESS_DELETE_PRODUCTS_FROM_CART||action.type===ERROR_DELETE_PRODUCTS_FROM_CART;});/**
159
+ */
160
+ export const productsUpdated$ = main$.filter(({
161
+ action
162
+ }) => action.type === SUCCESS_ADD_PRODUCTS_TO_CART || action.type === ERROR_ADD_PRODUCTS_TO_CART || action.type === SUCCESS_UPDATE_PRODUCTS_IN_CART || action.type === ERROR_UPDATE_PRODUCTS_IN_CART || action.type === SUCCESS_DELETE_PRODUCTS_FROM_CART || action.type === ERROR_DELETE_PRODUCTS_FROM_CART);
163
+
164
+ /**
48
165
  * Gets triggered when the remote cart was updated.
49
166
  * @type {Observable}
50
- */export var remoteCartDidUpdate$=main$.filter(function(_ref18){var action=_ref18.action;return action.type===SUCCESS_ADD_PRODUCTS_TO_CART||action.type===ERROR_ADD_PRODUCTS_TO_CART||action.type===SUCCESS_UPDATE_PRODUCTS_IN_CART||action.type===ERROR_UPDATE_PRODUCTS_IN_CART||action.type===SUCCESS_DELETE_PRODUCTS_FROM_CART||action.type===ERROR_DELETE_PRODUCTS_FROM_CART||action.type===SUCCESS_ADD_COUPONS_TO_CART||action.type===ERROR_ADD_COUPONS_TO_CART||action.type===SUCCESS_DELETE_COUPONS_FROM_CART||action.type===ERROR_DELETE_COUPONS_FROM_CART;});/**
167
+ */
168
+ export const remoteCartDidUpdate$ = main$.filter(({
169
+ action
170
+ }) => action.type === SUCCESS_ADD_PRODUCTS_TO_CART || action.type === ERROR_ADD_PRODUCTS_TO_CART || action.type === SUCCESS_UPDATE_PRODUCTS_IN_CART || action.type === ERROR_UPDATE_PRODUCTS_IN_CART || action.type === SUCCESS_DELETE_PRODUCTS_FROM_CART || action.type === ERROR_DELETE_PRODUCTS_FROM_CART || action.type === SUCCESS_ADD_COUPONS_TO_CART || action.type === ERROR_ADD_COUPONS_TO_CART || action.type === SUCCESS_DELETE_COUPONS_FROM_CART || action.type === ERROR_DELETE_COUPONS_FROM_CART);
171
+
172
+ /**
51
173
  * Gets triggered whenever any cart update request fails.
52
174
  * @type {Observable}
53
- */export var cartUpdateFailed$=main$.filter(function(_ref19){var action=_ref19.action;return action.type===ERROR_ADD_PRODUCTS_TO_CART||action.type===ERROR_UPDATE_PRODUCTS_IN_CART||action.type===ERROR_DELETE_PRODUCTS_FROM_CART||action.type===ERROR_ADD_COUPONS_TO_CART||action.type===ERROR_DELETE_COUPONS_FROM_CART;});/**
175
+ */
176
+ export const cartUpdateFailed$ = main$.filter(({
177
+ action
178
+ }) => action.type === ERROR_ADD_PRODUCTS_TO_CART || action.type === ERROR_UPDATE_PRODUCTS_IN_CART || action.type === ERROR_DELETE_PRODUCTS_FROM_CART || action.type === ERROR_ADD_COUPONS_TO_CART || action.type === ERROR_DELETE_COUPONS_FROM_CART);
179
+
180
+ /**
54
181
  * Gets triggered when /cart_add_product/123/COUPON route is navigated
55
182
  * @type {Observable}
56
- */export var routeAddProductNavigate$=navigate$.filter(function(_ref20){var _ref20$action$params=_ref20.action.params,_ref20$action$params2=_ref20$action$params===void 0?{}:_ref20$action$params,_ref20$action$params3=_ref20$action$params2.pathname,pathname=_ref20$action$params3===void 0?'':_ref20$action$params3;return pathname.includes(DEEPLINK_CART_ADD_PRODUCT_PATTERN.split('/')[1]);}).map(function(params){var _params$action$params=params.action.params.pathname.split('/'),_params$action$params2=_slicedToArray(_params$action$params,4),productId=_params$action$params2[2],couponCode=_params$action$params2[3];return _extends({},params,{action:_extends({},params.action,{productId:decodeURIComponent(productId),couponCode:couponCode?decodeURIComponent(couponCode):undefined})});});export var setFulfillmentSlot$=main$.filter(function(_ref21){var action=_ref21.action;return action.type===SET_FULFILLMENT_SLOT;});
183
+ */
184
+ export const routeAddProductNavigate$ = navigate$.filter(({
185
+ action: {
186
+ params: {
187
+ pathname = ''
188
+ } = {}
189
+ }
190
+ }) => pathname.includes(DEEPLINK_CART_ADD_PRODUCT_PATTERN.split('/')[1])).map(params => {
191
+ const [,, productId, couponCode] = params.action.params.pathname.split('/');
192
+ return {
193
+ ...params,
194
+ action: {
195
+ ...params.action,
196
+ productId: decodeURIComponent(productId),
197
+ couponCode: couponCode ? decodeURIComponent(couponCode) : undefined
198
+ }
199
+ };
200
+ });
201
+ export const setFulfillmentSlot$ = main$.filter(({
202
+ action
203
+ }) => action.type === SET_FULFILLMENT_SLOT);