13
13
14
14
const LogBoxData = require ( '../Data/LogBoxData' ) ;
15
15
const LogBox = require ( '../LogBox' ) . default ;
16
+ const ExceptionsManager = require ( '../../Core/ExceptionsManager.js' ) ;
16
17
17
18
declare var console: any ;
18
19
@@ -34,15 +35,18 @@ describe('LogBox', () => {
34
35
35
36
beforeEach ( ( ) => {
36
37
jest . resetModules ( ) ;
38
+ jest . restoreAllMocks ( ) ;
37
39
console . error = jest . fn ( ) ;
38
- console . log = jest . fn ( ) ;
39
40
console . warn = jest . fn ( ) ;
40
41
} ) ;
41
42
42
43
afterEach ( ( ) => {
43
44
LogBox . uninstall ( ) ;
45
+ // Reset ExceptionManager patching.
46
+ if ( console . _errorOriginal ) {
47
+ console . _errorOriginal = null ;
48
+ }
44
49
console . error = error ;
45
- console . log = log ;
46
50
console . warn = warn ;
47
51
} ) ;
48
52
@@ -95,7 +99,7 @@ describe('LogBox', () => {
95
99
} ) ;
96
100
97
101
it ( 'registers warnings' , ( ) => {
98
- jest . mock ( '../Data/ LogBoxData') ;
102
+ jest . spyOn ( LogBoxData , 'addLog ') ;
99
103
100
104
LogBox . install ( ) ;
101
105
@@ -105,13 +109,14 @@ describe('LogBox', () => {
105
109
} ) ;
106
110
107
111
it ( 'reports a LogBox exception if we fail to add warnings' , ( ) => {
108
- jest . mock ( '../Data/ LogBoxData') ;
109
- const mockError = new Error ( 'Simulated error ') ;
112
+ jest . spyOn ( LogBoxData , 'addLog ') ;
113
+ jest . spyOn ( LogBoxData , 'reportLogBoxError ') ;
110
114
111
115
// Picking a random implementation detail to simulate throwing.
112
- ( LogBoxData . isMessageIgnored : any ) . mockImplementation ( ( ) => {
116
+ jest . spyOn ( LogBoxData , 'isMessageIgnored' ) . mockImplementation ( ( ) => {
113
117
throw mockError ;
114
118
} ) ;
119
+ const mockError = new Error ( 'Simulated error' ) ;
115
120
116
121
LogBox . install ( ) ;
117
122
@@ -123,7 +128,8 @@ describe('LogBox', () => {
123
128
} ) ;
124
129
125
130
it ( 'only registers errors beginning with "Warning: "' , ( ) => {
126
- jest . mock ( '../Data/LogBoxData' ) ;
131
+ jest . spyOn ( LogBoxData , 'addLog' ) ;
132
+ jest . spyOn ( LogBoxData , 'checkWarningFilter' ) ;
127
133
128
134
LogBox . install ( ) ;
129
135
@@ -133,7 +139,8 @@ describe('LogBox', () => {
133
139
} ) ;
134
140
135
141
it ( 'registers react errors with the formatting from filter' , ( ) => {
136
- jest . mock ( '../Data/LogBoxData' ) ;
142
+ jest . spyOn ( LogBoxData , 'addLog' ) ;
143
+ jest . spyOn ( LogBoxData , 'checkWarningFilter' ) ;
137
144
138
145
mockFilterResult ( {
139
146
finalFormat : 'Custom format' ,
@@ -157,7 +164,8 @@ describe('LogBox', () => {
157
164
} ) ;
158
165
159
166
it ( 'registers errors with component stack as errors by default' , ( ) => {
160
- jest . mock ( '../Data/LogBoxData' ) ;
167
+ jest . spyOn ( LogBoxData , 'addLog' ) ;
168
+ jest . spyOn ( LogBoxData , 'checkWarningFilter' ) ;
161
169
162
170
mockFilterResult ( { } ) ;
163
171
@@ -174,7 +182,8 @@ describe('LogBox', () => {
174
182
} ) ;
175
183
176
184
it ( 'registers errors with component stack as errors by default if not found in warning filter' , ( ) => {
177
- jest . mock ( '../Data/LogBoxData' ) ;
185
+ jest . spyOn ( LogBoxData , 'addLog' ) ;
186
+ jest . spyOn ( LogBoxData , 'checkWarningFilter' ) ;
178
187
179
188
mockFilterResult ( {
180
189
monitorEvent : 'warning_unhandled' ,
@@ -193,10 +202,12 @@ describe('LogBox', () => {
193
202
} ) ;
194
203
195
204
it ( 'registers errors with component stack with legacy suppression as warning' , ( ) => {
196
- jest . mock ( '../Data/LogBoxData' ) ;
205
+ jest . spyOn ( LogBoxData , 'addLog' ) ;
206
+ jest . spyOn ( LogBoxData , 'checkWarningFilter' ) ;
197
207
198
208
mockFilterResult ( {
199
209
suppressDialog_LEGACY : true ,
210
+ monitorEvent : 'warning' ,
200
211
} ) ;
201
212
202
213
LogBox . install ( ) ;
@@ -211,10 +222,12 @@ describe('LogBox', () => {
211
222
} ) ;
212
223
213
224
it ( 'registers errors with component stack and a forced dialog as fatals' , ( ) => {
214
- jest . mock ( '../Data/LogBoxData' ) ;
225
+ jest . spyOn ( LogBoxData , 'addLog' ) ;
226
+ jest . spyOn ( LogBoxData , 'checkWarningFilter' ) ;
215
227
216
228
mockFilterResult ( {
217
229
forceDialogImmediately : true ,
230
+ monitorEvent : 'warning' ,
218
231
} ) ;
219
232
220
233
LogBox . install ( ) ;
@@ -229,7 +242,8 @@ describe('LogBox', () => {
229
242
} ) ;
230
243
231
244
it ( 'registers warning module errors with the formatting from filter' , ( ) => {
232
- jest . mock ( '../Data/LogBoxData' ) ;
245
+ jest . spyOn ( LogBoxData , 'addLog' ) ;
246
+ jest . spyOn ( LogBoxData , 'checkWarningFilter' ) ;
233
247
234
248
mockFilterResult ( {
235
249
finalFormat : 'Custom format' ,
@@ -248,7 +262,8 @@ describe('LogBox', () => {
248
262
} ) ;
249
263
250
264
it ( 'registers warning module errors as errors by default' , ( ) => {
251
- jest . mock ( '../Data/LogBoxData' ) ;
265
+ jest . spyOn ( LogBoxData , 'addLog' ) ;
266
+ jest . spyOn ( LogBoxData , 'checkWarningFilter' ) ;
252
267
253
268
mockFilterResult ( { } ) ;
254
269
@@ -262,10 +277,12 @@ describe('LogBox', () => {
262
277
} ) ;
263
278
264
279
it ( 'registers warning module errors with only legacy suppression as warning' , ( ) => {
265
- jest . mock ( '../Data/LogBoxData' ) ;
280
+ jest . spyOn ( LogBoxData , 'addLog' ) ;
281
+ jest . spyOn ( LogBoxData , 'checkWarningFilter' ) ;
266
282
267
283
mockFilterResult ( {
268
284
suppressDialog_LEGACY : true ,
285
+ monitorEvent : 'warning' ,
269
286
} ) ;
270
287
271
288
LogBox . install ( ) ;
@@ -277,10 +294,12 @@ describe('LogBox', () => {
277
294
} ) ;
278
295
279
296
it ( 'registers warning module errors with a forced dialog as fatals' , ( ) => {
280
- jest . mock ( '../Data/LogBoxData' ) ;
297
+ jest . spyOn ( LogBoxData , 'addLog' ) ;
298
+ jest . spyOn ( LogBoxData , 'checkWarningFilter' ) ;
281
299
282
300
mockFilterResult ( {
283
301
forceDialogImmediately : true ,
302
+ monitorEvent : 'warning' ,
284
303
} ) ;
285
304
286
305
LogBox . install ( ) ;
@@ -292,10 +311,12 @@ describe('LogBox', () => {
292
311
} ) ;
293
312
294
313
it ( 'ignores warning module errors that are suppressed completely' , ( ) => {
295
- jest . mock ( '../Data/LogBoxData' ) ;
314
+ jest . spyOn ( LogBoxData , 'addLog' ) ;
315
+ jest . spyOn ( LogBoxData , 'checkWarningFilter' ) ;
296
316
297
317
mockFilterResult ( {
298
318
suppressCompletely : true ,
319
+ monitorEvent : 'warning' ,
299
320
} ) ;
300
321
301
322
LogBox . install ( ) ;
@@ -305,10 +326,11 @@ describe('LogBox', () => {
305
326
} ) ;
306
327
307
328
it ( 'ignores warning module errors that are pattern ignored' , ( ) => {
308
- jest . mock ( '../Data/LogBoxData' ) ;
329
+ jest . spyOn ( LogBoxData , 'checkWarningFilter' ) ;
330
+ jest . spyOn ( LogBoxData , 'isMessageIgnored' ) . mockReturnValue ( true ) ;
331
+ jest . spyOn ( LogBoxData , 'addLog' ) ;
309
332
310
333
mockFilterResult ( { } ) ;
311
- ( LogBoxData . isMessageIgnored : any ) . mockReturnValue ( true ) ;
312
334
313
335
LogBox . install ( ) ;
314
336
@@ -317,10 +339,11 @@ describe('LogBox', () => {
317
339
} ) ;
318
340
319
341
it ( 'ignores warning module errors that are from LogBox itself' , ( ) => {
320
- jest . mock ( '../Data/LogBoxData' ) ;
342
+ jest . spyOn ( LogBoxData , 'checkWarningFilter' ) ;
343
+ jest . spyOn ( LogBoxData , 'isLogBoxErrorMessage' ) . mockReturnValue ( true ) ;
344
+ jest . spyOn ( LogBoxData , 'addLog' ) ;
321
345
322
346
mockFilterResult ( { } ) ;
323
- ( LogBoxData . isLogBoxErrorMessage : any ) . mockReturnValue ( true ) ;
324
347
325
348
LogBox . install ( ) ;
326
349
@@ -329,8 +352,9 @@ describe('LogBox', () => {
329
352
} ) ;
330
353
331
354
it ( 'ignores logs that are pattern ignored"' , ( ) => {
332
- jest . mock ( '../Data/LogBoxData' ) ;
333
- ( LogBoxData . isMessageIgnored : any ) . mockReturnValue ( true ) ;
355
+ jest . spyOn ( LogBoxData , 'checkWarningFilter' ) ;
356
+ jest . spyOn ( LogBoxData , 'isMessageIgnored' ) . mockReturnValue ( true ) ;
357
+ jest . spyOn ( LogBoxData , 'addLog' ) ;
334
358
335
359
LogBox . install ( ) ;
336
360
@@ -339,8 +363,8 @@ describe('LogBox', () => {
339
363
} ) ;
340
364
341
365
it ( 'does not add logs that are from LogBox itself"' , ( ) => {
342
- jest . mock ( '../Data/ LogBoxData' ) ;
343
- ( LogBoxData . isLogBoxErrorMessage : any ) . mockReturnValue ( true ) ;
366
+ jest . spyOn ( LogBoxData , 'isLogBoxErrorMessage' ) . mockReturnValue ( true ) ;
367
+ jest . spyOn ( LogBoxData , 'addLog' ) ;
344
368
345
369
LogBox . install ( ) ;
346
370
@@ -349,7 +373,7 @@ describe('LogBox', () => {
349
373
} ) ;
350
374
351
375
it ( 'ignores logs starting with "(ADVICE)"' , ( ) => {
352
- jest . mock ( '../Data/ LogBoxData') ;
376
+ jest . spyOn ( LogBoxData , 'addLog ') ;
353
377
354
378
LogBox . install ( ) ;
355
379
@@ -358,7 +382,7 @@ describe('LogBox', () => {
358
382
} ) ;
359
383
360
384
it ( 'does not ignore logs formatted to start with "(ADVICE)"' , ( ) => {
361
- jest . mock ( '../Data/ LogBoxData') ;
385
+ jest . spyOn ( LogBoxData , 'addLog ') ;
362
386
363
387
LogBox . install ( ) ;
364
388
@@ -376,7 +400,7 @@ describe('LogBox', () => {
376
400
} ) ;
377
401
378
402
it ( 'ignores console methods after uninstalling' , ( ) => {
379
- jest . mock ( '../Data/ LogBoxData') ;
403
+ jest . spyOn ( LogBoxData , 'addLog ') ;
380
404
381
405
LogBox . install ( ) ;
382
406
LogBox . uninstall ( ) ;
@@ -389,7 +413,7 @@ describe('LogBox', () => {
389
413
} ) ;
390
414
391
415
it ( 'does not add logs after uninstalling' , ( ) => {
392
- jest . mock ( '../Data/ LogBoxData') ;
416
+ jest . spyOn ( LogBoxData , 'addLog ') ;
393
417
394
418
LogBox . install ( ) ;
395
419
LogBox . uninstall ( ) ;
@@ -406,7 +430,7 @@ describe('LogBox', () => {
406
430
} ) ;
407
431
408
432
it ( 'does not add exceptions after uninstalling' , ( ) => {
409
- jest . mock ( '../Data/ LogBoxData') ;
433
+ jest . spyOn ( LogBoxData , 'addException ') ;
410
434
411
435
LogBox . install ( ) ;
412
436
LogBox . uninstall ( ) ;
@@ -482,4 +506,41 @@ describe('LogBox', () => {
482
506
'Custom: after installing for the second time' ,
483
507
) ;
484
508
} ) ;
509
+ it ( 'registers errors without component stack as errors by default, when ExceptionManager is registered first' , ( ) => {
510
+ jest . spyOn ( LogBoxData , 'checkWarningFilter' ) ;
511
+ jest . spyOn ( LogBoxData , 'addException' ) ;
512
+
513
+ ExceptionsManager . installConsoleErrorReporter ( ) ;
514
+ LogBox . install ( ) ;
515
+
516
+ console . error ( 'HIT' ) ;
517
+
518
+ // Errors without a component stack skip the warning filter and
519
+ // fall through to the ExceptionManager, which are then reported
520
+ // back to LogBox as non-fatal exceptions, in a convuluted dance
521
+ // in the most legacy cruft way.
522
+ expect ( LogBoxData . addException ) . toBeCalledWith (
523
+ expect . objectContaining ( { originalMessage : 'HIT' } ) ,
524
+ ) ;
525
+ expect ( LogBoxData . checkWarningFilter ) . not . toBeCalled ( ) ;
526
+ } ) ;
527
+
528
+ it ( 'registers errors without component stack as errors by default, when ExceptionManager is registered second' , ( ) => {
529
+ jest . spyOn ( LogBoxData , 'checkWarningFilter' ) ;
530
+ jest . spyOn ( LogBoxData , 'addException' ) ;
531
+
532
+ LogBox . install ( ) ;
533
+ ExceptionsManager . installConsoleErrorReporter ( ) ;
534
+
535
+ console . error ( 'HIT' ) ;
536
+
537
+ // Errors without a component stack skip the warning filter and
538
+ // fall through to the ExceptionManager, which are then reported
539
+ // back to LogBox as non-fatal exceptions, in a convuluted dance
540
+ // in the most legacy cruft way.
541
+ expect ( LogBoxData . addException ) . toBeCalledWith (
542
+ expect . objectContaining ( { originalMessage : 'HIT' } ) ,
543
+ ) ;
544
+ expect ( LogBoxData . checkWarningFilter ) . not . toBeCalled ( ) ;
545
+ } ) ;
485
546
} ) ;
0 commit comments