Skip to content

Commit c43e2b9

Browse files
authored
Infra/render tests - TextField (#1684)
* WIP - add render tests for TextField * WIP - keep working on TextField tests * Add tests for validations * cleanup tests * move render test case into the same file of the test * minor changes in Hint render tests * Code review fixes * Add test that check when hint not passed
1 parent ebd9fb6 commit c43e2b9

File tree

2 files changed

+91
-12
lines changed

2 files changed

+91
-12
lines changed

src/components/hint/__tests__/index.spec.js

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,22 +45,15 @@ describe('Hint Screen component test', () => {
4545
});
4646

4747
it('Test Hint modal is not visible when showHint is false', async () => {
48-
const element = <HintTestComponent showHint={false}/>;
49-
50-
const {queryByTestId} = render(element);
51-
52-
const modal = queryByTestId('Hint.modal');
53-
48+
const renderTree = render(<HintTestComponent showHint={false}/>);
49+
const modal = renderTree.queryByTestId('Hint.modal');
5450
expect(modal).toBeNull();
5551
});
5652

5753
it('Test Hint modal is visible when showHint is true', async () => {
58-
const element = <HintTestComponent showHint/>;
59-
60-
const {getByTestId, queryAllByTestId} = render(element);
61-
const hint = getByTestId('Hint');
54+
const renderTree = render(<HintTestComponent showHint/>);
55+
const hint = renderTree.getByTestId('Hint');
6256
expect(hint).toBeTruthy();
63-
64-
expect(queryAllByTestId('Hint.modal')).toBeTruthy();
57+
expect(renderTree.queryAllByTestId('Hint.modal')).toBeTruthy();
6558
});
6659
});
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import React, {useState} from 'react';
2+
import {fireEvent, render} from '@testing-library/react-native';
3+
import TextField from '../index';
4+
5+
const defaultProps = {
6+
testID: 'field',
7+
placeholder: 'Placeholder'
8+
};
9+
10+
const TestCase = props => {
11+
const [value, setValue] = useState(props.value);
12+
return <TextField {...defaultProps} {...props} onChangeText={setValue} value={value}/>;
13+
};
14+
15+
describe('TextField', () => {
16+
describe('hint prop', () => {
17+
it('should hint text replace placeholder when input is focused', () => {
18+
const renderTree = render(<TestCase hint={'Hint'}/>);
19+
20+
const input = renderTree.getByTestId('field');
21+
renderTree.getByPlaceholderText(defaultProps.placeholder);
22+
23+
fireEvent(input, 'focus');
24+
renderTree.getByPlaceholderText('Hint');
25+
});
26+
27+
it('should not show hint when hint prop not passed', () => {
28+
const renderTree = render(<TestCase/>);
29+
30+
const input = renderTree.getByTestId('field');
31+
renderTree.getByPlaceholderText(defaultProps.placeholder);
32+
33+
fireEvent(input, 'focus');
34+
renderTree.getByPlaceholderText(defaultProps.placeholder);
35+
});
36+
});
37+
38+
describe('formatter prop', () => {
39+
const priceFormatter = Intl.NumberFormat('en-US');
40+
41+
const props = {
42+
value: '10000',
43+
formatter: value => priceFormatter.format(Number(value))
44+
};
45+
46+
it('should format value while not focused based on formatter prop', () => {
47+
const renderTree = render(<TestCase {...props}/>);
48+
renderTree.getByDisplayValue('10,000');
49+
});
50+
51+
it('should not format value while focused', () => {
52+
const renderTree = render(<TestCase {...props}/>);
53+
const input = renderTree.getByTestId('field');
54+
fireEvent(input, 'focus');
55+
renderTree.getByDisplayValue('10000');
56+
});
57+
});
58+
59+
describe('validation', () => {
60+
const props = {
61+
testID: 'field',
62+
enableErrors: true,
63+
validate: 'email',
64+
validationMessage: 'email is invalid'
65+
};
66+
67+
it('should display validation error message when validation fail after blur', () => {
68+
const renderTree = render(<TestCase {...props} validateOnBlur/>);
69+
const input = renderTree.getByTestId('field');
70+
fireEvent.changeText(input, 'invalidEmail');
71+
fireEvent(input, 'blur');
72+
renderTree.getByText(props.validationMessage);
73+
});
74+
75+
it('should remove validation error message after entering a valid input', async () => {
76+
const renderTree = render(<TestCase {...props} validateOnStart validateOnChange value={'invalid'}/>);
77+
const input = renderTree.getByTestId('field');
78+
79+
renderTree.getByText(props.validationMessage);
80+
81+
fireEvent.changeText(input, '[email protected]');
82+
const validationMessageElement = renderTree.queryByText(props.validationMessage);
83+
expect(validationMessageElement).toBe(null);
84+
});
85+
});
86+
});

0 commit comments

Comments
 (0)