@capillarytech/creatives-library 8.0.130 → 8.0.132

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 (77) hide show
  1. package/containers/App/constants.js +1 -0
  2. package/containers/Login/index.js +1 -2
  3. package/package.json +1 -1
  4. package/services/api.js +5 -0
  5. package/tests/integration/TemplateCreation/TemplateCreation.integration.test.js +8 -3
  6. package/tests/integration/TemplateCreation/api-response.js +5 -0
  7. package/tests/integration/TemplateCreation/msw-handler.js +42 -63
  8. package/utils/common.js +7 -0
  9. package/utils/commonUtils.js +2 -6
  10. package/utils/createMobilePushPayload.js +322 -0
  11. package/utils/tests/createMobilePushPayload.test.js +1054 -0
  12. package/v2Components/CapDeviceContent/index.js +1 -1
  13. package/v2Components/CapImageUpload/index.js +57 -44
  14. package/v2Components/CapInAppCTA/index.js +1 -0
  15. package/v2Components/CapMpushCTA/constants.js +25 -0
  16. package/v2Components/CapMpushCTA/index.js +403 -0
  17. package/v2Components/CapMpushCTA/index.scss +95 -0
  18. package/v2Components/CapMpushCTA/messages.js +101 -0
  19. package/v2Components/CapTagList/index.js +178 -121
  20. package/v2Components/CapVideoUpload/constants.js +3 -0
  21. package/v2Components/CapVideoUpload/index.js +182 -115
  22. package/v2Components/CapVideoUpload/messages.js +16 -0
  23. package/v2Components/Carousel/index.js +15 -13
  24. package/v2Components/ErrorInfoNote/style.scss +1 -0
  25. package/v2Components/MobilePushPreviewV2/index.js +57 -12
  26. package/v2Components/TemplatePreview/_templatePreview.scss +218 -74
  27. package/v2Components/TemplatePreview/assets/images/Android_With_date_and_time.svg +29 -0
  28. package/v2Components/TemplatePreview/assets/images/android.svg +9 -0
  29. package/v2Components/TemplatePreview/assets/images/iOS_With_date_and_time.svg +26 -0
  30. package/v2Components/TemplatePreview/assets/images/ios.svg +9 -0
  31. package/v2Components/TemplatePreview/index.js +234 -107
  32. package/v2Components/TemplatePreview/messages.js +4 -0
  33. package/v2Components/TemplatePreview/tests/__snapshots__/index.test.js.snap +10 -10
  34. package/v2Containers/CreativesContainer/SlideBoxContent.js +127 -62
  35. package/v2Containers/CreativesContainer/index.js +193 -136
  36. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +0 -22
  37. package/v2Containers/InApp/constants.js +1 -0
  38. package/v2Containers/InApp/index.js +13 -13
  39. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +4748 -4658
  40. package/v2Containers/Login/index.js +1 -2
  41. package/v2Containers/MobilePush/Create/index.js +1 -0
  42. package/v2Containers/MobilePush/commonMethods.js +7 -14
  43. package/v2Containers/MobilePush/tests/commonMethods.test.js +401 -0
  44. package/v2Containers/MobilePushNew/actions.js +116 -0
  45. package/v2Containers/MobilePushNew/components/CtaButtons.js +183 -0
  46. package/v2Containers/MobilePushNew/components/MediaUploaders.js +835 -0
  47. package/v2Containers/MobilePushNew/components/PlatformContentFields.js +346 -0
  48. package/v2Containers/MobilePushNew/components/index.js +5 -0
  49. package/v2Containers/MobilePushNew/components/tests/CtaButtons.test.js +565 -0
  50. package/v2Containers/MobilePushNew/components/tests/MediaUploaders.test.js +3180 -0
  51. package/v2Containers/MobilePushNew/components/tests/PlatformContentFields.test.js +654 -0
  52. package/v2Containers/MobilePushNew/constants.js +116 -0
  53. package/v2Containers/MobilePushNew/hooks/tests/usePlatformSync.test.js +1462 -0
  54. package/v2Containers/MobilePushNew/hooks/tests/useUpload.test.js +1459 -0
  55. package/v2Containers/MobilePushNew/hooks/usePlatformSync.js +366 -0
  56. package/v2Containers/MobilePushNew/hooks/useUpload.js +740 -0
  57. package/v2Containers/MobilePushNew/index.js +2158 -0
  58. package/v2Containers/MobilePushNew/index.scss +308 -0
  59. package/v2Containers/MobilePushNew/messages.js +272 -0
  60. package/v2Containers/MobilePushNew/reducer.js +160 -0
  61. package/v2Containers/MobilePushNew/sagas.js +193 -0
  62. package/v2Containers/MobilePushNew/selectors.js +55 -0
  63. package/v2Containers/MobilePushNew/tests/reducer.test.js +741 -0
  64. package/v2Containers/MobilePushNew/tests/sagas.test.js +864 -0
  65. package/v2Containers/MobilePushNew/tests/selectors.test.js +665 -0
  66. package/v2Containers/MobilePushNew/tests/utils.test.js +421 -0
  67. package/v2Containers/MobilePushNew/utils.js +84 -0
  68. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +1176 -976
  69. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +684 -424
  70. package/v2Containers/TagList/index.js +56 -10
  71. package/v2Containers/Templates/_templates.scss +100 -1
  72. package/v2Containers/Templates/index.js +170 -31
  73. package/v2Containers/Templates/messages.js +8 -0
  74. package/v2Containers/Templates/sagas.js +1 -0
  75. package/v2Containers/Whatsapp/constants.js +1 -0
  76. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +3992 -3677
  77. package/assets/loading_img.gif +0 -0
@@ -0,0 +1,665 @@
1
+ import { fromJS } from 'immutable';
2
+ import {
3
+ makeSelectMobilePushNew,
4
+ makeSelectUploadedAssetData,
5
+ makeSelectUploadedAssetData0,
6
+ makeSelectUploadedAssetData1,
7
+ makeSelectUploadAssetSuccess,
8
+ makeSelectCreateError,
9
+ makeSelectAssetUploading,
10
+ makeSelectGetTemplateDetailsInProgress,
11
+ } from '../selectors';
12
+
13
+ describe('MobilePushNew selectors', () => {
14
+ // Mock state structures
15
+ const mockMobilePushNewState = {
16
+ uploadedAssetData: { id: 1, url: 'test-url' },
17
+ uploadedAssetData0: { id: 10, url: 'test-url-0', platform: 'android' },
18
+ uploadedAssetData1: { id: 11, url: 'test-url-1', platform: 'ios' },
19
+ uploadAssetSuccess: true,
20
+ createTemplateErrorMessage: 'Test error message',
21
+ assetUploading: true,
22
+ getTemplateDetailsInProgress: true,
23
+ otherProperty: 'test-value',
24
+ };
25
+
26
+ const mockStateWithMobilePushNew = fromJS({
27
+ mobilePushNew: mockMobilePushNewState,
28
+ otherState: { value: 'test' },
29
+ });
30
+
31
+ const mockStateWithoutMobilePushNew = fromJS({
32
+ otherState: { value: 'test' },
33
+ });
34
+
35
+ const mockStateWithEmptyMobilePushNew = fromJS({
36
+ mobilePushNew: {},
37
+ otherState: { value: 'test' },
38
+ });
39
+
40
+ const mockStateWithPartialMobilePushNew = fromJS({
41
+ mobilePushNew: {
42
+ uploadedAssetData: { id: 2, name: 'test-asset' },
43
+ uploadedAssetData0: { id: 20, name: 'test-asset-0' },
44
+ uploadAssetSuccess: false,
45
+ // Missing other properties to test defaults
46
+ },
47
+ otherState: { value: 'test' },
48
+ });
49
+
50
+ describe('makeSelectMobilePushNew', () => {
51
+ it('should select the mobilePushNew state and convert to JS', () => {
52
+ const selector = makeSelectMobilePushNew();
53
+ const result = selector(mockStateWithMobilePushNew);
54
+
55
+ expect(result).toEqual(mockMobilePushNewState);
56
+ expect(typeof result).toBe('object');
57
+ expect(Array.isArray(result)).toBe(false);
58
+ });
59
+
60
+ it('should return empty object when mobilePushNew state does not exist', () => {
61
+ const selector = makeSelectMobilePushNew();
62
+ const result = selector(mockStateWithoutMobilePushNew);
63
+
64
+ expect(result).toEqual({});
65
+ });
66
+
67
+ it('should return empty object when mobilePushNew state is empty', () => {
68
+ const selector = makeSelectMobilePushNew();
69
+ const result = selector(mockStateWithEmptyMobilePushNew);
70
+
71
+ expect(result).toEqual({});
72
+ });
73
+
74
+ it('should handle partial mobilePushNew state', () => {
75
+ const selector = makeSelectMobilePushNew();
76
+ const result = selector(mockStateWithPartialMobilePushNew);
77
+
78
+ expect(result).toEqual({
79
+ uploadedAssetData: { id: 2, name: 'test-asset' },
80
+ uploadedAssetData0: { id: 20, name: 'test-asset-0' },
81
+ uploadAssetSuccess: false,
82
+ });
83
+ });
84
+ });
85
+
86
+ describe('makeSelectUploadedAssetData', () => {
87
+ it('should select uploadedAssetData when it exists', () => {
88
+ const selector = makeSelectUploadedAssetData();
89
+ const result = selector(mockStateWithMobilePushNew);
90
+
91
+ // The selector returns the Immutable object directly, not converted to JS
92
+ expect(result.get('id')).toBe(1);
93
+ expect(result.get('url')).toBe('test-url');
94
+ });
95
+
96
+ it('should return empty object when uploadedAssetData does not exist', () => {
97
+ const selector = makeSelectUploadedAssetData();
98
+ const result = selector(mockStateWithoutMobilePushNew);
99
+
100
+ expect(result).toEqual({});
101
+ });
102
+
103
+ it('should return empty object when mobilePushNew state is empty', () => {
104
+ const selector = makeSelectUploadedAssetData();
105
+ const result = selector(mockStateWithEmptyMobilePushNew);
106
+
107
+ expect(result).toEqual({});
108
+ });
109
+
110
+ it('should return uploadedAssetData from partial state', () => {
111
+ const selector = makeSelectUploadedAssetData();
112
+ const result = selector(mockStateWithPartialMobilePushNew);
113
+
114
+ // The selector returns the Immutable object directly
115
+ expect(result.get('id')).toBe(2);
116
+ expect(result.get('name')).toBe('test-asset');
117
+ });
118
+
119
+ it('should return empty object when uploadedAssetData is null', () => {
120
+ const stateWithNullAssetData = fromJS({
121
+ mobilePushNew: {
122
+ uploadedAssetData: null,
123
+ uploadAssetSuccess: true,
124
+ },
125
+ });
126
+
127
+ const selector = makeSelectUploadedAssetData();
128
+ const result = selector(stateWithNullAssetData);
129
+
130
+ expect(result).toEqual({});
131
+ });
132
+ });
133
+
134
+ describe('makeSelectUploadedAssetData0', () => {
135
+ it('should select uploadedAssetData0 when it exists', () => {
136
+ const selector = makeSelectUploadedAssetData0();
137
+ const result = selector(mockStateWithMobilePushNew);
138
+
139
+ // The selector returns the Immutable object directly, not converted to JS
140
+ expect(result.get('id')).toBe(10);
141
+ expect(result.get('url')).toBe('test-url-0');
142
+ expect(result.get('platform')).toBe('android');
143
+ });
144
+
145
+ it('should return empty object when uploadedAssetData0 does not exist', () => {
146
+ const selector = makeSelectUploadedAssetData0();
147
+ const result = selector(mockStateWithoutMobilePushNew);
148
+
149
+ expect(result).toEqual({});
150
+ });
151
+
152
+ it('should return empty object when mobilePushNew state is empty', () => {
153
+ const selector = makeSelectUploadedAssetData0();
154
+ const result = selector(mockStateWithEmptyMobilePushNew);
155
+
156
+ expect(result).toEqual({});
157
+ });
158
+
159
+ it('should return uploadedAssetData0 from partial state', () => {
160
+ const selector = makeSelectUploadedAssetData0();
161
+ const result = selector(mockStateWithPartialMobilePushNew);
162
+
163
+ // The selector returns the Immutable object directly
164
+ expect(result.get('id')).toBe(20);
165
+ expect(result.get('name')).toBe('test-asset-0');
166
+ });
167
+
168
+ it('should return empty object when uploadedAssetData0 is null', () => {
169
+ const stateWithNullAssetData0 = fromJS({
170
+ mobilePushNew: {
171
+ uploadedAssetData0: null,
172
+ uploadAssetSuccess: true,
173
+ },
174
+ });
175
+
176
+ const selector = makeSelectUploadedAssetData0();
177
+ const result = selector(stateWithNullAssetData0);
178
+
179
+ expect(result).toEqual({});
180
+ });
181
+
182
+ it('should handle uploadedAssetData0 with complex nested data', () => {
183
+ const stateWithComplexAssetData0 = fromJS({
184
+ mobilePushNew: {
185
+ uploadedAssetData0: {
186
+ id: 30,
187
+ metaInfo: {
188
+ secure_file_path: '/path/to/file.jpg',
189
+ duration: 10.5,
190
+ file_size: 1024000,
191
+ },
192
+ status: 'uploaded',
193
+ },
194
+ },
195
+ });
196
+
197
+ const selector = makeSelectUploadedAssetData0();
198
+ const result = selector(stateWithComplexAssetData0);
199
+
200
+ expect(result.get('id')).toBe(30);
201
+ expect(result.getIn(['metaInfo', 'secure_file_path'])).toBe('/path/to/file.jpg');
202
+ expect(result.getIn(['metaInfo', 'duration'])).toBe(10.5);
203
+ expect(result.getIn(['metaInfo', 'file_size'])).toBe(1024000);
204
+ expect(result.get('status')).toBe('uploaded');
205
+ });
206
+
207
+ it('should handle uploadedAssetData0 with empty object', () => {
208
+ const stateWithEmptyAssetData0 = fromJS({
209
+ mobilePushNew: {
210
+ uploadedAssetData0: {},
211
+ },
212
+ });
213
+
214
+ const selector = makeSelectUploadedAssetData0();
215
+ const result = selector(stateWithEmptyAssetData0);
216
+
217
+ expect(result).toEqual(fromJS({}));
218
+ });
219
+ });
220
+
221
+ describe('makeSelectUploadedAssetData1', () => {
222
+ it('should select uploadedAssetData1 when it exists', () => {
223
+ const selector = makeSelectUploadedAssetData1();
224
+ const result = selector(mockStateWithMobilePushNew);
225
+
226
+ // The selector returns the Immutable object directly, not converted to JS
227
+ expect(result.get('id')).toBe(11);
228
+ expect(result.get('url')).toBe('test-url-1');
229
+ expect(result.get('platform')).toBe('ios');
230
+ });
231
+
232
+ it('should return empty object when uploadedAssetData1 does not exist', () => {
233
+ const selector = makeSelectUploadedAssetData1();
234
+ const result = selector(mockStateWithoutMobilePushNew);
235
+
236
+ expect(result).toEqual({});
237
+ });
238
+
239
+ it('should return empty object when mobilePushNew state is empty', () => {
240
+ const selector = makeSelectUploadedAssetData1();
241
+ const result = selector(mockStateWithEmptyMobilePushNew);
242
+
243
+ expect(result).toEqual({});
244
+ });
245
+
246
+ it('should return empty object when uploadedAssetData1 is not in partial state', () => {
247
+ const selector = makeSelectUploadedAssetData1();
248
+ const result = selector(mockStateWithPartialMobilePushNew);
249
+
250
+ expect(result).toEqual({});
251
+ });
252
+
253
+ it('should return empty object when uploadedAssetData1 is null', () => {
254
+ const stateWithNullAssetData1 = fromJS({
255
+ mobilePushNew: {
256
+ uploadedAssetData1: null,
257
+ uploadAssetSuccess: true,
258
+ },
259
+ });
260
+
261
+ const selector = makeSelectUploadedAssetData1();
262
+ const result = selector(stateWithNullAssetData1);
263
+
264
+ expect(result).toEqual({});
265
+ });
266
+
267
+ it('should handle uploadedAssetData1 with complex nested data', () => {
268
+ const stateWithComplexAssetData1 = fromJS({
269
+ mobilePushNew: {
270
+ uploadedAssetData1: {
271
+ id: 31,
272
+ metaInfo: {
273
+ secure_file_path: '/path/to/video.mp4',
274
+ duration: 15.2,
275
+ file_size: 2048000,
276
+ video_preview: '/path/to/preview.jpg',
277
+ },
278
+ status: 'processing',
279
+ uploadProgress: 100,
280
+ },
281
+ },
282
+ });
283
+
284
+ const selector = makeSelectUploadedAssetData1();
285
+ const result = selector(stateWithComplexAssetData1);
286
+
287
+ expect(result.get('id')).toBe(31);
288
+ expect(result.getIn(['metaInfo', 'secure_file_path'])).toBe('/path/to/video.mp4');
289
+ expect(result.getIn(['metaInfo', 'duration'])).toBe(15.2);
290
+ expect(result.getIn(['metaInfo', 'file_size'])).toBe(2048000);
291
+ expect(result.getIn(['metaInfo', 'video_preview'])).toBe('/path/to/preview.jpg');
292
+ expect(result.get('status')).toBe('processing');
293
+ expect(result.get('uploadProgress')).toBe(100);
294
+ });
295
+
296
+ it('should handle uploadedAssetData1 with empty object', () => {
297
+ const stateWithEmptyAssetData1 = fromJS({
298
+ mobilePushNew: {
299
+ uploadedAssetData1: {},
300
+ },
301
+ });
302
+
303
+ const selector = makeSelectUploadedAssetData1();
304
+ const result = selector(stateWithEmptyAssetData1);
305
+
306
+ expect(result).toEqual(fromJS({}));
307
+ });
308
+
309
+ it('should handle uploadedAssetData1 with different data types', () => {
310
+ const stateWithMixedDataTypes = fromJS({
311
+ mobilePushNew: {
312
+ uploadedAssetData1: {
313
+ id: 32,
314
+ name: 'test-video',
315
+ isActive: true,
316
+ tags: ['video', 'mobile'],
317
+ metadata: {
318
+ width: 1920,
319
+ height: 1080,
320
+ format: 'mp4',
321
+ },
322
+ },
323
+ },
324
+ });
325
+
326
+ const selector = makeSelectUploadedAssetData1();
327
+ const result = selector(stateWithMixedDataTypes);
328
+
329
+ expect(result.get('id')).toBe(32);
330
+ expect(result.get('name')).toBe('test-video');
331
+ expect(result.get('isActive')).toBe(true);
332
+ expect(result.get('tags').toJS()).toEqual(['video', 'mobile']);
333
+ expect(result.getIn(['metadata', 'width'])).toBe(1920);
334
+ expect(result.getIn(['metadata', 'height'])).toBe(1080);
335
+ expect(result.getIn(['metadata', 'format'])).toBe('mp4');
336
+ });
337
+ });
338
+
339
+ describe('makeSelectUploadAssetSuccess', () => {
340
+ it('should select uploadAssetSuccess when it is true', () => {
341
+ const selector = makeSelectUploadAssetSuccess();
342
+ const result = selector(mockStateWithMobilePushNew);
343
+
344
+ expect(result).toBe(true);
345
+ });
346
+
347
+ it('should select uploadAssetSuccess when it is false', () => {
348
+ const selector = makeSelectUploadAssetSuccess();
349
+ const result = selector(mockStateWithPartialMobilePushNew);
350
+
351
+ expect(result).toBe(false);
352
+ });
353
+
354
+ it('should return false when uploadAssetSuccess does not exist', () => {
355
+ const selector = makeSelectUploadAssetSuccess();
356
+ const result = selector(mockStateWithoutMobilePushNew);
357
+
358
+ expect(result).toBe(false);
359
+ });
360
+
361
+ it('should return false when mobilePushNew state is empty', () => {
362
+ const selector = makeSelectUploadAssetSuccess();
363
+ const result = selector(mockStateWithEmptyMobilePushNew);
364
+
365
+ expect(result).toBe(false);
366
+ });
367
+
368
+ it('should return false when uploadAssetSuccess is null or undefined', () => {
369
+ const stateWithNullSuccess = fromJS({
370
+ mobilePushNew: {
371
+ uploadAssetSuccess: null,
372
+ uploadedAssetData: {},
373
+ },
374
+ });
375
+
376
+ const selector = makeSelectUploadAssetSuccess();
377
+ const result = selector(stateWithNullSuccess);
378
+
379
+ expect(result).toBe(false);
380
+ });
381
+ });
382
+
383
+ describe('makeSelectCreateError', () => {
384
+ it('should select createTemplateErrorMessage when it exists', () => {
385
+ const selector = makeSelectCreateError();
386
+ const result = selector(mockStateWithMobilePushNew);
387
+
388
+ expect(result).toBe('Test error message');
389
+ });
390
+
391
+ it('should return empty string when createTemplateErrorMessage does not exist', () => {
392
+ const selector = makeSelectCreateError();
393
+ const result = selector(mockStateWithoutMobilePushNew);
394
+
395
+ expect(result).toBe('');
396
+ });
397
+
398
+ it('should return empty string when mobilePushNew state is empty', () => {
399
+ const selector = makeSelectCreateError();
400
+ const result = selector(mockStateWithEmptyMobilePushNew);
401
+
402
+ expect(result).toBe('');
403
+ });
404
+
405
+ it('should return empty string when createTemplateErrorMessage is not in partial state', () => {
406
+ const selector = makeSelectCreateError();
407
+ const result = selector(mockStateWithPartialMobilePushNew);
408
+
409
+ expect(result).toBe('');
410
+ });
411
+
412
+ it('should handle various error message types', () => {
413
+ const stateWithErrorMessage = fromJS({
414
+ mobilePushNew: {
415
+ createTemplateErrorMessage: 'Network error occurred',
416
+ },
417
+ });
418
+
419
+ const selector = makeSelectCreateError();
420
+ const result = selector(stateWithErrorMessage);
421
+
422
+ expect(result).toBe('Network error occurred');
423
+ });
424
+
425
+ it('should return empty string when createTemplateErrorMessage is null', () => {
426
+ const stateWithNullError = fromJS({
427
+ mobilePushNew: {
428
+ createTemplateErrorMessage: null,
429
+ },
430
+ });
431
+
432
+ const selector = makeSelectCreateError();
433
+ const result = selector(stateWithNullError);
434
+
435
+ expect(result).toBe('');
436
+ });
437
+ });
438
+
439
+ describe('makeSelectAssetUploading', () => {
440
+ it('should select assetUploading when it is true', () => {
441
+ const selector = makeSelectAssetUploading();
442
+ const result = selector(mockStateWithMobilePushNew);
443
+
444
+ expect(result).toBe(true);
445
+ });
446
+
447
+ it('should return false when assetUploading does not exist', () => {
448
+ const selector = makeSelectAssetUploading();
449
+ const result = selector(mockStateWithoutMobilePushNew);
450
+
451
+ expect(result).toBe(false);
452
+ });
453
+
454
+ it('should return false when mobilePushNew state is empty', () => {
455
+ const selector = makeSelectAssetUploading();
456
+ const result = selector(mockStateWithEmptyMobilePushNew);
457
+
458
+ expect(result).toBe(false);
459
+ });
460
+
461
+ it('should return false when assetUploading is not in partial state', () => {
462
+ const selector = makeSelectAssetUploading();
463
+ const result = selector(mockStateWithPartialMobilePushNew);
464
+
465
+ expect(result).toBe(false);
466
+ });
467
+
468
+ it('should handle assetUploading when explicitly set to false', () => {
469
+ const stateWithFalseUploading = fromJS({
470
+ mobilePushNew: {
471
+ assetUploading: false,
472
+ },
473
+ });
474
+
475
+ const selector = makeSelectAssetUploading();
476
+ const result = selector(stateWithFalseUploading);
477
+
478
+ expect(result).toBe(false);
479
+ });
480
+
481
+ it('should return false when assetUploading is null', () => {
482
+ const stateWithNullUploading = fromJS({
483
+ mobilePushNew: {
484
+ assetUploading: null,
485
+ },
486
+ });
487
+
488
+ const selector = makeSelectAssetUploading();
489
+ const result = selector(stateWithNullUploading);
490
+
491
+ expect(result).toBe(false);
492
+ });
493
+ });
494
+
495
+ describe('makeSelectGetTemplateDetailsInProgress', () => {
496
+ it('should select getTemplateDetailsInProgress when it is true', () => {
497
+ const selector = makeSelectGetTemplateDetailsInProgress();
498
+ const result = selector(mockStateWithMobilePushNew);
499
+
500
+ expect(result).toBe(true);
501
+ });
502
+
503
+ it('should return false when getTemplateDetailsInProgress does not exist', () => {
504
+ const selector = makeSelectGetTemplateDetailsInProgress();
505
+ const result = selector(mockStateWithoutMobilePushNew);
506
+
507
+ expect(result).toBe(false);
508
+ });
509
+
510
+ it('should return false when mobilePushNew state is empty', () => {
511
+ const selector = makeSelectGetTemplateDetailsInProgress();
512
+ const result = selector(mockStateWithEmptyMobilePushNew);
513
+
514
+ expect(result).toBe(false);
515
+ });
516
+
517
+ it('should return false when getTemplateDetailsInProgress is not in partial state', () => {
518
+ const selector = makeSelectGetTemplateDetailsInProgress();
519
+ const result = selector(mockStateWithPartialMobilePushNew);
520
+
521
+ expect(result).toBe(false);
522
+ });
523
+
524
+ it('should handle getTemplateDetailsInProgress when explicitly set to false', () => {
525
+ const stateWithFalseProgress = fromJS({
526
+ mobilePushNew: {
527
+ getTemplateDetailsInProgress: false,
528
+ },
529
+ });
530
+
531
+ const selector = makeSelectGetTemplateDetailsInProgress();
532
+ const result = selector(stateWithFalseProgress);
533
+
534
+ expect(result).toBe(false);
535
+ });
536
+
537
+ it('should return false when getTemplateDetailsInProgress is null', () => {
538
+ const stateWithNullProgress = fromJS({
539
+ mobilePushNew: {
540
+ getTemplateDetailsInProgress: null,
541
+ },
542
+ });
543
+
544
+ const selector = makeSelectGetTemplateDetailsInProgress();
545
+ const result = selector(stateWithNullProgress);
546
+
547
+ expect(result).toBe(false);
548
+ });
549
+ });
550
+
551
+ describe('Selector memoization', () => {
552
+ it('should return the same result for identical state (memoization test)', () => {
553
+ const selector = makeSelectMobilePushNew();
554
+ const result1 = selector(mockStateWithMobilePushNew);
555
+ const result2 = selector(mockStateWithMobilePushNew);
556
+
557
+ expect(result1).toBe(result2);
558
+ });
559
+
560
+ it('should return different results for different states', () => {
561
+ const selector = makeSelectUploadAssetSuccess();
562
+ const result1 = selector(mockStateWithMobilePushNew);
563
+ const result2 = selector(mockStateWithPartialMobilePushNew);
564
+
565
+ expect(result1).toBe(true);
566
+ expect(result2).toBe(false);
567
+ expect(result1).not.toBe(result2);
568
+ });
569
+ });
570
+
571
+ describe('Edge cases', () => {
572
+ it('should handle undefined state gracefully', () => {
573
+ const selector = makeSelectMobilePushNew();
574
+ const undefinedState = fromJS({});
575
+ const result = selector(undefinedState);
576
+
577
+ expect(result).toEqual({});
578
+ });
579
+
580
+ it('should handle state with mobilePushNew as null', () => {
581
+ const stateWithNullMobilePushNew = fromJS({
582
+ mobilePushNew: null,
583
+ });
584
+
585
+ const selector = makeSelectUploadedAssetData();
586
+ const result = selector(stateWithNullMobilePushNew);
587
+
588
+ expect(result).toEqual({});
589
+ });
590
+
591
+ it('should handle deeply nested state access', () => {
592
+ const complexState = fromJS({
593
+ level1: {
594
+ level2: {
595
+ mobilePushNew: mockMobilePushNewState,
596
+ },
597
+ },
598
+ });
599
+
600
+ // This should return defaults since mobilePushNew is not at root level
601
+ const selector = makeSelectUploadAssetSuccess();
602
+ const result = selector(complexState);
603
+
604
+ expect(result).toBe(false);
605
+ });
606
+ });
607
+
608
+ describe('Multiple selector usage', () => {
609
+ it('should work correctly when multiple selectors are used on same state', () => {
610
+ const successSelector = makeSelectUploadAssetSuccess();
611
+ const uploadingSelector = makeSelectAssetUploading();
612
+ const errorSelector = makeSelectCreateError();
613
+ const assetData0Selector = makeSelectUploadedAssetData0();
614
+ const assetData1Selector = makeSelectUploadedAssetData1();
615
+
616
+ const successResult = successSelector(mockStateWithMobilePushNew);
617
+ const uploadingResult = uploadingSelector(mockStateWithMobilePushNew);
618
+ const errorResult = errorSelector(mockStateWithMobilePushNew);
619
+ const assetData0Result = assetData0Selector(mockStateWithMobilePushNew);
620
+ const assetData1Result = assetData1Selector(mockStateWithMobilePushNew);
621
+
622
+ expect(successResult).toBe(true);
623
+ expect(uploadingResult).toBe(true);
624
+ expect(errorResult).toBe('Test error message');
625
+ expect(assetData0Result.get('id')).toBe(10);
626
+ expect(assetData0Result.get('platform')).toBe('android');
627
+ expect(assetData1Result.get('id')).toBe(11);
628
+ expect(assetData1Result.get('platform')).toBe('ios');
629
+ });
630
+
631
+ it('should maintain independent results across different selectors', () => {
632
+ const assetDataSelector = makeSelectUploadedAssetData();
633
+ const assetData0Selector = makeSelectUploadedAssetData0();
634
+ const progressSelector = makeSelectGetTemplateDetailsInProgress();
635
+
636
+ const assetDataResult = assetDataSelector(mockStateWithPartialMobilePushNew);
637
+ const assetData0Result = assetData0Selector(mockStateWithPartialMobilePushNew);
638
+ const progressResult = progressSelector(mockStateWithPartialMobilePushNew);
639
+
640
+ // Check that assetDataResult is an Immutable object with the expected values
641
+ expect(assetDataResult.get('id')).toBe(2);
642
+ expect(assetDataResult.get('name')).toBe('test-asset');
643
+ expect(assetData0Result.get('id')).toBe(20);
644
+ expect(assetData0Result.get('name')).toBe('test-asset-0');
645
+ expect(progressResult).toBe(false);
646
+ });
647
+
648
+ it('should handle all asset data selectors together', () => {
649
+ const assetDataSelector = makeSelectUploadedAssetData();
650
+ const assetData0Selector = makeSelectUploadedAssetData0();
651
+ const assetData1Selector = makeSelectUploadedAssetData1();
652
+
653
+ const assetDataResult = assetDataSelector(mockStateWithMobilePushNew);
654
+ const assetData0Result = assetData0Selector(mockStateWithMobilePushNew);
655
+ const assetData1Result = assetData1Selector(mockStateWithMobilePushNew);
656
+
657
+ expect(assetDataResult.get('id')).toBe(1);
658
+ expect(assetDataResult.get('url')).toBe('test-url');
659
+ expect(assetData0Result.get('id')).toBe(10);
660
+ expect(assetData0Result.get('url')).toBe('test-url-0');
661
+ expect(assetData1Result.get('id')).toBe(11);
662
+ expect(assetData1Result.get('url')).toBe('test-url-1');
663
+ });
664
+ });
665
+ });