33 lines
1.3 KiB
TypeScript
33 lines
1.3 KiB
TypeScript
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
|
|
import { WEB_READINESS_CACHE_TTL_MS, checkCachedWebReadiness, resetWebReadinessCacheForTests } from "./readiness-cache.server";
|
|
|
|
describe("web readiness cache", () => {
|
|
afterEach(() => {
|
|
resetWebReadinessCacheForTests();
|
|
});
|
|
|
|
it("coalesces parallel checks inside a one-second freshness window", async () => {
|
|
let release!: () => void;
|
|
const check = vi.fn(() => new Promise<void>((resolve) => (release = resolve)));
|
|
|
|
const probes = Array.from({ length: 25 }, () => checkCachedWebReadiness(check, 1_000));
|
|
expect(check).toHaveBeenCalledOnce();
|
|
release();
|
|
await Promise.all(probes);
|
|
|
|
await checkCachedWebReadiness(check, 1_000 + WEB_READINESS_CACHE_TTL_MS - 1);
|
|
expect(check).toHaveBeenCalledOnce();
|
|
check.mockResolvedValueOnce(undefined);
|
|
await checkCachedWebReadiness(check, 1_000 + WEB_READINESS_CACHE_TTL_MS);
|
|
expect(check).toHaveBeenCalledTimes(2);
|
|
});
|
|
|
|
it("propagates a cached failure to every concurrent probe", async () => {
|
|
const check = vi.fn().mockRejectedValue(new Error("database unavailable"));
|
|
|
|
await expect(Promise.all([checkCachedWebReadiness(check, 1_000), checkCachedWebReadiness(check, 1_000)])).rejects.toThrow("database unavailable");
|
|
expect(check).toHaveBeenCalledOnce();
|
|
});
|
|
});
|