Skip to content
49 linesCodeBlameRaw
1import assert from "node:assert/strict";
2import { test } from "node:test";
3
4import { DeadlineExceeded, withDeadline } from "./deadline.ts";
5
6test("an answer in time is passed through", async () => {
7 assert.equal(await withDeadline("repos get_repo", 1000, async () => "ok"), "ok");
8});
9
10test("a call that never answers fails at its deadline, and its signal aborts", async () => {
11 let seen: AbortSignal | undefined;
12 const never = withDeadline("repos get_repo", 20, (signal) => {
13 seen = signal;
14 return new Promise<never>(() => {});
15 });
16 await assert.rejects(never, (error: unknown) => error instanceof DeadlineExceeded && /repos get_repo did not answer within 20ms/.test(error.message));
17 assert.equal(seen?.aborted, true);
18});
19
20test("a call that ignores its signal is still let go", async () => {
21 await assert.rejects(withDeadline("chat sidebar", 10, () => new Promise<never>(() => {})), DeadlineExceeded);
22});
23
24test("a failure in time is the call's own, not a deadline", async () => {
25 await assert.rejects(
26 withDeadline("work get_pull", 1000, async () => {
27 throw new Error("get_pull failed with status 500");
28 }),
29 /status 500/,
30 );
31});
32
33test("the caller's own signal aborts the call", async () => {
34 const outer = new AbortController();
35 let seen: AbortSignal | undefined;
36 const call = withDeadline(
37 "repos get_repo",
38 1000,
39 (signal) =>
40 new Promise<never>((_, reject) => {
41 seen = signal;
42 signal.addEventListener("abort", () => reject(signal.reason));
43 }),
44 outer.signal,
45 );
46 outer.abort(new Error("visitor left"));
47 await assert.rejects(call, /visitor left/);
48 assert.equal(seen?.aborted, true);
49});