mod cli_binary_test_helpers;
use cli_binary_test_helpers::{ run_cli, stderr_str, stdout_str };
#[ cfg( unix ) ]
use cli_binary_test_helpers::{ fake_claude_binary_dir, spawn_fake_claude };
#[ test ]
fn it_01_no_pid_argument()
{
let out = run_cli( &[ "kill" ] );
let stderr = stderr_str( &out );
assert!( !out.status.success(), "expected non-zero exit" );
assert!(
stderr.contains( "missing PID" ),
"stderr must mention 'missing PID', got: {stderr}"
);
}
#[ test ]
fn it_02_non_numeric_pid()
{
let out = run_cli( &[ "kill", "abc" ] );
let stderr = stderr_str( &out );
assert!( !out.status.success(), "expected non-zero exit" );
assert!(
stderr.contains( "invalid PID" ),
"stderr must mention 'invalid PID', got: {stderr}"
);
}
#[ test ]
fn it_03_pid_not_a_claude_process()
{
let out = run_cli( &[ "kill", "999999" ] );
let stderr = stderr_str( &out );
assert!( !out.status.success(), "expected non-zero exit" );
assert!(
stderr.contains( "999999" ),
"stderr must include the rejected PID, got: {stderr}"
);
assert!(
stderr.contains( "not a running Claude Code session" ),
"stderr must explain the PID is not a Claude session, got: {stderr}"
);
}
#[ cfg( unix ) ]
#[ test ]
fn it_04_successful_sigterm_delivery()
{
let ( _dir, path_val ) = fake_claude_binary_dir();
let mut bg = spawn_fake_claude( &path_val );
let pid = bg.id();
let bin = env!( "CARGO_BIN_EXE_clr" );
let result = std::process::Command::new( bin )
.args( [ "kill", &pid.to_string() ] )
.output();
let _ = bg.kill();
let _ = bg.wait();
let out = result.expect( "run clr kill" );
let stdout = stdout_str( &out );
assert!( out.status.success(), "exit 0 expected, got {:?}: {}", out.status.code(), stderr_str( &out ) );
assert!(
stdout.contains( "Sent SIGTERM" ),
"stdout must contain 'Sent SIGTERM', got: {stdout}"
);
}
#[ test ]
fn it_05_help_flag()
{
let out = run_cli( &[ "kill", "--help" ] );
let stdout = stdout_str( &out );
assert!( out.status.success(), "exit 0 expected, got {:?}", out.status.code() );
assert!( stdout.contains( "SIGTERM" ), "help must mention SIGTERM: {stdout}" );
assert!( stdout.contains( "<PID>" ), "help must mention <PID>: {stdout}" );
}
#[ test ]
fn it_06_help_short_flag()
{
let out = run_cli( &[ "kill", "-h" ] );
let stdout = stdout_str( &out );
assert!( out.status.success(), "exit 0 expected, got {:?}", out.status.code() );
assert!( stdout.contains( "SIGTERM" ), "help must mention SIGTERM: {stdout}" );
}
#[ test ]
fn it_07_help_lists_kill()
{
let out = run_cli( &[ "--help" ] );
let stdout = stdout_str( &out );
assert!( out.status.success(), "exit 0 expected, got {:?}", out.status.code() );
assert!(
stdout.contains( "kill" ),
"help output must mention 'kill' subcommand, got: {stdout}"
);
}
#[ test ]
fn it_08_typo_clr_kil()
{
let out = run_cli( &[ "kil" ] );
let stderr = stderr_str( &out );
assert!( !out.status.success(), "expected non-zero exit" );
assert!(
stderr.contains( "Did you mean" ),
"stderr must contain 'Did you mean', got: {stderr}"
);
}
#[ test ]
fn it_09_extra_argument()
{
let out = run_cli( &[ "kill", "1234", "extra" ] );
let stderr = stderr_str( &out );
assert!( !out.status.success(), "expected non-zero exit" );
assert!(
stderr.contains( "unexpected argument" ),
"stderr must contain 'unexpected argument', got: {stderr}"
);
}