Skip to content

Commit 4642563

Browse files
committed
docs: examples
1 parent b948dce commit 4642563

File tree

5 files changed

+227
-0
lines changed

5 files changed

+227
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import * as React from 'react';
2+
import { Text, View } from 'react-native';
3+
import { render, screen } from '@testing-library/react-native';
4+
5+
function Greeting({ name = 'World' }) {
6+
return (
7+
<View>
8+
<Text>Hello, {name}!</Text>
9+
</View>
10+
);
11+
}
12+
13+
describe('Greeting', () => {
14+
it('should render', () => {
15+
// Arrange
16+
render(<Greeting />);
17+
18+
// Assert`
19+
expect(screen.getByText('Hello, World!')).toBeOnTheScreen();
20+
});
21+
22+
it('should render with the correct name', () => {
23+
// Arrange
24+
render(<Greeting name="John" />);
25+
26+
// Assert
27+
expect(screen.getByText('Hello, John!')).toBeOnTheScreen();
28+
});
29+
});
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import * as React from 'react';
2+
import { Text, View } from 'react-native';
3+
import { render, screen } from '@testing-library/react-native';
4+
5+
test('showcase query variants', () => {
6+
render(
7+
<View>
8+
<Text>Item 1</Text>
9+
<Text>Item 2</Text>
10+
</View>,
11+
);
12+
13+
// Use getBy* queries to find a single element matching given predicate
14+
expect(screen.getByText('Item 1')).toBeOnTheScreen();
15+
16+
// Use getAllBy* queries to find all elements matching given predicate (note the use of a regex)
17+
expect(screen.getAllByText(/Item/)).toHaveLength(2);
18+
19+
// Use queryBy* to look for an element that you expect does not exist
20+
expect(screen.queryByText('Item 3')).not.toBeOnTheScreen();
21+
});
22+
23+
function LazyText({ content }: { content: string }) {
24+
const [isLoaded, setIsLoaded] = React.useState(false);
25+
26+
// Simulate async loading operation
27+
React.useEffect(() => {
28+
sleep(100);
29+
setIsLoaded(true);
30+
}, []);
31+
32+
return <Text>{isLoaded ? content : 'Loading...'}</Text>;
33+
}
34+
35+
test('showcase async query variants', async () => {
36+
render(
37+
<View>
38+
<LazyText content="Lazy Item 1" />
39+
<LazyText content="Lazy Item 2" />
40+
</View>,
41+
);
42+
43+
// Use findBy* to wait for an element to appear
44+
expect(await screen.findByText('Lazy Item 1')).toBeOnTheScreen();
45+
});
46+
47+
// Simulate async operation
48+
function sleep(ms: number) {
49+
return new Promise((resolve) => setTimeout(resolve, ms));
50+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import * as React from 'react';
2+
import { Pressable, Switch, Text, TextInput, View } from 'react-native';
3+
import { render, screen } from '@testing-library/react-native';
4+
5+
test('query by semantic role: *ByRole (highly recommended)', () => {
6+
render(
7+
<View>
8+
<Text role="heading">Heading Text</Text>
9+
10+
<Pressable role="button">
11+
<Text>Button 1</Text>
12+
</Pressable>
13+
14+
<Switch value={true} aria-label="Switch 1" />
15+
16+
<Text role="alert">Alert Text</Text>
17+
18+
<View accessible role="menu">
19+
<Text role="menuitem">Menu Item 1</Text>
20+
<Text role="menuitem">Menu Item 2</Text>
21+
</View>
22+
</View>,
23+
);
24+
25+
expect(screen.getByRole('heading', { name: 'Heading Text' })).toBeOnTheScreen();
26+
27+
expect(screen.getByRole('button', { name: 'Button 1' })).toBeOnTheScreen();
28+
expect(screen.getByRole('switch', { name: 'Switch 1' })).toBeOnTheScreen();
29+
expect(screen.getByRole('alert', { name: 'Alert Text' })).toBeOnTheScreen();
30+
31+
expect(screen.getByRole('menu')).toBeOnTheScreen();
32+
expect(screen.getAllByRole('menuitem')).toHaveLength(2);
33+
});
34+
35+
test('querying TextInput elements', () => {
36+
render(
37+
<View>
38+
<TextInput placeholder="Enter Text..." aria-label="Text Label" defaultValue="Hello" />
39+
</View>,
40+
);
41+
42+
// Option 1: Query by a11y label
43+
expect(screen.getByLabelText('Text Label')).toHaveDisplayValue('Hello');
44+
45+
// Option 2: Query by placeholder text
46+
expect(screen.getByPlaceholderText('Enter Text...')).toHaveDisplayValue('Hello');
47+
48+
// Option 3: Query by display value
49+
expect(screen.getByDisplayValue('Hello')).toBeOnTheScreen();
50+
});
51+
52+
test('other accessible queries', () => {
53+
render(
54+
<View>
55+
<Text>Text content</Text>
56+
<View aria-label="ARIA Label" />
57+
<View accessibilityLabel="Accessibility Label" />
58+
<View accessibilityHint="Accessibility Hint" />
59+
</View>,
60+
);
61+
62+
expect(screen.getByText('Text content')).toBeOnTheScreen();
63+
expect(screen.getByLabelText('ARIA Label')).toBeOnTheScreen();
64+
expect(screen.getByLabelText('Accessibility Label')).toBeOnTheScreen();
65+
expect(screen.getByHintText('Accessibility Hint')).toBeOnTheScreen();
66+
});
67+
68+
test('escape hatch: *ByTestId (use as a last resort)', () => {
69+
render(
70+
<View>
71+
<Text testID="Text 1">Text 1</Text>
72+
</View>,
73+
);
74+
75+
expect(screen.getByTestId('Text 1')).toBeOnTheScreen();
76+
});
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import * as React from 'react';
2+
import { Text, View, Button } from 'react-native';
3+
import { fireEvent, render, screen, userEvent } from '@testing-library/react-native';
4+
5+
function Counter() {
6+
const [count, setCount] = React.useState(0);
7+
8+
return (
9+
<View>
10+
<Text>{count}</Text>
11+
<Button title="Increment" onPress={() => setCount(count + 1)} />
12+
</View>
13+
);
14+
}
15+
16+
describe('Counter', () => {
17+
it('should increment the count', async () => {
18+
const user = userEvent.setup();
19+
20+
render(<Counter />);
21+
expect(screen.getByText('0')).toBeOnTheScreen();
22+
23+
const button = screen.getByRole('button', { name: 'Increment' });
24+
expect(button).toBeOnTheScreen();
25+
26+
await user.press(button);
27+
expect(screen.getByText('1')).toBeOnTheScreen();
28+
});
29+
30+
it('should increment the count when the button is pressed', async () => {
31+
const user = userEvent.setup();
32+
33+
render(<Counter />);
34+
expect(screen.getByText('0')).toBeOnTheScreen();
35+
36+
const button = screen.getByRole('button', { name: 'Increment' });
37+
expect(button).toBeOnTheScreen();
38+
39+
await user.press(button);
40+
expect(screen.getByText('1')).toBeOnTheScreen();
41+
});
42+
});
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import * as React from 'react';
2+
import { Text, View } from 'react-native';
3+
import { render, screen } from '@testing-library/react-native';
4+
5+
function Greeting({ name = 'World' }) {
6+
return (
7+
<View>
8+
<Text>Hello, {name}!</Text>
9+
</View>
10+
);
11+
}
12+
13+
describe('Greeting', () => {
14+
it('should re-render when name changes', () => {
15+
render(<Greeting name="John" />);
16+
expect(screen.getByText('Hello, John!')).toBeOnTheScreen();
17+
18+
screen.rerender(<Greeting name="Jane" />);
19+
expect(screen.getByText('Hello, Jane!')).toBeOnTheScreen();
20+
});
21+
22+
it('should unmount', () => {
23+
render(<Greeting name="John" />);
24+
25+
screen.unmount();
26+
expect(() => screen.getByText('Hello, John!')).toThrowErrorMatchingInlineSnapshot(
27+
`"Unable to find node on an unmounted component."`,
28+
);
29+
});
30+
});

0 commit comments

Comments
 (0)