diff options
| author | main <main@swarm.moe> | 2026-03-19 11:19:42 -0400 |
|---|---|---|
| committer | main <main@swarm.moe> | 2026-03-19 11:19:42 -0400 |
| commit | eb6b1af642f5829d5dc08aa61138d893b91b60b2 (patch) | |
| tree | 0f1f5a81424f2a98ea08a8743995303769763e32 /crates/fidget-spinner-cli/tests/mcp_hardening.rs | |
| parent | 7b9bd8b42883f82b090718175b8316296ef18236 (diff) | |
| download | fidget_spinner-eb6b1af642f5829d5dc08aa61138d893b91b60b2.zip | |
Retrofit MCP host onto libmcp
Diffstat (limited to 'crates/fidget-spinner-cli/tests/mcp_hardening.rs')
| -rw-r--r-- | crates/fidget-spinner-cli/tests/mcp_hardening.rs | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/crates/fidget-spinner-cli/tests/mcp_hardening.rs b/crates/fidget-spinner-cli/tests/mcp_hardening.rs index 8d3cd9d..1c70562 100644 --- a/crates/fidget-spinner-cli/tests/mcp_hardening.rs +++ b/crates/fidget-spinner-cli/tests/mcp_hardening.rs @@ -8,6 +8,7 @@ use clap as _; use dirs as _; use fidget_spinner_core::NonEmptyText; use fidget_spinner_store_sqlite::{ListNodesQuery, ProjectStore}; +use libmcp as _; use serde as _; use serde_json::{Value, json}; use time as _; @@ -160,6 +161,13 @@ fn tool_content(response: &Value) -> &Value { &response["result"]["structuredContent"] } +fn tool_text(response: &Value) -> Option<&str> { + response["result"]["content"] + .as_array() + .and_then(|content| content.first()) + .and_then(|entry| entry["text"].as_str()) +} + #[test] fn cold_start_exposes_health_and_telemetry() -> TestResult { let project_root = temp_project_root("cold_start")?; @@ -214,6 +222,29 @@ fn cold_start_exposes_health_and_telemetry() -> TestResult { } #[test] +fn tool_output_defaults_to_porcelain_and_supports_json_render() -> TestResult { + let project_root = temp_project_root("render_modes")?; + init_project(&project_root)?; + + let mut harness = McpHarness::spawn(None, &[])?; + let _ = harness.initialize()?; + harness.notify_initialized()?; + let bind = harness.bind_project(21, &project_root)?; + assert_eq!(bind["result"]["isError"].as_bool(), Some(false)); + + let porcelain = harness.call_tool(22, "project.status", json!({}))?; + let porcelain_text = must_some(tool_text(&porcelain), "porcelain project.status text")?; + assert!(porcelain_text.contains("project_root:")); + assert!(!porcelain_text.contains("\"project_root\":")); + + let json_render = harness.call_tool(23, "project.status", json!({"render": "json"}))?; + let json_text = must_some(tool_text(&json_render), "json project.status text")?; + assert!(json_text.contains("\"project_root\":")); + assert!(json_text.trim_start().starts_with('{')); + Ok(()) +} + +#[test] fn safe_request_retries_after_worker_crash() -> TestResult { let project_root = temp_project_root("crash_retry")?; init_project(&project_root)?; |