Deterministic Retry Test Harness
A test harness that drives retry logic with scripted outcomes and a fake clock, so retry behaviour is verified without real delays.
Code
export type Outcome<T> = { readonly ok: true; readonly value: T } | { readonly ok: false; readonly error: Error };
export function ok<T>(value: T): Outcome<T> {
return { ok: true, value };
}
export function fail(message: string): Outcome<never> {
return { ok: false, error: new Error(message) };
}
export interface AttemptLog {
readonly index: number;
readonly at: number;
readonly result: "ok" | "error";
}
export interface RetryHarness<T> {
readonly attempts: AttemptLog[];
readonly loader: () => Promise<T>;
readonly exhausted: () => boolean;
}
export function createHarness<T>(
script: readonly Outcome<T>[],
clock: { now: () => number; setTimeout: (fn: () => void, ms: number) => unknown },
): RetryHarness<T> {
const attempts: AttemptLog[] = [];
let index = 0;
const loader = async (): Promise<T> =>
new Promise<T>((resolve, reject) => {
const outcome = script[index];
attempts.push({
index,
at: clock.now(),
result: outcome.ok ? "ok" : "error",
});
index += 1;
if (outcome.ok) resolve(outcome.value);
else reject(outcome.error);
});
return {
attempts,
loader,
exhausted: () => index >= script.length,
};
}Report a problem with this exampleOpens a pre-filled issue on GitHub.