mcpb/test/cli.test.ts
Felix Rieseberg 0172c07623
🚀 Hello World
2025-06-26 08:38:59 -07:00

80 lines
2.3 KiB
TypeScript

import { execSync } from "node:child_process";
import fs from "node:fs";
import { join } from "node:path";
interface ExecSyncError extends Error {
stdout: Buffer;
stderr: Buffer;
status: number | null;
signal: string | null;
}
describe("DXT CLI", () => {
const cliPath = join(__dirname, "../dist/cli/cli.js");
const validManifestPath = join(__dirname, "valid-manifest.json");
const invalidManifestPath = join(__dirname, "invalid-manifest.json");
beforeAll(() => {
// Ensure the CLI is built
execSync("yarn build", { cwd: join(__dirname, "..") });
});
it("should validate a valid manifest", () => {
const result = execSync(`node ${cliPath} validate ${validManifestPath}`, {
encoding: "utf-8",
});
expect(result).toContain("Manifest is valid!");
});
it("should reject an invalid manifest", () => {
expect(() => {
execSync(`node ${cliPath} validate ${invalidManifestPath}`, {
encoding: "utf-8",
});
}).toThrow();
});
it("should show usage when no arguments provided", () => {
try {
execSync(`node ${cliPath}`, { encoding: "utf-8", stdio: "pipe" });
} catch (error) {
// Commander outputs help to stderr when no command is provided
const execError = error as ExecSyncError;
expect(execError.stderr.toString()).toContain(
"Usage: dxt [options] [command]",
);
}
});
it("should handle non-existent files", () => {
try {
execSync(`node ${cliPath} validate /non/existent/file.json`, {
encoding: "utf-8",
stdio: "pipe",
});
fail("Should have thrown an error");
} catch (error) {
const execError = error as ExecSyncError;
expect(execError.stderr.toString()).toContain("ERROR: File not found");
}
});
it("should handle invalid JSON", () => {
const invalidJsonPath = join(__dirname, "invalid-json.json");
fs.writeFileSync(invalidJsonPath, "{ invalid json }");
try {
execSync(`node ${cliPath} validate ${invalidJsonPath}`, {
encoding: "utf-8",
stdio: "pipe",
});
fail("Should have thrown an error");
} catch (error) {
const execError = error as ExecSyncError;
expect(execError.stderr.toString()).toContain("ERROR: Invalid JSON");
}
// Clean up
fs.unlinkSync(invalidJsonPath);
});
});