Rename header to oMoMoMoMo Doctor to match installation guide branding. Remove providers check entirely — no longer meaningful for diagnostics. Fix comment-checker detection by resolving @code-yeongyu/comment-checker package path in addition to PATH lookup.
127 lines
4.4 KiB
TypeScript
127 lines
4.4 KiB
TypeScript
import { afterEach, describe, expect, it, mock } from "bun:test"
|
|
import type { DoctorResult } from "./types"
|
|
|
|
function createDoctorResult(): DoctorResult {
|
|
return {
|
|
results: [
|
|
{ name: "System", status: "pass", message: "ok", issues: [] },
|
|
{ name: "Configuration", status: "warn", message: "warn", issues: [] },
|
|
],
|
|
systemInfo: {
|
|
opencodeVersion: "1.0.200",
|
|
opencodePath: "/usr/local/bin/opencode",
|
|
pluginVersion: "3.4.0",
|
|
loadedVersion: "3.4.0",
|
|
bunVersion: "1.2.0",
|
|
configPath: "/tmp/opencode.jsonc",
|
|
configValid: true,
|
|
isLocalDev: false,
|
|
},
|
|
tools: {
|
|
lspInstalled: 2,
|
|
lspTotal: 4,
|
|
astGrepCli: true,
|
|
astGrepNapi: false,
|
|
commentChecker: true,
|
|
ghCli: { installed: true, authenticated: true, username: "yeongyu" },
|
|
mcpBuiltin: ["context7", "grep_app"],
|
|
mcpUser: ["custom"],
|
|
},
|
|
summary: {
|
|
total: 2,
|
|
passed: 1,
|
|
failed: 0,
|
|
warnings: 1,
|
|
skipped: 0,
|
|
duration: 12,
|
|
},
|
|
exitCode: 0,
|
|
}
|
|
}
|
|
|
|
describe("formatter", () => {
|
|
afterEach(() => {
|
|
mock.restore()
|
|
})
|
|
|
|
describe("formatDoctorOutput", () => {
|
|
it("dispatches to default formatter for default mode", async () => {
|
|
//#given
|
|
const formatDefaultMock = mock(() => "default-output")
|
|
const formatStatusMock = mock(() => "status-output")
|
|
const formatVerboseMock = mock(() => "verbose-output")
|
|
mock.module("./format-default", () => ({ formatDefault: formatDefaultMock }))
|
|
mock.module("./format-status", () => ({ formatStatus: formatStatusMock }))
|
|
mock.module("./format-verbose", () => ({ formatVerbose: formatVerboseMock }))
|
|
const { formatDoctorOutput } = await import(`./formatter?default=${Date.now()}`)
|
|
|
|
//#when
|
|
const output = formatDoctorOutput(createDoctorResult(), "default")
|
|
|
|
//#then
|
|
expect(output).toBe("default-output")
|
|
expect(formatDefaultMock).toHaveBeenCalledTimes(1)
|
|
expect(formatStatusMock).toHaveBeenCalledTimes(0)
|
|
expect(formatVerboseMock).toHaveBeenCalledTimes(0)
|
|
})
|
|
|
|
it("dispatches to status formatter for status mode", async () => {
|
|
//#given
|
|
const formatDefaultMock = mock(() => "default-output")
|
|
const formatStatusMock = mock(() => "status-output")
|
|
const formatVerboseMock = mock(() => "verbose-output")
|
|
mock.module("./format-default", () => ({ formatDefault: formatDefaultMock }))
|
|
mock.module("./format-status", () => ({ formatStatus: formatStatusMock }))
|
|
mock.module("./format-verbose", () => ({ formatVerbose: formatVerboseMock }))
|
|
const { formatDoctorOutput } = await import(`./formatter?status=${Date.now()}`)
|
|
|
|
//#when
|
|
const output = formatDoctorOutput(createDoctorResult(), "status")
|
|
|
|
//#then
|
|
expect(output).toBe("status-output")
|
|
expect(formatDefaultMock).toHaveBeenCalledTimes(0)
|
|
expect(formatStatusMock).toHaveBeenCalledTimes(1)
|
|
expect(formatVerboseMock).toHaveBeenCalledTimes(0)
|
|
})
|
|
|
|
it("dispatches to verbose formatter for verbose mode", async () => {
|
|
//#given
|
|
const formatDefaultMock = mock(() => "default-output")
|
|
const formatStatusMock = mock(() => "status-output")
|
|
const formatVerboseMock = mock(() => "verbose-output")
|
|
mock.module("./format-default", () => ({ formatDefault: formatDefaultMock }))
|
|
mock.module("./format-status", () => ({ formatStatus: formatStatusMock }))
|
|
mock.module("./format-verbose", () => ({ formatVerbose: formatVerboseMock }))
|
|
const { formatDoctorOutput } = await import(`./formatter?verbose=${Date.now()}`)
|
|
|
|
//#when
|
|
const output = formatDoctorOutput(createDoctorResult(), "verbose")
|
|
|
|
//#then
|
|
expect(output).toBe("verbose-output")
|
|
expect(formatDefaultMock).toHaveBeenCalledTimes(0)
|
|
expect(formatStatusMock).toHaveBeenCalledTimes(0)
|
|
expect(formatVerboseMock).toHaveBeenCalledTimes(1)
|
|
})
|
|
})
|
|
|
|
describe("formatJsonOutput", () => {
|
|
it("returns valid JSON payload", async () => {
|
|
//#given
|
|
const { formatJsonOutput } = await import(`./formatter?json=${Date.now()}`)
|
|
const result = createDoctorResult()
|
|
|
|
//#when
|
|
const output = formatJsonOutput(result)
|
|
const parsed = JSON.parse(output) as DoctorResult
|
|
|
|
//#then
|
|
expect(parsed.summary.total).toBe(2)
|
|
expect(parsed.systemInfo.pluginVersion).toBe("3.4.0")
|
|
expect(parsed.tools.ghCli.username).toBe("yeongyu")
|
|
expect(parsed.exitCode).toBe(0)
|
|
})
|
|
})
|
|
})
|