


























@@ -1,4 +1,5 @@
11import { createServer } from "node:http";
2+import { setTimeout as sleep } from "node:timers/promises";
23import { afterEach, describe, expect, it } from "vitest";
34import { buildQaTarget, getQaBusState, parseQaTarget, pollQaBus } from "./bus-client.js";
45@@ -69,6 +70,48 @@ describe("qa-bus client", () => {
6970).rejects.toThrow(SyntaxError);
7071});
717273+it("rejects immediately when a poll request is aborted", async () => {
74+const server = createServer((_req, _res) => {
75+// Keep the request open so the client abort path owns the outcome.
76+});
77+78+await new Promise<void>((resolve, reject) => {
79+server.once("error", reject);
80+server.listen(0, "127.0.0.1", () => resolve());
81+});
82+83+const address = server.address();
84+if (!address || typeof address === "string") {
85+throw new Error("test server failed to bind");
86+}
87+88+stops.push(async () => {
89+server.closeAllConnections?.();
90+await new Promise<void>((resolve, reject) => {
91+server.close((error) => (error ? reject(error) : resolve()));
92+});
93+});
94+95+const abort = new AbortController();
96+const request = pollQaBus({
97+baseUrl: `http://127.0.0.1:${address.port}`,
98+accountId: "acct-a",
99+cursor: 0,
100+timeoutMs: 30_000,
101+signal: abort.signal,
102+});
103+abort.abort();
104+105+await expect(
106+Promise.race([
107+request,
108+sleep(500).then(() => {
109+throw new Error("poll abort did not settle");
110+}),
111+]),
112+).rejects.toMatchObject({ name: "AbortError" });
113+});
114+72115it("preserves baseUrl path prefixes when composing bus URLs", async () => {
73116const server = await startJsonServer((req) => ({
74117statusCode: req.url === "/qa-bus/v1/state" ? 200 : 404,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。