import { act, fireEvent, render } from '@testing-library/react-native' import * as React from 'react' import { Platform } from 'react-native' import SmsRetriever from 'react-native-sms-retriever' import PhoneNumberInput from 'src/components/PhoneNumberInput' import { Countries } from 'src/utils/Countries' jest.mock('react-native-sms-retriever', () => { return { requestPhoneNumber: jest.fn(() => '+49030111111'), } }) const requestPhoneNumber = jest.mocked(SmsRetriever.requestPhoneNumber) const countries = new Countries('en-us') describe('PhoneNumberInput', () => { it('renders and behaves correctly', async () => { // mock Platform.OS = 'ios' const onChange = jest.fn() const onPressCountry = jest.fn() const { getByTestId, getByText, toJSON } = render( ) expect(toJSON()).toMatchSnapshot() expect(getByText('🇫🇷')).toBeTruthy() expect(getByTestId('PhoneNumberField').props.placeholder).toBe('00 00 00 00 00') await act(() => { fireEvent.press(getByTestId('CountrySelectionButton')) }) expect(onPressCountry).toHaveBeenCalled() fireEvent.changeText(getByTestId('PhoneNumberField'), '123') expect(onChange).toHaveBeenCalledWith('123', '+33') }) describe('native phone picker (Android)', () => { beforeEach(() => { Platform.OS = 'android' }) it('requests the device phone number when focusing the phone number field', async () => { const onChange = jest.fn() const { getByTestId } = render( ) await act(() => { fireEvent(getByTestId('PhoneNumberField'), 'focus') }) expect(onChange).toHaveBeenCalledWith('030 111111', '+49') }) it('requests the device phone number when pressing the country selection button', async () => { const onChange = jest.fn() const { getByTestId } = render( ) await act(() => { fireEvent.press(getByTestId('CountrySelectionButton')) }) expect(onChange).toHaveBeenCalledWith('030 111111', '+49') }) }) it("doesn't trigger the native phone picker if there's data in the form", async () => { const onChange = jest.fn() const { getByTestId } = render( ) await act(() => { fireEvent(getByTestId('PhoneNumberField'), 'focus') }) expect(onChange).not.toHaveBeenCalled() }) it('can read Canadian phone numbers', async () => { const onChange = jest.fn() const { getByTestId } = render( ) requestPhoneNumber.mockResolvedValue('+1 416-868-0000') await act(() => { fireEvent(getByTestId('PhoneNumberField'), 'focus') }) expect(onChange).toHaveBeenCalledWith('(416) 868-0000', '+1') }) it('can read US phone numbers', async () => { const onChange = jest.fn() const { getByTestId } = render( ) requestPhoneNumber.mockResolvedValue('+1 415-426-5200') await act(() => { fireEvent(getByTestId('PhoneNumberField'), 'focus') }) expect(onChange).toHaveBeenCalledWith('(415) 426-5200', '+1') }) it('renders and behaves correctly with Côte d’Ivoire phone numbers', async () => { // mock Platform.OS = 'ios' const onChange = jest.fn() const onPressCountry = jest.fn() const { getByTestId, getByText } = render( ) expect(getByText('🇨🇮')).toBeTruthy() expect(getByTestId('PhoneNumberField').props.placeholder).toBe('00 00 0 00000') await act(() => { fireEvent.press(getByTestId('CountrySelectionButton')) }) expect(onPressCountry).toHaveBeenCalled() fireEvent.changeText(getByTestId('PhoneNumberField'), '2123456789') expect(onChange).toHaveBeenCalledWith('21 23 4 56789', '+225') }) })