Skip to content

Commit a2818b0

Browse files
add: unit tests to InstabugUtils.spec.ts,
remove: debug console logs
1 parent 46d0746 commit a2818b0

File tree

3 files changed

+121
-6
lines changed

3 files changed

+121
-6
lines changed

src/utils/AppStatesHandler.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ let subscription: any = null;
66
export const addAppStateListener = (handleAppStateChange: (state: AppStateStatus) => void) => {
77
if (!subscription) {
88
subscription = AppState.addEventListener('change', handleAppStateChange);
9-
console.log('Andrew: AppState listener added');
109
}
1110
};
1211

@@ -16,6 +15,5 @@ export const removeAppStateListener = () => {
1615
if (subscription) {
1716
subscription.remove();
1817
subscription = null;
19-
console.log('Andrew: AppState listener removed');
2018
}
2119
};

test/utils/AppStatesHandler.spec.ts

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { AppState } from 'react-native';
2+
import { addAppStateListener, removeAppStateListener } from '../../src/utils/AppStatesHandler';
3+
4+
jest.mock('react-native', () => ({
5+
AppState: {
6+
addEventListener: jest.fn(),
7+
},
8+
}));
9+
10+
describe('AppState Listener', () => {
11+
const mockHandleAppStateChange = jest.fn();
12+
const mockRemove = jest.fn();
13+
14+
beforeEach(() => {
15+
jest.clearAllMocks();
16+
(AppState.addEventListener as jest.Mock).mockReturnValue({ remove: mockRemove });
17+
});
18+
19+
afterEach(() => {
20+
removeAppStateListener(); // Ensure no leftover subscriptions between tests
21+
});
22+
23+
it('should add an AppState listener if none exists', () => {
24+
addAppStateListener(mockHandleAppStateChange);
25+
26+
expect(AppState.addEventListener).toHaveBeenCalledTimes(1);
27+
expect(AppState.addEventListener).toHaveBeenCalledWith('change', mockHandleAppStateChange);
28+
});
29+
30+
it('should not add another listener if one already exists', () => {
31+
addAppStateListener(mockHandleAppStateChange);
32+
addAppStateListener(mockHandleAppStateChange);
33+
34+
expect(AppState.addEventListener).toHaveBeenCalledTimes(1); // Only called once
35+
});
36+
37+
it('should remove the AppState listener if one exists', () => {
38+
addAppStateListener(mockHandleAppStateChange);
39+
removeAppStateListener();
40+
41+
expect(mockRemove).toHaveBeenCalledTimes(1); // The remove function is called
42+
});
43+
44+
it('should do nothing if removeAppStateListener is called without an existing subscription', () => {
45+
removeAppStateListener();
46+
47+
expect(mockRemove).not.toHaveBeenCalled(); // No remove is called
48+
});
49+
50+
it('should handle multiple add/remove calls properly', () => {
51+
addAppStateListener(mockHandleAppStateChange);
52+
removeAppStateListener();
53+
54+
addAppStateListener(mockHandleAppStateChange);
55+
removeAppStateListener();
56+
57+
expect(AppState.addEventListener).toHaveBeenCalledTimes(2); // Listener is added twice
58+
expect(mockRemove).toHaveBeenCalledTimes(2); // Listener is removed twice
59+
});
60+
});

test/utils/InstabugUtils.spec.ts

Lines changed: 61 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,21 @@ import InstabugUtils, {
1313
registerFilteringListener,
1414
registerObfuscationListener,
1515
reportNetworkLog,
16+
resetNativeObfuscationListener,
1617
sendCrashReport,
18+
updateNetworkLogSnapshot,
1719
} from '../../src/utils/InstabugUtils';
1820

19-
import { NativeNetworkLogger, NetworkListenerType } from '../../src/native/NativeNetworkLogger';
21+
import {
22+
NativeNetworkLogger,
23+
NetworkListenerType,
24+
NetworkLoggerEmitter,
25+
} from '../../src/native/NativeNetworkLogger';
2026
import { NativeInstabug } from '../../src/native/NativeInstabug';
2127
import { NativeAPM } from '../../src/native/NativeAPM';
2228

29+
jest.mock('../../src/modules/NetworkLogger');
30+
2331
describe('Test global error handler', () => {
2432
beforeEach(() => {
2533
Instabug.init({ token: '', invocationEvents: [InvocationEvent.none] });
@@ -339,15 +347,33 @@ describe('reportNetworkLog', () => {
339347
});
340348
});
341349

342-
jest.mock('../../src/modules/NetworkLogger');
343-
344350
describe('test registerNetworkLogsListener usage', () => {
345351
beforeEach(() => {
346352
jest.clearAllMocks(); // Clear all mocks before each test
347353
});
354+
355+
const network: NetworkLogger.NetworkData = {
356+
id: '',
357+
url: 'https://api.instabug.com',
358+
requestBody: '',
359+
requestHeaders: { 'content-type': 'application/json' },
360+
method: 'GET',
361+
responseBody: '',
362+
responseCode: 200,
363+
responseHeaders: { 'content-type': 'application/json' },
364+
contentType: 'application/json',
365+
duration: 0,
366+
requestBodySize: 0,
367+
responseBodySize: 0,
368+
errorDomain: '',
369+
errorCode: 0,
370+
startTime: 0,
371+
serverErrorMessage: '',
372+
requestContentType: 'application/json',
373+
};
374+
348375
it('registerObfuscationListener should call NetworkLogger.registerNetworkLogsListener() with NetworkListenerType = NetworkListenerType.obfuscation', () => {
349376
registerObfuscationListener();
350-
351377
expect(NetworkLogger.registerNetworkLogsListener).toBeCalledTimes(1);
352378
expect(NetworkLogger.registerNetworkLogsListener).toBeCalledWith(
353379
NetworkListenerType.obfuscation,
@@ -376,4 +402,35 @@ describe('test registerNetworkLogsListener usage', () => {
376402
expect.any(Function),
377403
);
378404
});
405+
406+
it('should call NetworkLoggerEmitter.removeAllListeners when call resetNativeObfuscationListener', () => {
407+
jest.spyOn(NetworkLoggerEmitter, 'removeAllListeners').mockImplementation();
408+
resetNativeObfuscationListener();
409+
expect(NetworkLoggerEmitter.removeAllListeners).toBeCalledTimes(1);
410+
});
411+
412+
it('should call NativeNetworkLogger.resetNetworkLogsListener when call resetNativeObfuscationListener on android platform', () => {
413+
Platform.OS = 'android';
414+
jest.spyOn(NativeNetworkLogger, 'resetNetworkLogsListener').mockImplementation();
415+
jest.spyOn(NetworkLoggerEmitter, 'removeAllListeners').mockImplementation();
416+
resetNativeObfuscationListener();
417+
expect(NativeNetworkLogger.resetNetworkLogsListener).toBeCalledTimes(1);
418+
expect(NetworkLoggerEmitter.removeAllListeners).toBeCalledTimes(1);
419+
});
420+
421+
it('should call NativeNetworkLogger.updateNetworkLogSnapshot when call updateNetworkLogSnapshot with correct parameters', () => {
422+
jest.spyOn(NativeNetworkLogger, 'updateNetworkLogSnapshot').mockImplementation();
423+
424+
updateNetworkLogSnapshot(network);
425+
expect(NativeNetworkLogger.updateNetworkLogSnapshot).toBeCalledTimes(1);
426+
expect(NativeNetworkLogger.updateNetworkLogSnapshot).toHaveBeenCalledWith(
427+
network.url,
428+
network.id,
429+
network.requestBody,
430+
network.responseBody,
431+
network.responseCode ?? 200,
432+
network.requestHeaders,
433+
network.responseHeaders,
434+
);
435+
});
379436
});

0 commit comments

Comments
 (0)