@capillarytech/creatives-library 8.0.242-alpha.0 → 8.0.242-alpha.10

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 (216) hide show
  1. package/assets/Android.png +0 -0
  2. package/assets/iOS.png +0 -0
  3. package/constants/unified.js +2 -1
  4. package/initialReducer.js +2 -0
  5. package/package.json +1 -1
  6. package/sagas/__tests__/assetPolling.test.js +74 -3
  7. package/sagas/assetPolling.js +8 -1
  8. package/services/api.js +10 -5
  9. package/services/tests/api.test.js +18 -0
  10. package/translations/en.json +0 -1
  11. package/utils/common.js +5 -0
  12. package/utils/commonUtils.js +14 -1
  13. package/utils/tests/commonUtil.test.js +224 -0
  14. package/utils/transformTemplateConfig.js +0 -10
  15. package/utils/transformerUtils.js +0 -42
  16. package/v2Components/CapDeviceContent/index.js +61 -56
  17. package/v2Components/CapImageUpload/constants.js +0 -2
  18. package/v2Components/CapImageUpload/index.js +14 -54
  19. package/v2Components/CapImageUpload/index.scss +1 -4
  20. package/v2Components/CapImageUpload/messages.js +0 -4
  21. package/v2Components/CapTagList/index.js +6 -1
  22. package/v2Components/CapTagListWithInput/index.js +5 -1
  23. package/v2Components/CapTagListWithInput/messages.js +1 -1
  24. package/v2Components/CapWhatsappCTA/tests/index.test.js +5 -0
  25. package/v2Components/ErrorInfoNote/index.js +412 -72
  26. package/v2Components/ErrorInfoNote/messages.js +22 -0
  27. package/v2Components/ErrorInfoNote/style.scss +279 -2
  28. package/v2Components/HtmlEditor/HTMLEditor.js +220 -91
  29. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +1132 -133
  30. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +17 -12
  31. package/v2Components/HtmlEditor/_htmlEditor.scss +107 -45
  32. package/v2Components/HtmlEditor/_index.lazy.scss +1 -1
  33. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +13 -101
  34. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +148 -139
  35. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +2 -1
  36. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  37. package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +9 -0
  38. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
  39. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +22 -0
  40. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +4 -7
  41. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +35 -45
  42. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +1 -3
  43. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  44. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +7 -6
  45. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +3 -6
  46. package/v2Components/HtmlEditor/components/PreviewPane/index.js +10 -11
  47. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  48. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +70 -72
  49. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +49 -31
  50. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +254 -0
  51. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +362 -0
  52. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +51 -0
  53. package/v2Components/HtmlEditor/constants.js +29 -20
  54. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +373 -16
  55. package/v2Components/HtmlEditor/hooks/useEditorContent.js +5 -2
  56. package/v2Components/HtmlEditor/hooks/useInAppContent.js +88 -146
  57. package/v2Components/HtmlEditor/index.js +1 -1
  58. package/v2Components/HtmlEditor/messages.js +95 -85
  59. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +99 -101
  60. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +23 -25
  61. package/v2Components/HtmlEditor/utils/validationAdapter.js +34 -41
  62. package/v2Components/MobilePushPreviewV2/index.js +32 -7
  63. package/v2Components/TemplatePreview/_templatePreview.scss +44 -24
  64. package/v2Components/TemplatePreview/index.js +47 -32
  65. package/v2Components/TemplatePreview/messages.js +4 -0
  66. package/v2Components/TestAndPreviewSlidebox/index.js +31 -25
  67. package/v2Containers/App/constants.js +0 -5
  68. package/v2Containers/BeeEditor/index.js +82 -80
  69. package/v2Containers/BeePopupEditor/constants.js +10 -0
  70. package/v2Containers/BeePopupEditor/index.js +193 -0
  71. package/v2Containers/BeePopupEditor/tests/index.test.js +627 -0
  72. package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +0 -1
  73. package/v2Containers/CreativesContainer/SlideBoxContent.js +148 -120
  74. package/v2Containers/CreativesContainer/SlideBoxFooter.js +9 -3
  75. package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
  76. package/v2Containers/CreativesContainer/constants.js +1 -2
  77. package/v2Containers/CreativesContainer/index.js +173 -193
  78. package/v2Containers/CreativesContainer/messages.js +4 -4
  79. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +38 -50
  80. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +36 -0
  81. package/v2Containers/Email/actions.js +7 -0
  82. package/v2Containers/Email/constants.js +5 -1
  83. package/v2Containers/Email/index.js +13 -0
  84. package/v2Containers/Email/messages.js +32 -0
  85. package/v2Containers/Email/reducer.js +12 -1
  86. package/v2Containers/Email/sagas.js +41 -6
  87. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +2 -0
  88. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +1046 -0
  89. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +193 -7
  90. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +40 -74
  91. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +2 -67
  92. package/v2Containers/EmailWrapper/constants.js +2 -0
  93. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +436 -67
  94. package/v2Containers/EmailWrapper/index.js +99 -23
  95. package/v2Containers/EmailWrapper/messages.js +61 -1
  96. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +111 -77
  97. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +376 -0
  98. package/v2Containers/InApp/__tests__/sagas.test.js +363 -0
  99. package/v2Containers/InApp/actions.js +7 -0
  100. package/v2Containers/InApp/constants.js +20 -4
  101. package/v2Containers/InApp/index.js +801 -357
  102. package/v2Containers/InApp/index.scss +4 -3
  103. package/v2Containers/InApp/messages.js +7 -3
  104. package/v2Containers/InApp/reducer.js +21 -3
  105. package/v2Containers/InApp/sagas.js +29 -9
  106. package/v2Containers/InApp/selectors.js +25 -5
  107. package/v2Containers/InApp/tests/index.test.js +154 -50
  108. package/v2Containers/InApp/tests/reducer.test.js +34 -0
  109. package/v2Containers/InApp/tests/sagas.test.js +61 -9
  110. package/v2Containers/InApp/tests/selectors.test.js +612 -0
  111. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +162 -0
  112. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +267 -0
  113. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +9 -0
  114. package/v2Containers/InAppWrapper/constants.js +16 -0
  115. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +473 -0
  116. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +198 -0
  117. package/v2Containers/InAppWrapper/index.js +148 -0
  118. package/v2Containers/InAppWrapper/messages.js +49 -0
  119. package/v2Containers/InappAdvance/index.js +1099 -0
  120. package/v2Containers/InappAdvance/index.scss +10 -0
  121. package/v2Containers/InappAdvance/tests/index.test.js +448 -0
  122. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +3 -3
  123. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +2 -2
  124. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +2 -25
  125. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +9 -18
  126. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +12 -46
  127. package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +0 -4
  128. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4 -8
  129. package/v2Containers/TagList/index.js +67 -1
  130. package/v2Containers/Templates/ChannelTypeIllustration.js +1 -13
  131. package/v2Containers/Templates/_templates.scss +56 -200
  132. package/v2Containers/Templates/actions.js +1 -2
  133. package/v2Containers/Templates/constants.js +0 -1
  134. package/v2Containers/Templates/index.js +124 -277
  135. package/v2Containers/Templates/messages.js +4 -24
  136. package/v2Containers/Templates/reducer.js +0 -2
  137. package/v2Containers/Templates/tests/index.test.js +0 -10
  138. package/v2Containers/TemplatesV2/index.js +2 -3
  139. package/v2Containers/TemplatesV2/messages.js +0 -4
  140. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +35 -132
  141. package/v2Components/CapImageUrlUpload/constants.js +0 -19
  142. package/v2Components/CapImageUrlUpload/index.js +0 -455
  143. package/v2Components/CapImageUrlUpload/index.scss +0 -35
  144. package/v2Components/CapImageUrlUpload/messages.js +0 -47
  145. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +0 -214
  146. package/v2Containers/WebPush/Create/components/ButtonForm.js +0 -175
  147. package/v2Containers/WebPush/Create/components/ButtonItem.js +0 -101
  148. package/v2Containers/WebPush/Create/components/ButtonList.js +0 -144
  149. package/v2Containers/WebPush/Create/components/_buttons.scss +0 -246
  150. package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +0 -554
  151. package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +0 -607
  152. package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +0 -633
  153. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +0 -666
  154. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +0 -74
  155. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +0 -80
  156. package/v2Containers/WebPush/Create/index.js +0 -1755
  157. package/v2Containers/WebPush/Create/index.scss +0 -123
  158. package/v2Containers/WebPush/Create/messages.js +0 -199
  159. package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +0 -241
  160. package/v2Containers/WebPush/Create/preview/NotificationContainer.js +0 -290
  161. package/v2Containers/WebPush/Create/preview/PreviewContent.js +0 -81
  162. package/v2Containers/WebPush/Create/preview/PreviewControls.js +0 -240
  163. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +0 -23
  164. package/v2Containers/WebPush/Create/preview/WebPushPreview.js +0 -144
  165. package/v2Containers/WebPush/Create/preview/assets/Light.svg +0 -53
  166. package/v2Containers/WebPush/Create/preview/assets/Top.svg +0 -5
  167. package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
  168. package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
  169. package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +0 -106
  170. package/v2Containers/WebPush/Create/preview/assets/iOS.svg +0 -26
  171. package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +0 -18
  172. package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +0 -29
  173. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +0 -44
  174. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +0 -110
  175. package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +0 -45
  176. package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +0 -72
  177. package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +0 -55
  178. package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +0 -70
  179. package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +0 -512
  180. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +0 -77
  181. package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +0 -527
  182. package/v2Containers/WebPush/Create/preview/constants.js +0 -162
  183. package/v2Containers/WebPush/Create/preview/notification-container.scss +0 -104
  184. package/v2Containers/WebPush/Create/preview/preview.scss +0 -409
  185. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +0 -300
  186. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +0 -12
  187. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +0 -12
  188. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +0 -12
  189. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +0 -303
  190. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +0 -11
  191. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +0 -11
  192. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +0 -11
  193. package/v2Containers/WebPush/Create/preview/styles/_base.scss +0 -188
  194. package/v2Containers/WebPush/Create/preview/styles/_ios.scss +0 -106
  195. package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +0 -107
  196. package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +0 -75
  197. package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +0 -174
  198. package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +0 -909
  199. package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +0 -1077
  200. package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +0 -723
  201. package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +0 -943
  202. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +0 -128
  203. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +0 -121
  204. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +0 -144
  205. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +0 -127
  206. package/v2Containers/WebPush/Create/utils/urlValidation.js +0 -116
  207. package/v2Containers/WebPush/Create/utils/urlValidation.test.js +0 -449
  208. package/v2Containers/WebPush/actions.js +0 -60
  209. package/v2Containers/WebPush/constants.js +0 -108
  210. package/v2Containers/WebPush/index.js +0 -2
  211. package/v2Containers/WebPush/reducer.js +0 -104
  212. package/v2Containers/WebPush/sagas.js +0 -119
  213. package/v2Containers/WebPush/selectors.js +0 -65
  214. package/v2Containers/WebPush/tests/reducer.test.js +0 -863
  215. package/v2Containers/WebPush/tests/sagas.test.js +0 -566
  216. package/v2Containers/WebPush/tests/selectors.test.js +0 -960
@@ -1,512 +0,0 @@
1
- import React from 'react';
2
- import { shallowWithIntl, mountWithIntl } from '../../../../../../helpers/intl-enzym-test-helpers';
3
- import AndroidMobileExpanded from '../AndroidMobileExpanded';
4
-
5
- describe('AndroidMobileExpanded', () => {
6
- const defaultProps = {
7
- icon: 'https://example.com/chrome-icon.png',
8
- selectedBrowser: 'Chrome',
9
- notificationTitle: 'Test Notification Title',
10
- notificationBody: 'Test notification body text that can be quite long and should be truncated after 4 lines',
11
- displayUrl: 'example.com',
12
- brandIcon: 'https://example.com/brand-icon.png',
13
- shouldShowBrandIcon: false,
14
- shouldShowBrandIconExpanded: false,
15
- mediaImageUrl: '',
16
- };
17
-
18
- beforeEach(() => {
19
- jest.clearAllMocks();
20
- });
21
-
22
- describe('Basic Rendering', () => {
23
- it('should render correctly with default props', () => {
24
- const wrapper = shallowWithIntl(<AndroidMobileExpanded {...defaultProps} />);
25
- expect(wrapper).toMatchSnapshot();
26
- });
27
-
28
- it('should render all required elements', () => {
29
- const wrapper = mountWithIntl(<AndroidMobileExpanded {...defaultProps} />);
30
-
31
- // Browser icon container
32
- expect(wrapper.find('.android-mobile-expanded-icon').exists()).toBe(true);
33
- expect(wrapper.find('.notification-icon-container').exists()).toBe(true);
34
- expect(wrapper.find('.notification-icon').exists()).toBe(true);
35
-
36
- // Wrapper container
37
- expect(wrapper.find('.android-mobile-expanded-wrapper').exists()).toBe(true);
38
-
39
- // Top section
40
- expect(wrapper.find('.android-mobile-expanded-top').exists()).toBe(true);
41
- expect(wrapper.find('.android-mobile-expanded-top-content').exists()).toBe(true);
42
-
43
- // Header
44
- expect(wrapper.find('.android-mobile-expanded-header').exists()).toBe(true);
45
- expect(wrapper.find('.android-mobile-expanded-header-content').exists()).toBe(true);
46
- expect(wrapper.find('.android-mobile-expanded-browser-name').exists()).toBe(true);
47
- expect(wrapper.find('.android-mobile-expanded-domain-time').exists()).toBe(true);
48
- expect(wrapper.find('.android-mobile-expanded-domain').exists()).toBe(true);
49
- expect(wrapper.find('.android-mobile-expanded-time').exists()).toBe(true);
50
-
51
- // Title
52
- expect(wrapper.find('.android-mobile-expanded-title').exists()).toBe(true);
53
-
54
- // Body
55
- expect(wrapper.find('.android-mobile-expanded-body').exists()).toBe(true);
56
- expect(wrapper.find('.android-mobile-expanded-body-text').exists()).toBe(true);
57
-
58
- // Arrow
59
- expect(wrapper.find('.notification-action-arrow.android-mobile-expanded-arrow').exists()).toBe(true);
60
- });
61
-
62
- it('should render browser icon with correct src and alt', () => {
63
- const wrapper = mountWithIntl(<AndroidMobileExpanded {...defaultProps} />);
64
- const icon = wrapper.find('.notification-icon');
65
-
66
- expect(icon.exists()).toBe(true);
67
- expect(icon.prop('src')).toBe(defaultProps.icon);
68
- expect(icon.prop('alt')).toBe(defaultProps.selectedBrowser);
69
- });
70
-
71
- it('should render notification title', () => {
72
- const wrapper = mountWithIntl(<AndroidMobileExpanded {...defaultProps} />);
73
- const title = wrapper.find('.android-mobile-expanded-title');
74
-
75
- expect(title.exists()).toBe(true);
76
- expect(title.text()).toBe(defaultProps.notificationTitle);
77
- });
78
-
79
- it('should render notification body', () => {
80
- const wrapper = mountWithIntl(<AndroidMobileExpanded {...defaultProps} />);
81
- const body = wrapper.find('.android-mobile-expanded-body-text');
82
-
83
- expect(body.exists()).toBe(true);
84
- expect(body.text()).toBe(defaultProps.notificationBody);
85
- });
86
-
87
- it('should render display URL', () => {
88
- const wrapper = mountWithIntl(<AndroidMobileExpanded {...defaultProps} />);
89
- const domain = wrapper.find('.android-mobile-expanded-domain');
90
-
91
- expect(domain.exists()).toBe(true);
92
- expect(domain.text()).toBe(defaultProps.displayUrl);
93
- });
94
-
95
- it('should render hardcoded time', () => {
96
- const wrapper = mountWithIntl(<AndroidMobileExpanded {...defaultProps} />);
97
- const time = wrapper.find('.android-mobile-expanded-time');
98
-
99
- expect(time.exists()).toBe(true);
100
- expect(time.text()).toBe('2:29 PM');
101
- });
102
-
103
- it('should render arrow icon', () => {
104
- const wrapper = mountWithIntl(<AndroidMobileExpanded {...defaultProps} />);
105
- const arrow = wrapper.find('.notification-action-arrow.android-mobile-expanded-arrow');
106
-
107
- expect(arrow.exists()).toBe(true);
108
- expect(arrow.text()).toBe('^');
109
- });
110
- });
111
-
112
- describe('getBrowserDisplayName', () => {
113
- it('should return "Chrome" for Chrome browser', () => {
114
- const wrapper = mountWithIntl(
115
- <AndroidMobileExpanded {...defaultProps} selectedBrowser="Chrome" />
116
- );
117
- const browserName = wrapper.find('.android-mobile-expanded-browser-name');
118
-
119
- expect(browserName.text()).toBe('Chrome');
120
- });
121
-
122
- it('should return "Firefox" for Firefox browser', () => {
123
- const wrapper = mountWithIntl(
124
- <AndroidMobileExpanded {...defaultProps} selectedBrowser="Firefox" />
125
- );
126
- const browserName = wrapper.find('.android-mobile-expanded-browser-name');
127
-
128
- expect(browserName.text()).toBe('Firefox');
129
- });
130
-
131
- it('should return "Edge" for Edge browser', () => {
132
- const wrapper = mountWithIntl(
133
- <AndroidMobileExpanded {...defaultProps} selectedBrowser="Edge" />
134
- );
135
- const browserName = wrapper.find('.android-mobile-expanded-browser-name');
136
-
137
- expect(browserName.text()).toBe('Edge');
138
- });
139
-
140
- it('should return "Opera" for Opera browser', () => {
141
- const wrapper = mountWithIntl(
142
- <AndroidMobileExpanded {...defaultProps} selectedBrowser="Opera" />
143
- );
144
- const browserName = wrapper.find('.android-mobile-expanded-browser-name');
145
-
146
- expect(browserName.text()).toBe('Opera');
147
- });
148
-
149
- it('should return the browser name as-is for unknown browsers', () => {
150
- const unknownBrowser = 'Safari';
151
- const wrapper = mountWithIntl(
152
- <AndroidMobileExpanded {...defaultProps} selectedBrowser={unknownBrowser} />
153
- );
154
- const browserName = wrapper.find('.android-mobile-expanded-browser-name');
155
-
156
- expect(browserName.text()).toBe(unknownBrowser);
157
- });
158
-
159
- it('should handle empty string browser name', () => {
160
- const wrapper = mountWithIntl(
161
- <AndroidMobileExpanded {...defaultProps} selectedBrowser="" />
162
- );
163
- const browserName = wrapper.find('.android-mobile-expanded-browser-name');
164
-
165
- expect(browserName.text()).toBe('');
166
- });
167
-
168
- it('should handle case-sensitive browser names', () => {
169
- const wrapper = mountWithIntl(
170
- <AndroidMobileExpanded {...defaultProps} selectedBrowser="chrome" />
171
- );
172
- const browserName = wrapper.find('.android-mobile-expanded-browser-name');
173
-
174
- // Should return as-is since "chrome" (lowercase) is not in the mapping
175
- expect(browserName.text()).toBe('chrome');
176
- });
177
- });
178
-
179
- describe('Brand Icon Display Logic', () => {
180
- it('should show brand icon when shouldShowBrandIconExpanded is true and brandIcon exists', () => {
181
- const wrapper = mountWithIntl(
182
- <AndroidMobileExpanded
183
- {...defaultProps}
184
- shouldShowBrandIconExpanded={true}
185
- brandIcon="https://example.com/brand-icon.png"
186
- />
187
- );
188
-
189
- const brandIconContainer = wrapper.find('.notification-brand-icon-container.android-mobile-chrome-brand-icon');
190
- expect(brandIconContainer.exists()).toBe(true);
191
-
192
- const brandIcon = wrapper.find('.notification-brand-icon');
193
- expect(brandIcon.exists()).toBe(true);
194
- expect(brandIcon.prop('src')).toBe('https://example.com/brand-icon.png');
195
- expect(brandIcon.prop('alt')).toBe('Brand icon');
196
- });
197
-
198
- it('should show brand icon when shouldShowBrandIcon is true and brandIcon exists', () => {
199
- const wrapper = mountWithIntl(
200
- <AndroidMobileExpanded
201
- {...defaultProps}
202
- shouldShowBrandIcon={true}
203
- brandIcon="https://example.com/brand-icon.png"
204
- />
205
- );
206
-
207
- const brandIconContainer = wrapper.find('.notification-brand-icon-container.android-mobile-chrome-brand-icon');
208
- expect(brandIconContainer.exists()).toBe(true);
209
-
210
- const brandIcon = wrapper.find('.notification-brand-icon');
211
- expect(brandIcon.exists()).toBe(true);
212
- expect(brandIcon.prop('src')).toBe('https://example.com/brand-icon.png');
213
- });
214
-
215
- it('should show brand icon when both shouldShowBrandIcon and shouldShowBrandIconExpanded are true', () => {
216
- const wrapper = mountWithIntl(
217
- <AndroidMobileExpanded
218
- {...defaultProps}
219
- shouldShowBrandIcon={true}
220
- shouldShowBrandIconExpanded={true}
221
- brandIcon="https://example.com/brand-icon.png"
222
- />
223
- );
224
-
225
- const brandIconContainer = wrapper.find('.notification-brand-icon-container.android-mobile-chrome-brand-icon');
226
- expect(brandIconContainer.exists()).toBe(true);
227
- });
228
-
229
- it('should not show brand icon when both shouldShowBrandIcon and shouldShowBrandIconExpanded are false', () => {
230
- const wrapper = mountWithIntl(
231
- <AndroidMobileExpanded
232
- {...defaultProps}
233
- shouldShowBrandIcon={false}
234
- shouldShowBrandIconExpanded={false}
235
- brandIcon="https://example.com/brand-icon.png"
236
- />
237
- );
238
-
239
- const brandIconContainer = wrapper.find('.notification-brand-icon-container.android-mobile-chrome-brand-icon');
240
- expect(brandIconContainer.exists()).toBe(false);
241
- });
242
-
243
- it('should not show brand icon when brandIcon is not provided, even if shouldShowBrandIconExpanded is true', () => {
244
- const wrapper = mountWithIntl(
245
- <AndroidMobileExpanded
246
- {...defaultProps}
247
- shouldShowBrandIconExpanded={true}
248
- brandIcon=""
249
- />
250
- );
251
-
252
- const brandIconContainer = wrapper.find('.notification-brand-icon-container.android-mobile-chrome-brand-icon');
253
- expect(brandIconContainer.exists()).toBe(false);
254
- });
255
-
256
- it('should not show brand icon when brandIcon is not provided, even if shouldShowBrandIcon is true', () => {
257
- const wrapper = mountWithIntl(
258
- <AndroidMobileExpanded
259
- {...defaultProps}
260
- shouldShowBrandIcon={true}
261
- brandIcon={null}
262
- />
263
- );
264
-
265
- const brandIconContainer = wrapper.find('.notification-brand-icon-container.android-mobile-chrome-brand-icon');
266
- expect(brandIconContainer.exists()).toBe(false);
267
- });
268
-
269
- it('should not show brand icon when brandIcon is undefined', () => {
270
- const propsWithoutBrandIcon = { ...defaultProps };
271
- delete propsWithoutBrandIcon.brandIcon;
272
-
273
- const wrapper = mountWithIntl(
274
- <AndroidMobileExpanded
275
- {...propsWithoutBrandIcon}
276
- shouldShowBrandIcon={true}
277
- shouldShowBrandIconExpanded={true}
278
- />
279
- );
280
-
281
- const brandIconContainer = wrapper.find('.notification-brand-icon-container.android-mobile-chrome-brand-icon');
282
- expect(brandIconContainer.exists()).toBe(false);
283
- });
284
-
285
- it('should handle shouldShowBrandIconExpanded taking precedence when both flags are set', () => {
286
- // When shouldShowBrandIconExpanded is true, it should show (OR logic)
287
- const wrapper = mountWithIntl(
288
- <AndroidMobileExpanded
289
- {...defaultProps}
290
- shouldShowBrandIcon={false}
291
- shouldShowBrandIconExpanded={true}
292
- brandIcon="https://example.com/brand-icon.png"
293
- />
294
- );
295
-
296
- const brandIconContainer = wrapper.find('.notification-brand-icon-container.android-mobile-chrome-brand-icon');
297
- expect(brandIconContainer.exists()).toBe(true);
298
- });
299
- });
300
-
301
- describe('Media Image Display', () => {
302
- it('should render media image when mediaImageUrl is provided', () => {
303
- const wrapper = mountWithIntl(
304
- <AndroidMobileExpanded
305
- {...defaultProps}
306
- mediaImageUrl="https://example.com/media-image.jpg"
307
- />
308
- );
309
-
310
- const mediaContainer = wrapper.find('.android-mobile-expanded-media');
311
- expect(mediaContainer.exists()).toBe(true);
312
-
313
- const mediaImage = wrapper.find('.android-mobile-expanded-media-image');
314
- expect(mediaImage.exists()).toBe(true);
315
- expect(mediaImage.prop('src')).toBe('https://example.com/media-image.jpg');
316
- expect(mediaImage.prop('alt')).toBe('Notification media');
317
- });
318
-
319
- it('should not render media image when mediaImageUrl is empty string', () => {
320
- const wrapper = mountWithIntl(
321
- <AndroidMobileExpanded
322
- {...defaultProps}
323
- mediaImageUrl=""
324
- />
325
- );
326
-
327
- const mediaContainer = wrapper.find('.android-mobile-expanded-media');
328
- expect(mediaContainer.exists()).toBe(false);
329
- });
330
-
331
- it('should not render media image when mediaImageUrl is not provided', () => {
332
- const propsWithoutMedia = { ...defaultProps };
333
- delete propsWithoutMedia.mediaImageUrl;
334
-
335
- const wrapper = mountWithIntl(<AndroidMobileExpanded {...propsWithoutMedia} />);
336
-
337
- const mediaContainer = wrapper.find('.android-mobile-expanded-media');
338
- expect(mediaContainer.exists()).toBe(false);
339
- });
340
-
341
- it('should not render media image when mediaImageUrl is null', () => {
342
- const wrapper = mountWithIntl(
343
- <AndroidMobileExpanded
344
- {...defaultProps}
345
- mediaImageUrl={null}
346
- />
347
- );
348
-
349
- const mediaContainer = wrapper.find('.android-mobile-expanded-media');
350
- expect(mediaContainer.exists()).toBe(false);
351
- });
352
-
353
- it('should not render media image when mediaImageUrl is undefined', () => {
354
- const wrapper = mountWithIntl(
355
- <AndroidMobileExpanded
356
- {...defaultProps}
357
- mediaImageUrl={undefined}
358
- />
359
- );
360
-
361
- const mediaContainer = wrapper.find('.android-mobile-expanded-media');
362
- expect(mediaContainer.exists()).toBe(false);
363
- });
364
- });
365
-
366
- describe('Edge Cases and Optional Props', () => {
367
- it('should handle empty notification title', () => {
368
- const wrapper = mountWithIntl(
369
- <AndroidMobileExpanded {...defaultProps} notificationTitle="" />
370
- );
371
- const title = wrapper.find('.android-mobile-expanded-title');
372
-
373
- expect(title.exists()).toBe(true);
374
- expect(title.text()).toBe('');
375
- });
376
-
377
- it('should handle empty notification body', () => {
378
- const wrapper = mountWithIntl(
379
- <AndroidMobileExpanded {...defaultProps} notificationBody="" />
380
- );
381
- const body = wrapper.find('.android-mobile-expanded-body-text');
382
-
383
- expect(body.exists()).toBe(true);
384
- expect(body.text()).toBe('');
385
- });
386
-
387
- it('should handle empty display URL', () => {
388
- const wrapper = mountWithIntl(
389
- <AndroidMobileExpanded {...defaultProps} displayUrl="" />
390
- );
391
- const domain = wrapper.find('.android-mobile-expanded-domain');
392
-
393
- expect(domain.exists()).toBe(true);
394
- expect(domain.text()).toBe('');
395
- });
396
-
397
- it('should handle very long notification title', () => {
398
- const longTitle = 'A'.repeat(200);
399
- const wrapper = mountWithIntl(
400
- <AndroidMobileExpanded {...defaultProps} notificationTitle={longTitle} />
401
- );
402
- const title = wrapper.find('.android-mobile-expanded-title');
403
-
404
- expect(title.exists()).toBe(true);
405
- expect(title.text()).toBe(longTitle);
406
- });
407
-
408
- it('should handle very long notification body', () => {
409
- const longBody = 'B'.repeat(500);
410
- const wrapper = mountWithIntl(
411
- <AndroidMobileExpanded {...defaultProps} notificationBody={longBody} />
412
- );
413
- const body = wrapper.find('.android-mobile-expanded-body-text');
414
-
415
- expect(body.exists()).toBe(true);
416
- expect(body.text()).toBe(longBody);
417
- });
418
-
419
- it('should handle missing optional props gracefully', () => {
420
- const minimalProps = {
421
- icon: 'https://example.com/icon.png',
422
- selectedBrowser: 'Chrome',
423
- };
424
-
425
- const wrapper = mountWithIntl(<AndroidMobileExpanded {...minimalProps} />);
426
-
427
- // Should still render all structural elements
428
- expect(wrapper.find('.android-mobile-expanded-wrapper').exists()).toBe(true);
429
- expect(wrapper.find('.android-mobile-expanded-title').exists()).toBe(true);
430
- expect(wrapper.find('.android-mobile-expanded-body-text').exists()).toBe(true);
431
- });
432
- });
433
-
434
- describe('Component Structure', () => {
435
- it('should have correct DOM hierarchy', () => {
436
- const wrapper = mountWithIntl(<AndroidMobileExpanded {...defaultProps} />);
437
-
438
- // Icon should be sibling to wrapper
439
- const icon = wrapper.find('.android-mobile-expanded-icon');
440
- const wrapperDiv = wrapper.find('.android-mobile-expanded-wrapper');
441
- const arrow = wrapper.find('.notification-action-arrow.android-mobile-expanded-arrow');
442
-
443
- expect(icon.exists()).toBe(true);
444
- expect(wrapperDiv.exists()).toBe(true);
445
- expect(arrow.exists()).toBe(true);
446
-
447
- // Top section should contain header and title
448
- const topSection = wrapper.find('.android-mobile-expanded-top');
449
- expect(topSection.find('.android-mobile-expanded-header').exists()).toBe(true);
450
- expect(topSection.find('.android-mobile-expanded-title').exists()).toBe(true);
451
-
452
- // Body should contain body text
453
- const bodySection = wrapper.find('.android-mobile-expanded-body');
454
- expect(bodySection.find('.android-mobile-expanded-body-text').exists()).toBe(true);
455
- });
456
-
457
- it('should render brand icon in correct location when shown', () => {
458
- const wrapper = mountWithIntl(
459
- <AndroidMobileExpanded
460
- {...defaultProps}
461
- shouldShowBrandIconExpanded={true}
462
- brandIcon="https://example.com/brand-icon.png"
463
- />
464
- );
465
-
466
- // Brand icon should be in the top section
467
- const topSection = wrapper.find('.android-mobile-expanded-top');
468
- const brandIconContainer = topSection.find('.notification-brand-icon-container.android-mobile-chrome-brand-icon');
469
-
470
- expect(brandIconContainer.exists()).toBe(true);
471
- });
472
-
473
- it('should render media image in body section when provided', () => {
474
- const wrapper = mountWithIntl(
475
- <AndroidMobileExpanded
476
- {...defaultProps}
477
- mediaImageUrl="https://example.com/media.jpg"
478
- />
479
- );
480
-
481
- // Media should be in the body section
482
- const bodySection = wrapper.find('.android-mobile-expanded-body');
483
- const mediaContainer = bodySection.find('.android-mobile-expanded-media');
484
-
485
- expect(mediaContainer.exists()).toBe(true);
486
- });
487
- });
488
-
489
- describe('PropTypes Validation', () => {
490
- it('should require icon prop', () => {
491
- const propsWithoutIcon = { ...defaultProps };
492
- delete propsWithoutIcon.icon;
493
-
494
- // PropTypes validation happens at runtime, but we can verify the component handles missing props
495
- // In a real scenario, this would be caught by PropTypes in development mode
496
- expect(() => {
497
- mountWithIntl(<AndroidMobileExpanded {...propsWithoutIcon} />);
498
- }).not.toThrow();
499
- });
500
-
501
- it('should require selectedBrowser prop', () => {
502
- const propsWithoutBrowser = { ...defaultProps };
503
- delete propsWithoutBrowser.selectedBrowser;
504
-
505
- // Component should still render, but PropTypes would warn in development
506
- expect(() => {
507
- mountWithIntl(<AndroidMobileExpanded {...propsWithoutBrowser} />);
508
- }).not.toThrow();
509
- });
510
- });
511
- });
512
-
@@ -1,77 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`AndroidMobileExpanded Basic Rendering should render correctly with default props 1`] = `
4
- <Fragment>
5
- <div
6
- className="android-mobile-expanded-icon"
7
- >
8
- <div
9
- className="notification-icon-container"
10
- >
11
- <img
12
- alt="Chrome"
13
- className="notification-icon"
14
- src="https://example.com/chrome-icon.png"
15
- />
16
- </div>
17
- </div>
18
- <div
19
- className="android-mobile-expanded-wrapper"
20
- >
21
- <div
22
- className="android-mobile-expanded-top"
23
- >
24
- <div
25
- className="android-mobile-expanded-top-content"
26
- >
27
- <div
28
- className="android-mobile-expanded-header"
29
- >
30
- <div
31
- className="android-mobile-expanded-header-content"
32
- >
33
- <span
34
- className="android-mobile-expanded-browser-name"
35
- >
36
- Chrome
37
- </span>
38
- <span
39
- className="android-mobile-expanded-domain-time"
40
- >
41
- <span
42
- className="android-mobile-expanded-domain"
43
- >
44
- example.com
45
- </span>
46
- <span
47
- className="android-mobile-expanded-time"
48
- >
49
- 2:29 PM
50
- </span>
51
- </span>
52
- </div>
53
- </div>
54
- <div
55
- className="android-mobile-expanded-title"
56
- >
57
- Test Notification Title
58
- </div>
59
- </div>
60
- </div>
61
- <div
62
- className="android-mobile-expanded-body"
63
- >
64
- <div
65
- className="android-mobile-expanded-body-text"
66
- >
67
- Test notification body text that can be quite long and should be truncated after 4 lines
68
- </div>
69
- </div>
70
- </div>
71
- <div
72
- className="notification-action-arrow android-mobile-expanded-arrow"
73
- >
74
- ^
75
- </div>
76
- </Fragment>
77
- `;