swarm repositories / source
aboutsummaryrefslogtreecommitdiff
path: root/crates/fidget-spinner-cli/tests
diff options
context:
space:
mode:
authormain <main@swarm.moe>2026-03-19 11:19:42 -0400
committermain <main@swarm.moe>2026-03-19 11:19:42 -0400
commiteb6b1af642f5829d5dc08aa61138d893b91b60b2 (patch)
tree0f1f5a81424f2a98ea08a8743995303769763e32 /crates/fidget-spinner-cli/tests
parent7b9bd8b42883f82b090718175b8316296ef18236 (diff)
downloadfidget_spinner-eb6b1af642f5829d5dc08aa61138d893b91b60b2.zip
Retrofit MCP host onto libmcp
Diffstat (limited to 'crates/fidget-spinner-cli/tests')
-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)?;