use mockforge_sdk::{Error, MockServer};
#[tokio::test]
async fn test_server_builder_creation() {
let server = MockServer::new();
let builder = server.port(44000).auto_port();
drop(builder);
}
#[tokio::test]
async fn test_port_in_use_error() {
let server1 = Box::pin(MockServer::new().port(33000).start())
.await
.expect("Failed to start first server");
let result = Box::pin(MockServer::new().port(33000).start()).await;
if result.is_err() {
let err_msg = format!("{:?}", result.unwrap_err());
assert!(!err_msg.is_empty());
}
Box::pin(server1.stop()).await.expect("Failed to stop server");
}
#[tokio::test]
async fn test_port_discovery_failed_error() {
let result = Box::pin(MockServer::new()
.auto_port()
.port_range(1, 10) .start())
.await;
if result.is_err() {
let err = result.unwrap_err();
let err_msg = format!("{err:?}");
assert!(
err_msg.contains("Port discovery failed") || err_msg.contains("port"),
"Error message: {err_msg}"
);
}
}
#[tokio::test]
async fn test_stub_not_found_error() {
let err = Error::stub_not_found(
"GET",
"/api/missing",
&["GET /api/users".to_string(), "POST /api/users".to_string()],
);
let err_msg = format!("{err}");
assert!(err_msg.contains("GET"));
assert!(err_msg.contains("/api/missing"));
assert!(err_msg.contains("GET /api/users"));
}
#[tokio::test]
async fn test_admin_api_error() {
let err = Error::admin_api_error("create_mock", "Invalid JSON", "/api/mocks");
let err_msg = format!("{err}");
assert!(err_msg.contains("create_mock"));
assert!(err_msg.contains("Invalid JSON"));
assert!(err_msg.contains("/api/mocks"));
}
#[tokio::test]
async fn test_error_messages_are_helpful() {
let errors = vec![
Error::ServerAlreadyStarted(3000),
Error::ServerNotStarted,
Error::PortInUse(8080),
Error::PortDiscoveryFailed("No ports available".to_string()),
Error::InvalidConfig("Missing field".to_string()),
Error::InvalidStub("Invalid method".to_string()),
Error::StartupTimeout { timeout_secs: 30 },
Error::ShutdownTimeout { timeout_secs: 10 },
];
for err in errors {
let msg = format!("{err}");
assert!(msg.len() > 20, "Error message too short: {msg}");
let lowercase_msg = msg.to_lowercase();
let has_actionable_info = lowercase_msg.contains("tip:")
|| lowercase_msg.contains("check")
|| lowercase_msg.contains("try")
|| lowercase_msg.contains("call")
|| lowercase_msg.contains("ensure");
assert!(has_actionable_info, "Error message lacks actionable advice: {msg}");
}
}