diff --git a/src/__tests__/auto-cleanup-skip.js b/src/__tests__/auto-cleanup-skip.test.js
similarity index 94%
rename from src/__tests__/auto-cleanup-skip.js
rename to src/__tests__/auto-cleanup-skip.test.js
index eece886ab..168ce2814 100644
--- a/src/__tests__/auto-cleanup-skip.js
+++ b/src/__tests__/auto-cleanup-skip.test.js
@@ -4,8 +4,8 @@ import { View } from 'react-native';
let render;
beforeAll(() => {
process.env.RNTL_SKIP_AUTO_CLEANUP = 'true';
- const rtl = require('../');
- render = rtl.render;
+ const rntl = require('..');
+ render = rntl.render;
});
let isMounted = false;
diff --git a/src/__tests__/auto-cleanup.js b/src/__tests__/auto-cleanup.test.js
similarity index 68%
rename from src/__tests__/auto-cleanup.js
rename to src/__tests__/auto-cleanup.test.js
index 5a26d7c8f..04c7eb5d5 100644
--- a/src/__tests__/auto-cleanup.js
+++ b/src/__tests__/auto-cleanup.test.js
@@ -20,14 +20,31 @@ class Test extends React.Component<*> {
}
}
+afterEach(() => {
+ jest.useRealTimers();
+});
+
// This just verifies that by importing RNTL in an environment which supports afterEach (like jest)
// we'll get automatic cleanup between tests.
test('component is mounted, but not umounted before test ends', () => {
const fn = jest.fn();
render();
+ expect(isMounted).toEqual(true);
expect(fn).not.toHaveBeenCalled();
});
test('component is automatically umounted after first test ends', () => {
expect(isMounted).toEqual(false);
});
+
+test('does not time out with legacy fake timers', () => {
+ jest.useFakeTimers('legacy');
+ render();
+ expect(isMounted).toEqual(true);
+});
+
+test('does not time out with fake timers', () => {
+ jest.useFakeTimers('modern');
+ render();
+ expect(isMounted).toEqual(true);
+});
diff --git a/src/__tests__/waitFor.test.js b/src/__tests__/waitFor.test.js
index e38f05c44..84ee17266 100644
--- a/src/__tests__/waitFor.test.js
+++ b/src/__tests__/waitFor.test.js
@@ -35,6 +35,10 @@ class BananaContainer extends React.Component<{}, any> {
}
}
+afterEach(() => {
+ jest.useRealTimers();
+});
+
test('waits for element until it stops throwing', async () => {
const { getByText, queryByText } = render();
@@ -75,8 +79,8 @@ test('waits for element with custom interval', async () => {
expect(mockFn).toHaveBeenCalledTimes(3);
});
-test('works with fake timers', async () => {
- jest.useFakeTimers();
+test('works with legacy fake timers', async () => {
+ jest.useFakeTimers('legacy');
const mockFn = jest.fn(() => {
throw Error('test');
@@ -87,9 +91,24 @@ test('works with fake timers', async () => {
} catch (e) {
// suppress
}
- jest.runTimersToTime(400);
+ jest.advanceTimersByTime(400);
expect(mockFn).toHaveBeenCalledTimes(3);
+});
- jest.useRealTimers();
+test('works with fake timers', async () => {
+ jest.useFakeTimers('modern');
+
+ const mockFn = jest.fn(() => {
+ throw Error('test');
+ });
+
+ try {
+ waitFor(() => mockFn(), { timeout: 400, interval: 200 });
+ } catch (e) {
+ // suppress
+ }
+ jest.advanceTimersByTime(400);
+
+ expect(mockFn).toHaveBeenCalledTimes(3);
});
diff --git a/src/__tests__/waitForElementToBeRemoved.test.js b/src/__tests__/waitForElementToBeRemoved.test.js
index d2fc12091..ad5add433 100644
--- a/src/__tests__/waitForElementToBeRemoved.test.js
+++ b/src/__tests__/waitForElementToBeRemoved.test.js
@@ -25,6 +25,10 @@ const TestSetup = ({ shouldUseDelay = true }) => {
);
};
+afterEach(() => {
+ jest.useRealTimers();
+});
+
test('waits when using getBy query', async () => {
const screen = render();
@@ -126,8 +130,22 @@ test('waits with custom interval', async () => {
expect(mockFn).toHaveBeenCalledTimes(4);
});
+test('works with legacy fake timers', async () => {
+ jest.useFakeTimers('legacy');
+
+ const mockFn = jest.fn(() => );
+
+ waitForElementToBeRemoved(() => mockFn(), {
+ timeout: 400,
+ interval: 200,
+ });
+
+ jest.advanceTimersByTime(400);
+ expect(mockFn).toHaveBeenCalledTimes(4);
+});
+
test('works with fake timers', async () => {
- jest.useFakeTimers();
+ jest.useFakeTimers('modern');
const mockFn = jest.fn(() => );
diff --git a/src/flushMicroTasks.js b/src/flushMicroTasks.js
index c4bb67903..5a5a0153d 100644
--- a/src/flushMicroTasks.js
+++ b/src/flushMicroTasks.js
@@ -1,15 +1,22 @@
// @flow
-
import { printDeprecationWarning } from './helpers/errors';
+type Thenable = { then: (() => T) => mixed };
+
/**
* Wait for microtasks queue to flush
*/
-export default function flushMicrotasksQueue(): Promise {
+export default function flushMicrotasksQueue(): Thenable {
printDeprecationWarning('flushMicrotasksQueue');
return flushMicroTasks();
}
-export function flushMicroTasks(): Promise {
- return new Promise((resolve) => setImmediate(resolve));
+export function flushMicroTasks(): Thenable {
+ return {
+ // using "thenable" instead of a Promise, because otherwise it breaks when
+ // using "modern" fake timers
+ then(resolve) {
+ setImmediate(resolve);
+ },
+ };
}