mirror of
https://github.com/getpaseo/paseo.git
synced 2026-10-22 01:02:41 +00:00
* fix(server): report an unknown agent as not found to CLI commands fetch_agent_request answered an unknown agent ID with an error string, so DaemonClient.fetchAgent threw instead of returning null. Every CLI command that looks up one agent checks for null to report AGENT_NOT_FOUND, so delete, stop, inspect, logs and the rest reported their generic failure code and skipped the "paseo ls" hint. The daemon now answers an unknown agent with a null agent and no error. An empty or ambiguous identifier is still an error. * test(cli): expect the not-found message agent logs now prints * test(cli): move the unknown agent ID cases into the delete and stop suites --------- Co-authored-by: paseo-bot[bot] <266920839+paseo-bot[bot]@users.noreply.github.com>
143 lines
5.4 KiB
TypeScript
143 lines
5.4 KiB
TypeScript
#!/usr/bin/env npx tsx
|
|
|
|
/**
|
|
* Delete Command Tests
|
|
*
|
|
* Tests the delete command - hard-deleting agents (interrupt if running first).
|
|
* Since daemon may not be running, we test both:
|
|
* - Help and argument parsing
|
|
* - Graceful error handling when daemon not running
|
|
* - All flags are accepted
|
|
*/
|
|
|
|
import assert from "node:assert";
|
|
import { runLocalPaseo } from "./helpers/local-cli.ts";
|
|
import { getAvailablePort } from "./helpers/network.ts";
|
|
import { runPaseoCli, startTestDaemon } from "./helpers/test-daemon.ts";
|
|
import { mkdtemp, rm } from "fs/promises";
|
|
import { tmpdir } from "os";
|
|
import { join } from "path";
|
|
|
|
console.log("=== Delete Command Tests ===\n");
|
|
|
|
const port = await getAvailablePort();
|
|
const paseoHome = await mkdtemp(join(tmpdir(), "paseo-delete-test-home-"));
|
|
|
|
async function runCli(args: string[]) {
|
|
return runLocalPaseo(["--host", `localhost:${port}`, ...args], { PASEO_HOME: paseoHome });
|
|
}
|
|
|
|
async function runDelete(args: string[]) {
|
|
return runCli(["delete", ...args]);
|
|
}
|
|
|
|
try {
|
|
{
|
|
console.log("Test 1: delete --help shows options");
|
|
const result = await runDelete(["--help"]);
|
|
assert.strictEqual(result.exitCode, 0, "delete --help should exit 0");
|
|
assert(result.stdout.includes("--all"), "help should mention --all flag");
|
|
assert(result.stdout.includes("--cwd"), "help should mention --cwd option");
|
|
assert(result.stdout.includes("--host"), "help should mention --host option");
|
|
assert(result.stdout.includes("[id]"), "help should mention optional id argument");
|
|
console.log("✓ delete --help shows options\n");
|
|
}
|
|
|
|
{
|
|
console.log("Test 2: delete requires ID, --all, or --cwd");
|
|
const result = await runDelete([]);
|
|
assert.notStrictEqual(result.exitCode, 0, "should fail without id, --all, or --cwd");
|
|
const output = result.stdout + result.stderr;
|
|
const hasError =
|
|
output.toLowerCase().includes("missing") ||
|
|
output.toLowerCase().includes("required") ||
|
|
output.toLowerCase().includes("argument") ||
|
|
output.toLowerCase().includes("id");
|
|
assert(hasError, "error should mention missing argument");
|
|
console.log("✓ delete requires ID, --all, or --cwd\n");
|
|
}
|
|
|
|
{
|
|
console.log("Test 3: delete handles daemon not running");
|
|
const result = await runDelete(["abc123"]);
|
|
assert.notStrictEqual(result.exitCode, 0, "should fail when daemon not running");
|
|
const output = result.stdout + result.stderr;
|
|
const hasError =
|
|
output.toLowerCase().includes("daemon") ||
|
|
output.toLowerCase().includes("connect") ||
|
|
output.toLowerCase().includes("cannot");
|
|
assert(hasError, "error message should mention connection issue");
|
|
console.log("✓ delete handles daemon not running\n");
|
|
}
|
|
|
|
{
|
|
console.log("Test 4: delete --all flag is accepted");
|
|
const result = await runDelete(["--all"]);
|
|
const output = result.stdout + result.stderr;
|
|
assert(!output.includes("unknown option"), "should accept --all flag");
|
|
assert(!output.includes("error: option"), "should not have option parsing error");
|
|
console.log("✓ delete --all flag is accepted\n");
|
|
}
|
|
|
|
{
|
|
console.log("Test 5: delete --cwd flag is accepted");
|
|
const result = await runDelete(["--cwd", "/tmp"]);
|
|
const output = result.stdout + result.stderr;
|
|
assert(!output.includes("unknown option"), "should accept --cwd flag");
|
|
assert(!output.includes("error: option"), "should not have option parsing error");
|
|
console.log("✓ delete --cwd flag is accepted\n");
|
|
}
|
|
|
|
{
|
|
console.log("Test 6: delete with ID and --host flag is accepted");
|
|
const result = await runDelete(["abc123", "--host", `localhost:${port}`]);
|
|
const output = result.stdout + result.stderr;
|
|
assert(!output.includes("unknown option"), "should accept --host flag");
|
|
assert(!output.includes("error: option"), "should not have option parsing error");
|
|
console.log("✓ delete with ID and --host flag is accepted\n");
|
|
}
|
|
|
|
{
|
|
console.log("Test 7: paseo --help shows delete command");
|
|
const result = await runCli(["--help"]);
|
|
assert.strictEqual(result.exitCode, 0, "paseo --help should exit 0");
|
|
assert(result.stdout.includes("delete"), "help should mention delete command");
|
|
console.log("✓ paseo --help shows delete command\n");
|
|
}
|
|
|
|
{
|
|
console.log("Test 8: -q (quiet) flag is accepted with delete");
|
|
const result = await runCli(["-q", "delete", "abc123"]);
|
|
const output = result.stdout + result.stderr;
|
|
assert(!output.includes("unknown option"), "should accept -q flag");
|
|
assert(!output.includes("error: option"), "should not have option parsing error");
|
|
console.log("✓ -q (quiet) flag is accepted with delete\n");
|
|
}
|
|
|
|
{
|
|
console.log("Test 9: delete reports AGENT_NOT_FOUND for an unknown ID");
|
|
const daemon = await startTestDaemon();
|
|
try {
|
|
const result = await runPaseoCli(daemon, [
|
|
"agent",
|
|
"delete",
|
|
"does-not-exist",
|
|
"--host",
|
|
`127.0.0.1:${daemon.port}`,
|
|
"--json",
|
|
]);
|
|
assert.notStrictEqual(result.exitCode, 0, "delete should fail for an unknown ID");
|
|
const { error } = JSON.parse(result.stderr);
|
|
assert.strictEqual(error.code, "AGENT_NOT_FOUND", result.stderr);
|
|
assert.match(error.details, /paseo ls/);
|
|
} finally {
|
|
await daemon.stop();
|
|
}
|
|
console.log("✓ delete reports AGENT_NOT_FOUND for an unknown ID\n");
|
|
}
|
|
} finally {
|
|
await rm(paseoHome, { recursive: true, force: true });
|
|
}
|
|
|
|
console.log("=== All delete tests passed ===");
|