diff --git a/__tests__/nativeModules.test.ts b/__tests__/nativeModules.test.ts new file mode 100644 index 00000000..61eb57d5 --- /dev/null +++ b/__tests__/nativeModules.test.ts @@ -0,0 +1,45 @@ +/** + * Tests that importing the native module bindings does not throw when the + * native side is unavailable (Expo Go, Jest, web bundles, prebuilds before + * pods are installed). + */ + +describe('nativeModules', () => { + afterEach(() => { + jest.resetModules(); + jest.dontMock('react-native'); + }); + + test('falls back to empty objects when native modules are missing', () => { + jest.doMock('react-native', () => ({ + NativeModules: {}, + TurboModuleRegistry: { get: () => null }, + })); + + let modules: typeof import('../src/nativeModules') | undefined; + expect(() => { + modules = require('../src/nativeModules'); + }).not.toThrow(); + + expect(modules?.IntercomModule).toEqual({}); + expect(modules?.IntercomEventEmitter).toEqual({}); + }); + + test('uses the registered native modules when they are available', () => { + const intercomModule = { initialize: jest.fn() }; + const intercomEventEmitter = { UNREAD_COUNT_CHANGE_NOTIFICATION: 'event' }; + + jest.doMock('react-native', () => ({ + NativeModules: { + IntercomModule: intercomModule, + IntercomEventEmitter: intercomEventEmitter, + }, + TurboModuleRegistry: { get: () => null }, + })); + + const modules = require('../src/nativeModules'); + + expect(modules.IntercomModule).toBe(intercomModule); + expect(modules.IntercomEventEmitter).toBe(intercomEventEmitter); + }); +}); diff --git a/src/nativeModules.ts b/src/nativeModules.ts index c3f18b8a..68b5d957 100644 --- a/src/nativeModules.ts +++ b/src/nativeModules.ts @@ -8,8 +8,9 @@ function isTurboModuleAvailable(name: string) { } } -export const IntercomModule = isTurboModuleAvailable('IntercomModule') - ? require('./NativeIntercomSpec').default - : NativeModules.IntercomModule; +export const IntercomModule = + (isTurboModuleAvailable('IntercomModule') + ? require('./NativeIntercomSpec').default + : NativeModules.IntercomModule) ?? {}; -export const IntercomEventEmitter = NativeModules.IntercomEventEmitter; +export const IntercomEventEmitter = NativeModules.IntercomEventEmitter ?? {};