diff --git a/package.json b/package.json index 4668ca109..00566f77c 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ }, "peerDependencies": { "react": ">=16.0.0", + "react-native": ">=0.59", "react-test-renderer": ">=16.0.0" }, "scripts": { diff --git a/src/__tests__/render.test.js b/src/__tests__/render.test.js index ebf846967..a1d8d0c0d 100644 --- a/src/__tests__/render.test.js +++ b/src/__tests__/render.test.js @@ -382,3 +382,29 @@ test('renders options.wrapper around updated node', () => { `); }); + +test('returns container', () => { + const { container } = render(); + + expect(container).toBeDefined(); + // `View` composite component is returned. This behavior will break if we + // start returning only host components. + expect(container.type).toBe(View); + expect(container.props.testID).toBe('inner'); +}); + +test('returns wrapped component as container', () => { + const WrapperComponent = ({ children }) => ( + {children} + ); + + const { container } = render(, { + wrapper: WrapperComponent, + }); + + expect(container).toBeDefined(); + // `WrapperComponent` composite component is returned with no testID passed to + // it. This behavior will break if we start returning only host components. + expect(container.type).toBe(WrapperComponent); + expect(container.props.testID).not.toBeDefined(); +}); diff --git a/src/fireEvent.js b/src/fireEvent.js index c9156dd13..f3846c714 100644 --- a/src/fireEvent.js +++ b/src/fireEvent.js @@ -7,7 +7,6 @@ const isHostElement = (element?: ReactTestInstance) => { }; const isTextInput = (element?: ReactTestInstance) => { - // eslint-disable-next-line import/no-extraneous-dependencies const { TextInput } = require('react-native'); return element?.type === TextInput; }; diff --git a/src/helpers/getByAPI.js b/src/helpers/getByAPI.js index 6f860ac8c..33c88d50f 100644 --- a/src/helpers/getByAPI.js +++ b/src/helpers/getByAPI.js @@ -13,7 +13,6 @@ const filterNodeByType = (node, type) => node.type === type; const getNodeByText = (node, text) => { try { - // eslint-disable-next-line const { Text } = require('react-native'); const isTextComponent = filterNodeByType(node, Text); if (isTextComponent) { @@ -61,7 +60,6 @@ const getChildrenAsText = (children, TextComponent, textContent = []) => { const getTextInputNodeByPlaceholderText = (node, placeholder) => { try { - // eslint-disable-next-line const { TextInput } = require('react-native'); return ( filterNodeByType(node, TextInput) && @@ -76,7 +74,6 @@ const getTextInputNodeByPlaceholderText = (node, placeholder) => { const getTextInputNodeByDisplayValue = (node, value) => { try { - // eslint-disable-next-line const { TextInput } = require('react-native'); return ( filterNodeByType(node, TextInput) && diff --git a/src/render.js b/src/render.js index 3adfcc8d7..03e745dcf 100644 --- a/src/render.js +++ b/src/render.js @@ -44,6 +44,7 @@ export default function render( ...findByAPI(instance), ...a11yAPI(instance), update, + container: instance, rerender: update, // alias for `update` unmount: renderer.unmount, toJSON: renderer.toJSON, diff --git a/website/docs/API.md b/website/docs/API.md index 0a323762e..abdef6031 100644 --- a/website/docs/API.md +++ b/website/docs/API.md @@ -118,6 +118,14 @@ toJSON(): ReactTestRendererJSON | null Get the rendered component JSON representation, e.g. for snapshot testing. +### `container` + +```ts +container: ReactTestInstance; +``` + +A reference to the rendered root element. + ## `cleanup` ```ts