154 lines
4.8 KiB
TypeScript
154 lines
4.8 KiB
TypeScript
import { describe, it, expect, spyOn, afterEach } from "bun:test"
|
|
import {
|
|
runCheck,
|
|
calculateSummary,
|
|
determineExitCode,
|
|
filterChecksByCategory,
|
|
groupChecksByCategory,
|
|
} from "./runner"
|
|
import type { CheckResult, CheckDefinition, CheckCategory } from "./types"
|
|
|
|
describe("runner", () => {
|
|
describe("runCheck", () => {
|
|
it("returns result from check function", async () => {
|
|
const check: CheckDefinition = {
|
|
id: "test",
|
|
name: "Test Check",
|
|
category: "installation",
|
|
check: async () => ({ name: "Test Check", status: "pass", message: "OK" }),
|
|
}
|
|
|
|
const result = await runCheck(check)
|
|
|
|
expect(result.name).toBe("Test Check")
|
|
expect(result.status).toBe("pass")
|
|
})
|
|
|
|
it("measures duration", async () => {
|
|
const check: CheckDefinition = {
|
|
id: "test",
|
|
name: "Test Check",
|
|
category: "installation",
|
|
check: async () => {
|
|
await new Promise((r) => setTimeout(r, 50))
|
|
return { name: "Test", status: "pass", message: "OK" }
|
|
},
|
|
}
|
|
|
|
const result = await runCheck(check)
|
|
|
|
expect(result.duration).toBeGreaterThanOrEqual(10)
|
|
})
|
|
|
|
it("returns fail on error", async () => {
|
|
const check: CheckDefinition = {
|
|
id: "test",
|
|
name: "Test Check",
|
|
category: "installation",
|
|
check: async () => {
|
|
throw new Error("Test error")
|
|
},
|
|
}
|
|
|
|
const result = await runCheck(check)
|
|
|
|
expect(result.status).toBe("fail")
|
|
expect(result.message).toContain("Test error")
|
|
})
|
|
})
|
|
|
|
describe("calculateSummary", () => {
|
|
it("counts each status correctly", () => {
|
|
const results: CheckResult[] = [
|
|
{ name: "1", status: "pass", message: "" },
|
|
{ name: "2", status: "pass", message: "" },
|
|
{ name: "3", status: "fail", message: "" },
|
|
{ name: "4", status: "warn", message: "" },
|
|
{ name: "5", status: "skip", message: "" },
|
|
]
|
|
|
|
const summary = calculateSummary(results, 100)
|
|
|
|
expect(summary.total).toBe(5)
|
|
expect(summary.passed).toBe(2)
|
|
expect(summary.failed).toBe(1)
|
|
expect(summary.warnings).toBe(1)
|
|
expect(summary.skipped).toBe(1)
|
|
expect(summary.duration).toBe(100)
|
|
})
|
|
})
|
|
|
|
describe("determineExitCode", () => {
|
|
it("returns 0 when all pass", () => {
|
|
const results: CheckResult[] = [
|
|
{ name: "1", status: "pass", message: "" },
|
|
{ name: "2", status: "pass", message: "" },
|
|
]
|
|
|
|
expect(determineExitCode(results)).toBe(0)
|
|
})
|
|
|
|
it("returns 0 when only warnings", () => {
|
|
const results: CheckResult[] = [
|
|
{ name: "1", status: "pass", message: "" },
|
|
{ name: "2", status: "warn", message: "" },
|
|
]
|
|
|
|
expect(determineExitCode(results)).toBe(0)
|
|
})
|
|
|
|
it("returns 1 when any failures", () => {
|
|
const results: CheckResult[] = [
|
|
{ name: "1", status: "pass", message: "" },
|
|
{ name: "2", status: "fail", message: "" },
|
|
]
|
|
|
|
expect(determineExitCode(results)).toBe(1)
|
|
})
|
|
})
|
|
|
|
describe("filterChecksByCategory", () => {
|
|
const checks: CheckDefinition[] = [
|
|
{ id: "1", name: "Install", category: "installation", check: async () => ({ name: "", status: "pass", message: "" }) },
|
|
{ id: "2", name: "Config", category: "configuration", check: async () => ({ name: "", status: "pass", message: "" }) },
|
|
{ id: "3", name: "Auth", category: "authentication", check: async () => ({ name: "", status: "pass", message: "" }) },
|
|
]
|
|
|
|
it("returns all checks when no category", () => {
|
|
const filtered = filterChecksByCategory(checks)
|
|
|
|
expect(filtered.length).toBe(3)
|
|
})
|
|
|
|
it("filters to specific category", () => {
|
|
const filtered = filterChecksByCategory(checks, "installation")
|
|
|
|
expect(filtered.length).toBe(1)
|
|
expect(filtered[0].name).toBe("Install")
|
|
})
|
|
})
|
|
|
|
describe("groupChecksByCategory", () => {
|
|
const checks: CheckDefinition[] = [
|
|
{ id: "1", name: "Install1", category: "installation", check: async () => ({ name: "", status: "pass", message: "" }) },
|
|
{ id: "2", name: "Install2", category: "installation", check: async () => ({ name: "", status: "pass", message: "" }) },
|
|
{ id: "3", name: "Config", category: "configuration", check: async () => ({ name: "", status: "pass", message: "" }) },
|
|
]
|
|
|
|
it("groups checks by category", () => {
|
|
const groups = groupChecksByCategory(checks)
|
|
|
|
expect(groups.get("installation")?.length).toBe(2)
|
|
expect(groups.get("configuration")?.length).toBe(1)
|
|
})
|
|
|
|
it("maintains order within categories", () => {
|
|
const groups = groupChecksByCategory(checks)
|
|
const installChecks = groups.get("installation")!
|
|
|
|
expect(installChecks[0].name).toBe("Install1")
|
|
expect(installChecks[1].name).toBe("Install2")
|
|
})
|
|
})
|
|
})
|