@capillarytech/creatives-library 8.0.263 → 8.0.265

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 (280) hide show
  1. package/assets/Android.png +0 -0
  2. package/assets/iOS.png +0 -0
  3. package/constants/unified.js +1 -3
  4. package/initialReducer.js +0 -2
  5. package/package.json +1 -1
  6. package/services/api.js +0 -15
  7. package/services/tests/api.test.js +0 -34
  8. package/tests/integration/TemplateCreation/TemplateCreation.integration.test.js +35 -17
  9. package/tests/integration/TemplateCreation/api-response.js +1 -31
  10. package/tests/integration/TemplateCreation/msw-handler.js +0 -2
  11. package/utils/common.js +0 -11
  12. package/utils/commonUtils.js +5 -28
  13. package/utils/tests/commonUtil.test.js +0 -224
  14. package/utils/tests/transformerUtils.test.js +0 -297
  15. package/utils/transformTemplateConfig.js +10 -0
  16. package/utils/transformerUtils.js +0 -40
  17. package/v2Components/CapDeviceContent/index.js +56 -61
  18. package/v2Components/CapImageUpload/constants.js +0 -2
  19. package/v2Components/CapImageUpload/index.js +16 -65
  20. package/v2Components/CapImageUpload/index.scss +1 -4
  21. package/v2Components/CapImageUpload/messages.js +1 -5
  22. package/v2Components/CapTagList/index.js +1 -6
  23. package/v2Components/CapTagListWithInput/index.js +1 -5
  24. package/v2Components/CapTagListWithInput/messages.js +1 -1
  25. package/v2Components/CapWhatsappCTA/tests/index.test.js +0 -5
  26. package/v2Components/ErrorInfoNote/index.js +72 -402
  27. package/v2Components/ErrorInfoNote/messages.js +6 -32
  28. package/v2Components/ErrorInfoNote/style.scss +6 -278
  29. package/v2Components/FormBuilder/tests/index.test.js +4 -13
  30. package/v2Components/HtmlEditor/HTMLEditor.js +99 -418
  31. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +133 -1882
  32. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +16 -27
  33. package/v2Components/HtmlEditor/_htmlEditor.scss +45 -108
  34. package/v2Components/HtmlEditor/_index.lazy.scss +1 -0
  35. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +102 -23
  36. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +140 -148
  37. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +1 -2
  38. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  39. package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +1 -9
  40. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +6 -31
  41. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +0 -22
  42. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +7 -4
  43. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +45 -35
  44. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +3 -1
  45. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  46. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +6 -7
  47. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +10 -7
  48. package/v2Components/HtmlEditor/components/PreviewPane/index.js +43 -22
  49. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  50. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +152 -0
  51. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/_validationErrorDisplay.scss +0 -18
  52. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +31 -36
  53. package/v2Components/HtmlEditor/components/ValidationPanel/_validationPanel.scss +34 -46
  54. package/v2Components/HtmlEditor/components/ValidationPanel/index.js +46 -52
  55. package/v2Components/HtmlEditor/constants.js +20 -45
  56. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +16 -373
  57. package/v2Components/HtmlEditor/hooks/__tests__/useValidation.test.js +16 -351
  58. package/v2Components/HtmlEditor/hooks/useEditorContent.js +2 -5
  59. package/v2Components/HtmlEditor/hooks/useInAppContent.js +146 -88
  60. package/v2Components/HtmlEditor/hooks/useValidation.js +56 -213
  61. package/v2Components/HtmlEditor/index.js +1 -1
  62. package/v2Components/HtmlEditor/messages.js +94 -102
  63. package/v2Components/HtmlEditor/utils/__tests__/htmlValidator.enhanced.test.js +45 -214
  64. package/v2Components/HtmlEditor/utils/__tests__/validationAdapter.test.js +0 -134
  65. package/v2Components/HtmlEditor/utils/contentSanitizer.js +41 -40
  66. package/v2Components/HtmlEditor/utils/htmlValidator.js +72 -71
  67. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +124 -158
  68. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
  69. package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -66
  70. package/v2Components/MobilePushPreviewV2/index.js +7 -33
  71. package/v2Components/TemplatePreview/_templatePreview.scss +24 -55
  72. package/v2Components/TemplatePreview/index.js +32 -47
  73. package/v2Components/TemplatePreview/messages.js +0 -4
  74. package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +0 -1
  75. package/v2Containers/App/constants.js +0 -5
  76. package/v2Containers/BeeEditor/index.js +90 -172
  77. package/v2Containers/CreativesContainer/SlideBoxContent.js +53 -184
  78. package/v2Containers/CreativesContainer/SlideBoxFooter.js +13 -163
  79. package/v2Containers/CreativesContainer/SlideBoxHeader.js +1 -3
  80. package/v2Containers/CreativesContainer/constants.js +0 -4
  81. package/v2Containers/CreativesContainer/index.js +46 -408
  82. package/v2Containers/CreativesContainer/messages.js +0 -12
  83. package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +0 -210
  84. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +2 -11
  85. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +50 -342
  86. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -103
  87. package/v2Containers/Email/actions.js +0 -7
  88. package/v2Containers/Email/constants.js +1 -5
  89. package/v2Containers/Email/index.js +36 -237
  90. package/v2Containers/Email/messages.js +0 -32
  91. package/v2Containers/Email/reducer.js +1 -12
  92. package/v2Containers/Email/sagas.js +7 -61
  93. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
  94. package/v2Containers/Email/tests/reducer.test.js +0 -46
  95. package/v2Containers/Email/tests/sagas.test.js +29 -320
  96. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +21 -211
  97. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +74 -40
  98. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +67 -2
  99. package/v2Containers/EmailWrapper/constants.js +0 -2
  100. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +77 -629
  101. package/v2Containers/EmailWrapper/index.js +23 -103
  102. package/v2Containers/EmailWrapper/messages.js +1 -65
  103. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +214 -0
  104. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +77 -594
  105. package/v2Containers/InApp/actions.js +0 -7
  106. package/v2Containers/InApp/constants.js +4 -20
  107. package/v2Containers/InApp/index.js +359 -802
  108. package/v2Containers/InApp/index.scss +3 -4
  109. package/v2Containers/InApp/messages.js +3 -7
  110. package/v2Containers/InApp/reducer.js +3 -21
  111. package/v2Containers/InApp/sagas.js +9 -29
  112. package/v2Containers/InApp/selectors.js +5 -25
  113. package/v2Containers/InApp/tests/index.test.js +50 -154
  114. package/v2Containers/InApp/tests/reducer.test.js +0 -34
  115. package/v2Containers/InApp/tests/sagas.test.js +9 -61
  116. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +0 -3
  117. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +0 -2
  118. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +0 -2
  119. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +0 -9
  120. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +0 -12
  121. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +0 -4
  122. package/v2Containers/TagList/index.js +19 -62
  123. package/v2Containers/Templates/ChannelTypeIllustration.js +1 -13
  124. package/v2Containers/Templates/_templates.scss +1 -265
  125. package/v2Containers/Templates/actions.js +1 -2
  126. package/v2Containers/Templates/constants.js +0 -1
  127. package/v2Containers/Templates/index.js +38 -363
  128. package/v2Containers/Templates/messages.js +0 -28
  129. package/v2Containers/Templates/reducer.js +0 -2
  130. package/v2Containers/Templates/tests/index.test.js +0 -10
  131. package/v2Containers/TemplatesV2/TemplatesV2.style.js +2 -4
  132. package/v2Containers/TemplatesV2/index.js +7 -15
  133. package/v2Containers/TemplatesV2/messages.js +0 -4
  134. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +0 -34
  135. package/utils/imageUrlUpload.js +0 -141
  136. package/v2Components/CapImageUrlUpload/constants.js +0 -26
  137. package/v2Components/CapImageUrlUpload/index.js +0 -365
  138. package/v2Components/CapImageUrlUpload/index.scss +0 -35
  139. package/v2Components/CapImageUrlUpload/messages.js +0 -47
  140. package/v2Components/ErrorInfoNote/constants.js +0 -1
  141. package/v2Components/HtmlEditor/__tests__/HTMLEditor.apiErrors.test.js +0 -870
  142. package/v2Components/HtmlEditor/components/ValidationPanel/constants.js +0 -6
  143. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -281
  144. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -295
  145. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
  146. package/v2Components/HtmlEditor/utils/validationConstants.js +0 -38
  147. package/v2Components/MobilePushPreviewV2/constants.js +0 -6
  148. package/v2Containers/BeePopupEditor/_beePopupEditor.scss +0 -14
  149. package/v2Containers/BeePopupEditor/constants.js +0 -10
  150. package/v2Containers/BeePopupEditor/index.js +0 -194
  151. package/v2Containers/BeePopupEditor/tests/index.test.js +0 -627
  152. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1246
  153. package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +0 -2472
  154. package/v2Containers/EmailWrapper/components/__tests__/EmailWrapperView.test.js +0 -520
  155. package/v2Containers/EmailWrapper/tests/useEmailWrapper.edgeCases.test.js +0 -956
  156. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +0 -376
  157. package/v2Containers/InApp/__tests__/sagas.test.js +0 -363
  158. package/v2Containers/InApp/tests/selectors.test.js +0 -612
  159. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +0 -151
  160. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +0 -267
  161. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +0 -23
  162. package/v2Containers/InAppWrapper/constants.js +0 -16
  163. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +0 -473
  164. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +0 -198
  165. package/v2Containers/InAppWrapper/index.js +0 -148
  166. package/v2Containers/InAppWrapper/messages.js +0 -49
  167. package/v2Containers/InappAdvance/index.js +0 -1099
  168. package/v2Containers/InappAdvance/index.scss +0 -10
  169. package/v2Containers/InappAdvance/tests/index.test.js +0 -448
  170. package/v2Containers/WebPush/Create/components/BrandIconSection.js +0 -108
  171. package/v2Containers/WebPush/Create/components/ButtonForm.js +0 -172
  172. package/v2Containers/WebPush/Create/components/ButtonItem.js +0 -101
  173. package/v2Containers/WebPush/Create/components/ButtonList.js +0 -145
  174. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.js +0 -164
  175. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.test.js +0 -463
  176. package/v2Containers/WebPush/Create/components/FormActions.js +0 -54
  177. package/v2Containers/WebPush/Create/components/FormActions.test.js +0 -163
  178. package/v2Containers/WebPush/Create/components/MediaSection.js +0 -142
  179. package/v2Containers/WebPush/Create/components/MediaSection.test.js +0 -341
  180. package/v2Containers/WebPush/Create/components/MessageSection.js +0 -103
  181. package/v2Containers/WebPush/Create/components/MessageSection.test.js +0 -268
  182. package/v2Containers/WebPush/Create/components/NotificationTitleSection.js +0 -87
  183. package/v2Containers/WebPush/Create/components/NotificationTitleSection.test.js +0 -210
  184. package/v2Containers/WebPush/Create/components/TemplateNameSection.js +0 -54
  185. package/v2Containers/WebPush/Create/components/TemplateNameSection.test.js +0 -143
  186. package/v2Containers/WebPush/Create/components/__snapshots__/ButtonsLinksSection.test.js.snap +0 -86
  187. package/v2Containers/WebPush/Create/components/__snapshots__/FormActions.test.js.snap +0 -16
  188. package/v2Containers/WebPush/Create/components/__snapshots__/MediaSection.test.js.snap +0 -41
  189. package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +0 -54
  190. package/v2Containers/WebPush/Create/components/__snapshots__/NotificationTitleSection.test.js.snap +0 -37
  191. package/v2Containers/WebPush/Create/components/__snapshots__/TemplateNameSection.test.js.snap +0 -21
  192. package/v2Containers/WebPush/Create/components/_buttons.scss +0 -246
  193. package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +0 -554
  194. package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +0 -607
  195. package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +0 -633
  196. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +0 -666
  197. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +0 -74
  198. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +0 -78
  199. package/v2Containers/WebPush/Create/hooks/useButtonManagement.js +0 -138
  200. package/v2Containers/WebPush/Create/hooks/useButtonManagement.test.js +0 -406
  201. package/v2Containers/WebPush/Create/hooks/useCharacterCount.js +0 -30
  202. package/v2Containers/WebPush/Create/hooks/useCharacterCount.test.js +0 -151
  203. package/v2Containers/WebPush/Create/hooks/useImageUpload.js +0 -104
  204. package/v2Containers/WebPush/Create/hooks/useImageUpload.test.js +0 -538
  205. package/v2Containers/WebPush/Create/hooks/useTagManagement.js +0 -122
  206. package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +0 -633
  207. package/v2Containers/WebPush/Create/index.js +0 -1148
  208. package/v2Containers/WebPush/Create/index.scss +0 -134
  209. package/v2Containers/WebPush/Create/messages.js +0 -211
  210. package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +0 -228
  211. package/v2Containers/WebPush/Create/preview/NotificationContainer.js +0 -294
  212. package/v2Containers/WebPush/Create/preview/PreviewContent.js +0 -90
  213. package/v2Containers/WebPush/Create/preview/PreviewControls.js +0 -305
  214. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +0 -25
  215. package/v2Containers/WebPush/Create/preview/WebPushPreview.js +0 -155
  216. package/v2Containers/WebPush/Create/preview/assets/Light.svg +0 -53
  217. package/v2Containers/WebPush/Create/preview/assets/Top.svg +0 -5
  218. package/v2Containers/WebPush/Create/preview/assets/android-arrow-down.svg +0 -9
  219. package/v2Containers/WebPush/Create/preview/assets/android-arrow-up.svg +0 -9
  220. package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
  221. package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
  222. package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +0 -106
  223. package/v2Containers/WebPush/Create/preview/assets/iOS.svg +0 -26
  224. package/v2Containers/WebPush/Create/preview/assets/macos-arrow-down-icon.svg +0 -9
  225. package/v2Containers/WebPush/Create/preview/assets/macos-triple-dot-icon.svg +0 -9
  226. package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +0 -18
  227. package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +0 -29
  228. package/v2Containers/WebPush/Create/preview/assets/windows-close-icon.svg +0 -9
  229. package/v2Containers/WebPush/Create/preview/assets/windows-triple-dot-icon.svg +0 -9
  230. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +0 -51
  231. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +0 -145
  232. package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +0 -45
  233. package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +0 -68
  234. package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +0 -61
  235. package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +0 -99
  236. package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +0 -733
  237. package/v2Containers/WebPush/Create/preview/components/tests/WindowsChromeExpanded.test.js +0 -571
  238. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +0 -85
  239. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/WindowsChromeExpanded.test.js.snap +0 -81
  240. package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +0 -50
  241. package/v2Containers/WebPush/Create/preview/constants.js +0 -637
  242. package/v2Containers/WebPush/Create/preview/notification-container.scss +0 -79
  243. package/v2Containers/WebPush/Create/preview/preview.scss +0 -358
  244. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +0 -370
  245. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +0 -12
  246. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +0 -12
  247. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +0 -12
  248. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +0 -47
  249. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +0 -11
  250. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +0 -11
  251. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +0 -11
  252. package/v2Containers/WebPush/Create/preview/styles/_base.scss +0 -207
  253. package/v2Containers/WebPush/Create/preview/styles/_ios.scss +0 -153
  254. package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +0 -107
  255. package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +0 -101
  256. package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +0 -229
  257. package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +0 -909
  258. package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +0 -1081
  259. package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +0 -723
  260. package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +0 -1327
  261. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +0 -131
  262. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +0 -112
  263. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +0 -144
  264. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +0 -129
  265. package/v2Containers/WebPush/Create/utils/payloadBuilder.js +0 -96
  266. package/v2Containers/WebPush/Create/utils/payloadBuilder.test.js +0 -396
  267. package/v2Containers/WebPush/Create/utils/previewUtils.js +0 -89
  268. package/v2Containers/WebPush/Create/utils/urlValidation.js +0 -115
  269. package/v2Containers/WebPush/Create/utils/urlValidation.test.js +0 -449
  270. package/v2Containers/WebPush/Create/utils/validation.js +0 -75
  271. package/v2Containers/WebPush/Create/utils/validation.test.js +0 -283
  272. package/v2Containers/WebPush/actions.js +0 -60
  273. package/v2Containers/WebPush/constants.js +0 -132
  274. package/v2Containers/WebPush/index.js +0 -2
  275. package/v2Containers/WebPush/reducer.js +0 -104
  276. package/v2Containers/WebPush/sagas.js +0 -119
  277. package/v2Containers/WebPush/selectors.js +0 -65
  278. package/v2Containers/WebPush/tests/reducer.test.js +0 -863
  279. package/v2Containers/WebPush/tests/sagas.test.js +0 -566
  280. package/v2Containers/WebPush/tests/selectors.test.js +0 -960
@@ -1,863 +0,0 @@
1
- import { fromJS } from 'immutable';
2
- import webPushReducer from '../reducer';
3
- import * as types from '../constants';
4
-
5
- describe('WebPush Reducer', () => {
6
- const initialState = fromJS({
7
- createTemplateInProgress: false,
8
- response: {},
9
- createTemplateErrorMessage: '',
10
- editTemplateInProgress: false,
11
- editResponse: {},
12
- editTemplateErrorMessage: '',
13
- uploadedAssetData: {},
14
- uploadAssetSuccess: false,
15
- assetUploading: false,
16
- });
17
-
18
- describe('Initial State', () => {
19
- it.concurrent('should return the initial state', () => {
20
- expect(webPushReducer(undefined, {})).toEqual(initialState);
21
- });
22
-
23
- it.concurrent('should return the initial state when state is undefined', () => {
24
- const action = { type: 'UNKNOWN_ACTION' };
25
- expect(webPushReducer(undefined, action)).toEqual(initialState);
26
- });
27
- });
28
-
29
- describe('Action Validation', () => {
30
- it.concurrent('should handle null action', () => {
31
- const currentState = initialState.set('createTemplateInProgress', true);
32
- expect(webPushReducer(currentState, null)).toEqual(currentState);
33
- });
34
-
35
- it.concurrent('should handle undefined action', () => {
36
- const currentState = initialState.set('createTemplateInProgress', true);
37
- expect(webPushReducer(currentState, undefined)).toEqual(currentState);
38
- });
39
-
40
- it.concurrent('should handle action without type property', () => {
41
- const currentState = initialState.set('createTemplateInProgress', true);
42
- const action = { payload: 'some data' };
43
- expect(webPushReducer(currentState, action)).toEqual(currentState);
44
- });
45
-
46
- it.concurrent('should handle non-object action', () => {
47
- const currentState = initialState.set('createTemplateInProgress', true);
48
- expect(webPushReducer(currentState, 'invalid')).toEqual(currentState);
49
- });
50
- });
51
-
52
- describe('DEFAULT_ACTION', () => {
53
- it.concurrent('should return the current state unchanged', () => {
54
- const currentState = initialState.set('createTemplateInProgress', true);
55
- const action = { type: types.DEFAULT_ACTION };
56
- expect(webPushReducer(currentState, action)).toEqual(currentState);
57
- });
58
- });
59
-
60
- describe('CREATE_TEMPLATE_REQUEST', () => {
61
- it.concurrent('should set createTemplateInProgress to true and reset error states', () => {
62
- const action = { type: types.CREATE_TEMPLATE_REQUEST };
63
- const expectedState = initialState
64
- .set('createTemplateInProgress', true)
65
- .set('createTemplateError', false)
66
- .set('createTemplateErrorMessage', fromJS(''));
67
-
68
- expect(webPushReducer(initialState, action)).toEqual(expectedState);
69
- });
70
-
71
- it.concurrent('should reset error states when request is made', () => {
72
- const currentState = initialState
73
- .set('createTemplateError', true)
74
- .set('createTemplateErrorMessage', fromJS('Previous error'));
75
-
76
- const action = { type: types.CREATE_TEMPLATE_REQUEST };
77
- const expectedState = currentState
78
- .set('createTemplateInProgress', true)
79
- .set('createTemplateError', false)
80
- .set('createTemplateErrorMessage', fromJS(''));
81
-
82
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
83
- });
84
- });
85
-
86
- describe('CREATE_TEMPLATE_SUCCESS', () => {
87
- it.concurrent('should set createTemplateInProgress to false and store response with successful status', () => {
88
- const mockData = { id: 1, name: 'Test Template', content: 'Test Content' };
89
- const action = {
90
- type: types.CREATE_TEMPLATE_SUCCESS,
91
- data: mockData,
92
- statusCode: 200,
93
- };
94
-
95
- const currentState = initialState.set('createTemplateInProgress', true);
96
- const expectedState = currentState
97
- .set('createTemplateInProgress', false)
98
- .set('response', mockData)
99
- .set('createTemplateError', false);
100
-
101
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
102
- });
103
-
104
- it.concurrent('should set createTemplateError to true when statusCode is greater than 300', () => {
105
- const mockData = { error: 'Template creation failed' };
106
- const action = {
107
- type: types.CREATE_TEMPLATE_SUCCESS,
108
- data: mockData,
109
- statusCode: 400,
110
- };
111
-
112
- const currentState = initialState.set('createTemplateInProgress', true);
113
- const expectedState = currentState
114
- .set('createTemplateInProgress', false)
115
- .set('response', mockData)
116
- .set('createTemplateError', true);
117
-
118
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
119
- });
120
-
121
- it.concurrent('should set createTemplateError to true when statusCode is 301', () => {
122
- const mockData = { id: 1, name: 'Test Template' };
123
- const action = {
124
- type: types.CREATE_TEMPLATE_SUCCESS,
125
- data: mockData,
126
- statusCode: 301,
127
- };
128
-
129
- const currentState = initialState.set('createTemplateInProgress', true);
130
- const result = webPushReducer(currentState, action);
131
-
132
- // statusCode > 300 should set error to true
133
- expect(result.get('createTemplateError')).toBe(true);
134
- });
135
-
136
- it.concurrent('should handle success without statusCode', () => {
137
- const mockData = { id: 1, name: 'Test Template' };
138
- const action = {
139
- type: types.CREATE_TEMPLATE_SUCCESS,
140
- data: mockData,
141
- };
142
-
143
- const currentState = initialState.set('createTemplateInProgress', true);
144
- const expectedState = currentState
145
- .set('createTemplateInProgress', false)
146
- .set('response', mockData)
147
- .set('createTemplateError', false);
148
-
149
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
150
- });
151
-
152
- it.concurrent('should handle success with statusCode exactly 300', () => {
153
- const mockData = { id: 1, name: 'Test Template' };
154
- const action = {
155
- type: types.CREATE_TEMPLATE_SUCCESS,
156
- data: mockData,
157
- statusCode: 300,
158
- };
159
-
160
- const currentState = initialState.set('createTemplateInProgress', true);
161
- const expectedState = currentState
162
- .set('createTemplateInProgress', false)
163
- .set('response', mockData)
164
- .set('createTemplateError', false);
165
-
166
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
167
- });
168
- });
169
-
170
- describe('CREATE_TEMPLATE_FAILURE', () => {
171
- it.concurrent('should set createTemplateInProgress to false and store error message', () => {
172
- const errorMessage = 'Template creation failed';
173
- const action = {
174
- type: types.CREATE_TEMPLATE_FAILURE,
175
- error: errorMessage,
176
- };
177
-
178
- const currentState = initialState.set('createTemplateInProgress', true);
179
- const expectedState = currentState
180
- .set('createTemplateInProgress', false)
181
- .set('createTemplateError', true)
182
- .set('createTemplateErrorMessage', fromJS(errorMessage));
183
-
184
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
185
- });
186
-
187
- it.concurrent('should handle failure with empty error message', () => {
188
- const action = {
189
- type: types.CREATE_TEMPLATE_FAILURE,
190
- error: '',
191
- };
192
-
193
- const currentState = initialState.set('createTemplateInProgress', true);
194
- const expectedState = currentState
195
- .set('createTemplateInProgress', false)
196
- .set('createTemplateError', true)
197
- .set('createTemplateErrorMessage', fromJS(''));
198
-
199
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
200
- });
201
-
202
- it.concurrent('should handle failure with undefined error', () => {
203
- const action = {
204
- type: types.CREATE_TEMPLATE_FAILURE,
205
- error: undefined,
206
- };
207
-
208
- const currentState = initialState.set('createTemplateInProgress', true);
209
- const result = webPushReducer(currentState, action);
210
-
211
- expect(result.get('createTemplateInProgress')).toBe(false);
212
- expect(result.get('createTemplateError')).toBe(true);
213
- expect(result.get('createTemplateErrorMessage')).toEqual(fromJS(undefined));
214
- });
215
- });
216
-
217
- describe('CLEAR_CREATE_RESPONSE_REQUEST', () => {
218
- it.concurrent('should clear the response', () => {
219
- const currentState = initialState.set('response', { id: 1, name: 'Test Template' });
220
- const action = { type: types.CLEAR_CREATE_RESPONSE_REQUEST };
221
- const expectedState = currentState.set('response', {});
222
-
223
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
224
- });
225
-
226
- it.concurrent('should clear response even when it is already empty', () => {
227
- const action = { type: types.CLEAR_CREATE_RESPONSE_REQUEST };
228
- const expectedState = initialState.set('response', {});
229
-
230
- expect(webPushReducer(initialState, action)).toEqual(expectedState);
231
- });
232
- });
233
-
234
- describe('EDIT_TEMPLATE_REQUEST', () => {
235
- it.concurrent('should set editTemplateInProgress to true and reset error states', () => {
236
- const action = { type: types.EDIT_TEMPLATE_REQUEST };
237
- const expectedState = initialState
238
- .set('editTemplateInProgress', true)
239
- .set('editTemplateError', false)
240
- .set('editTemplateErrorMessage', fromJS(''));
241
-
242
- expect(webPushReducer(initialState, action)).toEqual(expectedState);
243
- });
244
-
245
- it.concurrent('should reset error states when edit request is made', () => {
246
- const currentState = initialState
247
- .set('editTemplateError', true)
248
- .set('editTemplateErrorMessage', fromJS('Previous error'));
249
-
250
- const action = { type: types.EDIT_TEMPLATE_REQUEST };
251
- const expectedState = currentState
252
- .set('editTemplateInProgress', true)
253
- .set('editTemplateError', false)
254
- .set('editTemplateErrorMessage', fromJS(''));
255
-
256
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
257
- });
258
- });
259
-
260
- describe('EDIT_TEMPLATE_SUCCESS', () => {
261
- it.concurrent('should set editTemplateInProgress to false and store editResponse with successful status', () => {
262
- const mockData = { id: 1, name: 'Updated Template', content: 'Updated Content' };
263
- const action = {
264
- type: types.EDIT_TEMPLATE_SUCCESS,
265
- data: mockData,
266
- statusCode: 200,
267
- };
268
-
269
- const currentState = initialState.set('editTemplateInProgress', true);
270
- const expectedState = currentState
271
- .set('editTemplateInProgress', false)
272
- .set('editResponse', mockData)
273
- .set('editTemplateError', false);
274
-
275
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
276
- });
277
-
278
- it.concurrent('should set editTemplateError to true when statusCode is greater than 300', () => {
279
- const mockData = { error: 'Template update failed' };
280
- const action = {
281
- type: types.EDIT_TEMPLATE_SUCCESS,
282
- data: mockData,
283
- statusCode: 400,
284
- };
285
-
286
- const currentState = initialState.set('editTemplateInProgress', true);
287
- const expectedState = currentState
288
- .set('editTemplateInProgress', false)
289
- .set('editResponse', mockData)
290
- .set('editTemplateError', true);
291
-
292
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
293
- });
294
-
295
- it.concurrent('should handle edit success without statusCode', () => {
296
- const mockData = { id: 1, name: 'Updated Template' };
297
- const action = {
298
- type: types.EDIT_TEMPLATE_SUCCESS,
299
- data: mockData,
300
- };
301
-
302
- const currentState = initialState.set('editTemplateInProgress', true);
303
- const expectedState = currentState
304
- .set('editTemplateInProgress', false)
305
- .set('editResponse', mockData)
306
- .set('editTemplateError', false);
307
-
308
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
309
- });
310
-
311
- it.concurrent('should handle edit success with statusCode 500', () => {
312
- const mockData = { error: 'Internal server error' };
313
- const action = {
314
- type: types.EDIT_TEMPLATE_SUCCESS,
315
- data: mockData,
316
- statusCode: 500,
317
- };
318
-
319
- const currentState = initialState.set('editTemplateInProgress', true);
320
- const result = webPushReducer(currentState, action);
321
-
322
- expect(result.get('editTemplateInProgress')).toBe(false);
323
- expect(result.get('editResponse')).toEqual(mockData);
324
- expect(result.get('editTemplateError')).toBe(true);
325
- });
326
-
327
- it.concurrent('should handle edit success with statusCode exactly 300', () => {
328
- const mockData = { id: 1, name: 'Updated Template' };
329
- const action = {
330
- type: types.EDIT_TEMPLATE_SUCCESS,
331
- data: mockData,
332
- statusCode: 300,
333
- };
334
-
335
- const currentState = initialState.set('editTemplateInProgress', true);
336
- const expectedState = currentState
337
- .set('editTemplateInProgress', false)
338
- .set('editResponse', mockData)
339
- .set('editTemplateError', false);
340
-
341
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
342
- });
343
- });
344
-
345
- describe('EDIT_TEMPLATE_FAILURE', () => {
346
- it.concurrent('should set editTemplateInProgress to false and store error message from error property', () => {
347
- const errorMessage = 'Template update failed';
348
- const action = {
349
- type: types.EDIT_TEMPLATE_FAILURE,
350
- error: errorMessage,
351
- };
352
-
353
- const currentState = initialState.set('editTemplateInProgress', true);
354
- const expectedState = currentState
355
- .set('editTemplateInProgress', false)
356
- .set('editTemplateError', true)
357
- .set('editTemplateErrorMessage', fromJS(errorMessage));
358
-
359
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
360
- });
361
-
362
- it.concurrent('should handle failure with errorMsg property when error is not present', () => {
363
- const errorMessage = 'Template update failed via errorMsg';
364
- const action = {
365
- type: types.EDIT_TEMPLATE_FAILURE,
366
- errorMsg: errorMessage,
367
- };
368
-
369
- const currentState = initialState.set('editTemplateInProgress', true);
370
- const expectedState = currentState
371
- .set('editTemplateInProgress', false)
372
- .set('editTemplateError', true)
373
- .set('editTemplateErrorMessage', fromJS(errorMessage));
374
-
375
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
376
- });
377
-
378
- it.concurrent('should prioritize error property over errorMsg property', () => {
379
- const action = {
380
- type: types.EDIT_TEMPLATE_FAILURE,
381
- error: 'Primary error',
382
- errorMsg: 'Secondary error',
383
- };
384
-
385
- const currentState = initialState.set('editTemplateInProgress', true);
386
- const result = webPushReducer(currentState, action);
387
-
388
- expect(result.get('editTemplateErrorMessage')).toEqual(fromJS('Primary error'));
389
- });
390
-
391
- it.concurrent('should handle failure with empty error and errorMsg', () => {
392
- const action = {
393
- type: types.EDIT_TEMPLATE_FAILURE,
394
- error: '',
395
- errorMsg: '',
396
- };
397
-
398
- const currentState = initialState.set('editTemplateInProgress', true);
399
- const expectedState = currentState
400
- .set('editTemplateInProgress', false)
401
- .set('editTemplateError', true)
402
- .set('editTemplateErrorMessage', fromJS(''));
403
-
404
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
405
- });
406
-
407
- it.concurrent('should handle failure with neither error nor errorMsg', () => {
408
- const action = {
409
- type: types.EDIT_TEMPLATE_FAILURE,
410
- };
411
-
412
- const currentState = initialState.set('editTemplateInProgress', true);
413
- const expectedState = currentState
414
- .set('editTemplateInProgress', false)
415
- .set('editTemplateError', true)
416
- .set('editTemplateErrorMessage', fromJS(''));
417
-
418
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
419
- });
420
- });
421
-
422
- describe('CLEAR_EDIT_RESPONSE_REQUEST', () => {
423
- it.concurrent('should clear the editResponse', () => {
424
- const currentState = initialState.set('editResponse', { id: 1, name: 'Updated Template' });
425
- const action = { type: types.CLEAR_EDIT_RESPONSE_REQUEST };
426
- const expectedState = currentState.set('editResponse', {});
427
-
428
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
429
- });
430
-
431
- it.concurrent('should clear editResponse even when it is already empty', () => {
432
- const action = { type: types.CLEAR_EDIT_RESPONSE_REQUEST };
433
- const expectedState = initialState.set('editResponse', {});
434
-
435
- expect(webPushReducer(initialState, action)).toEqual(expectedState);
436
- });
437
- });
438
-
439
- describe('UPLOAD_WEBPUSH_ASSET_REQUEST', () => {
440
- it.concurrent('should set uploadAssetSuccess to false and assetUploading to true', () => {
441
- const action = { type: types.UPLOAD_WEBPUSH_ASSET_REQUEST };
442
- const expectedState = initialState
443
- .set('uploadAssetSuccess', false)
444
- .set('assetUploading', true);
445
-
446
- expect(webPushReducer(initialState, action)).toEqual(expectedState);
447
- });
448
-
449
- it.concurrent('should reset uploadAssetSuccess when starting new upload', () => {
450
- const currentState = initialState
451
- .set('uploadAssetSuccess', true)
452
- .set('assetUploading', false);
453
-
454
- const action = { type: types.UPLOAD_WEBPUSH_ASSET_REQUEST };
455
- const expectedState = currentState
456
- .set('uploadAssetSuccess', false)
457
- .set('assetUploading', true);
458
-
459
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
460
- });
461
- });
462
-
463
- describe('UPLOAD_WEBPUSH_ASSET_SUCCESS', () => {
464
- it.concurrent('should set uploadAssetSuccess to true and store asset data with successful status', () => {
465
- const mockData = { url: 'https://example.com/image.jpg', id: 'asset-123' };
466
- const action = {
467
- type: types.UPLOAD_WEBPUSH_ASSET_SUCCESS,
468
- data: mockData,
469
- statusCode: 200,
470
- };
471
-
472
- const currentState = initialState.set('assetUploading', true);
473
- const expectedState = currentState
474
- .set('uploadAssetSuccess', true)
475
- .set('assetUploading', false)
476
- .set('uploadedAssetData', mockData);
477
-
478
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
479
- });
480
-
481
- it.concurrent('should set uploadAssetSuccess to false when statusCode is >= 300', () => {
482
- const mockData = { error: 'Upload failed' };
483
- const action = {
484
- type: types.UPLOAD_WEBPUSH_ASSET_SUCCESS,
485
- data: mockData,
486
- statusCode: 400,
487
- };
488
-
489
- const currentState = initialState.set('assetUploading', true);
490
- const expectedState = currentState
491
- .set('uploadAssetSuccess', false)
492
- .set('assetUploading', false)
493
- .set('uploadedAssetData', mockData);
494
-
495
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
496
- });
497
-
498
- it.concurrent('should handle success with statusCode 299 (success)', () => {
499
- const mockData = { url: 'https://example.com/image.jpg' };
500
- const action = {
501
- type: types.UPLOAD_WEBPUSH_ASSET_SUCCESS,
502
- data: mockData,
503
- statusCode: 299,
504
- };
505
-
506
- const currentState = initialState.set('assetUploading', true);
507
- const expectedState = currentState
508
- .set('uploadAssetSuccess', true)
509
- .set('assetUploading', false)
510
- .set('uploadedAssetData', mockData);
511
-
512
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
513
- });
514
-
515
- it.concurrent('should set uploadAssetSuccess to false when statusCode is 300', () => {
516
- const mockData = { url: 'https://example.com/image.jpg' };
517
- const action = {
518
- type: types.UPLOAD_WEBPUSH_ASSET_SUCCESS,
519
- data: mockData,
520
- statusCode: 300,
521
- };
522
-
523
- const currentState = initialState.set('assetUploading', true);
524
- const expectedState = currentState
525
- .set('uploadAssetSuccess', false)
526
- .set('assetUploading', false)
527
- .set('uploadedAssetData', mockData);
528
-
529
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
530
- });
531
-
532
- it.concurrent('should handle success without statusCode', () => {
533
- const mockData = { url: 'https://example.com/image.jpg' };
534
- const action = {
535
- type: types.UPLOAD_WEBPUSH_ASSET_SUCCESS,
536
- data: mockData,
537
- };
538
-
539
- const currentState = initialState.set('assetUploading', true);
540
- const expectedState = currentState
541
- .set('uploadAssetSuccess', false)
542
- .set('assetUploading', false)
543
- .set('uploadedAssetData', mockData);
544
-
545
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
546
- });
547
-
548
- it.concurrent('should set uploadAssetSuccess to false when statusCode is empty string', () => {
549
- const mockData = { url: 'https://example.com/image.jpg' };
550
- const action = {
551
- type: types.UPLOAD_WEBPUSH_ASSET_SUCCESS,
552
- data: mockData,
553
- statusCode: '',
554
- };
555
-
556
- const currentState = initialState.set('assetUploading', true);
557
- const expectedState = currentState
558
- .set('uploadAssetSuccess', false)
559
- .set('assetUploading', false)
560
- .set('uploadedAssetData', mockData);
561
-
562
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
563
- });
564
-
565
- it.concurrent('should store asset data with templateType when provided', () => {
566
- const mockData = { url: 'https://example.com/brand-icon.png' };
567
- const action = {
568
- type: types.UPLOAD_WEBPUSH_ASSET_SUCCESS,
569
- data: mockData,
570
- statusCode: 200,
571
- templateType: 'BrandIcon',
572
- };
573
-
574
- const currentState = initialState.set('assetUploading', true);
575
- const expectedState = currentState
576
- .set('uploadAssetSuccess', true)
577
- .set('assetUploading', false)
578
- .set('uploadedAssetDataBrandIcon', mockData);
579
-
580
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
581
- });
582
-
583
- it.concurrent('should store asset data without templateType when not provided', () => {
584
- const mockData = { url: 'https://example.com/image.jpg' };
585
- const action = {
586
- type: types.UPLOAD_WEBPUSH_ASSET_SUCCESS,
587
- data: mockData,
588
- statusCode: 200,
589
- };
590
-
591
- const currentState = initialState.set('assetUploading', true);
592
- const expectedState = currentState
593
- .set('uploadAssetSuccess', true)
594
- .set('assetUploading', false)
595
- .set('uploadedAssetData', mockData);
596
-
597
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
598
- });
599
-
600
- it.concurrent('should handle success with different templateType values', () => {
601
- const mockData = { url: 'https://example.com/media.jpg' };
602
- const action = {
603
- type: types.UPLOAD_WEBPUSH_ASSET_SUCCESS,
604
- data: mockData,
605
- statusCode: 200,
606
- templateType: 'Media',
607
- };
608
-
609
- const currentState = initialState.set('assetUploading', true);
610
- const result = webPushReducer(currentState, action);
611
-
612
- expect(result.get('uploadAssetSuccess')).toBe(true);
613
- expect(result.get('assetUploading')).toBe(false);
614
- expect(result.get('uploadedAssetDataMedia')).toEqual(mockData);
615
- });
616
- });
617
-
618
- describe('UPLOAD_WEBPUSH_ASSET_FAILURE', () => {
619
- it.concurrent('should set uploadAssetSuccess to false and assetUploading to false', () => {
620
- const action = { type: types.UPLOAD_WEBPUSH_ASSET_FAILURE };
621
- const currentState = initialState
622
- .set('uploadAssetSuccess', true)
623
- .set('assetUploading', true);
624
-
625
- const expectedState = currentState
626
- .set('uploadAssetSuccess', false)
627
- .set('assetUploading', false);
628
-
629
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
630
- });
631
-
632
- it.concurrent('should handle failure when upload was in progress', () => {
633
- const action = { type: types.UPLOAD_WEBPUSH_ASSET_FAILURE };
634
- const currentState = initialState.set('assetUploading', true);
635
-
636
- const expectedState = currentState
637
- .set('uploadAssetSuccess', false)
638
- .set('assetUploading', false);
639
-
640
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
641
- });
642
-
643
- it.concurrent('should handle failure when upload was already successful', () => {
644
- const action = { type: types.UPLOAD_WEBPUSH_ASSET_FAILURE };
645
- const currentState = initialState
646
- .set('uploadAssetSuccess', true)
647
- .set('assetUploading', false)
648
- .set('uploadedAssetData', { url: 'https://example.com/image.jpg' });
649
-
650
- const expectedState = currentState
651
- .set('uploadAssetSuccess', false)
652
- .set('assetUploading', false);
653
-
654
- expect(webPushReducer(currentState, action)).toEqual(expectedState);
655
- });
656
- });
657
-
658
- describe('CLEAR_WEBPUSH_ASSET', () => {
659
- it.concurrent('should delete uploadedAssetData when templateType is not provided', () => {
660
- const currentState = initialState.set('uploadedAssetData', { url: 'https://example.com/image.jpg' });
661
- const action = { type: types.CLEAR_WEBPUSH_ASSET };
662
- const result = webPushReducer(currentState, action);
663
-
664
- expect(result.has('uploadedAssetData')).toBe(false);
665
- });
666
-
667
- it.concurrent('should delete uploadedAssetData with templateType when provided', () => {
668
- const currentState = initialState.set('uploadedAssetDataBrandIcon', { url: 'https://example.com/brand-icon.png' });
669
- const action = {
670
- type: types.CLEAR_WEBPUSH_ASSET,
671
- templateType: 'BrandIcon',
672
- };
673
- const result = webPushReducer(currentState, action);
674
-
675
- expect(result.has('uploadedAssetDataBrandIcon')).toBe(false);
676
- });
677
-
678
- it.concurrent('should handle clear when asset data does not exist', () => {
679
- const action = { type: types.CLEAR_WEBPUSH_ASSET };
680
- const result = webPushReducer(initialState, action);
681
-
682
- expect(result.has('uploadedAssetData')).toBe(false);
683
- });
684
-
685
- it.concurrent('should handle clear with different templateType values', () => {
686
- const currentState = initialState.set('uploadedAssetDataMedia', { url: 'https://example.com/media.jpg' });
687
- const action = {
688
- type: types.CLEAR_WEBPUSH_ASSET,
689
- templateType: 'Media',
690
- };
691
- const result = webPushReducer(currentState, action);
692
-
693
- expect(result.has('uploadedAssetDataMedia')).toBe(false);
694
- });
695
-
696
- it.concurrent('should only delete the specified templateType asset, not others', () => {
697
- const currentState = initialState
698
- .set('uploadedAssetData', { url: 'https://example.com/default.jpg' })
699
- .set('uploadedAssetDataBrandIcon', { url: 'https://example.com/brand-icon.png' });
700
-
701
- const action = {
702
- type: types.CLEAR_WEBPUSH_ASSET,
703
- templateType: 'BrandIcon',
704
- };
705
- const result = webPushReducer(currentState, action);
706
-
707
- expect(result.has('uploadedAssetDataBrandIcon')).toBe(false);
708
- expect(result.has('uploadedAssetData')).toBe(true);
709
- });
710
- });
711
-
712
- describe('Default Case', () => {
713
- it.concurrent('should return current state for unknown action types', () => {
714
- const currentState = initialState.set('createTemplateInProgress', true);
715
- const action = { type: 'UNKNOWN_ACTION_TYPE' };
716
- expect(webPushReducer(currentState, action)).toEqual(currentState);
717
- });
718
- });
719
-
720
- describe('Integration Scenarios', () => {
721
- it.concurrent('should handle complete create template flow', () => {
722
- let state = initialState;
723
-
724
- // Request
725
- state = webPushReducer(state, { type: types.CREATE_TEMPLATE_REQUEST });
726
- expect(state.get('createTemplateInProgress')).toBe(true);
727
- expect(state.get('createTemplateError')).toBe(false);
728
-
729
- // Success
730
- const mockData = { id: 1, name: 'Test Template' };
731
- state = webPushReducer(state, {
732
- type: types.CREATE_TEMPLATE_SUCCESS,
733
- data: mockData,
734
- statusCode: 200,
735
- });
736
- expect(state.get('createTemplateInProgress')).toBe(false);
737
- expect(state.get('response')).toEqual(mockData);
738
- expect(state.get('createTemplateError')).toBe(false);
739
-
740
- // Clear
741
- state = webPushReducer(state, { type: types.CLEAR_CREATE_RESPONSE_REQUEST });
742
- expect(state.get('response')).toEqual({});
743
- });
744
-
745
- it.concurrent('should handle create template failure flow', () => {
746
- let state = initialState;
747
-
748
- // Request
749
- state = webPushReducer(state, { type: types.CREATE_TEMPLATE_REQUEST });
750
- expect(state.get('createTemplateInProgress')).toBe(true);
751
-
752
- // Failure
753
- state = webPushReducer(state, {
754
- type: types.CREATE_TEMPLATE_FAILURE,
755
- error: 'Creation failed',
756
- });
757
- expect(state.get('createTemplateInProgress')).toBe(false);
758
- expect(state.get('createTemplateError')).toBe(true);
759
- expect(state.get('createTemplateErrorMessage')).toEqual(fromJS('Creation failed'));
760
- });
761
-
762
- it.concurrent('should handle complete edit template flow', () => {
763
- let state = initialState;
764
-
765
- // Request
766
- state = webPushReducer(state, { type: types.EDIT_TEMPLATE_REQUEST });
767
- expect(state.get('editTemplateInProgress')).toBe(true);
768
-
769
- // Success
770
- const mockData = { id: 1, name: 'Updated Template' };
771
- state = webPushReducer(state, {
772
- type: types.EDIT_TEMPLATE_SUCCESS,
773
- data: mockData,
774
- statusCode: 200,
775
- });
776
- expect(state.get('editTemplateInProgress')).toBe(false);
777
- expect(state.get('editResponse')).toEqual(mockData);
778
-
779
- // Clear
780
- state = webPushReducer(state, { type: types.CLEAR_EDIT_RESPONSE_REQUEST });
781
- expect(state.get('editResponse')).toEqual({});
782
- });
783
-
784
- it.concurrent('should handle edit template failure flow', () => {
785
- let state = initialState;
786
-
787
- // Request
788
- state = webPushReducer(state, { type: types.EDIT_TEMPLATE_REQUEST });
789
- expect(state.get('editTemplateInProgress')).toBe(true);
790
-
791
- // Failure
792
- state = webPushReducer(state, {
793
- type: types.EDIT_TEMPLATE_FAILURE,
794
- error: 'Update failed',
795
- });
796
- expect(state.get('editTemplateInProgress')).toBe(false);
797
- expect(state.get('editTemplateError')).toBe(true);
798
- expect(state.get('editTemplateErrorMessage')).toEqual(fromJS('Update failed'));
799
- });
800
-
801
- it.concurrent('should handle complete asset upload flow', () => {
802
- let state = initialState;
803
-
804
- // Request
805
- state = webPushReducer(state, { type: types.UPLOAD_WEBPUSH_ASSET_REQUEST });
806
- expect(state.get('assetUploading')).toBe(true);
807
- expect(state.get('uploadAssetSuccess')).toBe(false);
808
-
809
- // Success
810
- const mockData = { url: 'https://example.com/image.jpg' };
811
- state = webPushReducer(state, {
812
- type: types.UPLOAD_WEBPUSH_ASSET_SUCCESS,
813
- data: mockData,
814
- statusCode: 200,
815
- });
816
- expect(state.get('assetUploading')).toBe(false);
817
- expect(state.get('uploadAssetSuccess')).toBe(true);
818
- expect(state.get('uploadedAssetData')).toEqual(mockData);
819
-
820
- // Clear
821
- state = webPushReducer(state, { type: types.CLEAR_WEBPUSH_ASSET });
822
- expect(state.has('uploadedAssetData')).toBe(false);
823
- });
824
-
825
- it.concurrent('should handle asset upload failure flow', () => {
826
- let state = initialState;
827
-
828
- // Request
829
- state = webPushReducer(state, { type: types.UPLOAD_WEBPUSH_ASSET_REQUEST });
830
- expect(state.get('assetUploading')).toBe(true);
831
-
832
- // Failure
833
- state = webPushReducer(state, { type: types.UPLOAD_WEBPUSH_ASSET_FAILURE });
834
- expect(state.get('assetUploading')).toBe(false);
835
- expect(state.get('uploadAssetSuccess')).toBe(false);
836
- });
837
-
838
- it.concurrent('should handle asset upload with templateType flow', () => {
839
- let state = initialState;
840
-
841
- // Request
842
- state = webPushReducer(state, { type: types.UPLOAD_WEBPUSH_ASSET_REQUEST });
843
-
844
- // Success with templateType
845
- const mockData = { url: 'https://example.com/brand-icon.png' };
846
- state = webPushReducer(state, {
847
- type: types.UPLOAD_WEBPUSH_ASSET_SUCCESS,
848
- data: mockData,
849
- statusCode: 200,
850
- templateType: 'BrandIcon',
851
- });
852
- expect(state.get('uploadedAssetDataBrandIcon')).toEqual(mockData);
853
-
854
- // Clear with templateType
855
- state = webPushReducer(state, {
856
- type: types.CLEAR_WEBPUSH_ASSET,
857
- templateType: 'BrandIcon',
858
- });
859
- expect(state.has('uploadedAssetDataBrandIcon')).toBe(false);
860
- });
861
- });
862
- });
863
-