diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-04-27 22:53:34 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-04-27 22:54:02 +0300 |
| commit | 5a61ae2f9d89320c2e91d58fc3646b5a6a88f44a (patch) | |
| tree | 5a627b659542cc3b881e50de1b57e10f1736a198 /tests/cli_wrapper.rs | |
| parent | d7879fafe80933ce962f1e029992e47a4eafc69d (diff) | |
feat: add status command
Diffstat (limited to 'tests/cli_wrapper.rs')
| -rw-r--r-- | tests/cli_wrapper.rs | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/tests/cli_wrapper.rs b/tests/cli_wrapper.rs index 46f199b1..caad5b39 100644 --- a/tests/cli_wrapper.rs +++ b/tests/cli_wrapper.rs @@ -462,6 +462,56 @@ fn pane_run_sends_one_send_input_request_with_enter_key() { } #[test] +fn help_commands_exit_successfully() { + let help_cases: &[&[&str]] = &[ + &["-h"], + &["--help"], + &["status", "-h"], + &["server", "-h"], + &["workspace", "-h"], + &["tab", "-h"], + &["pane", "-h"], + &["wait", "-h"], + &["integration", "-h"], + ]; + + for args in help_cases { + let output = Command::new(env!("CARGO_BIN_EXE_herdr")) + .args(*args) + .output() + .unwrap(); + assert!( + output.status.success(), + "herdr {} failed: status={:?} stdout={} stderr={}", + args.join(" "), + output.status.code(), + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr) + ); + } +} + +#[test] +fn removed_show_changelog_flag_fails_before_nested_guard() { + let output = Command::new(env!("CARGO_BIN_EXE_herdr")) + .arg("--show-changelog") + .env("HERDR_ENV", "1") + .output() + .unwrap(); + + assert_eq!(output.status.code(), Some(1)); + let stderr = String::from_utf8_lossy(&output.stderr); + assert!( + stderr.contains("unknown option: --show-changelog"), + "stderr: {stderr}" + ); + assert!( + !stderr.contains("nested herdr"), + "unknown flag should be rejected before nested guard: {stderr}" + ); +} + +#[test] fn integration_commands_honor_socket_override_when_server_is_missing() { let base = unique_test_dir(); let home_dir = base.join("home"); @@ -515,6 +565,106 @@ fn integration_commands_honor_socket_override_when_server_is_missing() { } #[test] +fn status_commands_report_client_and_server_versions() { + let base = unique_test_dir(); + let config_home = base.join("config"); + let runtime_dir = base.join("runtime"); + let socket_path = runtime_dir.join("herdr.sock"); + + let herdr = spawn_herdr(&config_home, &runtime_dir, &socket_path); + wait_for_socket(&socket_path, Duration::from_secs(5)); + + let full = run_cli(&socket_path, &["status"]); + assert!( + full.status.success(), + "stderr: {}", + String::from_utf8_lossy(&full.stderr) + ); + let full_stdout = String::from_utf8_lossy(&full.stdout); + assert!(full_stdout.contains("client:\n"), "stdout: {full_stdout}"); + assert!( + full_stdout.contains(&format!(" version: {}", env!("CARGO_PKG_VERSION"))), + "stdout: {full_stdout}" + ); + assert!( + full_stdout.contains(" protocol: 2"), + "stdout: {full_stdout}" + ); + assert!(full_stdout.contains("server:\n"), "stdout: {full_stdout}"); + assert!( + full_stdout.contains(" status: running"), + "stdout: {full_stdout}" + ); + assert!( + full_stdout.contains(" compatible: yes"), + "stdout: {full_stdout}" + ); + assert!( + full_stdout.contains(" restart_needed: no"), + "stdout: {full_stdout}" + ); + assert!( + full_stdout.contains(&socket_path.display().to_string()), + "stdout: {full_stdout}" + ); + + let server = run_cli(&socket_path, &["status", "server"]); + assert!(server.status.success()); + let server_stdout = String::from_utf8_lossy(&server.stdout); + assert!( + server_stdout.contains("status: running"), + "stdout: {server_stdout}" + ); + assert!( + server_stdout.contains(&format!("version: {}", env!("CARGO_PKG_VERSION"))), + "stdout: {server_stdout}" + ); + assert!( + server_stdout.contains("protocol: 2"), + "stdout: {server_stdout}" + ); + + let client = run_cli(&socket_path, &["status", "client"]); + assert!(client.status.success()); + let client_stdout = String::from_utf8_lossy(&client.stdout); + assert!( + client_stdout.contains(&format!("version: {}", env!("CARGO_PKG_VERSION"))), + "stdout: {client_stdout}" + ); + assert!( + client_stdout.contains("protocol: 2"), + "stdout: {client_stdout}" + ); + assert!( + client_stdout.contains("binary: "), + "stdout: {client_stdout}" + ); + + cleanup_spawned_herdr(herdr, base); +} + +#[test] +fn status_reports_not_running_when_server_socket_is_missing() { + let base = unique_test_dir(); + let runtime_dir = base.join("runtime"); + fs::create_dir_all(&runtime_dir).unwrap(); + register_runtime_dir(&runtime_dir); + let socket_path = runtime_dir.join("missing.sock"); + + let status = run_cli(&socket_path, &["status"]); + assert!(status.status.success()); + let stdout = String::from_utf8_lossy(&status.stdout); + assert!(stdout.contains(" status: not running"), "stdout: {stdout}"); + assert!(stdout.contains(" restart_needed: no"), "stdout: {stdout}"); + assert!( + stdout.contains(&socket_path.display().to_string()), + "stdout: {stdout}" + ); + + cleanup_test_base(&base); +} + +#[test] fn server_stop_command_shuts_down_running_server() { let base = unique_test_dir(); let config_home = base.join("config"); |
