(http://kentcdodds.com/)",
"license": "MIT",
- "dependencies": {},
+ "dependencies": {
+ "wait-for-expect": "0.4.0"
+ },
"devDependencies": {
"@types/react-dom": "^16.0.4",
"axios": "^0.18.0",
diff --git a/src/__tests__/end-to-end.js b/src/__tests__/end-to-end.js
new file mode 100644
index 00000000..435f4a6e
--- /dev/null
+++ b/src/__tests__/end-to-end.js
@@ -0,0 +1,40 @@
+import React from 'react'
+import {render, waitForExpect} from '../'
+
+const fetchAMessage = () =>
+ new Promise(resolve => {
+ // we are using random timeout here to simulate a real-time example
+ // of an async operation calling a callback at a non-deterministic time
+ const randomTimeout = Math.floor(Math.random() * 100)
+ setTimeout(() => {
+ resolve({returnedMessage: 'Hello World'})
+ }, randomTimeout)
+ })
+
+class ComponentWithLoader extends React.Component {
+ state = {loading: true}
+ async componentDidMount() {
+ const data = await fetchAMessage()
+ this.setState({data, loading: false}) // eslint-disable-line
+ }
+ render() {
+ if (this.state.loading) {
+ return Loading...
+ } else {
+ return (
+
+ Loaded this message: {this.state.data.returnedMessage}!
+
+ )
+ }
+ }
+}
+
+test('it waits for the data to be loaded', async () => {
+ const {queryByText, queryByTestId} = render()
+
+ expect(queryByText('Loading...')).toBeTruthy()
+
+ await waitForExpect(() => expect(queryByText('Loading...')).toBeNull())
+ expect(queryByTestId('message').textContent).toMatch(/Hello World/)
+})
diff --git a/src/index.js b/src/index.js
index fd46ac9e..1fd4a9a9 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,5 +1,6 @@
import ReactDOM from 'react-dom'
import {Simulate} from 'react-dom/test-utils'
+import waitForExpect from 'wait-for-expect'
import * as queries from './queries'
function render(ui, {container = document.createElement('div')} = {}) {
@@ -24,4 +25,4 @@ function flushPromises() {
return new Promise(resolve => setImmediate(resolve))
}
-export {render, flushPromises, Simulate}
+export {render, flushPromises, Simulate, waitForExpect}
diff --git a/typings/index.d.ts b/typings/index.d.ts
index 55c9963c..153836db 100644
--- a/typings/index.d.ts
+++ b/typings/index.d.ts
@@ -1,4 +1,5 @@
import {Simulate as ReactSimulate} from 'react-dom/test-utils'
+import waitForExpect from 'wait-for-expect'
interface RenderResult {
container: HTMLDivElement
@@ -21,3 +22,5 @@ export function render(
export function flushPromises(): Promise
export const Simulate: typeof ReactSimulate
+
+export function waitForExpect(): typeof waitForExpect