@capillarytech/creatives-library 8.0.239-alpha.0 → 8.0.239

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 (110) hide show
  1. package/package.json +1 -1
  2. package/services/api.js +0 -5
  3. package/translations/en.json +0 -1
  4. package/utils/transformerUtils.js +0 -42
  5. package/v2Components/CapImageUpload/constants.js +0 -2
  6. package/v2Components/CapImageUpload/index.js +14 -54
  7. package/v2Components/CapImageUpload/index.scss +1 -4
  8. package/v2Components/CapImageUpload/messages.js +0 -4
  9. package/v2Containers/App/constants.js +0 -5
  10. package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +0 -1
  11. package/v2Containers/CreativesContainer/SlideBoxContent.js +2 -57
  12. package/v2Containers/CreativesContainer/SlideBoxHeader.js +0 -1
  13. package/v2Containers/CreativesContainer/constants.js +0 -2
  14. package/v2Containers/CreativesContainer/index.js +0 -152
  15. package/v2Containers/CreativesContainer/messages.js +0 -4
  16. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +0 -3
  17. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +0 -2
  18. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +0 -25
  19. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +0 -18
  20. package/v2Containers/Rcs/index.js +153 -383
  21. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +0 -46
  22. package/v2Containers/Rcs/tests/index.test.js +168 -0
  23. package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +0 -4
  24. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +0 -8
  25. package/v2Containers/Templates/ChannelTypeIllustration.js +1 -13
  26. package/v2Containers/Templates/_templates.scss +0 -203
  27. package/v2Containers/Templates/actions.js +1 -2
  28. package/v2Containers/Templates/constants.js +0 -1
  29. package/v2Containers/Templates/index.js +30 -273
  30. package/v2Containers/Templates/messages.js +0 -24
  31. package/v2Containers/Templates/reducer.js +0 -2
  32. package/v2Containers/Templates/tests/index.test.js +0 -10
  33. package/v2Containers/TemplatesV2/index.js +2 -3
  34. package/v2Containers/TemplatesV2/messages.js +0 -4
  35. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +0 -132
  36. package/v2Components/CapImageUrlUpload/constants.js +0 -19
  37. package/v2Components/CapImageUrlUpload/index.js +0 -455
  38. package/v2Components/CapImageUrlUpload/index.scss +0 -35
  39. package/v2Components/CapImageUrlUpload/messages.js +0 -47
  40. package/v2Containers/WebPush/Create/components/ButtonForm.js +0 -175
  41. package/v2Containers/WebPush/Create/components/ButtonItem.js +0 -101
  42. package/v2Containers/WebPush/Create/components/ButtonList.js +0 -144
  43. package/v2Containers/WebPush/Create/components/_buttons.scss +0 -246
  44. package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +0 -554
  45. package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +0 -607
  46. package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +0 -633
  47. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +0 -666
  48. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +0 -74
  49. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +0 -80
  50. package/v2Containers/WebPush/Create/index.js +0 -1727
  51. package/v2Containers/WebPush/Create/index.scss +0 -123
  52. package/v2Containers/WebPush/Create/messages.js +0 -199
  53. package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +0 -241
  54. package/v2Containers/WebPush/Create/preview/NotificationContainer.js +0 -290
  55. package/v2Containers/WebPush/Create/preview/PreviewContent.js +0 -81
  56. package/v2Containers/WebPush/Create/preview/PreviewControls.js +0 -240
  57. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +0 -23
  58. package/v2Containers/WebPush/Create/preview/WebPushPreview.js +0 -139
  59. package/v2Containers/WebPush/Create/preview/assets/Light.svg +0 -53
  60. package/v2Containers/WebPush/Create/preview/assets/Top.svg +0 -5
  61. package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
  62. package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
  63. package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +0 -106
  64. package/v2Containers/WebPush/Create/preview/assets/iOS.svg +0 -26
  65. package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +0 -18
  66. package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +0 -29
  67. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +0 -44
  68. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +0 -110
  69. package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +0 -45
  70. package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +0 -72
  71. package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +0 -55
  72. package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +0 -70
  73. package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +0 -512
  74. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +0 -77
  75. package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +0 -527
  76. package/v2Containers/WebPush/Create/preview/constants.js +0 -162
  77. package/v2Containers/WebPush/Create/preview/notification-container.scss +0 -104
  78. package/v2Containers/WebPush/Create/preview/preview.scss +0 -409
  79. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +0 -300
  80. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +0 -12
  81. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +0 -12
  82. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +0 -12
  83. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +0 -303
  84. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +0 -11
  85. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +0 -11
  86. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +0 -11
  87. package/v2Containers/WebPush/Create/preview/styles/_base.scss +0 -188
  88. package/v2Containers/WebPush/Create/preview/styles/_ios.scss +0 -106
  89. package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +0 -107
  90. package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +0 -75
  91. package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +0 -174
  92. package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +0 -909
  93. package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +0 -1077
  94. package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +0 -723
  95. package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +0 -943
  96. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +0 -128
  97. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +0 -121
  98. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +0 -144
  99. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +0 -127
  100. package/v2Containers/WebPush/Create/utils/urlValidation.js +0 -116
  101. package/v2Containers/WebPush/Create/utils/urlValidation.test.js +0 -449
  102. package/v2Containers/WebPush/actions.js +0 -60
  103. package/v2Containers/WebPush/constants.js +0 -108
  104. package/v2Containers/WebPush/index.js +0 -2
  105. package/v2Containers/WebPush/reducer.js +0 -104
  106. package/v2Containers/WebPush/sagas.js +0 -119
  107. package/v2Containers/WebPush/selectors.js +0 -65
  108. package/v2Containers/WebPush/tests/reducer.test.js +0 -863
  109. package/v2Containers/WebPush/tests/sagas.test.js +0 -566
  110. package/v2Containers/WebPush/tests/selectors.test.js +0 -843
@@ -1,843 +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
-