mirror of
https://github.com/getpaseo/paseo.git
synced 2026-10-21 08:42:39 +00:00
* fix(daemon): keep lifecycle operations on the selected instance Restart reconstructed launch inputs and address fallback could redirect a home-selected shutdown to another daemon. Let supervisors publish bound endpoints, retain their worker restart contract, and share captured local lifecycle ownership between CLI and Desktop. * test(daemon): verify bounded desktop readiness and cancellable artifacts * test(cli): verify reload target hints and durable offline pairing * test(daemon): align lifecycle fixtures with ownership and targeting * fix(daemon): preserve reachability when status details time out Provider discovery can outlast a status request after authentication succeeds. Keep local connection facts separate from unavailable details, while explicit remote queries retain their error outcome. Migrate CLI and packaged Desktop fixtures to persistent managed configuration and explicit targets. Isolate generic Git observation from forge discovery and reuse disposable CLI homes on Windows. * test(daemon): observe restart through the worker status RPC The bounded CLI status observation may omit worker details while an authenticated connection remains healthy. Exercise the app-style restart through its full RPC and retain the replacement observation, with a real slow provider probe covering the distinction.
120 lines
4.6 KiB
TypeScript
120 lines
4.6 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 { 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");
|
|
}
|
|
} finally {
|
|
await rm(paseoHome, { recursive: true, force: true });
|
|
}
|
|
|
|
console.log("=== All delete tests passed ===");
|