swarm repositories / source
aboutsummaryrefslogtreecommitdiff
path: root/crates/fidget-spinner-cli/tests/mcp_hardening.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/fidget-spinner-cli/tests/mcp_hardening.rs')
-rw-r--r--crates/fidget-spinner-cli/tests/mcp_hardening.rs31
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)?;