//! sessions command and session registry: lifecycle, counter, reconciliation //! and CLI parsing. mod common; use agent_manager::cli::{Cli, Command}; use agent_manager::commands::sessions_cmd; use agent_manager::sessions; use clap::Parser; #[test] fn cli_parses_sessions() { let cli = Cli::parse_from(["am", "sessions", "--status", "failed", "--show", "abc"]); match &cli.command { Some(Command::Sessions { agent, status, show, .. }) => { assert!(agent.is_none()); assert_eq!(status.as_deref(), Some("failed")); assert_eq!(show.as_deref(), Some("abc")); } other => panic!("unexpected command: {other:?}"), } } #[test] fn agent_session_roundtrip_and_counter() { let app = common::test_app("sess", &["sessions"]); let id = sessions::start_agent( &app, "claude-code", 4242, Some("/tmp".to_string()), None, vec![], vec![], None, ) .unwrap(); let sf = sessions::load(&app).unwrap(); let r = sf.sessions.get(&id).unwrap(); assert_eq!(r.status, "running"); assert_eq!(r.agent.as_deref(), Some("claude-code")); assert_eq!(app.state.load().unwrap().sessions_count, 1); sessions::finish_agent(&app, "claude-code", Some(4242), 0, true).unwrap(); let sf = sessions::load(&app).unwrap(); let r = sf.sessions.get(&id).unwrap(); assert_eq!(r.status, "stopped"); assert_eq!(r.exit_code, Some(0)); assert!(r.ended_at.is_some()); } #[test] fn command_lists_sessions() { let app = common::test_app("sesscmd", &["sessions"]); sessions::start_agent(&app, "aider", 4242, None, None, vec![], vec![], None).unwrap(); let code = sessions_cmd::run(&app, None, None, None, None, None).unwrap(); assert_eq!(code, 0); // --json path returns the row set without error. sessions::finish_agent(&app, "aider", Some(4242), 0, true).unwrap(); } #[test] fn resume_unknown_or_repl_session_errors() { let app = common::test_app("resume", &["sessions"]); assert!(sessions_cmd::run(&app, None, None, None, None, Some("inconnue")).is_err()); sessions::start_repl(&app, "r1", None).unwrap(); assert!(sessions_cmd::run(&app, None, None, None, None, Some("r1")).is_err()); } #[test] fn resume_dry_run_announces() { let app = common::test_app("resumedry", &["sessions", "--dry-run"]); let id = sessions::start_agent(&app, "claude-code", 4242, None, None, vec![], vec![], None).unwrap(); sessions::finish_agent(&app, "claude-code", Some(4242), 0, true).unwrap(); let code = sessions_cmd::run(&app, None, None, None, None, Some(&id)).unwrap(); assert_eq!(code, 0, "dry-run resume"); } #[test] fn show_one_accepts_known_id() { let app = common::test_app("sessshow", &["sessions"]); let id = sessions::start_agent(&app, "jcode", 99, None, None, vec![], vec![], None).unwrap(); let code = sessions_cmd::run(&app, None, None, None, Some(&id), None).unwrap(); assert_eq!(code, 0); }