use assert_cmd::Command;
use predicates::prelude::*;
use std::thread;
use std::time::Duration;
#[test]
fn test_session_lifecycle() {
let mut cmd = Command::cargo_bin("nds").unwrap();
let output = cmd
.arg("new")
.arg("test-lifecycle")
.arg("--no-attach")
.output()
.expect("Failed to create session");
assert!(output.status.success());
let output_str = String::from_utf8_lossy(&output.stdout);
let session_id = output_str
.lines()
.find(|line| line.starts_with("Created session:"))
.and_then(|line| line.split_whitespace().last())
.expect("Failed to extract session ID");
let mut cmd = Command::cargo_bin("nds").unwrap();
cmd.arg("list")
.assert()
.success()
.stdout(predicate::str::contains("test-lifecycle"));
let mut cmd = Command::cargo_bin("nds").unwrap();
cmd.arg("info")
.arg(&session_id)
.assert()
.success()
.stdout(predicate::str::contains("Session ID:"))
.stdout(predicate::str::contains("test-lifecycle"));
let mut cmd = Command::cargo_bin("nds").unwrap();
cmd.arg("rename")
.arg(&session_id)
.arg("renamed-session")
.assert()
.success();
let mut cmd = Command::cargo_bin("nds").unwrap();
cmd.arg("info")
.arg(&session_id)
.assert()
.success()
.stdout(predicate::str::contains("renamed-session"));
let mut cmd = Command::cargo_bin("nds").unwrap();
cmd.arg("kill")
.arg(&session_id)
.assert()
.success()
.stdout(predicate::str::contains("Killed session"));
let mut cmd = Command::cargo_bin("nds").unwrap();
cmd.arg("info").arg(&session_id).assert().failure();
}
#[test]
fn test_session_name_matching() {
let mut cmd = Command::cargo_bin("nds").unwrap();
cmd.arg("new")
.arg("unique-test-name")
.arg("--no-attach")
.assert()
.success();
thread::sleep(Duration::from_millis(100));
let mut cmd = Command::cargo_bin("nds").unwrap();
cmd.arg("info")
.arg("unique")
.assert()
.success()
.stdout(predicate::str::contains("unique-test-name"));
let mut cmd = Command::cargo_bin("nds").unwrap();
cmd.arg("info")
.arg("UNIQUE")
.assert()
.success()
.stdout(predicate::str::contains("unique-test-name"));
let mut cmd = Command::cargo_bin("nds").unwrap();
cmd.arg("kill").arg("unique").assert().success();
}
#[test]
fn test_multiple_sessions() {
for i in 1..=3 {
let mut cmd = Command::cargo_bin("nds").unwrap();
cmd.arg("new")
.arg(format!("multi-test-{}", i))
.arg("--no-attach")
.assert()
.success();
}
thread::sleep(Duration::from_millis(200));
let mut cmd = Command::cargo_bin("nds").unwrap();
let output = cmd.arg("list").output().unwrap();
let output_str = String::from_utf8_lossy(&output.stdout);
assert!(output_str.contains("multi-test-1"));
assert!(output_str.contains("multi-test-2"));
assert!(output_str.contains("multi-test-3"));
let mut cmd = Command::cargo_bin("nds").unwrap();
cmd.arg("kill")
.arg("multi-test-1")
.arg("multi-test-2")
.arg("multi-test-3")
.assert()
.success()
.stdout(predicate::str::contains("Successfully killed 3 session(s)"));
}
#[test]
fn test_clean_command() {
let mut cmd = Command::cargo_bin("nds").unwrap();
cmd.arg("clean")
.assert()
.success()
.stdout(predicate::str::contains("Cleanup complete"));
}
#[test]
fn test_history_command() {
let mut cmd = Command::cargo_bin("nds").unwrap();
cmd.arg("new")
.arg("history-test")
.arg("--no-attach")
.assert()
.success();
thread::sleep(Duration::from_millis(100));
let mut cmd = Command::cargo_bin("nds").unwrap();
cmd.arg("history").assert().success();
let mut cmd = Command::cargo_bin("nds").unwrap();
cmd.arg("history").arg("--all").assert().success();
let mut cmd = Command::cargo_bin("nds").unwrap();
cmd.arg("kill").arg("history-test").assert().success();
}