test: speed up cli and command suites

This commit is contained in:
Peter Steinberger
2026-03-31 02:12:23 +01:00
parent 6b6ddcd2a6
commit 3f1d6fe147
83 changed files with 1161 additions and 1054 deletions

View File

@@ -1,34 +1,26 @@
import readline from "node:readline/promises";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { isYes, setVerbose, setYes } from "../globals.js";
import { promptYesNo } from "./prompt.js";
type ReadlineMock = {
default: {
createInterface: () => {
question: ReturnType<typeof vi.fn>;
close: ReturnType<typeof vi.fn>;
};
};
};
const readlineState = vi.hoisted(() => {
const question = vi.fn(async () => "");
const close = vi.fn();
const createInterface = vi.fn(() => ({ question, close }));
return { question, close, createInterface };
});
type PromptModule = typeof import("./prompt.js");
type GlobalsModule = typeof import("../globals.js");
vi.mock("node:readline/promises", () => ({
default: { createInterface: readlineState.createInterface },
}));
let promptYesNo: PromptModule["promptYesNo"];
let readline: ReadlineMock;
let isYes: GlobalsModule["isYes"];
let setVerbose: GlobalsModule["setVerbose"];
let setYes: GlobalsModule["setYes"];
beforeEach(async () => {
vi.resetModules();
vi.doMock("node:readline/promises", () => {
const question = vi.fn(async () => "");
const close = vi.fn();
const createInterface = vi.fn(() => ({ question, close }));
return { default: { createInterface } };
});
({ promptYesNo } = await import("./prompt.js"));
({ isYes, setVerbose, setYes } = await import("../globals.js"));
readline = (await import("node:readline/promises")) as unknown as ReadlineMock;
beforeEach(() => {
setYes(false);
setVerbose(false);
readlineState.question.mockReset();
readlineState.question.mockResolvedValue("");
readlineState.close.mockClear();
readlineState.createInterface.mockClear();
});
describe("promptYesNo", () => {
@@ -43,16 +35,16 @@ describe("promptYesNo", () => {
it("asks the question and respects default", async () => {
setYes(false);
setVerbose(false);
const { question: questionMock } = readline.default.createInterface();
questionMock.mockResolvedValueOnce("");
expect(readline).toBeTruthy();
readlineState.question.mockResolvedValueOnce("");
const resultDefaultYes = await promptYesNo("Continue?", true);
expect(resultDefaultYes).toBe(true);
questionMock.mockResolvedValueOnce("n");
readlineState.question.mockResolvedValueOnce("n");
const resultNo = await promptYesNo("Continue?", true);
expect(resultNo).toBe(false);
questionMock.mockResolvedValueOnce("y");
readlineState.question.mockResolvedValueOnce("y");
const resultYes = await promptYesNo("Continue?", false);
expect(resultYes).toBe(true);
});