import * as React from 'react' import 'react-native' import { Provider } from 'react-redux' import ProfileSubmenu from 'src/account/ProfileSubmenu' import { Screens } from 'src/navigator/Screens' import MockedNavigator from 'test/MockedNavigator' import { FetchMock } from 'jest-fetch-mock/types' import { createMockStore, getMockStackScreenProps } from 'test/utils' import { mockE164Number } from 'test/values' import networkConfig from 'src/web3/networkConfig' import { act, fireEvent, render, waitFor } from '@testing-library/react-native' import * as Keychain from 'react-native-keychain' const mockFetch = fetch as FetchMock const mockedKeychain = jest.mocked(Keychain) import Logger from 'src/utils/Logger' jest.mock('src/utils/Logger') mockedKeychain.getGenericPassword.mockResolvedValue({ username: 'some username', password: 'someSignedMessage', service: 'some service', storage: 'some string', }) describe('ProfileSubmenu', () => { beforeEach(() => { jest.clearAllMocks() }) it('shows the expected menu items', () => { const store = createMockStore() const { getByTestId } = render( ) expect(getByTestId('ProfileSubmenu/EditProfile')).toBeTruthy() expect(getByTestId('ProfileSubmenu/Verify')).toBeTruthy() }) it('can revoke the phone number successfully', async () => { mockFetch.mockResponseOnce(JSON.stringify({ message: 'OK' }), { status: 200, }) const store = createMockStore({ app: { phoneNumberVerified: true }, account: { e164PhoneNumber: mockE164Number, }, }) const tree = render( ) fireEvent.press(tree.getByText('revokePhoneNumber.title')) expect(tree.getByText('revokePhoneNumber.bottomSheetTitle')).toBeTruthy() expect(tree.getByText('+1 415-555-0000')).toBeTruthy() await act(() => { fireEvent.press(tree.getByText('revokePhoneNumber.confirmButton')) }) await waitFor(() => expect(tree.getByText('revokePhoneNumber.revokeSuccess')).toBeTruthy()) expect(mockFetch).toHaveBeenNthCalledWith(1, `${networkConfig.revokePhoneNumberUrl}`, { method: 'POST', headers: { 'Content-Type': 'application/json', authorization: `${networkConfig.authHeaderIssuer} 0x0000000000000000000000000000000000007e57:someSignedMessage`, }, body: '{"phoneNumber":"+14155550000","clientPlatform":"android","clientVersion":"0.0.1"}', }) }) it('shows the error on revoke phone number error', async () => { mockFetch.mockResponseOnce(JSON.stringify({ message: 'something went wrong' }), { status: 500, }) const store = createMockStore({ app: { phoneNumberVerified: true }, account: { e164PhoneNumber: mockE164Number, }, }) const tree = render( ) fireEvent.press(tree.getByText('revokePhoneNumber.title')) await act(() => { fireEvent.press(tree.getByText('revokePhoneNumber.confirmButton')) }) await waitFor(() => expect(Logger.showError).toHaveBeenCalledWith('revokePhoneNumber.revokeError') ) expect(mockFetch).toHaveBeenCalledTimes(1) }) })