aboutsummaryrefslogtreecommitdiff
path: root/tests/cli_wrapper.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-04-27 22:53:34 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-04-27 22:54:02 +0300
commit5a61ae2f9d89320c2e91d58fc3646b5a6a88f44a (patch)
tree5a627b659542cc3b881e50de1b57e10f1736a198 /tests/cli_wrapper.rs
parentd7879fafe80933ce962f1e029992e47a4eafc69d (diff)
feat: add status command
Diffstat (limited to 'tests/cli_wrapper.rs')
-rw-r--r--tests/cli_wrapper.rs150
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");