use super::{create_test_client, should_run};
use opencode_rs::types::message::{PromptPart, PromptRequest};
#[tokio::test]
#[ignore] async fn test_session_crud_typed() {
if !should_run() {
return;
}
let client = create_test_client().await;
let session = client
.sessions()
.create(&Default::default())
.await
.expect("Failed to create session");
assert!(!session.id.is_empty(), "Session should have ID");
let fetched = client
.sessions()
.get(&session.id)
.await
.expect("Failed to get session");
assert_eq!(fetched.id, session.id, "Session IDs should match");
match client.sessions().list().await {
Ok(sessions) => {
println!("Listed {} sessions", sessions.len());
if let Some(first) = sessions.first() {
assert!(!first.id.is_empty(), "Session should have ID");
}
}
Err(e) => {
println!("List sessions: {:?}", e);
}
}
client
.sessions()
.delete(&session.id)
.await
.expect("Failed to delete session");
}
#[tokio::test]
#[ignore] async fn test_prompt_typed_response() {
if !should_run() {
return;
}
let client = create_test_client().await;
let session = client
.sessions()
.create(&Default::default())
.await
.expect("Failed to create session");
client
.messages()
.prompt(
&session.id,
&PromptRequest {
parts: vec![PromptPart::Text {
text: "Say hello".to_string(),
synthetic: None,
ignored: None,
metadata: None,
}],
message_id: None,
model: None,
agent: None,
no_reply: Some(true), system: None,
variant: None,
},
)
.await
.expect("Failed to send prompt");
println!("Prompt sent successfully");
let _ = client.sessions().delete(&session.id).await;
}
#[tokio::test]
#[ignore] async fn test_providers_list_typed() {
if !should_run() {
return;
}
let client = create_test_client().await;
let response = client
.providers()
.list()
.await
.expect("Failed to list providers");
for provider in &response.all {
assert!(!provider.id.is_empty(), "Provider should have ID");
assert!(!provider.name.is_empty(), "Provider should have name");
println!(
"Provider: {} ({}) - {:?} models",
provider.name,
provider.id,
provider.models.len()
);
}
println!(
"Response: {} providers, {} defaults, {} connected",
response.all.len(),
response.default.len(),
response.connected.len()
);
}
#[tokio::test]
#[ignore] async fn test_mcp_status_typed() {
if !should_run() {
return;
}
let client = create_test_client().await;
let status = client
.mcp()
.status()
.await
.expect("Failed to get MCP status");
println!("MCP servers: {:?}", status.servers.len());
for server in &status.servers {
assert!(!server.name.is_empty(), "MCP server should have name");
println!(" Server: {} - {:?}", server.name, server.status);
}
}
#[tokio::test]
#[ignore] async fn test_lsp_status_typed() {
if !should_run() {
return;
}
let client = create_test_client().await;
let servers = client.misc().lsp().await.expect("Failed to get LSP status");
println!("LSP servers: {} configured", servers.len());
for server in &servers {
println!(" {} ({}): {:?}", server.name, server.id, server.status);
}
}
#[tokio::test]
#[ignore] async fn test_formatter_status_typed() {
if !should_run() {
return;
}
let client = create_test_client().await;
let formatters = client
.misc()
.formatter()
.await
.expect("Failed to get formatter status");
println!("Formatters: {} configured", formatters.len());
for fmt in &formatters {
println!(
" {} - enabled: {}, extensions: {:?}",
fmt.name, fmt.enabled, fmt.extensions
);
}
}
#[tokio::test]
#[ignore] async fn test_openapi_doc_typed() {
if !should_run() {
return;
}
let client = create_test_client().await;
let doc = client
.misc()
.doc()
.await
.expect("Failed to get OpenAPI doc");
assert!(doc.spec.is_object(), "Doc should be a JSON object");
assert!(
doc.spec.get("openapi").is_some() || doc.spec.get("swagger").is_some(),
"Should be an OpenAPI/Swagger document"
);
}
#[tokio::test]
#[ignore] async fn test_find_endpoints_typed() {
if !should_run() {
return;
}
let client = create_test_client().await;
match client.find().text("fn").await {
Ok(text_results) => {
println!("Text search: got response");
let _ = text_results.results;
}
Err(e) => {
println!("Text search not available: {:?}", e);
}
}
match client.find().files("Cargo").await {
Ok(file_results) => {
println!("File search: got response");
let _ = file_results.results;
}
Err(e) => {
println!("File search not available: {:?}", e);
}
}
match client.find().symbols("main").await {
Ok(symbol_results) => {
println!("Symbol search: got response");
let _ = symbol_results.results;
}
Err(e) => {
println!("Symbol search not available: {:?}", e);
}
}
}
#[tokio::test]
#[ignore] async fn test_message_parts_typed() {
if !should_run() {
return;
}
let client = create_test_client().await;
let session = client
.sessions()
.create(&Default::default())
.await
.expect("Failed to create session");
let _ = client
.messages()
.prompt(
&session.id,
&PromptRequest {
parts: vec![PromptPart::Text {
text: "Hello".to_string(),
synthetic: None,
ignored: None,
metadata: None,
}],
message_id: None,
model: None,
agent: None,
no_reply: Some(true),
system: None,
variant: None,
},
)
.await;
let messages = client
.messages()
.list(&session.id)
.await
.expect("Failed to list messages");
for message in &messages {
println!("Message {} has {} parts", message.id(), message.parts.len());
for part in &message.parts {
match part {
opencode_rs::types::Part::Text { text, .. } => {
let preview: String = text.chars().take(50).collect();
println!(" Text part: {}...", preview);
}
opencode_rs::types::Part::Tool { tool, state, .. } => {
println!(
" Tool part: {} - state: {:?}",
tool,
state.as_ref().map(|s| s.status())
);
}
_ => {
println!(" Other part type");
}
}
}
}
let _ = client.sessions().delete(&session.id).await;
}
#[tokio::test]
#[ignore] async fn test_session_permission_ruleset() {
if !should_run() {
return;
}
let client = create_test_client().await;
let session = client
.sessions()
.create(&Default::default())
.await
.expect("Failed to create session");
let fetched = client
.sessions()
.get(&session.id)
.await
.expect("Failed to get session");
if let Some(permission) = &fetched.permission {
println!("Session has {} permission rules", permission.len());
for rule in permission {
println!(
" Rule: {} {} {:?}",
rule.permission, rule.pattern, rule.action
);
}
}
let _ = client.sessions().delete(&session.id).await;
}