use fastmcp_server::{Router, Server, ServerBuilder};
use fastmcp_transport::memory::{MemoryTransport, create_memory_transport_pair};
pub struct TestServerBuilder {
name: String,
version: String,
request_timeout: Option<u64>,
}
impl Default for TestServerBuilder {
fn default() -> Self {
Self::new()
}
}
impl TestServerBuilder {
#[must_use]
pub fn new() -> Self {
Self {
name: "test-server".to_string(),
version: "1.0.0".to_string(),
request_timeout: None,
}
}
#[must_use]
pub fn with_name(mut self, name: impl Into<String>) -> Self {
self.name = name.into();
self
}
#[must_use]
pub fn with_version(mut self, version: impl Into<String>) -> Self {
self.version = version.into();
self
}
#[must_use]
pub fn with_request_timeout(mut self, secs: u64) -> Self {
self.request_timeout = Some(secs);
self
}
#[must_use]
pub fn build(self) -> (Router, MemoryTransport, MemoryTransport) {
let (client_transport, server_transport) = create_memory_transport_pair();
let router = Router::new();
(router, client_transport, server_transport)
}
#[must_use]
pub fn build_server_builder(self) -> (ServerBuilder, MemoryTransport, MemoryTransport) {
let (client_transport, server_transport) = create_memory_transport_pair();
let mut builder = Server::new(&self.name, &self.version);
if let Some(timeout) = self.request_timeout {
builder = builder.request_timeout(timeout);
}
(builder, client_transport, server_transport)
}
}
pub struct TestServer;
impl TestServer {
#[must_use]
pub fn builder() -> TestServerBuilder {
TestServerBuilder::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_builder_defaults() {
let builder = TestServerBuilder::new();
assert_eq!(builder.name, "test-server");
assert_eq!(builder.version, "1.0.0");
}
#[test]
fn test_builder_customization() {
let builder = TestServerBuilder::new()
.with_name("custom-server")
.with_version("2.0.0")
.with_request_timeout(30);
assert_eq!(builder.name, "custom-server");
assert_eq!(builder.version, "2.0.0");
assert_eq!(builder.request_timeout, Some(30));
}
#[test]
fn test_build_creates_transport_pair() {
let (router, client_transport, server_transport) = TestServer::builder().build();
assert!(!client_transport.is_closed());
assert!(!server_transport.is_closed());
assert!(router.tools().is_empty());
}
#[test]
fn default_trait_matches_new() {
let default_builder = TestServerBuilder::default();
let new_builder = TestServerBuilder::new();
assert_eq!(default_builder.name, new_builder.name);
assert_eq!(default_builder.version, new_builder.version);
assert_eq!(default_builder.request_timeout, new_builder.request_timeout);
}
#[test]
fn test_server_builder_convenience() {
let builder = TestServer::builder();
assert_eq!(builder.name, "test-server");
}
#[test]
fn build_server_builder_without_timeout() {
let (_builder, client, server) = TestServer::builder()
.with_name("sb-test")
.build_server_builder();
assert!(!client.is_closed());
assert!(!server.is_closed());
}
#[test]
fn build_server_builder_with_timeout() {
let (_builder, client, server) = TestServer::builder()
.with_request_timeout(60)
.build_server_builder();
assert!(!client.is_closed());
assert!(!server.is_closed());
}
#[test]
fn build_returns_independent_transports() {
let (_router, client, server) = TestServer::builder().build();
drop(client);
assert!(!server.is_closed());
}
}