Skip to content

Commit c05efc3

Browse files
committed
test(app): add tests for RNFBAppModule setImmediate browser fallback
1 parent e576623 commit c05efc3

1 file changed

Lines changed: 91 additions & 0 deletions

File tree

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import { describe, expect, it, jest, beforeEach, afterEach } from '@jest/globals';
2+
3+
jest.mock('react-native', () => ({
4+
DeviceEventEmitter: {
5+
emit: jest.fn(),
6+
},
7+
}));
8+
9+
jest.mock('../lib/internal/web/firebaseApp', () => ({
10+
initializeApp: jest.fn(),
11+
setLogLevel: jest.fn(),
12+
getApp: jest.fn(),
13+
getApps: jest.fn(() => []),
14+
deleteApp: jest.fn(),
15+
}));
16+
17+
const appModule = require('../lib/internal/web/RNFBAppModule.ts').default;
18+
19+
describe('RNFBAppModule setImmediate guards', () => {
20+
describe('with setImmediate available', () => {
21+
beforeEach(() => {
22+
jest.useFakeTimers();
23+
});
24+
25+
afterEach(() => {
26+
jest.useRealTimers();
27+
});
28+
29+
it('eventsSendEvent uses setImmediate when available', () => {
30+
const spy = jest.spyOn(globalThis, 'setImmediate');
31+
appModule.eventsAddListener('test_event');
32+
appModule.eventsNotifyReady(true);
33+
appModule.eventsPing('test_event', { data: 1 });
34+
expect(spy).toHaveBeenCalled();
35+
spy.mockRestore();
36+
});
37+
38+
it('eventsNotifyReady uses setImmediate when available', () => {
39+
const spy = jest.spyOn(globalThis, 'setImmediate');
40+
appModule.eventsNotifyReady(true);
41+
expect(spy).toHaveBeenCalled();
42+
spy.mockRestore();
43+
});
44+
45+
it('eventsAddListener uses setImmediate when available', () => {
46+
const spy = jest.spyOn(globalThis, 'setImmediate');
47+
appModule.eventsAddListener('another_event');
48+
expect(spy).toHaveBeenCalled();
49+
spy.mockRestore();
50+
});
51+
});
52+
53+
describe('without setImmediate (browser environment)', () => {
54+
let savedSetImmediate: typeof setImmediate;
55+
56+
beforeEach(() => {
57+
jest.useFakeTimers();
58+
savedSetImmediate = globalThis.setImmediate;
59+
// @ts-expect-error — simulating browser where setImmediate is absent
60+
delete globalThis.setImmediate;
61+
});
62+
63+
afterEach(() => {
64+
globalThis.setImmediate = savedSetImmediate;
65+
jest.useRealTimers();
66+
});
67+
68+
it('eventsSendEvent falls back to setTimeout', () => {
69+
const spy = jest.spyOn(globalThis, 'setTimeout');
70+
appModule.eventsAddListener('browser_event');
71+
appModule.eventsNotifyReady(true);
72+
appModule.eventsPing('browser_event', { data: 2 });
73+
expect(spy).toHaveBeenCalled();
74+
spy.mockRestore();
75+
});
76+
77+
it('eventsNotifyReady falls back to setTimeout', () => {
78+
const spy = jest.spyOn(globalThis, 'setTimeout');
79+
appModule.eventsNotifyReady(true);
80+
expect(spy).toHaveBeenCalled();
81+
spy.mockRestore();
82+
});
83+
84+
it('eventsAddListener falls back to setTimeout', () => {
85+
const spy = jest.spyOn(globalThis, 'setTimeout');
86+
appModule.eventsAddListener('browser_event_2');
87+
expect(spy).toHaveBeenCalled();
88+
spy.mockRestore();
89+
});
90+
});
91+
});

0 commit comments

Comments
 (0)