Skip to main content

agent_engine/tools/shell/
config.rs

1//! Shell session configuration — re-exported from `core::shell_config`.
2//! All existing paths (`tools::shell::config::ShellConfig`) remain valid.
3
4pub use crate::core::shell_config::ShellConfig;
5
6#[cfg(test)]
7mod tests {
8    use super::*;
9    use std::time::Duration;
10    use serial_test::serial;
11    use crate::core::config::load_config;
12
13    #[test]
14    fn test_shell_config_default() {
15        let config = ShellConfig::default();
16        assert_eq!(config.max_sessions, 5);
17        assert_eq!(config.idle_timeout, Duration::from_secs(600));
18        assert_eq!(config.readiness_timeout_ms, 300);
19        assert_eq!(config.max_readiness_timeout_ms, 10_000);
20        assert_eq!(config.default_rows, 24);
21        assert_eq!(config.default_cols, 80);
22        assert_eq!(config.prompt_patterns.len(), 19);
23    }
24
25    #[test]
26    #[serial]
27    fn test_shell_config_from_file() {
28        // These tests must run sequentially since they mutate HOME env var.
29        // Combined into one test to avoid parallel races.
30
31        // --- Subtest 1: Full config parsing ---
32        {
33            let test_dir = std::path::PathBuf::from("/tmp/synaps-shell-test-1/.synaps-cli");
34            let _ = std::fs::create_dir_all(&test_dir);
35            let config_path = test_dir.join("config");
36
37            let config_content = "shell.max_sessions = 10\nshell.idle_timeout = 1200\nshell.readiness_timeout_ms = 500\nshell.max_readiness_timeout_ms = 20000\nshell.default_rows = 30\nshell.default_cols = 120\n";
38            std::fs::write(&config_path, config_content).unwrap();
39
40            let original_home = std::env::var("HOME").ok();
41            let original_base_dir = std::env::var("SYNAPS_BASE_DIR").ok();
42            std::env::remove_var("SYNAPS_BASE_DIR");
43            std::env::set_var("HOME", "/tmp/synaps-shell-test-1");
44            let config = load_config();
45            if let Some(home) = original_home {
46                std::env::set_var("HOME", home);
47            }
48            if let Some(base_dir) = original_base_dir {
49                std::env::set_var("SYNAPS_BASE_DIR", base_dir);
50            }
51            let _ = std::fs::remove_dir_all("/tmp/synaps-shell-test-1");
52
53            assert_eq!(config.shell.max_sessions, 10);
54            assert_eq!(config.shell.idle_timeout, Duration::from_secs(1200));
55            assert_eq!(config.shell.readiness_timeout_ms, 500);
56            assert_eq!(config.shell.max_readiness_timeout_ms, 20000);
57            assert_eq!(config.shell.default_rows, 30);
58            assert_eq!(config.shell.default_cols, 120);
59        }
60
61        // --- Subtest 2: Partial config — missing keys use defaults ---
62        {
63            let test_dir = std::path::PathBuf::from("/tmp/synaps-shell-test-2/.synaps-cli");
64            let _ = std::fs::create_dir_all(&test_dir);
65            let config_path = test_dir.join("config");
66
67            let config_content = "shell.max_sessions = 3\nshell.default_rows = 40\n";
68            std::fs::write(&config_path, config_content).unwrap();
69
70            let original_home = std::env::var("HOME").ok();
71            let original_base_dir = std::env::var("SYNAPS_BASE_DIR").ok();
72            std::env::remove_var("SYNAPS_BASE_DIR");
73            std::env::set_var("HOME", "/tmp/synaps-shell-test-2");
74            let config = load_config();
75            if let Some(home) = original_home {
76                std::env::set_var("HOME", home);
77            }
78            if let Some(base_dir) = original_base_dir {
79                std::env::set_var("SYNAPS_BASE_DIR", base_dir);
80            }
81            let _ = std::fs::remove_dir_all("/tmp/synaps-shell-test-2");
82
83            assert_eq!(config.shell.max_sessions, 3);
84            assert_eq!(config.shell.default_rows, 40);
85            assert_eq!(config.shell.idle_timeout, Duration::from_secs(600));
86            assert_eq!(config.shell.readiness_timeout_ms, 300);
87        }
88
89        // --- Subtest 3: Invalid values → defaults ---
90        {
91            let test_dir = std::path::PathBuf::from("/tmp/synaps-shell-test-3/.synaps-cli");
92            let _ = std::fs::create_dir_all(&test_dir);
93            let config_path = test_dir.join("config");
94
95            let config_content = "shell.max_sessions = not_a_number\nshell.idle_timeout = invalid\n";
96            std::fs::write(&config_path, config_content).unwrap();
97
98            let original_home = std::env::var("HOME").ok();
99            let original_base_dir = std::env::var("SYNAPS_BASE_DIR").ok();
100            std::env::remove_var("SYNAPS_BASE_DIR");
101            std::env::set_var("HOME", "/tmp/synaps-shell-test-3");
102            let config = load_config();
103            if let Some(home) = original_home {
104                std::env::set_var("HOME", home);
105            }
106            if let Some(base_dir) = original_base_dir {
107                std::env::set_var("SYNAPS_BASE_DIR", base_dir);
108            }
109            let _ = std::fs::remove_dir_all("/tmp/synaps-shell-test-3");
110
111            assert_eq!(config.shell.max_sessions, 5);
112            assert_eq!(config.shell.idle_timeout, Duration::from_secs(600));
113        }
114    }
115}