Skip to content

Commit f0e6455

Browse files
committed
docs: add RSD variants
1 parent 4642563 commit f0e6455

10 files changed

+1479
-1200
lines changed

examples/basic/jest.config.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
module.exports = {
22
preset: 'react-native',
33
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'],
4+
transformIgnorePatterns: [
5+
'node_modules/(?!(jest-)?react-native|@react-native(-community)?|react-strict-dom)',
6+
],
47
setupFilesAfterEnv: ['./jest-setup.ts'],
58
};

examples/basic/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
"react": "18.3.1",
1717
"react-dom": "18.3.1",
1818
"react-native": "0.76.5",
19-
"react-native-web": "~0.19.13"
19+
"react-native-web": "~0.19.13",
20+
"react-strict-dom": "^0.0.39"
2021
},
2122
"devDependencies": {
2223
"@babel/core": "^7.24.0",
@@ -26,7 +27,7 @@
2627
"@types/react": "~18.3.12",
2728
"eslint": "^8.57.0",
2829
"jest": "^29.7.0",
29-
"react-test-renderer": "18.2.0",
30+
"react-test-renderer": "18.3.1",
3031
"typescript": "^5.3.0"
3132
},
3233
"private": true,

examples/basic/tsconfig.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
"extends": "expo/tsconfig.base",
33
"compilerOptions": {
44
"strict": true,
5-
"allowJs": false
5+
"allowJs": false,
6+
"module": "NodeNext",
7+
"moduleResolution": "NodeNext"
68
}
79
}
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 { html } from 'react-strict-dom';
3+
import { render, screen } from '@testing-library/react-native';
4+
5+
function Greeting({ name = 'World' }) {
6+
return (
7+
<html.div>
8+
<html.span>Hello, {name}!</html.span>
9+
</html.div>
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 { html } from 'react-strict-dom';
3+
import { render, screen } from '@testing-library/react-native';
4+
5+
test('showcase query variants', () => {
6+
render(
7+
<html.div>
8+
<html.span>Item 1</html.span>
9+
<html.span>Item 2</html.span>
10+
</html.div>,
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 <html.span>{isLoaded ? content : 'Loading...'}</html.span>;
33+
}
34+
35+
test('showcase async query variants', async () => {
36+
render(
37+
<html.div>
38+
<LazyText content="Lazy Item 1" />
39+
<LazyText content="Lazy Item 2" />
40+
</html.div>,
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: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import * as React from 'react';
2+
import { html } from 'react-strict-dom';
3+
import { render, screen } from '@testing-library/react-native';
4+
5+
test('query by semantic role: *ByRole (highly recommended)', () => {
6+
render(
7+
<html.div>
8+
<html.h1>Heading Text</html.h1>
9+
10+
<html.button>Button 1</html.button>
11+
12+
<html.p role="alert">Alert Text</html.p>
13+
14+
<html.div role="menu">
15+
<html.span role="menuitem">Menu Item 1</html.span>
16+
<html.span role="menuitem">Menu Item 2</html.span>
17+
</html.div>
18+
</html.div>,
19+
);
20+
21+
expect(screen.getByRole('heading', { name: 'Heading Text' })).toBeOnTheScreen();
22+
23+
expect(screen.getByRole('button', { name: 'Button 1' })).toBeOnTheScreen();
24+
expect(screen.getByRole('alert', { name: 'Alert Text' })).toBeOnTheScreen();
25+
26+
// TODO: RSD does not set accessible for role elements.
27+
// expect(screen.getByRole('menu')).toBeOnTheScreen();
28+
// expect(screen.getAllByRole('menuitem')).toHaveLength(2);
29+
});
30+
31+
test('querying TextInput elements (recommended)', () => {
32+
render(
33+
<html.div>
34+
<html.input placeholder="Enter Text..." aria-label="Text Label" defaultValue="Hello" />
35+
</html.div>,
36+
);
37+
38+
// Option 1: Query by a11y label
39+
expect(screen.getByLabelText('Text Label')).toHaveDisplayValue('Hello');
40+
41+
// Option 2: Query by placeholder text
42+
expect(screen.getByPlaceholderText('Enter Text...')).toHaveDisplayValue('Hello');
43+
44+
// Option 3: Query by display value
45+
expect(screen.getByDisplayValue('Hello')).toBeOnTheScreen();
46+
});
47+
48+
test('other accessible queries (ok)', () => {
49+
render(
50+
<html.div>
51+
<html.span>Text content</html.span>
52+
<html.div aria-label="ARIA Label" />
53+
</html.div>,
54+
);
55+
56+
expect(screen.getByText('Text content')).toBeOnTheScreen();
57+
expect(screen.getByLabelText('ARIA Label')).toBeOnTheScreen();
58+
});
59+
60+
test('escape hatch: *ByTestId (use as a last resort)', () => {
61+
render(
62+
<html.div>
63+
<html.span data-testid="Text 1">Text 1</html.span>
64+
</html.div>,
65+
);
66+
67+
expect(screen.getByTestId('Text 1')).toBeOnTheScreen();
68+
});

examples/basic/tutorial/4-events.test.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,14 @@ describe('Counter', () => {
2727
expect(screen.getByText('1')).toBeOnTheScreen();
2828
});
2929

30-
it('should increment the count when the button is pressed', async () => {
31-
const user = userEvent.setup();
32-
30+
it('should increment the count when the button is pressed', () => {
3331
render(<Counter />);
3432
expect(screen.getByText('0')).toBeOnTheScreen();
3533

3634
const button = screen.getByRole('button', { name: 'Increment' });
3735
expect(button).toBeOnTheScreen();
3836

39-
await user.press(button);
37+
fireEvent.press(button);
4038
expect(screen.getByText('1')).toBeOnTheScreen();
4139
});
4240
});

0 commit comments

Comments
 (0)