Skip to content
This repository was archived by the owner on Jul 30, 2020. It is now read-only.

Commit 11b7b1d

Browse files
committed
feat: prepare rc.1
1 parent c2984bc commit 11b7b1d

27 files changed

+242
-92
lines changed

cleanup-after-each.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
afterEach(require('./dist').cleanup);

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
"main": "dist/index.js",
66
"types": "dist/index.d.ts",
77
"files": [
8-
"dist/**",
8+
"dist",
99
"typings",
10+
"cleanup-after-each.js",
1011
"jest-preset.js"
1112
],
1213
"engines": {
Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

33
exports[`Fetch makes an API call and displays the greeting when load-greeting is clicked 1`] = `
4-
<View>
5-
<TouchableOpacity
6-
activeOpacity={0.2}
7-
>
4+
<View
5+
testID="ntl-container"
6+
>
7+
<View>
8+
<TouchableOpacity
9+
activeOpacity={0.2}
10+
>
11+
<Text>
12+
Fetch
13+
</Text>
14+
</TouchableOpacity>
815
<Text>
9-
Fetch
16+
hello there
1017
</Text>
11-
</TouchableOpacity>
12-
<Text>
13-
hello there
14-
</Text>
18+
</View>
1519
</View>
1620
`;

src/__tests__/act.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ import React from 'react';
22
import 'jest-native/extend-expect';
33
import { Button } from 'react-native';
44

5-
import { render, fireEvent } from '../';
5+
import { cleanup, render, fireEvent } from '../';
6+
7+
afterEach(cleanup);
68

79
test('render calls useEffect immediately', () => {
810
const effectCb = jest.fn();

src/__tests__/bugs.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
import { queryAllByProp } from '../lib';
2-
import { render } from '../index';
3-
import { Text, View } from 'react-native';
41
import React from 'react';
2+
import { Text, View } from 'react-native';
3+
4+
import { cleanup, render, queryAllByProp } from '../';
5+
6+
afterEach(cleanup);
57

68
// This is to ensure custom queries can be passed to render. In most cases, you
79
// wouldn't/shouldn't need to do this, but we do allow it so we'll test to

src/__tests__/debug.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import React from 'react';
22
import { Text } from 'react-native';
33

4-
import { render } from '../';
4+
import { cleanup, render } from '../';
5+
6+
afterEach(cleanup);
57

68
beforeEach(() => {
79
jest.spyOn(console, 'log').mockImplementation(() => {});

src/__tests__/end-to-end.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ import React from 'react';
22
import 'jest-native/extend-expect';
33
import { Text } from 'react-native';
44

5-
import { render, wait } from '../';
5+
import { cleanup, render, wait } from '../';
6+
7+
afterEach(cleanup);
68

79
const fetchAMessage = () =>
810
new Promise(resolve => {

src/__tests__/events.js

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ import React from 'react';
22
import 'jest-native/extend-expect';
33
import { Button, Image, Text, TextInput, TouchableHighlight } from 'react-native';
44

5-
import { render, fireEvent, eventMap, NativeEvent, getEventHandlerName, wait } from '../';
5+
import { cleanup, render, fireEvent, eventMap, NativeEvent, getEventHandlerName, wait } from '../';
6+
7+
afterEach(cleanup);
68

79
Object.keys(eventMap).forEach(key => {
810
const handlerName = getEventHandlerName(key);
@@ -11,20 +13,27 @@ Object.keys(eventMap).forEach(key => {
1113
const config = eventMap[key];
1214

1315
config.validTargets.forEach(element => {
14-
const handler = jest.fn();
15-
const { container } = render(React.createElement(element, { [handlerName]: handler }));
16+
const spy = jest.fn();
17+
18+
const { getByTestId } = render(
19+
React.createElement(element, {
20+
[handlerName]: spy,
21+
}),
22+
);
1623

17-
fireEvent[key](container);
24+
const target = getByTestId('ntl-container').children[0];
25+
fireEvent[key](target);
1826

19-
expect(handler).toHaveBeenCalledTimes(1);
27+
expect(spy).toHaveBeenCalledTimes(1);
2028
});
2129
});
2230
});
2331

2432
test('onChange works', () => {
2533
const handleChange = jest.fn();
26-
const { container } = render(<TextInput onChange={handleChange} />);
27-
fireEvent.change(container, { target: { value: 'a' } });
34+
const { getByTestId } = render(<TextInput onChange={handleChange} />);
35+
const target = getByTestId('ntl-container').children[0];
36+
fireEvent.change(target, { target: { value: 'a' } });
2837
expect(handleChange).toHaveBeenCalledTimes(1);
2938
});
3039

@@ -66,9 +75,10 @@ test('assigns target properties', async () => {
6675

6776
test('calling `fireEvent` directly works too', () => {
6877
const handleEvent = jest.fn();
69-
const { container } = render(<Button onPress={handleEvent} title="test" />);
78+
const { getByTestId } = render(<Button onPress={handleEvent} title="test" />);
7079

71-
fireEvent(container, new NativeEvent('press'));
80+
const target = getByTestId('ntl-container').children[0];
81+
fireEvent(target, new NativeEvent('press'));
7282
expect(handleEvent).toBeCalledTimes(1);
7383
});
7484

@@ -77,8 +87,9 @@ test('calling a custom event works as well', () => {
7787
const onMyEvent = jest.fn(({ nativeEvent }) => expect(nativeEvent).toEqual({ value: 'testing' }));
7888
const MyComponent = ({ onMyEvent }) => <TextInput value="test" onChange={onMyEvent} />;
7989

80-
const { container } = render(<MyComponent onMyEvent={onMyEvent} />);
81-
fireEvent(container, new NativeEvent('myEvent', event));
90+
const { getByTestId } = render(<MyComponent onMyEvent={onMyEvent} />);
91+
const target = getByTestId('ntl-container').children[0];
92+
fireEvent(target, new NativeEvent('myEvent', event));
8293

8394
expect(onMyEvent).toHaveBeenCalledWith({
8495
nativeEvent: { value: 'testing' },

src/__tests__/fetch.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ import React from 'react';
22
import 'jest-native/extend-expect';
33
import { TouchableOpacity, Text, View } from 'react-native';
44

5-
import { render, fireEvent, toJSON, wait } from '../';
5+
import { cleanup, render, fireEvent, toJSON, wait } from '../';
6+
7+
afterEach(cleanup);
68

79
global.fetch = require('jest-fetch-mock');
810

src/__tests__/forms.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import React from 'react';
22
import { Button, TextInput, View } from 'react-native';
3-
import { render, fireEvent } from '../';
3+
import { cleanup, render, fireEvent } from '../';
4+
5+
afterEach(cleanup);
46

57
function Login({ onSubmit, user }) {
68
return (

src/__tests__/misc.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import React from 'react';
22
import { Picker } from 'react-native';
33

4-
import { fireEvent, render } from '../';
4+
import { cleanup, fireEvent, render } from '../';
5+
6+
afterEach(cleanup);
57

68
test('picker works', () => {
79
function Wrapper() {

src/__tests__/render.js

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import React from 'react';
22
import { View } from 'react-native';
3-
import { toJSON, render } from '../';
3+
import { cleanup, toJSON, render } from '../';
4+
5+
afterEach(cleanup);
46

57
test('renders View', () => {
68
const { container } = render(<View />);
@@ -21,12 +23,16 @@ test('renders options.wrapper around node', () => {
2123

2224
expect(getByTestId('wrapper')).toBeTruthy();
2325
expect(toJSON(container)).toMatchInlineSnapshot(`
24-
<View
25-
testID="wrapper"
26-
>
27-
<View
28-
testID="inner"
29-
/>
30-
</View>
31-
`);
26+
<View
27+
testID="ntl-container"
28+
>
29+
<View
30+
testID="wrapper"
31+
>
32+
<View
33+
testID="inner"
34+
/>
35+
</View>
36+
</View>
37+
`);
3238
});

src/__tests__/rerender.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ import React from 'react';
22
import 'jest-native/extend-expect';
33
import { Text } from 'react-native';
44

5-
import { render } from '../';
5+
import { cleanup, render } from '../';
6+
7+
afterEach(cleanup);
68

79
test('rerender will re-render the element', () => {
810
const Greeting = props => <Text>{props.message}</Text>;

src/__tests__/stopwatch.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import React from 'react';
22
import { Button, Text, View } from 'react-native';
33

4-
import { render, fireEvent, toJSON } from '../';
4+
import { cleanup, render, fireEvent, toJSON } from '../';
5+
6+
afterEach(cleanup);
57

68
class StopWatch extends React.Component {
79
state = { lapse: 0, running: false };

src/index.js

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import React from 'react';
2+
import { View } from 'react-native';
23
import TR from 'react-test-renderer';
4+
import AppContainer from 'react-native/Libraries/ReactNative/AppContainer';
35

46
import {
57
toJSON,
@@ -8,22 +10,44 @@ import {
810
NativeEvent,
911
prettyPrint,
1012
proxyUnsafeProperties,
13+
validComponentFilter,
1114
} from './lib';
1215
import act from './act-compat';
1316

17+
const containerId = 'ntl-container';
18+
const renderers = new Set();
19+
1420
function render(ui, { options = {}, wrapper: WrapperComponent, queries } = {}) {
1521
const wrapUiIfNeeded = innerElement =>
16-
WrapperComponent ? <WrapperComponent>{innerElement}</WrapperComponent> : innerElement;
22+
WrapperComponent ? (
23+
<AppContainer>
24+
<View testID={containerId}>
25+
<WrapperComponent>{innerElement}</WrapperComponent>
26+
</View>
27+
</AppContainer>
28+
) : (
29+
<AppContainer>
30+
<View testID={containerId}>{innerElement}</View>
31+
</AppContainer>
32+
);
1733

1834
let testRenderer;
1935

2036
act(() => {
2137
testRenderer = TR.create(wrapUiIfNeeded(ui), options);
2238
});
2339

40+
renderers.add(testRenderer);
41+
42+
const baseElement = proxyUnsafeProperties(testRenderer.root);
43+
const container = baseElement
44+
.findAll(c => validComponentFilter(c))
45+
.filter(n => n.getProp('testID') === containerId)[0];
46+
2447
return {
25-
container: proxyUnsafeProperties(testRenderer.root),
26-
debug: (el = testRenderer.root) => console.log(prettyPrint(toJSON(el))),
48+
baseElement,
49+
container,
50+
debug: (el = baseElement) => console.log(prettyPrint(toJSON(el))),
2751
unmount: () => testRenderer.unmount(),
2852
rerender: rerenderUi => {
2953
act(() => {
@@ -34,6 +58,15 @@ function render(ui, { options = {}, wrapper: WrapperComponent, queries } = {}) {
3458
};
3559
}
3660

61+
function cleanup() {
62+
renderers.forEach(cleanupRenderer);
63+
}
64+
65+
function cleanupRenderer(renderer) {
66+
renderer.unmount();
67+
renderers.delete(renderer);
68+
}
69+
3770
function fireEvent(...args) {
3871
let returnValue;
3972
act(() => {
@@ -53,4 +86,4 @@ Object.keys(rntlFireEvent).forEach(key => {
5386
});
5487

5588
export * from './lib';
56-
export { act, fireEvent, render, NativeEvent };
89+
export { act, cleanup, fireEvent, render, NativeEvent };

0 commit comments

Comments
 (0)