@mittwald/react-use-promise
Version:
Simple and declarative use of Promises in your React components. Observe their state and refresh them in various advanced ways.
74 lines (73 loc) • 2.78 kB
JavaScript
import { ConsolidatedTimeout } from "./ConsolidatedTimeout.js";
import { vitest, beforeEach, expect, test } from "vitest";
const callback = vitest.fn();
let timeout;
beforeEach(() => {
vitest.resetAllMocks();
vitest.clearAllTimers();
vitest.useFakeTimers();
timeout = new ConsolidatedTimeout(callback);
});
const testCallbackIsCalledAfter = (ms) => {
const beforeCalls = callback.mock.calls.length;
vitest.advanceTimersByTime(ms - 1);
expect(callback).toHaveBeenCalledTimes(beforeCalls);
vitest.advanceTimersByTime(1);
expect(callback).toHaveBeenCalledTimes(beforeCalls + 1);
};
const testCallbackIsNotCalledAfter = (ms) => {
const beforeCalls = callback.mock.calls.length;
vitest.advanceTimersByTime(ms - 1);
expect(callback).toHaveBeenCalledTimes(beforeCalls);
vitest.advanceTimersByTime(1);
expect(callback).toHaveBeenCalledTimes(beforeCalls);
};
test("Callback is not triggered after start when there is no timeout added", () => {
timeout.start();
testCallbackIsNotCalledAfter(Number.MAX_SAFE_INTEGER);
});
test("Callback is triggered (only once) after timeout added after start", () => {
timeout.start();
timeout.addTimeout({ milliseconds: 1000 });
testCallbackIsCalledAfter(1000);
testCallbackIsNotCalledAfter(Number.MAX_SAFE_INTEGER);
});
test("Callback is triggered after timeout added before start", () => {
timeout.addTimeout({ milliseconds: 1000 });
timeout.start();
testCallbackIsCalledAfter(1000);
});
test("Callback is triggered at minimum timeout", () => {
timeout.start();
timeout.addTimeout({ milliseconds: 1000 });
timeout.addTimeout({ milliseconds: 500 });
testCallbackIsCalledAfter(500);
});
test("Consecutive start call restarts the timeout", () => {
timeout.start();
timeout.addTimeout({ milliseconds: 1000 });
testCallbackIsNotCalledAfter(999);
timeout.start();
testCallbackIsNotCalledAfter(500);
testCallbackIsCalledAfter(500);
});
test("Callback is triggered when adding timeout while already running", () => {
timeout.start();
timeout.addTimeout({ milliseconds: 1000 });
testCallbackIsNotCalledAfter(499);
timeout.addTimeout({ milliseconds: 500 });
testCallbackIsCalledAfter(1);
});
test("Callback is triggered instantly when adding due timeout while already running", () => {
timeout.start();
timeout.addTimeout({ milliseconds: 1000 });
testCallbackIsNotCalledAfter(501);
timeout.addTimeout({ milliseconds: 500 });
expect(callback).toHaveBeenCalledTimes(1);
});
test("Removing last timeout will not trigger callback", () => {
timeout.start();
const removeTimeout = timeout.addTimeout({ milliseconds: 1000 });
removeTimeout();
testCallbackIsNotCalledAfter(1000);
});