@@ -8,14 +8,21 @@ import Interceptor from '../../src/utils/XhrNetworkInterceptor';
88import { isContentTypeNotAllowed , reportNetworkLog } from '../../src/utils/InstabugUtils' ;
99import InstabugConstants from '../../src/utils/InstabugConstants' ;
1010import * 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' ;
1217import { InvocationEvent , LogLevel , NetworkInterceptionMode } from '../../src' ;
1318import { Platform } from 'react-native' ;
1419
1520const clone = < T > ( obj : T ) : T => {
1621 return JSON . parse ( JSON . stringify ( obj ) ) ;
1722} ;
1823
24+ jest . mock ( '../../src/native/NativeNetworkLogger' ) ;
25+
1926describe ( 'NetworkLogger Module' , ( ) => {
2027 const network : NetworkLogger . NetworkData = {
2128 id : '' ,
@@ -312,3 +319,111 @@ describe('NetworkLogger Module', () => {
312319 expect ( NativeNetworkLogger . hasAPMNetworkPlugin ) . toHaveBeenCalled ( ) ;
313320 } ) ;
314321} ) ;
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