use super::fixture::Fixture;
use crate::git_tree::{GitTree, ToolCallState};
#[test]
fn from_repo_surfaces_partial_response_text() {
let fx = Fixture::new();
fx.build_agent("20260427T120100Z-strm", "summarize Rust ownership");
fx.write_response_events(
"20260427T120100Z-strm",
1,
&[
r#"{"type":"message_start","message":{"id":"m1"}}"#,
r#"{"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}"#,
r#"{"type":"content_delta","index":0,"delta":{"text_delta":"Rust"}}"#,
r#"{"type":"content_delta","index":0,"delta":{"text_delta":" tracks"}}"#,
r#"{"type":"content_delta","index":0,"delta":{"text_delta":" ownership"}}"#,
],
);
let tree = GitTree::from_repo(&fx.path).unwrap();
assert_eq!(tree.agents.len(), 1);
assert_eq!(
tree.agents[0].stream.text.as_deref(),
Some("Rust tracks ownership")
);
}
#[test]
fn from_repo_picks_latest_step_response_text() {
let fx = Fixture::new();
fx.build_agent("20260427T120200Z-loop", "step into the loop");
fx.write_response_events(
"20260427T120200Z-loop",
1,
&[r#"{"type":"content_delta","index":0,"delta":{"text_delta":"first step body"}}"#],
);
fx.write_response_events(
"20260427T120200Z-loop",
2,
&[r#"{"type":"content_delta","index":0,"delta":{"text_delta":"second step partial"}}"#],
);
let tree = GitTree::from_repo(&fx.path).unwrap();
assert_eq!(
tree.agents[0].stream.text.as_deref(),
Some("second step partial")
);
}
#[test]
fn from_repo_with_response_but_no_text_deltas_yet() {
let fx = Fixture::new();
fx.build_agent("20260427T120300Z-prep", "still preparing");
fx.write_response_events(
"20260427T120300Z-prep",
1,
&[r#"{"type":"message_start","message":{"id":"m1"}}"#],
);
let tree = GitTree::from_repo(&fx.path).unwrap();
assert!(tree.agents[0].stream.text.is_none());
}
#[test]
fn from_repo_surfaces_in_flight_and_complete_tool_calls() {
let fx = Fixture::new();
fx.build_agent("20260427T140000Z-tool", "run two tools");
fx.write_tool_call("20260427T140000Z-tool", 1, "toolu_done", Some(b"{}"));
fx.write_tool_call("20260427T140000Z-tool", 1, "toolu_live", None);
let tree = GitTree::from_repo(&fx.path).unwrap();
let calls = &tree.agents[0].tool_calls;
assert_eq!(calls.len(), 2);
assert_eq!(calls[0].tool_id, "toolu_done");
assert_eq!(calls[0].state, ToolCallState::Complete);
assert_eq!(calls[1].tool_id, "toolu_live");
assert_eq!(calls[1].state, ToolCallState::InFlight);
}
#[test]
fn from_repo_without_tool_calls_yields_empty_vec() {
let fx = Fixture::new();
fx.build_agent("20260427T140100Z-bare", "no tools yet");
let tree = GitTree::from_repo(&fx.path).unwrap();
assert!(tree.agents[0].tool_calls.is_empty());
}