#!/usr/bin/env npx tsx /** * Permit Allow/Deny Command Tests * * Tests the permit allow and deny commands. * Since daemon may not be running, we test: * - Help and argument parsing * - Graceful error handling when daemon not running * - Flag acceptance * * Tests: * - permit allow --help shows options * - permit deny --help shows options * - permit allow handles daemon not running * - permit deny handles daemon not running * - permit allow --all flag is accepted * - permit deny --all flag is accepted * - permit deny --message flag is accepted * - permit deny --interrupt flag is accepted * - permit allow --input flag is accepted */ import assert from "node:assert"; import { $ } from "zx"; import { mkdtemp, rm } from "fs/promises"; import { tmpdir } from "os"; import { join } from "path"; $.verbose = false; console.log("=== Permit Allow/Deny Command Tests ===\n"); // Get random port that's definitely not in use (never 6767) const port = 10000 + Math.floor(Math.random() * 50000); const paseoHome = await mkdtemp(join(tmpdir(), "paseo-test-home-")); try { // Test 1: permit allow --help shows options { console.log("Test 1: permit allow --help shows options"); const result = await $`npx paseo permit allow --help`.nothrow(); assert.strictEqual(result.exitCode, 0, "permit allow --help should exit 0"); assert(result.stdout.includes("--all"), "help should mention --all flag"); assert(result.stdout.includes("--input"), "help should mention --input option"); assert(result.stdout.includes("--host"), "help should mention --host option"); assert(result.stdout.includes(""), "help should mention agent argument"); console.log("✓ permit allow --help shows options\n"); } // Test 2: permit deny --help shows options { console.log("Test 2: permit deny --help shows options"); const result = await $`npx paseo permit deny --help`.nothrow(); assert.strictEqual(result.exitCode, 0, "permit deny --help should exit 0"); assert(result.stdout.includes("--all"), "help should mention --all flag"); assert(result.stdout.includes("--message"), "help should mention --message option"); assert(result.stdout.includes("--interrupt"), "help should mention --interrupt flag"); assert(result.stdout.includes("--host"), "help should mention --host option"); assert(result.stdout.includes(""), "help should mention agent argument"); console.log("✓ permit deny --help shows options\n"); } // Test 3: permit allow handles daemon not running { console.log("Test 3: permit allow handles daemon not running"); const result = await $`PASEO_HOST=localhost:${port} PASEO_HOME=${paseoHome} npx paseo permit allow abc123 req456`.nothrow(); // Should fail because daemon not running 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("✓ permit allow handles daemon not running\n"); } // Test 4: permit deny handles daemon not running { console.log("Test 4: permit deny handles daemon not running"); const result = await $`PASEO_HOST=localhost:${port} PASEO_HOME=${paseoHome} npx paseo permit deny abc123 req456`.nothrow(); // Should fail because daemon not running 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("✓ permit deny handles daemon not running\n"); } // Test 5: permit allow --all flag is accepted { console.log("Test 5: permit allow --all flag is accepted"); const result = await $`PASEO_HOST=localhost:${port} PASEO_HOME=${paseoHome} npx paseo permit allow abc123 --all`.nothrow(); 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("✓ permit allow --all flag is accepted\n"); } // Test 6: permit deny --all flag is accepted { console.log("Test 6: permit deny --all flag is accepted"); const result = await $`PASEO_HOST=localhost:${port} PASEO_HOME=${paseoHome} npx paseo permit deny abc123 --all`.nothrow(); 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("✓ permit deny --all flag is accepted\n"); } // Test 7: permit deny --message flag is accepted { console.log("Test 7: permit deny --message flag is accepted"); const result = await $`PASEO_HOST=localhost:${port} PASEO_HOME=${paseoHome} npx paseo permit deny abc123 req456 --message "Not allowed"`.nothrow(); const output = result.stdout + result.stderr; assert(!output.includes("unknown option"), "should accept --message flag"); assert(!output.includes("error: option"), "should not have option parsing error"); console.log("✓ permit deny --message flag is accepted\n"); } // Test 8: permit deny --interrupt flag is accepted { console.log("Test 8: permit deny --interrupt flag is accepted"); const result = await $`PASEO_HOST=localhost:${port} PASEO_HOME=${paseoHome} npx paseo permit deny abc123 req456 --interrupt`.nothrow(); const output = result.stdout + result.stderr; assert(!output.includes("unknown option"), "should accept --interrupt flag"); assert(!output.includes("error: option"), "should not have option parsing error"); console.log("✓ permit deny --interrupt flag is accepted\n"); } // Test 9: permit allow --input flag is accepted { console.log("Test 9: permit allow --input flag is accepted"); const result = await $`PASEO_HOST=localhost:${port} PASEO_HOME=${paseoHome} npx paseo permit allow abc123 req456 --input '{"key":"value"}'`.nothrow(); const output = result.stdout + result.stderr; assert(!output.includes("unknown option"), "should accept --input flag"); assert(!output.includes("error: option"), "should not have option parsing error"); console.log("✓ permit allow --input flag is accepted\n"); } // Test 10: permit allow without req_id and without --all fails gracefully { console.log("Test 10: permit allow requires req_id or --all"); const result = await $`PASEO_HOST=localhost:${port} PASEO_HOME=${paseoHome} npx paseo permit allow abc123`.nothrow(); // This might fail due to daemon not running first, or due to missing argument // The important thing is it doesn't crash with an unhandled error assert.notStrictEqual(result.exitCode, 0, "should fail without req_id or --all"); console.log("✓ permit allow requires req_id or --all\n"); } // Test 11: permit deny without req_id and without --all fails gracefully { console.log("Test 11: permit deny requires req_id or --all"); const result = await $`PASEO_HOST=localhost:${port} PASEO_HOME=${paseoHome} npx paseo permit deny abc123`.nothrow(); assert.notStrictEqual(result.exitCode, 0, "should fail without req_id or --all"); console.log("✓ permit deny requires req_id or --all\n"); } } finally { // Clean up temp directory await rm(paseoHome, { recursive: true, force: true }); } console.log("=== All permit allow/deny tests passed ===");