


















@@ -1,13 +1,32 @@
11import readline from "node:readline/promises";
22import { beforeEach, describe, expect, it, vi } from "vitest";
33import { isYes, setVerbose, setYes } from "../globals.js";
4-import { promptYesNo } from "./prompt.js";
4+import { PromptInputClosedError, promptYesNo } from "./prompt.js";
5566const readlineState = vi.hoisted(() => {
77const question = vi.fn(async () => "");
88const close = vi.fn();
9-const createInterface = vi.fn(() => ({ question, close }));
10-return { question, close, createInterface };
9+const listeners = new Map<string, Set<() => void>>();
10+const once = vi.fn((event: string, listener: () => void) => {
11+const current = listeners.get(event) ?? new Set<() => void>();
12+current.add(listener);
13+listeners.set(event, current);
14+});
15+const off = vi.fn((event: string, listener: () => void) => {
16+listeners.get(event)?.delete(listener);
17+});
18+const emit = (event: string) => {
19+const current = [...(listeners.get(event) ?? [])];
20+listeners.delete(event);
21+for (const listener of current) {
22+listener();
23+}
24+};
25+const resetListeners = () => {
26+listeners.clear();
27+};
28+const createInterface = vi.fn(() => ({ question, close, once, off }));
29+return { question, close, createInterface, emit, off, once, resetListeners };
1130});
12311332vi.mock("node:readline/promises", () => ({
@@ -21,6 +40,9 @@ beforeEach(() => {
2140readlineState.question.mockResolvedValue("");
2241readlineState.close.mockClear();
2342readlineState.createInterface.mockClear();
43+readlineState.off.mockClear();
44+readlineState.once.mockClear();
45+readlineState.resetListeners();
2446});
25472648describe("promptYesNo", () => {
@@ -48,4 +70,14 @@ describe("promptYesNo", () => {
4870const resultYes = await promptYesNo("Continue?", false);
4971expect(resultYes).toBe(true);
5072});
73+74+it("rejects when input closes before an answer is received", async () => {
75+readlineState.question.mockReturnValueOnce(new Promise<string>(() => undefined));
76+77+const result = promptYesNo("Continue?");
78+readlineState.emit("close");
79+80+await expect(result).rejects.toThrow(PromptInputClosedError);
81+expect(readlineState.close).toHaveBeenCalled();
82+});
5183});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。