skillhub/skillhub-cli/tests/commands.test.ts
chenbaowang acea441625 feat(cli): enhance inspect/install commands and reorganize help
- Add --details option to inspect for version history and tags
- Normalize version input (strip 'v' prefix) in install command
- Skip version selection when --skill-version or --tag is specified
- Reorganize help: merge Discover & Info sections
- Move SkillVersionItem/VersionsResponse types to schema/routes.ts
- Remove versions command registration from CLI (file retained for now)
- Fix error handling to return after setting exit code
- Update tests to reflect command changes
2026-04-21 19:40:02 +08:00

184 lines
6.3 KiB
TypeScript

import { describe, it, expect } from "vitest";
import { Command } from "commander";
import { registerInspect } from "../src/commands/inspect.js";
import { registerWhoami } from "../src/commands/whoami.js";
import { registerLogin } from "../src/commands/login.js";
import { registerPublish } from "../src/commands/publish.js";
import { registerMe } from "../src/commands/me.js";
import { registerNotifications } from "../src/commands/notifications.js";
import { registerReviews } from "../src/commands/reviews.js";
import { registerNamespaces } from "../src/commands/namespaces.js";
import { registerResolve } from "../src/commands/resolve.js";
import { registerRating, registerRate } from "../src/commands/rating.js";
import { registerStar } from "../src/commands/star.js";
import { registerDelete } from "../src/commands/delete.js";
import { registerArchive } from "../src/commands/archive.js";
import { registerReport } from "../src/commands/report.js";
import { registerSearch } from "../src/commands/search.js";
import { registerInstall } from "../src/commands/install.js";
import { registerDownload } from "../src/commands/download.js";
import { registerInit } from "../src/commands/init.js";
import { registerList } from "../src/commands/list.js";
import { registerLogout } from "../src/commands/logout.js";
import { registerUninstall } from "../src/commands/uninstall.js";
import { registerSync } from "../src/commands/sync.js";
describe("Command registrations", () => {
function getCommandNames(program: Command): string[] {
return program.commands.map((c) => c.name());
}
it("registers inspect command", () => {
const program = new Command();
registerInspect(program);
const names = getCommandNames(program);
expect(names).toContain("inspect");
});
it("registers whoami command", () => {
const program = new Command();
registerWhoami(program);
expect(getCommandNames(program)).toContain("whoami");
});
it("registers login command", () => {
const program = new Command();
registerLogin(program);
expect(getCommandNames(program)).toContain("login");
});
it("registers publish command with correct options", () => {
const program = new Command();
registerPublish(program);
const cmd = program.commands.find((c) => c.name() === "publish");
expect(cmd).toBeDefined();
const opts = cmd!.options.map((o) => o.flags);
expect(opts).toContain("--namespace <ns>");
expect(opts).toContain("--slug <slug>");
expect(opts).toContain("-v, --skill-version <ver>");
expect(opts).not.toContain("--version <ver>");
});
it("registers me command with skills and stars subcommands", () => {
const program = new Command();
registerMe(program);
const cmd = program.commands.find((c) => c.name() === "me");
expect(cmd).toBeDefined();
const subNames = cmd!.commands.map((c) => c.name());
expect(subNames).toContain("skills");
expect(subNames).toContain("stars");
});
it("registers notifications command with subcommands", () => {
const program = new Command();
registerNotifications(program);
const cmd = program.commands.find((c) => c.name() === "notifications");
expect(cmd).toBeDefined();
const subNames = cmd!.commands.map((c) => c.name());
expect(subNames).toContain("list");
expect(subNames).toContain("read");
expect(subNames).toContain("read-all");
});
it("registers reviews command with subcommands", () => {
const program = new Command();
registerReviews(program);
const cmd = program.commands.find((c) => c.name() === "reviews");
expect(cmd).toBeDefined();
const subNames = cmd!.commands.map((c) => c.name());
expect(subNames).toContain("my");
});
it("registers namespaces command", () => {
const program = new Command();
registerNamespaces(program);
expect(getCommandNames(program)).toContain("namespaces");
});
it("registers resolve command", () => {
const program = new Command();
registerResolve(program);
expect(getCommandNames(program)).toContain("resolve");
});
it("registers rating and rate commands", () => {
const program = new Command();
registerRating(program);
registerRate(program);
const names = getCommandNames(program);
expect(names).toContain("rating");
expect(names).toContain("rate");
});
it("registers star command", () => {
const program = new Command();
registerStar(program);
expect(getCommandNames(program)).toContain("star");
});
it("registers delete command", () => {
const program = new Command();
registerDelete(program);
expect(getCommandNames(program)).toContain("delete");
});
it("registers archive command", () => {
const program = new Command();
registerArchive(program);
expect(getCommandNames(program)).toContain("archive");
});
it("registers report command", () => {
const program = new Command();
registerReport(program);
expect(getCommandNames(program)).toContain("report");
});
it("registers search command", () => {
const program = new Command();
registerSearch(program);
expect(getCommandNames(program)).toContain("search");
});
it("registers install command", () => {
const program = new Command();
registerInstall(program);
expect(getCommandNames(program)).toContain("install");
});
it("registers download command", () => {
const program = new Command();
registerDownload(program);
expect(getCommandNames(program)).toContain("download");
});
it("registers init command", () => {
const program = new Command();
registerInit(program);
expect(getCommandNames(program)).toContain("init");
});
it("registers list command", () => {
const program = new Command();
registerList(program);
expect(getCommandNames(program)).toContain("list");
});
it("registers uninstall command", () => {
const program = new Command();
registerUninstall(program);
expect(getCommandNames(program)).toContain("uninstall");
});
it("registers logout command", () => {
const program = new Command();
registerLogout(program);
expect(getCommandNames(program)).toContain("logout");
});
it("registers sync command", () => {
const program = new Command();
registerSync(program);
expect(getCommandNames(program)).toContain("sync");
});
});