@capillarytech/creatives-library 8.0.266 → 8.0.267

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 (147) hide show
  1. package/constants/unified.js +0 -1
  2. package/package.json +1 -1
  3. package/services/api.js +0 -5
  4. package/utils/common.js +0 -6
  5. package/utils/tests/transformerUtils.test.js +0 -297
  6. package/utils/transformerUtils.js +0 -40
  7. package/v2Components/CapImageUpload/constants.js +0 -2
  8. package/v2Components/CapImageUpload/index.js +16 -65
  9. package/v2Components/CapImageUpload/index.scss +1 -4
  10. package/v2Components/CapImageUpload/messages.js +1 -5
  11. package/v2Components/CommonTestAndPreview/index.js +15 -4
  12. package/v2Containers/App/constants.js +0 -5
  13. package/v2Containers/CreativesContainer/SlideBoxContent.js +2 -57
  14. package/v2Containers/CreativesContainer/SlideBoxHeader.js +0 -1
  15. package/v2Containers/CreativesContainer/constants.js +0 -3
  16. package/v2Containers/CreativesContainer/index.js +0 -168
  17. package/v2Containers/CreativesContainer/messages.js +0 -4
  18. package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +0 -210
  19. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +0 -304
  20. package/v2Containers/SmsTrai/Edit/index.js +12 -1
  21. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +648 -36
  22. package/v2Containers/Templates/ChannelTypeIllustration.js +1 -13
  23. package/v2Containers/Templates/_templates.scss +0 -205
  24. package/v2Containers/Templates/actions.js +1 -2
  25. package/v2Containers/Templates/constants.js +0 -1
  26. package/v2Containers/Templates/index.js +34 -274
  27. package/v2Containers/Templates/messages.js +0 -24
  28. package/v2Containers/Templates/reducer.js +0 -2
  29. package/v2Containers/Templates/tests/index.test.js +0 -10
  30. package/v2Containers/TemplatesV2/index.js +7 -15
  31. package/v2Containers/TemplatesV2/messages.js +0 -4
  32. package/utils/imageUrlUpload.js +0 -141
  33. package/v2Components/CapImageUrlUpload/constants.js +0 -26
  34. package/v2Components/CapImageUrlUpload/index.js +0 -365
  35. package/v2Components/CapImageUrlUpload/index.scss +0 -35
  36. package/v2Components/CapImageUrlUpload/messages.js +0 -47
  37. package/v2Containers/WebPush/Create/components/BrandIconSection.js +0 -108
  38. package/v2Containers/WebPush/Create/components/ButtonForm.js +0 -172
  39. package/v2Containers/WebPush/Create/components/ButtonItem.js +0 -101
  40. package/v2Containers/WebPush/Create/components/ButtonList.js +0 -145
  41. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.js +0 -164
  42. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.test.js +0 -463
  43. package/v2Containers/WebPush/Create/components/FormActions.js +0 -54
  44. package/v2Containers/WebPush/Create/components/FormActions.test.js +0 -163
  45. package/v2Containers/WebPush/Create/components/MediaSection.js +0 -142
  46. package/v2Containers/WebPush/Create/components/MediaSection.test.js +0 -341
  47. package/v2Containers/WebPush/Create/components/MessageSection.js +0 -103
  48. package/v2Containers/WebPush/Create/components/MessageSection.test.js +0 -268
  49. package/v2Containers/WebPush/Create/components/NotificationTitleSection.js +0 -87
  50. package/v2Containers/WebPush/Create/components/NotificationTitleSection.test.js +0 -210
  51. package/v2Containers/WebPush/Create/components/TemplateNameSection.js +0 -54
  52. package/v2Containers/WebPush/Create/components/TemplateNameSection.test.js +0 -143
  53. package/v2Containers/WebPush/Create/components/__snapshots__/ButtonsLinksSection.test.js.snap +0 -86
  54. package/v2Containers/WebPush/Create/components/__snapshots__/FormActions.test.js.snap +0 -16
  55. package/v2Containers/WebPush/Create/components/__snapshots__/MediaSection.test.js.snap +0 -41
  56. package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +0 -54
  57. package/v2Containers/WebPush/Create/components/__snapshots__/NotificationTitleSection.test.js.snap +0 -37
  58. package/v2Containers/WebPush/Create/components/__snapshots__/TemplateNameSection.test.js.snap +0 -21
  59. package/v2Containers/WebPush/Create/components/_buttons.scss +0 -246
  60. package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +0 -554
  61. package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +0 -607
  62. package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +0 -633
  63. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +0 -666
  64. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +0 -74
  65. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +0 -78
  66. package/v2Containers/WebPush/Create/hooks/useButtonManagement.js +0 -138
  67. package/v2Containers/WebPush/Create/hooks/useButtonManagement.test.js +0 -406
  68. package/v2Containers/WebPush/Create/hooks/useCharacterCount.js +0 -30
  69. package/v2Containers/WebPush/Create/hooks/useCharacterCount.test.js +0 -151
  70. package/v2Containers/WebPush/Create/hooks/useImageUpload.js +0 -104
  71. package/v2Containers/WebPush/Create/hooks/useImageUpload.test.js +0 -538
  72. package/v2Containers/WebPush/Create/hooks/useTagManagement.js +0 -122
  73. package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +0 -633
  74. package/v2Containers/WebPush/Create/index.js +0 -1148
  75. package/v2Containers/WebPush/Create/index.scss +0 -134
  76. package/v2Containers/WebPush/Create/messages.js +0 -211
  77. package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +0 -228
  78. package/v2Containers/WebPush/Create/preview/NotificationContainer.js +0 -294
  79. package/v2Containers/WebPush/Create/preview/PreviewContent.js +0 -90
  80. package/v2Containers/WebPush/Create/preview/PreviewControls.js +0 -305
  81. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +0 -25
  82. package/v2Containers/WebPush/Create/preview/WebPushPreview.js +0 -156
  83. package/v2Containers/WebPush/Create/preview/assets/Light.svg +0 -53
  84. package/v2Containers/WebPush/Create/preview/assets/Top.svg +0 -5
  85. package/v2Containers/WebPush/Create/preview/assets/android-arrow-down.svg +0 -9
  86. package/v2Containers/WebPush/Create/preview/assets/android-arrow-up.svg +0 -9
  87. package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
  88. package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
  89. package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +0 -106
  90. package/v2Containers/WebPush/Create/preview/assets/iOS.svg +0 -26
  91. package/v2Containers/WebPush/Create/preview/assets/macos-arrow-down-icon.svg +0 -9
  92. package/v2Containers/WebPush/Create/preview/assets/macos-triple-dot-icon.svg +0 -9
  93. package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +0 -18
  94. package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +0 -29
  95. package/v2Containers/WebPush/Create/preview/assets/windows-close-icon.svg +0 -9
  96. package/v2Containers/WebPush/Create/preview/assets/windows-triple-dot-icon.svg +0 -9
  97. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +0 -51
  98. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +0 -145
  99. package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +0 -45
  100. package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +0 -68
  101. package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +0 -61
  102. package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +0 -99
  103. package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +0 -733
  104. package/v2Containers/WebPush/Create/preview/components/tests/WindowsChromeExpanded.test.js +0 -571
  105. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +0 -85
  106. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/WindowsChromeExpanded.test.js.snap +0 -81
  107. package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +0 -50
  108. package/v2Containers/WebPush/Create/preview/constants.js +0 -637
  109. package/v2Containers/WebPush/Create/preview/notification-container.scss +0 -79
  110. package/v2Containers/WebPush/Create/preview/preview.scss +0 -358
  111. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +0 -370
  112. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +0 -12
  113. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +0 -12
  114. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +0 -12
  115. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +0 -47
  116. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +0 -11
  117. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +0 -11
  118. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +0 -11
  119. package/v2Containers/WebPush/Create/preview/styles/_base.scss +0 -207
  120. package/v2Containers/WebPush/Create/preview/styles/_ios.scss +0 -153
  121. package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +0 -107
  122. package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +0 -101
  123. package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +0 -229
  124. package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +0 -906
  125. package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +0 -1081
  126. package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +0 -723
  127. package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +0 -1327
  128. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +0 -131
  129. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +0 -112
  130. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +0 -144
  131. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +0 -129
  132. package/v2Containers/WebPush/Create/utils/payloadBuilder.js +0 -96
  133. package/v2Containers/WebPush/Create/utils/payloadBuilder.test.js +0 -396
  134. package/v2Containers/WebPush/Create/utils/previewUtils.js +0 -89
  135. package/v2Containers/WebPush/Create/utils/urlValidation.js +0 -115
  136. package/v2Containers/WebPush/Create/utils/urlValidation.test.js +0 -449
  137. package/v2Containers/WebPush/Create/utils/validation.js +0 -75
  138. package/v2Containers/WebPush/Create/utils/validation.test.js +0 -283
  139. package/v2Containers/WebPush/actions.js +0 -60
  140. package/v2Containers/WebPush/constants.js +0 -132
  141. package/v2Containers/WebPush/index.js +0 -2
  142. package/v2Containers/WebPush/reducer.js +0 -104
  143. package/v2Containers/WebPush/sagas.js +0 -119
  144. package/v2Containers/WebPush/selectors.js +0 -65
  145. package/v2Containers/WebPush/tests/reducer.test.js +0 -863
  146. package/v2Containers/WebPush/tests/sagas.test.js +0 -566
  147. package/v2Containers/WebPush/tests/selectors.test.js +0 -960
@@ -1,960 +0,0 @@
1
- import { fromJS } from 'immutable';
2
- import {
3
- makeSelectWebPush,
4
- makeSelectCreateError,
5
- makeSelectCreateTemplateInProgress,
6
- makeSelectEditTemplateInProgress,
7
- makeSelectEditError,
8
- makeSelectUploadedAssetData,
9
- } from '../selectors';
10
-
11
- describe('WebPush selectors', () => {
12
- // Mock state structures
13
- const mockWebPushState = {
14
- createTemplateInProgress: true,
15
- response: { id: 1, name: 'Test Template', content: 'Test Content' },
16
- createTemplateErrorMessage: 'Create error occurred',
17
- editTemplateInProgress: false,
18
- editResponse: { id: 2, name: 'Edited Template' },
19
- editTemplateErrorMessage: 'Edit error occurred',
20
- uploadedAssetData: {
21
- id: 100,
22
- url: 'https://example.com/image.jpg',
23
- fileName: 'test-image.jpg',
24
- fileSize: 1024000,
25
- },
26
- uploadAssetSuccess: true,
27
- assetUploading: false,
28
- otherProperty: 'test-value',
29
- };
30
-
31
- const mockStateWithWebPush = fromJS({
32
- webPush: mockWebPushState,
33
- otherState: { value: 'test' },
34
- });
35
-
36
- const mockStateWithoutWebPush = fromJS({
37
- otherState: { value: 'test' },
38
- });
39
-
40
- const mockStateWithEmptyWebPush = fromJS({
41
- webPush: {},
42
- otherState: { value: 'test' },
43
- });
44
-
45
- const mockStateWithPartialWebPush = fromJS({
46
- webPush: {
47
- createTemplateInProgress: true,
48
- uploadedAssetData: { id: 200, url: 'https://example.com/partial.jpg' },
49
- // Missing other properties to test defaults
50
- },
51
- otherState: { value: 'test' },
52
- });
53
-
54
- describe('makeSelectWebPush', () => {
55
- it.concurrent('should select the webPush state and convert to JS', () => {
56
- const selector = makeSelectWebPush();
57
- const result = selector(mockStateWithWebPush);
58
-
59
- expect(result).toEqual(mockWebPushState);
60
- expect(typeof result).toBe('object');
61
- expect(Array.isArray(result)).toBe(false);
62
- });
63
-
64
- it.concurrent('should return empty object when webPush state does not exist', () => {
65
- const selector = makeSelectWebPush();
66
- const result = selector(mockStateWithoutWebPush);
67
-
68
- expect(result).toEqual({});
69
- });
70
-
71
- it.concurrent('should return empty object when webPush state is empty', () => {
72
- const selector = makeSelectWebPush();
73
- const result = selector(mockStateWithEmptyWebPush);
74
-
75
- expect(result).toEqual({});
76
- });
77
-
78
- it.concurrent('should handle partial webPush state', () => {
79
- const selector = makeSelectWebPush();
80
- const result = selector(mockStateWithPartialWebPush);
81
-
82
- expect(result).toEqual({
83
- createTemplateInProgress: true,
84
- uploadedAssetData: { id: 200, url: 'https://example.com/partial.jpg' },
85
- });
86
- });
87
-
88
- it.concurrent('should convert immutable nested objects to JS', () => {
89
- const stateWithNested = fromJS({
90
- webPush: {
91
- response: {
92
- id: 1,
93
- nested: {
94
- deep: {
95
- value: 'test',
96
- },
97
- },
98
- },
99
- },
100
- });
101
-
102
- const selector = makeSelectWebPush();
103
- const result = selector(stateWithNested);
104
-
105
- expect(result.response.nested.deep.value).toBe('test');
106
- expect(typeof result.response).toBe('object');
107
- expect(Array.isArray(result.response)).toBe(false);
108
- });
109
- });
110
-
111
- describe('makeSelectCreateError', () => {
112
- it.concurrent('should select createTemplateErrorMessage when it exists', () => {
113
- const selector = makeSelectCreateError();
114
- const result = selector(mockStateWithWebPush);
115
-
116
- expect(result).toBe('Create error occurred');
117
- });
118
-
119
- it.concurrent('should return empty string when createTemplateErrorMessage does not exist', () => {
120
- const selector = makeSelectCreateError();
121
- const result = selector(mockStateWithoutWebPush);
122
-
123
- expect(result).toBe('');
124
- });
125
-
126
- it.concurrent('should return empty string when webPush state is empty', () => {
127
- const selector = makeSelectCreateError();
128
- const result = selector(mockStateWithEmptyWebPush);
129
-
130
- expect(result).toBe('');
131
- });
132
-
133
- it.concurrent('should return empty string when createTemplateErrorMessage is missing in partial state', () => {
134
- const selector = makeSelectCreateError();
135
- const result = selector(mockStateWithPartialWebPush);
136
-
137
- expect(result).toBe('');
138
- });
139
-
140
- it.concurrent('should return empty string when createTemplateErrorMessage is null', () => {
141
- const stateWithNullError = fromJS({
142
- webPush: {
143
- createTemplateErrorMessage: null,
144
- },
145
- });
146
-
147
- const selector = makeSelectCreateError();
148
- const result = selector(stateWithNullError);
149
-
150
- expect(result).toBe('');
151
- });
152
-
153
- it.concurrent('should return empty string when createTemplateErrorMessage is undefined', () => {
154
- const stateWithUndefinedError = fromJS({
155
- webPush: {
156
- createTemplateErrorMessage: undefined,
157
- },
158
- });
159
-
160
- const selector = makeSelectCreateError();
161
- const result = selector(stateWithUndefinedError);
162
-
163
- expect(result).toBe('');
164
- });
165
-
166
- it.concurrent('should handle empty string error message', () => {
167
- const stateWithEmptyError = fromJS({
168
- webPush: {
169
- createTemplateErrorMessage: '',
170
- },
171
- });
172
-
173
- const selector = makeSelectCreateError();
174
- const result = selector(stateWithEmptyError);
175
-
176
- expect(result).toBe('');
177
- });
178
- });
179
-
180
- describe('makeSelectCreateTemplateInProgress', () => {
181
- it.concurrent('should select createTemplateInProgress when it is true', () => {
182
- const selector = makeSelectCreateTemplateInProgress();
183
- const result = selector(mockStateWithWebPush);
184
-
185
- expect(result).toBe(true);
186
- });
187
-
188
- it.concurrent('should select createTemplateInProgress when it is false', () => {
189
- const stateWithFalse = fromJS({
190
- webPush: {
191
- createTemplateInProgress: false,
192
- },
193
- });
194
-
195
- const selector = makeSelectCreateTemplateInProgress();
196
- const result = selector(stateWithFalse);
197
-
198
- expect(result).toBe(false);
199
- });
200
-
201
- it.concurrent('should return false when createTemplateInProgress does not exist', () => {
202
- const selector = makeSelectCreateTemplateInProgress();
203
- const result = selector(mockStateWithoutWebPush);
204
-
205
- expect(result).toBe(false);
206
- });
207
-
208
- it.concurrent('should return false when webPush state is empty', () => {
209
- const selector = makeSelectCreateTemplateInProgress();
210
- const result = selector(mockStateWithEmptyWebPush);
211
-
212
- expect(result).toBe(false);
213
- });
214
-
215
- it.concurrent('should return true when createTemplateInProgress is true in partial state', () => {
216
- const selector = makeSelectCreateTemplateInProgress();
217
- const result = selector(mockStateWithPartialWebPush);
218
-
219
- expect(result).toBe(true);
220
- });
221
-
222
- it.concurrent('should return false when createTemplateInProgress is null', () => {
223
- const stateWithNull = fromJS({
224
- webPush: {
225
- createTemplateInProgress: null,
226
- },
227
- });
228
-
229
- const selector = makeSelectCreateTemplateInProgress();
230
- const result = selector(stateWithNull);
231
-
232
- expect(result).toBe(false);
233
- });
234
-
235
- it.concurrent('should return false when createTemplateInProgress is undefined', () => {
236
- const stateWithUndefined = fromJS({
237
- webPush: {
238
- createTemplateInProgress: undefined,
239
- },
240
- });
241
-
242
- const selector = makeSelectCreateTemplateInProgress();
243
- const result = selector(stateWithUndefined);
244
-
245
- expect(result).toBe(false);
246
- });
247
- });
248
-
249
- describe('makeSelectEditTemplateInProgress', () => {
250
- it.concurrent('should select editTemplateInProgress when it is false', () => {
251
- const selector = makeSelectEditTemplateInProgress();
252
- const result = selector(mockStateWithWebPush);
253
-
254
- expect(result).toBe(false);
255
- });
256
-
257
- it.concurrent('should select editTemplateInProgress when it is true', () => {
258
- const stateWithTrue = fromJS({
259
- webPush: {
260
- editTemplateInProgress: true,
261
- },
262
- });
263
-
264
- const selector = makeSelectEditTemplateInProgress();
265
- const result = selector(stateWithTrue);
266
-
267
- expect(result).toBe(true);
268
- });
269
-
270
- it.concurrent('should return false when editTemplateInProgress does not exist', () => {
271
- const selector = makeSelectEditTemplateInProgress();
272
- const result = selector(mockStateWithoutWebPush);
273
-
274
- expect(result).toBe(false);
275
- });
276
-
277
- it.concurrent('should return false when webPush state is empty', () => {
278
- const selector = makeSelectEditTemplateInProgress();
279
- const result = selector(mockStateWithEmptyWebPush);
280
-
281
- expect(result).toBe(false);
282
- });
283
-
284
- it.concurrent('should return false when editTemplateInProgress is missing in partial state', () => {
285
- const selector = makeSelectEditTemplateInProgress();
286
- const result = selector(mockStateWithPartialWebPush);
287
-
288
- expect(result).toBe(false);
289
- });
290
-
291
- it.concurrent('should return false when editTemplateInProgress is null', () => {
292
- const stateWithNull = fromJS({
293
- webPush: {
294
- editTemplateInProgress: null,
295
- },
296
- });
297
-
298
- const selector = makeSelectEditTemplateInProgress();
299
- const result = selector(stateWithNull);
300
-
301
- expect(result).toBe(false);
302
- });
303
-
304
- it.concurrent('should return false when editTemplateInProgress is undefined', () => {
305
- const stateWithUndefined = fromJS({
306
- webPush: {
307
- editTemplateInProgress: undefined,
308
- },
309
- });
310
-
311
- const selector = makeSelectEditTemplateInProgress();
312
- const result = selector(stateWithUndefined);
313
-
314
- expect(result).toBe(false);
315
- });
316
- });
317
-
318
- describe('makeSelectEditError', () => {
319
- it.concurrent('should select editTemplateErrorMessage when it exists', () => {
320
- const selector = makeSelectEditError();
321
- const result = selector(mockStateWithWebPush);
322
-
323
- expect(result).toBe('Edit error occurred');
324
- });
325
-
326
- it.concurrent('should return empty string when editTemplateErrorMessage does not exist', () => {
327
- const selector = makeSelectEditError();
328
- const result = selector(mockStateWithoutWebPush);
329
-
330
- expect(result).toBe('');
331
- });
332
-
333
- it.concurrent('should return empty string when webPush state is empty', () => {
334
- const selector = makeSelectEditError();
335
- const result = selector(mockStateWithEmptyWebPush);
336
-
337
- expect(result).toBe('');
338
- });
339
-
340
- it.concurrent('should return empty string when editTemplateErrorMessage is missing in partial state', () => {
341
- const selector = makeSelectEditError();
342
- const result = selector(mockStateWithPartialWebPush);
343
-
344
- expect(result).toBe('');
345
- });
346
-
347
- it.concurrent('should return empty string when editTemplateErrorMessage is null', () => {
348
- const stateWithNullError = fromJS({
349
- webPush: {
350
- editTemplateErrorMessage: null,
351
- },
352
- });
353
-
354
- const selector = makeSelectEditError();
355
- const result = selector(stateWithNullError);
356
-
357
- expect(result).toBe('');
358
- });
359
-
360
- it.concurrent('should return empty string when editTemplateErrorMessage is undefined', () => {
361
- const stateWithUndefinedError = fromJS({
362
- webPush: {
363
- editTemplateErrorMessage: undefined,
364
- },
365
- });
366
-
367
- const selector = makeSelectEditError();
368
- const result = selector(stateWithUndefinedError);
369
-
370
- expect(result).toBe('');
371
- });
372
-
373
- it.concurrent('should handle empty string error message', () => {
374
- const stateWithEmptyError = fromJS({
375
- webPush: {
376
- editTemplateErrorMessage: '',
377
- },
378
- });
379
-
380
- const selector = makeSelectEditError();
381
- const result = selector(stateWithEmptyError);
382
-
383
- expect(result).toBe('');
384
- });
385
-
386
- it.concurrent('should handle long error messages', () => {
387
- const longErrorMessage = 'A'.repeat(1000);
388
- const stateWithLongError = fromJS({
389
- webPush: {
390
- editTemplateErrorMessage: longErrorMessage,
391
- },
392
- });
393
-
394
- const selector = makeSelectEditError();
395
- const result = selector(stateWithLongError);
396
-
397
- expect(result).toBe(longErrorMessage);
398
- expect(result.length).toBe(1000);
399
- });
400
- });
401
-
402
- describe('makeSelectUploadedAssetData', () => {
403
- it.concurrent('should select uploadedAssetData when it exists', () => {
404
- const selector = makeSelectUploadedAssetData();
405
- const result = selector(mockStateWithWebPush);
406
-
407
- expect(result).toEqual({
408
- id: 100,
409
- url: 'https://example.com/image.jpg',
410
- fileName: 'test-image.jpg',
411
- fileSize: 1024000,
412
- });
413
- expect(typeof result).toBe('object');
414
- expect(Array.isArray(result)).toBe(false);
415
- });
416
-
417
- it.concurrent('should return empty object when uploadedAssetData does not exist', () => {
418
- const selector = makeSelectUploadedAssetData();
419
- const result = selector(mockStateWithoutWebPush);
420
-
421
- expect(result).toEqual({});
422
- });
423
-
424
- it.concurrent('should return empty object when webPush state is empty', () => {
425
- const selector = makeSelectUploadedAssetData();
426
- const result = selector(mockStateWithEmptyWebPush);
427
-
428
- expect(result).toEqual({});
429
- });
430
-
431
- it.concurrent('should return uploadedAssetData from partial state', () => {
432
- const selector = makeSelectUploadedAssetData();
433
- const result = selector(mockStateWithPartialWebPush);
434
-
435
- expect(result).toEqual({
436
- id: 200,
437
- url: 'https://example.com/partial.jpg',
438
- });
439
- });
440
-
441
- it.concurrent('should return empty object when uploadedAssetData is null', () => {
442
- const stateWithNullAssetData = fromJS({
443
- webPush: {
444
- uploadedAssetData: null,
445
- },
446
- });
447
-
448
- const selector = makeSelectUploadedAssetData();
449
- const result = selector(stateWithNullAssetData);
450
-
451
- expect(result).toEqual({});
452
- });
453
-
454
- it.concurrent('should return empty object when uploadedAssetData is undefined', () => {
455
- const stateWithUndefinedAssetData = fromJS({
456
- webPush: {
457
- uploadedAssetData: undefined,
458
- },
459
- });
460
-
461
- const selector = makeSelectUploadedAssetData();
462
- const result = selector(stateWithUndefinedAssetData);
463
-
464
- expect(result).toEqual({});
465
- });
466
-
467
- it.concurrent('should convert immutable uploadedAssetData to JS', () => {
468
- const stateWithNestedAsset = fromJS({
469
- webPush: {
470
- uploadedAssetData: {
471
- id: 300,
472
- metadata: {
473
- width: 1920,
474
- height: 1080,
475
- format: 'jpg',
476
- },
477
- },
478
- },
479
- });
480
-
481
- const selector = makeSelectUploadedAssetData();
482
- const result = selector(stateWithNestedAsset);
483
-
484
- expect(result.metadata.width).toBe(1920);
485
- expect(result.metadata.height).toBe(1080);
486
- expect(result.metadata.format).toBe('jpg');
487
- expect(typeof result.metadata).toBe('object');
488
- });
489
-
490
- it.concurrent('should handle uploadedAssetData with empty object', () => {
491
- const stateWithEmptyAsset = fromJS({
492
- webPush: {
493
- uploadedAssetData: {},
494
- },
495
- });
496
-
497
- const selector = makeSelectUploadedAssetData();
498
- const result = selector(stateWithEmptyAsset);
499
-
500
- expect(result).toEqual({});
501
- });
502
-
503
- it.concurrent('should select uploadedAssetData0 when templateType is 0', () => {
504
- const stateWithAssetData0 = fromJS({
505
- webPush: {
506
- uploadedAssetData0: {
507
- id: 400,
508
- url: 'https://example.com/image0.jpg',
509
- fileName: 'image0.jpg',
510
- },
511
- },
512
- });
513
-
514
- const selector = makeSelectUploadedAssetData(0);
515
- const result = selector(stateWithAssetData0);
516
-
517
- expect(result).toEqual({
518
- id: 400,
519
- url: 'https://example.com/image0.jpg',
520
- fileName: 'image0.jpg',
521
- });
522
- });
523
-
524
- it.concurrent('should select uploadedAssetData1 when templateType is 1', () => {
525
- const stateWithAssetData1 = fromJS({
526
- webPush: {
527
- uploadedAssetData1: {
528
- id: 401,
529
- url: 'https://example.com/image1.jpg',
530
- fileName: 'image1.jpg',
531
- },
532
- },
533
- });
534
-
535
- const selector = makeSelectUploadedAssetData(1);
536
- const result = selector(stateWithAssetData1);
537
-
538
- expect(result).toEqual({
539
- id: 401,
540
- url: 'https://example.com/image1.jpg',
541
- fileName: 'image1.jpg',
542
- });
543
- });
544
-
545
- it.concurrent('should return empty object when templateType-specific key does not exist', () => {
546
- const stateWithoutTemplateType = fromJS({
547
- webPush: {
548
- uploadedAssetData: {
549
- id: 100,
550
- url: 'https://example.com/default.jpg',
551
- },
552
- },
553
- });
554
-
555
- const selector = makeSelectUploadedAssetData(0);
556
- const result = selector(stateWithoutTemplateType);
557
-
558
- expect(result).toEqual({});
559
- });
560
-
561
- it.concurrent('should handle plain JS object stored directly (not Immutable)', () => {
562
- // Simulate the reducer storing plain JS object directly
563
- const stateWithPlainJS = fromJS({
564
- webPush: {
565
- uploadedAssetData: {
566
- id: 500,
567
- url: 'https://example.com/plain.jpg',
568
- },
569
- },
570
- });
571
-
572
- // Manually set a plain JS object to simulate the bug scenario
573
- const plainJSState = stateWithPlainJS.setIn(['webPush', 'uploadedAssetData'], {
574
- id: 500,
575
- url: 'https://example.com/plain.jpg',
576
- });
577
-
578
- const selector = makeSelectUploadedAssetData();
579
- const result = selector(plainJSState);
580
-
581
- expect(result).toEqual({
582
- id: 500,
583
- url: 'https://example.com/plain.jpg',
584
- });
585
- });
586
-
587
- it.concurrent('should handle plain JS object with templateType', () => {
588
- // Simulate the reducer storing plain JS object with templateType
589
- const stateWithPlainJS = fromJS({
590
- webPush: {
591
- uploadedAssetData0: {
592
- id: 600,
593
- url: 'https://example.com/plain0.jpg',
594
- },
595
- },
596
- });
597
-
598
- // Manually set a plain JS object to simulate the bug scenario
599
- const plainJSState = stateWithPlainJS.setIn(['webPush', 'uploadedAssetData0'], {
600
- id: 600,
601
- url: 'https://example.com/plain0.jpg',
602
- });
603
-
604
- const selector = makeSelectUploadedAssetData(0);
605
- const result = selector(plainJSState);
606
-
607
- expect(result).toEqual({
608
- id: 600,
609
- url: 'https://example.com/plain0.jpg',
610
- });
611
- });
612
- });
613
-
614
- describe('Selector memoization', () => {
615
- it.concurrent('should return the same result for identical state (memoization test) - makeSelectWebPush', () => {
616
- const selector = makeSelectWebPush();
617
- const result1 = selector(mockStateWithWebPush);
618
- const result2 = selector(mockStateWithWebPush);
619
-
620
- expect(result1).toBe(result2);
621
- });
622
-
623
- it.concurrent('should return the same result for identical state (memoization test) - makeSelectCreateError', () => {
624
- const selector = makeSelectCreateError();
625
- const result1 = selector(mockStateWithWebPush);
626
- const result2 = selector(mockStateWithWebPush);
627
-
628
- expect(result1).toBe(result2);
629
- });
630
-
631
- it.concurrent('should return different results for different states', () => {
632
- const selector = makeSelectCreateTemplateInProgress();
633
- const result1 = selector(mockStateWithWebPush);
634
- const result2 = selector(mockStateWithPartialWebPush);
635
-
636
- expect(result1).toBe(true);
637
- expect(result2).toBe(true);
638
- // Even though both are true, they should be different instances if state changed
639
- const stateWithFalse = fromJS({
640
- webPush: {
641
- createTemplateInProgress: false,
642
- },
643
- });
644
- const result3 = selector(stateWithFalse);
645
- expect(result3).toBe(false);
646
- expect(result1).not.toBe(result3);
647
- });
648
- });
649
-
650
- describe('Edge cases', () => {
651
- it.concurrent('should handle undefined state gracefully', () => {
652
- const selector = makeSelectWebPush();
653
- const undefinedState = fromJS({});
654
- const result = selector(undefinedState);
655
-
656
- expect(result).toEqual({});
657
- });
658
-
659
- it.concurrent('should handle state with webPush as null', () => {
660
- const stateWithNullWebPush = fromJS({
661
- webPush: null,
662
- });
663
-
664
- const selector = makeSelectUploadedAssetData();
665
- const result = selector(stateWithNullWebPush);
666
-
667
- expect(result).toEqual({});
668
- });
669
-
670
- it.concurrent('should handle deeply nested state access', () => {
671
- const complexState = fromJS({
672
- level1: {
673
- level2: {
674
- webPush: mockWebPushState,
675
- },
676
- },
677
- });
678
-
679
- // This should return defaults since webPush is not at root level
680
- const selector = makeSelectCreateTemplateInProgress();
681
- const result = selector(complexState);
682
-
683
- expect(result).toBe(false);
684
- });
685
-
686
- it.concurrent('should handle state with webPush as empty Map', () => {
687
- const stateWithEmptyMap = fromJS({
688
- webPush: {},
689
- });
690
-
691
- const selector = makeSelectEditError();
692
- const result = selector(stateWithEmptyMap);
693
-
694
- expect(result).toBe('');
695
- });
696
-
697
- it.concurrent('should handle multiple selectors on same state', () => {
698
- const selectWebPush = makeSelectWebPush();
699
- const selectCreateError = makeSelectCreateError();
700
- const selectCreateInProgress = makeSelectCreateTemplateInProgress();
701
- const selectEditError = makeSelectEditError();
702
- const selectEditInProgress = makeSelectEditTemplateInProgress();
703
- const selectUploadedAsset = makeSelectUploadedAssetData();
704
-
705
- const webPushResult = selectWebPush(mockStateWithWebPush);
706
- const createErrorResult = selectCreateError(mockStateWithWebPush);
707
- const createInProgressResult = selectCreateInProgress(mockStateWithWebPush);
708
- const editErrorResult = selectEditError(mockStateWithWebPush);
709
- const editInProgressResult = selectEditInProgress(mockStateWithWebPush);
710
- const uploadedAssetResult = selectUploadedAsset(mockStateWithWebPush);
711
-
712
- expect(webPushResult).toEqual(mockWebPushState);
713
- expect(createErrorResult).toBe('Create error occurred');
714
- expect(createInProgressResult).toBe(true);
715
- expect(editErrorResult).toBe('Edit error occurred');
716
- expect(editInProgressResult).toBe(false);
717
- expect(uploadedAssetResult).toEqual({
718
- id: 100,
719
- url: 'https://example.com/image.jpg',
720
- fileName: 'test-image.jpg',
721
- fileSize: 1024000,
722
- });
723
- });
724
-
725
- it.concurrent('should handle state transitions correctly', () => {
726
- const selector = makeSelectCreateTemplateInProgress();
727
-
728
- // Initial state - not in progress
729
- const initialState = fromJS({
730
- webPush: {
731
- createTemplateInProgress: false,
732
- },
733
- });
734
- expect(selector(initialState)).toBe(false);
735
-
736
- // Request state - in progress
737
- const requestState = fromJS({
738
- webPush: {
739
- createTemplateInProgress: true,
740
- },
741
- });
742
- expect(selector(requestState)).toBe(true);
743
-
744
- // Success state - not in progress
745
- const successState = fromJS({
746
- webPush: {
747
- createTemplateInProgress: false,
748
- },
749
- });
750
- expect(selector(successState)).toBe(false);
751
- });
752
- });
753
-
754
- describe('Integration with reducer state', () => {
755
- it.concurrent('should correctly select state after CREATE_TEMPLATE_REQUEST', () => {
756
- const stateAfterRequest = fromJS({
757
- webPush: {
758
- createTemplateInProgress: true,
759
- createTemplateError: false,
760
- createTemplateErrorMessage: '',
761
- },
762
- });
763
-
764
- const selectInProgress = makeSelectCreateTemplateInProgress();
765
- const selectError = makeSelectCreateError();
766
-
767
- expect(selectInProgress(stateAfterRequest)).toBe(true);
768
- expect(selectError(stateAfterRequest)).toBe('');
769
- });
770
-
771
- it.concurrent('should correctly select state after CREATE_TEMPLATE_FAILURE', () => {
772
- const stateAfterFailure = fromJS({
773
- webPush: {
774
- createTemplateInProgress: false,
775
- createTemplateError: true,
776
- createTemplateErrorMessage: 'Network error occurred',
777
- },
778
- });
779
-
780
- const selectInProgress = makeSelectCreateTemplateInProgress();
781
- const selectError = makeSelectCreateError();
782
-
783
- expect(selectInProgress(stateAfterFailure)).toBe(false);
784
- expect(selectError(stateAfterFailure)).toBe('Network error occurred');
785
- });
786
-
787
- it.concurrent('should correctly select state after EDIT_TEMPLATE_REQUEST', () => {
788
- const stateAfterRequest = fromJS({
789
- webPush: {
790
- editTemplateInProgress: true,
791
- editTemplateError: false,
792
- editTemplateErrorMessage: '',
793
- },
794
- });
795
-
796
- const selectInProgress = makeSelectEditTemplateInProgress();
797
- const selectError = makeSelectEditError();
798
-
799
- expect(selectInProgress(stateAfterRequest)).toBe(true);
800
- expect(selectError(stateAfterRequest)).toBe('');
801
- });
802
-
803
- it.concurrent('should correctly select state after EDIT_TEMPLATE_FAILURE', () => {
804
- const stateAfterFailure = fromJS({
805
- webPush: {
806
- editTemplateInProgress: false,
807
- editTemplateError: true,
808
- editTemplateErrorMessage: 'Validation failed',
809
- },
810
- });
811
-
812
- const selectInProgress = makeSelectEditTemplateInProgress();
813
- const selectError = makeSelectEditError();
814
-
815
- expect(selectInProgress(stateAfterFailure)).toBe(false);
816
- expect(selectError(stateAfterFailure)).toBe('Validation failed');
817
- });
818
-
819
- it.concurrent('should correctly select state after UPLOAD_WEBPUSH_ASSET_SUCCESS', () => {
820
- const stateAfterUpload = fromJS({
821
- webPush: {
822
- uploadAssetSuccess: true,
823
- assetUploading: false,
824
- uploadedAssetData: {
825
- id: 500,
826
- url: 'https://example.com/uploaded.jpg',
827
- fileName: 'uploaded.jpg',
828
- },
829
- },
830
- });
831
-
832
- const selectUploadedAsset = makeSelectUploadedAssetData();
833
- const result = selectUploadedAsset(stateAfterUpload);
834
-
835
- expect(result).toEqual({
836
- id: 500,
837
- url: 'https://example.com/uploaded.jpg',
838
- fileName: 'uploaded.jpg',
839
- });
840
- });
841
- });
842
-
843
- describe('accountData selector (from templates state)', () => {
844
- // This tests the accountData selector logic used in mapStateToProps
845
- const createAccountDataSelector = () => {
846
- return (state) => {
847
- const templatesState = state.get('templates');
848
- if (!templatesState) {
849
- return {};
850
- }
851
- const templates = templatesState.toJS();
852
- return templates?.selectedWebPushAccount || {};
853
- };
854
- };
855
-
856
- it.concurrent('should select selectedWebPushAccount from templates state', () => {
857
- const mockTemplatesState = fromJS({
858
- selectedWebPushAccount: {
859
- id: 123,
860
- accountId: 123,
861
- name: 'Test WebPush Account',
862
- configs: {
863
- websiteLink: 'https://example.com',
864
- },
865
- },
866
- });
867
-
868
- const mockState = fromJS({
869
- templates: mockTemplatesState,
870
- });
871
-
872
- const selector = createAccountDataSelector();
873
- const result = selector(mockState);
874
-
875
- expect(result).toEqual({
876
- id: 123,
877
- accountId: 123,
878
- name: 'Test WebPush Account',
879
- configs: {
880
- websiteLink: 'https://example.com',
881
- },
882
- });
883
- });
884
-
885
- it.concurrent('should return empty object when templates state does not exist', () => {
886
- const mockState = fromJS({
887
- otherState: { value: 'test' },
888
- });
889
-
890
- const selector = createAccountDataSelector();
891
- const result = selector(mockState);
892
-
893
- expect(result).toEqual({});
894
- });
895
-
896
- it.concurrent('should return empty object when selectedWebPushAccount does not exist', () => {
897
- const mockTemplatesState = fromJS({
898
- weCrmAccounts: [],
899
- templates: [],
900
- });
901
-
902
- const mockState = fromJS({
903
- templates: mockTemplatesState,
904
- });
905
-
906
- const selector = createAccountDataSelector();
907
- const result = selector(mockState);
908
-
909
- expect(result).toEqual({});
910
- });
911
-
912
- it.concurrent('should handle selectedWebPushAccount with websiteLink in configs', () => {
913
- const mockTemplatesState = fromJS({
914
- selectedWebPushAccount: {
915
- id: 456,
916
- accountId: 456,
917
- name: 'Account with Website',
918
- configs: {
919
- websiteLink: 'https://test.com',
920
- otherConfig: 'value',
921
- },
922
- },
923
- });
924
-
925
- const mockState = fromJS({
926
- templates: mockTemplatesState,
927
- });
928
-
929
- const selector = createAccountDataSelector();
930
- const result = selector(mockState);
931
-
932
- expect(result.configs.websiteLink).toBe('https://test.com');
933
- expect(result.id).toBe(456);
934
- });
935
-
936
- it.concurrent('should handle selectedWebPushAccount without websiteLink', () => {
937
- const mockTemplatesState = fromJS({
938
- selectedWebPushAccount: {
939
- id: 789,
940
- accountId: 789,
941
- name: 'Account without Website',
942
- configs: {
943
- otherConfig: 'value',
944
- },
945
- },
946
- });
947
-
948
- const mockState = fromJS({
949
- templates: mockTemplatesState,
950
- });
951
-
952
- const selector = createAccountDataSelector();
953
- const result = selector(mockState);
954
-
955
- expect(result.configs.websiteLink).toBeUndefined();
956
- expect(result.id).toBe(789);
957
- });
958
- });
959
- });
960
-