use crate::tui::app::DisplayMessage;
use crate::tui::render::chat::{TurnRange, turn_summary};
use chrono::{Duration, Utc};
use uuid::Uuid;
fn msg(role: &str, at: chrono::DateTime<Utc>) -> DisplayMessage {
DisplayMessage {
id: Uuid::new_v4(),
role: role.to_string(),
content: String::new(),
timestamp: at,
token_count: None,
cost: None,
approval: None,
approve_menu: None,
details: None,
expanded: false,
expanded_full: false,
tool_group: None,
duration_secs: None,
}
}
fn whole(n: usize) -> TurnRange {
TurnRange { start: 0, end: n }
}
#[test]
fn stored_duration_survives_identical_timestamps() {
let now = Utc::now();
let mut assistant = msg("assistant", now);
assistant.duration_secs = Some(1370);
let messages = vec![msg("user", now), assistant];
assert_eq!(turn_summary(&messages, whole(2)).duration_secs, 1370);
}
#[test]
fn stored_duration_wins_over_timestamp_subtraction() {
let start = Utc::now();
let mut assistant = msg("assistant", start + Duration::seconds(5));
assistant.duration_secs = Some(930);
let messages = vec![msg("user", start), assistant];
assert_eq!(turn_summary(&messages, whole(2)).duration_secs, 930);
}
#[test]
fn falls_back_to_timestamps_for_rows_without_a_stored_value() {
let start = Utc::now();
let messages = vec![
msg("user", start),
msg("assistant", start + Duration::seconds(42)),
];
assert_eq!(turn_summary(&messages, whole(2)).duration_secs, 42);
}
#[test]
fn a_negative_stored_duration_is_clamped() {
let now = Utc::now();
let mut assistant = msg("assistant", now);
assistant.duration_secs = Some(-7);
let messages = vec![msg("user", now), assistant];
assert_eq!(turn_summary(&messages, whole(2)).duration_secs, 0);
}
#[test]
fn the_last_stamped_value_in_the_turn_wins() {
let now = Utc::now();
let mut first = msg("assistant", now);
first.duration_secs = Some(12);
let mut last = msg("assistant", now);
last.duration_secs = Some(600);
let messages = vec![msg("user", now), first, last];
assert_eq!(turn_summary(&messages, whole(3)).duration_secs, 600);
}
#[test]
fn zero_stays_zero_so_instant_turns_stay_quiet() {
let now = Utc::now();
let mut assistant = msg("assistant", now);
assistant.duration_secs = Some(0);
let messages = vec![msg("user", now), assistant];
assert_eq!(turn_summary(&messages, whole(2)).duration_secs, 0);
}