import { fireEvent, render } from '@testing-library/react-native'
import * as React from 'react'
import 'react-native'
import { Provider } from 'react-redux'
import { clearStoredAccount } from 'src/account/actions'
import { navigate } from 'src/navigator/NavigationService'
import { Screens } from 'src/navigator/Screens'
import SettingsMenu from 'src/navigator/SettingsMenu'
import MockedNavigator from 'test/MockedNavigator'
import { createMockStore } from 'test/utils'
import { mockE164Number } from 'test/values'
jest.mock('src/statsig', () => ({
getFeatureGate: jest.fn().mockReturnValue(false),
getMultichainFeatures: jest.fn(() => ({
showBalances: ['celo-alfajores'],
})),
}))
jest.mock('statsig-react-native', () => ({
Statsig: {
getStableID: jest.fn().mockReturnValue('stableId'),
},
}))
jest.mock('src/config', () => ({
...jest.requireActual('src/config'),
STATSIG_ENABLED: true,
}))
describe('SettingsMenu', () => {
beforeEach(() => {
jest.clearAllMocks()
})
it('shows the expected menu items', () => {
const store = createMockStore()
const { getByTestId } = render(
)
expect(getByTestId('SettingsMenu/Profile/Username')).toBeTruthy()
expect(getByTestId('SettingsMenu/Address')).toBeTruthy()
expect(getByTestId('SettingsMenu/Invite')).toBeTruthy()
expect(getByTestId('SettingsMenu/Preferences')).toBeTruthy()
expect(getByTestId('SettingsMenu/Security')).toBeTruthy()
expect(getByTestId('SettingsMenu/ConnectedDapps')).toBeTruthy()
expect(getByTestId('SettingsMenu/Help')).toBeTruthy()
expect(getByTestId('SettingsMenu/Legal')).toBeTruthy()
expect(getByTestId('SettingsMenu/Version')).toBeTruthy()
})
it('does not show username if not set', () => {
const store = createMockStore({
account: {
name: '',
},
})
const { queryByTestId } = render(
)
expect(queryByTestId('SettingsMenu/Username')).toBeFalsy()
})
describe('shows phone number correctly', () => {
it('shows the phone number when the user is verified', () => {
const store = createMockStore({
app: {
phoneNumberVerified: true,
},
account: {
e164PhoneNumber: '+13023061234',
},
})
const { getByText } = render(
)
expect(getByText('+1 302-306-1234')).toBeTruthy()
})
it('shows no phone number when the user is not verified', () => {
const store = createMockStore({
app: {
phoneNumberVerified: false,
},
account: {
e164PhoneNumber: '+13023061234',
},
})
const { queryByText } = render(
)
expect(queryByText('+1 302-306-1234')).toBeFalsy()
})
})
it('menu items navigate to appropriate screens', () => {
const store = createMockStore()
const { getByTestId } = render(
)
fireEvent.press(getByTestId('SettingsMenu/Profile'))
fireEvent.press(getByTestId('SettingsMenu/Address'))
fireEvent.press(getByTestId('SettingsMenu/Invite'))
fireEvent.press(getByTestId('SettingsMenu/Help'))
fireEvent.press(getByTestId('SettingsMenu/Legal'))
fireEvent.press(getByTestId('SettingsMenu/ConnectedDapps'))
fireEvent.press(getByTestId('SettingsMenu/Preferences'))
fireEvent.press(getByTestId('SettingsMenu/Security'))
expect(navigate).toHaveBeenCalledTimes(8)
expect(navigate).toHaveBeenNthCalledWith(1, Screens.ProfileSubmenu)
expect(navigate).toHaveBeenNthCalledWith(2, Screens.QRNavigator, {
screen: Screens.QRCode,
params: { showSecureSendStyling: true },
})
expect(navigate).toHaveBeenNthCalledWith(3, Screens.Invite)
expect(navigate).toHaveBeenNthCalledWith(4, Screens.Support)
expect(navigate).toHaveBeenNthCalledWith(5, Screens.LegalSubmenu)
expect(navigate).toHaveBeenNthCalledWith(6, Screens.WalletConnectSessions)
expect(navigate).toHaveBeenNthCalledWith(7, Screens.PreferencesSubmenu)
expect(navigate).toHaveBeenNthCalledWith(8, Screens.SecuritySubmenu)
})
it('renders the dev mode menu', () => {
const mockAddress = '0x0000000000000000000000000000000000007e57'
const store = createMockStore({
account: {
devModeActive: true,
e164PhoneNumber: mockE164Number,
},
web3: {
account: mockAddress,
},
app: {
sessionId: 'sessionId',
},
})
const { getByText } = render(
)
expect(getByText('Session ID: sessionId')).toBeTruthy() // matches store mocks
expect(getByText('Statsig Stable ID: stableId')).toBeTruthy() // matches Statsig mocks
store.clearActions()
fireEvent.press(getByText('App Quick Reset'))
expect(store.getActions()).toEqual([clearStoredAccount(mockAddress)])
fireEvent.press(getByText('See App Assets'))
expect(navigate).toHaveBeenCalledWith(Screens.DebugImages)
})
})