use anyhow::Result;
use pmat::models::template::{TemplateCategory, Toolchain};
use pmat::{
models::template::TemplateResource, ContentCache, MetadataCache,
PublicTemplateRenderer as TemplateRenderer, S3Client, TemplateServerTrait,
};
use std::sync::Arc;
struct MockTemplateServer {
renderer: TemplateRenderer,
}
#[async_trait::async_trait]
impl TemplateServerTrait for MockTemplateServer {
async fn get_template_metadata(&self, _uri: &str) -> Result<Arc<TemplateResource>> {
let resource = TemplateResource {
uri: "mock://template".to_string(),
name: "Mock Template".to_string(),
description: "Mock template for testing".to_string(),
toolchain: Toolchain::RustCli {
cargo_features: vec![],
},
category: TemplateCategory::Context,
parameters: vec![],
s3_object_key: "mock-key".to_string(),
content_hash: "abc123".to_string(),
semantic_version: semver::Version::new(1, 0, 0),
dependency_graph: vec![],
};
Ok(Arc::new(resource))
}
async fn get_template_content(&self, _s3_key: &str) -> Result<Arc<str>> {
Ok(Arc::from("Mock template content"))
}
async fn list_templates(&self, _prefix: &str) -> Result<Vec<Arc<TemplateResource>>> {
Ok(vec![])
}
fn get_renderer(&self) -> &TemplateRenderer {
&self.renderer
}
fn get_metadata_cache(&self) -> Option<&MetadataCache> {
None
}
fn get_content_cache(&self) -> Option<&ContentCache> {
None
}
fn get_s3_client(&self) -> Option<&S3Client> {
None
}
fn get_bucket_name(&self) -> Option<&str> {
None
}
}
#[tokio::test]
async fn test_run_mcp_server_structure() {
let renderer = TemplateRenderer::new().expect("Failed to create renderer");
let mock_server = Arc::new(MockTemplateServer { renderer });
let _metadata_future = mock_server.get_template_metadata("test");
let _content_future = mock_server.get_template_content("test");
let _list_future = mock_server.list_templates("test");
assert!(!std::ptr::addr_of!(*mock_server.get_renderer()).is_null());
assert!(mock_server.get_metadata_cache().is_none());
assert!(mock_server.get_content_cache().is_none());
assert!(mock_server.get_s3_client().is_none());
assert!(mock_server.get_bucket_name().is_none());
}
#[test]
fn test_run_mcp_server_error_patterns() {
let invalid_json = "{ invalid json }";
let parse_result = serde_json::from_str::<serde_json::Value>(invalid_json);
assert!(parse_result.is_err());
let response = serde_json::json!({
"jsonrpc": "2.0",
"id": null,
"error": {
"code": -32700,
"message": "Parse error"
}
});
let serialized = serde_json::to_string(&response);
assert!(serialized.is_ok());
}
#[test]
fn test_mcp_request_response_structure() {
let request_json = r#"{
"jsonrpc": "2.0",
"method": "test",
"id": 1,
"params": {}
}"#;
let parse_result = serde_json::from_str::<serde_json::Value>(request_json);
assert!(parse_result.is_ok());
let parsed = parse_result.unwrap();
assert_eq!(parsed["method"], "test");
assert_eq!(parsed["id"], 1);
}