import React from 'react'; import { fireEvent, render, renderHook } from '@testing-library/react-native'; import { icons } from '../../../assets'; import { useTheme } from '../../../theme'; import PasswordField from '../PasswordField'; import { getThemedStyles } from '../styles'; import { TEXTFIELD_CONTAINER_TEST_ID } from '../../TextField/TextField'; const labelText = 'Label'; const testID = 'passwordInput'; const defaultProps = { testID, label: labelText, }; describe('PasswordField', () => { it('renders as expected', async () => { const { toJSON, findAllByRole, getByTestId, getByText, getByRole } = render( ); expect(toJSON()).toMatchSnapshot(); expect(await findAllByRole('text')).toHaveLength(1); const textInput = getByTestId(testID); expect(textInput.props.editable).toBe(true); expect(textInput.props.secureTextEntry).toBe(true); expect(textInput.props.accessible).toBe(true); const image = getByRole('image'); expect(image.props.source).toBe(icons.visibilityOff); const label = getByText(labelText); expect(label).not.toBeNull(); }); it('toggles visibility', () => { const { getByRole, getByTestId } = render( ); const icon = getByRole('image'); const textInput = getByTestId(testID); expect(icon.props.source).toBe(icons.visibilityOff); expect(textInput.props.secureTextEntry).toBe(true); fireEvent.press(icon); expect(icon.props.source).toBe(icons.visibilityOn); expect(textInput.props.secureTextEntry).toBe(false); }); it('should be able to hide show password icon', () => { const { toJSON, queryByRole } = render( ); expect(toJSON()).toMatchSnapshot(); const icon = queryByRole('button'); expect(icon).toBe(null); }); it('should be able to obscure text programmatically', () => { const { toJSON, getByTestId } = render( ); expect(toJSON()).toMatchSnapshot(); const textInput = getByTestId(testID); expect(textInput.props.secureTextEntry).toBe(false); }); it('renders as expected when disabled', () => { const { toJSON, getByTestId, getByRole } = render( ); expect(toJSON()).toMatchSnapshot(); const textInput = getByTestId(testID); expect(textInput.props.editable).toBe(false); const icon = getByRole('button'); expect(icon.props.accessibilityState).toHaveProperty('disabled', true); }); it('applies theme and style props', () => { const customStyle = { backgroundColor: 'red' }; const customIconStyle = { backgroundColor: 'blue' }; const { toJSON, getByRole, getByTestId } = render( ); const { result } = renderHook(() => useTheme()); const themedStyle = getThemedStyles(result.current); const container = getByTestId(TEXTFIELD_CONTAINER_TEST_ID); const icon = getByRole('image'); expect(container.props.style).toContainEqual([ themedStyle.container, customStyle, ]); expect(icon.props.style).toContainEqual([ themedStyle.icon, customIconStyle, ]); expect(toJSON()).toMatchSnapshot(); }); });