Skip to content

Commit 1cd0608

Browse files
mdjastrzebskithymikee
authored andcommitted
feature: screen
1 parent 1e67026 commit 1cd0608

File tree

5 files changed

+160
-3
lines changed

5 files changed

+160
-3
lines changed

src/__tests__/screen.test.tsx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import * as React from 'react';
2+
import { Text } from 'react-native';
3+
import { render, screen } from '..';
4+
5+
test('screen has the same queries as render result', () => {
6+
const result = render(<Text>Mt. Everest</Text>);
7+
expect(screen).toBe(result);
8+
9+
expect(screen.getByText('Mt. Everest')).toBeTruthy();
10+
expect(screen.queryByText('Mt. Everest')).toBeTruthy();
11+
expect(screen.getAllByText('Mt. Everest')).toHaveLength(1);
12+
expect(screen.queryAllByText('Mt. Everest')).toHaveLength(1);
13+
});
14+
15+
test('screen holds last render result', () => {
16+
render(<Text>Mt. Everest</Text>);
17+
render(<Text>Mt. Blanc</Text>);
18+
const finalResult = render(<Text>Śnieżka</Text>);
19+
expect(screen).toBe(finalResult);
20+
21+
expect(screen.getByText('Śnieżka')).toBeTruthy();
22+
expect(screen.queryByText('Mt. Everest')).toBeFalsy();
23+
expect(screen.queryByText('Mt. Blanc')).toBeFalsy();
24+
});
25+
26+
test('screen throws without render', () => {
27+
expect(() => screen.container).toThrowError(
28+
'`render` method has not been called'
29+
);
30+
expect(() => screen.debug()).toThrowError(
31+
'`render` method has not been called'
32+
);
33+
expect(() => screen.debug.shallow()).toThrowError(
34+
'`render` method has not been called'
35+
);
36+
expect(() => screen.getByText('Mt. Everest')).toThrowError(
37+
'`render` method has not been called'
38+
);
39+
});

src/cleanup.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import * as React from 'react';
2+
import { clearRenderResult } from './screen';
23

34
type CleanUpFunction = (nextElement?: React.ReactElement<any>) => void;
45
let cleanupQueue = new Set<CleanUpFunction>();
56

67
export default function cleanup() {
8+
clearRenderResult();
79
cleanupQueue.forEach((fn) => fn());
810
cleanupQueue.clear();
911
}

src/pure.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
import act from './act';
22
import cleanup from './cleanup';
33
import fireEvent from './fireEvent';
4-
import render from './render';
4+
import render, { RenderResult } from './render';
55
import waitFor from './waitFor';
66
import waitForElementToBeRemoved from './waitForElementToBeRemoved';
77
import { within, getQueriesForElement } from './within';
88
import { getDefaultNormalizer } from './matches';
99
import { renderHook } from './renderHook';
10+
import { screen } from './screen';
1011

1112
export { act };
1213
export { cleanup };
1314
export { fireEvent };
14-
export { render };
15+
export { render, RenderResult };
1516
export { waitFor };
1617
export { waitForElementToBeRemoved };
1718
export { within, getQueriesForElement };
1819
export { getDefaultNormalizer };
1920
export { renderHook };
21+
export { screen };
2022
export type RenderAPI = ReturnType<typeof render>;

src/render.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { addToCleanupQueue } from './cleanup';
66
import debugShallow from './helpers/debugShallow';
77
import debugDeep from './helpers/debugDeep';
88
import { getQueriesForElement } from './within';
9+
import { setRenderResult } from './screen';
910

1011
type Options = {
1112
wrapper?: React.ComponentType<any>;
@@ -15,6 +16,8 @@ type TestRendererOptions = {
1516
createNodeMock: (element: React.ReactElement) => any;
1617
};
1718

19+
export type RenderResult = ReturnType<typeof render>;
20+
1821
/**
1922
* Renders test component deeply using react-test-renderer and exposes helpers
2023
* to assert on the output.
@@ -40,7 +43,7 @@ export default function render<T>(
4043

4144
addToCleanupQueue(unmount);
4245

43-
return {
46+
const result = {
4447
...getQueriesForElement(instance),
4548
update,
4649
unmount,
@@ -49,6 +52,9 @@ export default function render<T>(
4952
toJSON: renderer.toJSON,
5053
debug: debug(instance, renderer),
5154
};
55+
56+
setRenderResult(result);
57+
return result;
5258
}
5359

5460
function renderWithAct(

src/screen.ts

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import { ReactTestInstance } from 'react-test-renderer';
2+
import { RenderResult } from './render';
3+
4+
const SCREEN_ERROR = '`render` method has not been called';
5+
6+
const notImplemented = () => {
7+
throw new Error(SCREEN_ERROR);
8+
};
9+
10+
const notImplementedDebug = () => {
11+
throw new Error(SCREEN_ERROR);
12+
};
13+
notImplementedDebug.shallow = notImplemented;
14+
15+
const defaultScreen: RenderResult = {
16+
get container(): ReactTestInstance {
17+
throw new Error(SCREEN_ERROR);
18+
},
19+
debug: notImplementedDebug,
20+
update: notImplemented,
21+
unmount: notImplemented,
22+
rerender: notImplemented,
23+
toJSON: notImplemented,
24+
getByLabelText: notImplemented,
25+
getAllByLabelText: notImplemented,
26+
queryByLabelText: notImplemented,
27+
queryAllByLabelText: notImplemented,
28+
findByLabelText: notImplemented,
29+
findAllByLabelText: notImplemented,
30+
getByA11yHint: notImplemented,
31+
getByHintText: notImplemented,
32+
getAllByA11yHint: notImplemented,
33+
getAllByHintText: notImplemented,
34+
queryByA11yHint: notImplemented,
35+
queryByHintText: notImplemented,
36+
queryAllByA11yHint: notImplemented,
37+
queryAllByHintText: notImplemented,
38+
findByA11yHint: notImplemented,
39+
findByHintText: notImplemented,
40+
findAllByA11yHint: notImplemented,
41+
findAllByHintText: notImplemented,
42+
getByRole: notImplemented,
43+
getAllByRole: notImplemented,
44+
queryByRole: notImplemented,
45+
queryAllByRole: notImplemented,
46+
findByRole: notImplemented,
47+
findAllByRole: notImplemented,
48+
getByA11yStates: notImplemented,
49+
getAllByA11yStates: notImplemented,
50+
queryByA11yStates: notImplemented,
51+
queryAllByA11yStates: notImplemented,
52+
findByA11yStates: notImplemented,
53+
findAllByA11yStates: notImplemented,
54+
getByA11yState: notImplemented,
55+
getAllByA11yState: notImplemented,
56+
queryByA11yState: notImplemented,
57+
queryAllByA11yState: notImplemented,
58+
findByA11yState: notImplemented,
59+
findAllByA11yState: notImplemented,
60+
getByA11yValue: notImplemented,
61+
getAllByA11yValue: notImplemented,
62+
queryByA11yValue: notImplemented,
63+
queryAllByA11yValue: notImplemented,
64+
findByA11yValue: notImplemented,
65+
findAllByA11yValue: notImplemented,
66+
UNSAFE_getByProps: notImplemented,
67+
UNSAFE_getAllByProps: notImplemented,
68+
UNSAFE_queryByProps: notImplemented,
69+
UNSAFE_queryAllByProps: notImplemented,
70+
UNSAFE_getByType: notImplemented,
71+
UNSAFE_getAllByType: notImplemented,
72+
UNSAFE_queryByType: notImplemented,
73+
UNSAFE_queryAllByType: notImplemented,
74+
getByPlaceholderText: notImplemented,
75+
getAllByPlaceholderText: notImplemented,
76+
queryByPlaceholderText: notImplemented,
77+
queryAllByPlaceholderText: notImplemented,
78+
findByPlaceholderText: notImplemented,
79+
findAllByPlaceholderText: notImplemented,
80+
getByDisplayValue: notImplemented,
81+
getAllByDisplayValue: notImplemented,
82+
queryByDisplayValue: notImplemented,
83+
queryAllByDisplayValue: notImplemented,
84+
findByDisplayValue: notImplemented,
85+
findAllByDisplayValue: notImplemented,
86+
getByTestId: notImplemented,
87+
getAllByTestId: notImplemented,
88+
queryByTestId: notImplemented,
89+
queryAllByTestId: notImplemented,
90+
findByTestId: notImplemented,
91+
findAllByTestId: notImplemented,
92+
getByText: notImplemented,
93+
getAllByText: notImplemented,
94+
queryByText: notImplemented,
95+
queryAllByText: notImplemented,
96+
findByText: notImplemented,
97+
findAllByText: notImplemented,
98+
};
99+
100+
export let screen: RenderResult = defaultScreen;
101+
102+
export function setRenderResult(output: RenderResult) {
103+
screen = output;
104+
}
105+
106+
export function clearRenderResult() {
107+
screen = defaultScreen;
108+
}

0 commit comments

Comments
 (0)