test.content/core/reporters/derivation.reporter.test.ts

test.content/core/reporters/derivation.reporter.test.ts is a file in Codebase Testing. 39 lines of code and 0 definitions.

import { afterEach, describe, expect, it, vi } from "vitest";
import { conclude, refuse, say } from "@banes-lab/content/core/reporters/derivation.reporter.ts";
import process from "node:process";

const EXIT_MESSAGE = "exit";

const exitThrows = function exitThrows(): never {
    throw new Error(EXIT_MESSAGE);
};

describe("say, refuse and conclude", () => {
    afterEach(() => {
        vi.restoreAllMocks();
    });

    it("writes a line to stdout", () => {
        const write = vi.spyOn(process.stdout, "write").mockImplementation(() => true);
        say("hello");
        expect(write).toHaveBeenCalledWith("hello\n");
    });

    it("refuses on stderr and exits non-zero", () => {
        vi.spyOn(process.stderr, "write").mockImplementation(() => true);
        const exit = vi.spyOn(process, "exit").mockImplementation(exitThrows);
        expect(() => refuse("no")).toThrow(EXIT_MESSAGE);
        expect(exit).toHaveBeenCalledWith(1);
    });

    it("concludes clean with a zero exit", () => {
        vi.spyOn(process.stdout, "write").mockImplementation(() => true);
        const exit = vi.spyOn(process, "exit").mockImplementation(exitThrows);
        expect(() => {
            conclude("check", [], "clean");
        }).toThrow(EXIT_MESSAGE);
        expect(exit).toHaveBeenCalledWith(0);
    });

    it("lists findings and exits non-zero", () => {
        vi.spyOn(process.stdout, "write").mockImplementation(() => true);
        const exit = vi.spyOn(process, "exit").mockImplementation(exitThrows);
        expect(() => {
            conclude("check", [{ file: "a", message: "b" }], "clean");
        }).toThrow(EXIT_MESSAGE);
        expect(exit).toHaveBeenCalledWith(1);
    });
});