@@ -8,14 +8,21 @@ import Interceptor from '../../src/utils/XhrNetworkInterceptor';
8
8
import { isContentTypeNotAllowed , reportNetworkLog } from '../../src/utils/InstabugUtils' ;
9
9
import InstabugConstants from '../../src/utils/InstabugConstants' ;
10
10
import * as Instabug from '../../src/modules/Instabug' ;
11
- import { NativeNetworkLogger } from '../../src/native/NativeNetworkLogger' ;
11
+ import {
12
+ NativeNetworkLogger ,
13
+ NativeNetworkLoggerEvent ,
14
+ NetworkListenerType ,
15
+ NetworkLoggerEmitter ,
16
+ } from '../../src/native/NativeNetworkLogger' ;
12
17
import { InvocationEvent , LogLevel , NetworkInterceptionMode } from '../../src' ;
13
18
import { Platform } from 'react-native' ;
14
19
15
20
const clone = < T > ( obj : T ) : T => {
16
21
return JSON . parse ( JSON . stringify ( obj ) ) ;
17
22
} ;
18
23
24
+ jest . mock ( '../../src/native/NativeNetworkLogger' ) ;
25
+
19
26
describe ( 'NetworkLogger Module' , ( ) => {
20
27
const network : NetworkLogger . NetworkData = {
21
28
id : '' ,
@@ -312,3 +319,111 @@ describe('NetworkLogger Module', () => {
312
319
expect ( NativeNetworkLogger . hasAPMNetworkPlugin ) . toHaveBeenCalled ( ) ;
313
320
} ) ;
314
321
} ) ;
322
+
323
+ describe ( '_registerNetworkLogsListener' , ( ) => {
324
+ let handlerMock : jest . Mock ;
325
+ let type : NetworkListenerType ;
326
+
327
+ beforeEach ( ( ) => {
328
+ jest . resetModules ( ) ; // Clear cached modules and reload
329
+ jest . resetAllMocks ( ) ; // Reset mock implementation and calls
330
+ jest . clearAllMocks ( ) ; // Clear only calls, keeping implementation intact
331
+ } ) ;
332
+
333
+ afterEach ( ( ) => {
334
+ handlerMock = jest . fn ( ) ;
335
+ type = NetworkListenerType . both ;
336
+ // Make sure to clean up listeners to avoid side effects
337
+ NetworkLoggerEmitter . removeAllListeners ( NativeNetworkLoggerEvent . NETWORK_LOGGER_HANDLER ) ;
338
+ } ) ;
339
+
340
+ it ( 'should ignore repetitive calls with the same type' , ( ) => {
341
+ // Simulate existing listener
342
+ jest . spyOn ( NetworkLoggerEmitter , 'listenerCount' ) . mockReturnValue ( 1 ) ;
343
+ NetworkLogger . registerNetworkLogsListener ( type , handlerMock ) ;
344
+
345
+ // Call again with the same type to ensure it does nothing
346
+ NetworkLogger . registerNetworkLogsListener ( type , handlerMock ) ;
347
+
348
+ expect ( NetworkLoggerEmitter . removeAllListeners ) . toHaveBeenCalledTimes ( 1 ) ;
349
+ expect ( NetworkLoggerEmitter . addListener ) . toHaveBeenCalledTimes ( 1 ) ;
350
+ expect ( NativeNetworkLogger . registerNetworkLogsListener ) . toHaveBeenCalledTimes ( 1 ) ;
351
+ } ) ;
352
+
353
+ it ( 'should remove old listeners if they exist' , ( ) => {
354
+ // Simulate that there are existing listeners
355
+ jest . spyOn ( NetworkLoggerEmitter , 'listenerCount' ) . mockReturnValue ( 2 ) ;
356
+
357
+ NetworkLogger . registerNetworkLogsListener ( type , handlerMock ) ;
358
+
359
+ expect ( NetworkLoggerEmitter . removeAllListeners ) . toHaveBeenCalledWith (
360
+ NativeNetworkLoggerEvent . NETWORK_LOGGER_HANDLER ,
361
+ ) ;
362
+ } ) ;
363
+
364
+ it ( 'should set the new listener if _networkListener is null' , ( ) => {
365
+ // No existing listener
366
+ jest . spyOn ( NetworkLoggerEmitter , 'listenerCount' ) . mockReturnValue ( 0 ) ;
367
+
368
+ NetworkLogger . registerNetworkLogsListener ( type , handlerMock ) ;
369
+
370
+ expect ( NetworkLoggerEmitter . addListener ) . toHaveBeenCalled ( ) ;
371
+ expect ( NativeNetworkLogger . registerNetworkLogsListener ) . toHaveBeenCalledWith ( type ) ;
372
+ } ) ;
373
+
374
+ it ( 'should attach a new listener to the existing one if _networkListener is set' , ( ) => {
375
+ type = NetworkListenerType . filtering ;
376
+ const newType = NetworkListenerType . both ;
377
+
378
+ // First call to set the listener
379
+ NetworkLogger . registerNetworkLogsListener ( type , handlerMock ) ;
380
+
381
+ // Second call with a different type to trigger setting to `both`
382
+ NetworkLogger . registerNetworkLogsListener ( newType , handlerMock ) ;
383
+
384
+ expect ( NetworkLoggerEmitter . addListener ) . toHaveBeenCalledTimes ( 2 ) ;
385
+ expect ( NativeNetworkLogger . registerNetworkLogsListener ) . toHaveBeenCalledWith (
386
+ NetworkListenerType . both ,
387
+ ) ;
388
+ } ) ;
389
+
390
+ it ( 'should map networkSnapshot data correctly and call handler' , ( ) => {
391
+ const mockNetworkSnapshot = {
392
+ id : '123' ,
393
+ url : 'http://example.com' ,
394
+ requestHeader : { } ,
395
+ requestBody : 'test request body' ,
396
+ responseHeader : { } ,
397
+ response : 'test response' ,
398
+ responseCode : 200 ,
399
+ } ;
400
+
401
+ ( NetworkLoggerEmitter . addListener as jest . Mock ) . mockImplementation ( ( _ , callback ) => {
402
+ callback ( mockNetworkSnapshot ) ;
403
+ } ) ;
404
+
405
+ NetworkLogger . registerNetworkLogsListener ( type , handlerMock ) ;
406
+
407
+ const expectedNetworkData : NetworkLogger . NetworkData = {
408
+ id : '123' ,
409
+ url : 'http://example.com' ,
410
+ requestBody : 'test request body' ,
411
+ requestHeaders : { } ,
412
+ method : '' ,
413
+ responseBody : 'test response' ,
414
+ responseCode : 200 ,
415
+ responseHeaders : { } ,
416
+ contentType : '' ,
417
+ duration : 0 ,
418
+ requestBodySize : 0 ,
419
+ responseBodySize : 0 ,
420
+ errorDomain : '' ,
421
+ errorCode : 0 ,
422
+ startTime : 0 ,
423
+ serverErrorMessage : '' ,
424
+ requestContentType : '' ,
425
+ } ;
426
+
427
+ expect ( handlerMock ) . toHaveBeenCalledWith ( expectedNetworkData ) ;
428
+ } ) ;
429
+ } ) ;
0 commit comments