UNPKG

@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
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); });