Files
galaxy/crates/acp/src/agent_runtime_tests.rs
T
2026-08-05 00:56:55 -05:00

128 lines
3.5 KiB
Rust

use agent_client_protocol::schema::v1::{
AgentCapabilities, ContentBlock, SessionId, TextContent, ToolCallId, ToolCallStatus,
};
use galaxy_agent_core::{
AgentEvent, ContentPart, MessageContent, RuntimeActivity, RuntimeActivityStatus,
};
use super::*;
#[test]
fn shared_prompt_converts_once_to_official_acp_content() {
let prompt = MessageContent::MultiPart(vec![
ContentPart::Text("describe this".to_owned()),
ContentPart::Image {
data: b"image".to_vec(),
mime_type: "image/png".to_owned(),
},
]);
let content = prompt_content(prompt).expect("prompt conversion");
assert!(matches!(
&content[0],
ContentBlock::Text(text) if text.text == "describe this"
));
assert!(matches!(
&content[1],
ContentBlock::Image(image)
if image.data == "aW1hZ2U="
&& image.mime_type == "image/png"
&& image.uri.is_none()
));
}
#[test]
fn provider_tool_history_is_rejected_as_an_acp_prompt() {
let error = prompt_content(MessageContent::ToolUse {
tool_use_id: "tool-1".to_owned(),
name: "shell".to_owned(),
input: serde_json::json!({}),
})
.expect_err("tool history must be rejected");
assert_eq!(error.kind, AgentErrorKind::InvalidRequest);
}
#[test]
fn session_start_updates_state_before_emitting_turn_started() {
let state = Arc::new(Mutex::new(AcpRuntimeState::default()));
let mut tool_titles = HashMap::new();
let event = map_event(
AcpEvent::SessionStarted {
session_id: SessionId::new("session-42"),
agent_info: None,
capabilities: AgentCapabilities::default(),
can_load: true,
can_steer: true,
},
&state,
&mut tool_titles,
)
.expect("event mapping");
assert_eq!(
event,
Some(AgentEvent::TurnStarted {
runtime_request_id: "session-42".to_owned(),
})
);
assert_eq!(
*state.lock().expect("state"),
AcpRuntimeState {
session_id: Some("session-42".to_owned()),
can_load: true,
can_steer: true,
config_options: Vec::new(),
}
);
}
#[test]
fn acp_tool_progress_is_runtime_activity_not_a_host_tool_proposal() {
let state = Arc::new(Mutex::new(AcpRuntimeState::default()));
let mut tool_titles = HashMap::new();
let event = map_event(
AcpEvent::ToolCall {
id: ToolCallId::new("tool-1"),
title: "Run tests".to_owned(),
status: ToolCallStatus::InProgress,
output: Some("test_a ... ok".to_owned()),
},
&state,
&mut tool_titles,
)
.expect("event mapping");
assert_eq!(
event,
Some(AgentEvent::RuntimeActivityUpdated {
activity: RuntimeActivity {
id: "tool-1".to_owned(),
title: "Run tests".to_owned(),
status: Some(RuntimeActivityStatus::InProgress),
output: Some("test_a ... ok".to_owned()),
},
})
);
}
#[test]
fn unsolicited_user_echo_is_not_exposed_as_visible_input() {
let state = Arc::new(Mutex::new(AcpRuntimeState::default()));
let mut tool_titles = HashMap::new();
let event = map_event(
AcpEvent::UserContent {
content: ContentBlock::Text(TextContent::new("hidden Galaxy context")),
},
&state,
&mut tool_titles,
)
.expect("event mapping");
assert_eq!(event, None);
}