import dynamicLinks from '@react-native-firebase/dynamic-links'
import { render, waitFor } from '@testing-library/react-native'
import CleverTap from 'clevertap-react-native'
import * as React from 'react'
import { Linking } from 'react-native'
import { Provider } from 'react-redux'
import NavigatorWrapper from 'src/navigator/NavigatorWrapper'
import { getDynamicConfigParams } from 'src/statsig'
import { StatsigDynamicConfigs } from 'src/statsig/types'
import { createMockStore } from 'test/utils'
jest.mock('src/statsig')
jest.mock('src/navigator/NavigationService', () => ({
...(jest.requireActual('src/navigator/NavigationService') as any),
navigatorIsReadyRef: { current: false },
navigate: jest.fn(),
}))
jest.mock('src/sentry/Sentry', () => ({
...(jest.requireActual('src/sentry/Sentry') as any),
sentryRoutingInstrumentation: { registerNavigationContainer: jest.fn() },
}))
const mockDynamicLinksOnLink = jest.fn().mockReturnValue(jest.fn())
const mockDynamicLinksGetInitialLink = jest.fn()
jest.mock('@react-native-firebase/dynamic-links', () => () => ({
onLink: mockDynamicLinksOnLink,
getInitialLink: mockDynamicLinksGetInitialLink,
}))
jest.mock('clevertap-react-native', () => ({
getInitialUrl: jest.fn(),
addListener: jest.fn(),
removeListener: jest.fn(),
}))
describe('NavigatorWrapper', () => {
beforeEach(() => {
jest.clearAllMocks()
})
it('initializes the deep links handlers', async () => {
jest.mocked(getDynamicConfigParams).mockImplementation(({ configName }) => {
if (configName === StatsigDynamicConfigs.APP_CONFIG) {
return {
minRequiredVersion: '0.0.1', // matches DeviceInfo mocks
}
}
return {} as any
})
const { queryByText } = render(
)
await waitFor(() => expect(CleverTap.addListener).toHaveBeenCalled())
expect(Linking.addEventListener).toHaveBeenCalled()
expect(dynamicLinks().onLink).toHaveBeenCalled()
expect(CleverTap.getInitialUrl).toHaveBeenCalled()
expect(Linking.getInitialURL).toHaveBeenCalled()
expect(dynamicLinks().getInitialLink).toHaveBeenCalled()
expect(queryByText('appUpdateAvailable')).toBeFalsy()
})
it('shows the upgrade screen if the version is below the minimum', () => {
jest.mocked(getDynamicConfigParams).mockImplementation(({ configName }) => {
if (configName === StatsigDynamicConfigs.APP_CONFIG) {
return {
minRequiredVersion: '2.0.0', // greater than DeviceInfo mocks
}
}
return {} as any
})
const { getByText } = render(
)
expect(getByText('appUpdateAvailable')).toBeTruthy()
})
})