use super::*;
#[test]
fn rediscover_is_noop_when_daemon_reachable() {
let mut client = DaemonClient::new("http://127.0.0.1:7880");
assert!(!rediscover_daemon(&mut client, true));
assert_eq!(client.base_url(), "http://127.0.0.1:7880");
}
#[test]
fn rediscover_is_noop_when_resolved_url_unchanged() {
let mut client = DaemonClient::new(crate::core::DEFAULT_DAEMON_URL);
let changed = rediscover_daemon(&mut client, false);
if !changed {
assert_eq!(client.base_url(), crate::core::DEFAULT_DAEMON_URL);
}
}
#[test]
fn coordinator_session_maps_status() {
let session = crate::client::CoordinatorSession {
id: "00000000-0000-0000-0000-000000000000".into(),
name: "tmpm-foo".into(),
prefix: "foo".into(),
workdir: "/tmp/p".into(),
status: "Paused".into(),
active_delegations: 2,
recent_output: Vec::new(),
};
let row = coordinator_session_to_row(session);
assert_eq!(row.tmux_name, "tmpm-foo");
assert_eq!(row.active_delegations, 2);
assert_eq!(row.status, crate::core::session::SessionStatus::Paused);
}
#[test]
fn screen_default_is_chat() {
assert_eq!(Screen::default(), Screen::Chat);
}
fn switch(from: Screen, key: char) -> Screen {
match (from, key) {
(Screen::Chat, '2') => Screen::Health,
(Screen::Health, 'c') => Screen::Chat,
_ => from,
}
}
#[test]
fn screen_switch_preserves_chat_state() {
let mut state = DashboardState::default();
state.push_chat(ChatMessage::user("remember me"));
let screen = switch(Screen::Chat, '2');
assert_eq!(screen, Screen::Health);
let screen = switch(screen, 'c');
assert_eq!(screen, Screen::Chat);
assert_eq!(state.chat_history.len(), 1);
assert_eq!(state.chat_history[0].content, "remember me");
}
#[test]
fn health_status_bar_lists_keys() {
for token in [
"[1]health",
"[2]logs",
"[3]search",
"[Tab]",
"[↑↓]",
"[r]",
"[S]start",
"[X]stop",
"[c]chat",
"[q]quit",
] {
assert!(
HEALTH_KEY_HINT.contains(token),
"status bar missing {token}"
);
}
}
#[test]
fn render_screen_draws_both_screens_without_panic() {
use ratatui::{Terminal, backend::TestBackend};
let chat = DashboardState::default();
let hp = HealthScreen::new(health::DEFAULT_SEARCH_URL, health::DEFAULT_MEMORY_URL);
for screen in [Screen::Chat, Screen::Health] {
let backend = TestBackend::new(120, 24);
let mut terminal = Terminal::new(backend).expect("test terminal");
terminal
.draw(|f| render_screen(f, screen, &chat, &hp))
.expect("render must not panic");
}
}
#[tokio::test]
async fn coordinator_send_without_daemon_reports_error() {
let client = DaemonClient::new("http://127.0.0.1:0");
let mut state = DashboardState::default();
coordinator_send(&mut state, &client, "what is happening?").await;
assert_eq!(state.chat_history.len(), 2);
assert_eq!(state.chat_history[0].role, dashboard::ChatRole::User);
assert!(
state.chat_history[1].content.contains("daemon error"),
"expected a daemon error, got {:?}",
state.chat_history[1].content
);
}