use mcp_gmailcal::{
GmailServer,
errors::{GmailApiError, ConfigError},
utils::parse_max_results,
};
use serde_json::json;
use std::env;
use std::sync::Once;
static INIT: Once = Once::new();
fn setup() {
INIT.call_once(|| {
env::set_var("GMAIL_CLIENT_ID", "test_client_id");
env::set_var("GMAIL_CLIENT_SECRET", "test_client_secret");
env::set_var("GMAIL_REFRESH_TOKEN", "test_refresh_token");
env::set_var("GMAIL_ACCESS_TOKEN", "test_access_token");
env::set_var("GMAIL_REDIRECT_URI", "test_redirect_uri");
});
}
#[cfg(test)]
mod server_tests {
use super::*;
#[test]
fn test_server_creation() {
setup();
let _server = GmailServer::new();
let _default_server = GmailServer::default();
}
#[test]
fn test_command_parsing() {
let params = json!({
"max_results": 5
});
assert_eq!(
parse_max_results(Some(params["max_results"].clone()), 10),
5
);
let params = json!({
"max_results": "5"
});
assert_eq!(
parse_max_results(Some(params["max_results"].clone()), 10),
5
);
let params = json!({
"max_results": "not a number"
});
assert_eq!(
parse_max_results(Some(params["max_results"].clone()), 10),
10
);
let params = json!({
"max_results": null
});
assert_eq!(
parse_max_results(Some(params["max_results"].clone()), 10),
10
);
let params = json!({
"max_results": true
});
assert_eq!(
parse_max_results(Some(params["max_results"].clone()), 10),
10
);
let params = json!({
"max_results": [1, 2, 3]
});
assert_eq!(
parse_max_results(Some(params["max_results"].clone()), 10),
10
);
let params = json!({
"max_results": {"value": 5}
});
assert_eq!(
parse_max_results(Some(params["max_results"].clone()), 10),
10
);
assert_eq!(
parse_max_results(None, 10),
10
);
}
#[test]
fn test_error_formatting() {
let missing_var_error = ConfigError::MissingEnvVar("TEST_VAR".to_string());
let error_string = format!("{}", missing_var_error);
assert!(error_string.contains("Missing environment variable"));
assert!(error_string.contains("TEST_VAR"));
let env_error = ConfigError::EnvError(env::VarError::NotPresent);
let error_string = format!("{}", env_error);
assert!(error_string.contains("Environment error"));
let gmail_errors = [
(GmailApiError::ApiError("API error".to_string()), "Gmail API error"),
(GmailApiError::AuthError("Auth error".to_string()), "Authentication error"),
(GmailApiError::MessageRetrievalError("Not found".to_string()), "Message retrieval error"),
(GmailApiError::MessageFormatError("Invalid format".to_string()), "Message format error"),
(GmailApiError::NetworkError("Connection error".to_string()), "Network error"),
(GmailApiError::RateLimitError("Too many requests".to_string()), "Rate limit error"),
];
for (error, expected_text) in gmail_errors {
let error_string = format!("{}", error);
assert!(
error_string.contains(expected_text),
"Error '{}' should contain '{}'",
error_string, expected_text
);
}
}
#[test]
fn test_error_debug() {
let missing_var_error = ConfigError::MissingEnvVar("TEST_VAR".to_string());
let debug_string = format!("{:?}", missing_var_error);
assert!(debug_string.contains("MissingEnvVar"));
assert!(debug_string.contains("TEST_VAR"));
let env_error = ConfigError::EnvError(env::VarError::NotPresent);
let debug_string = format!("{:?}", env_error);
assert!(debug_string.contains("EnvError"));
assert!(debug_string.contains("NotPresent"));
let gmail_errors = [
(GmailApiError::ApiError("API error".to_string()), "ApiError"),
(GmailApiError::AuthError("Auth error".to_string()), "AuthError"),
(GmailApiError::MessageRetrievalError("Not found".to_string()), "MessageRetrievalError"),
(GmailApiError::MessageFormatError("Invalid format".to_string()), "MessageFormatError"),
(GmailApiError::NetworkError("Connection error".to_string()), "NetworkError"),
(GmailApiError::RateLimitError("Too many requests".to_string()), "RateLimitError"),
];
for (error, expected_text) in gmail_errors {
let debug_string = format!("{:?}", error);
assert!(
debug_string.contains(expected_text),
"Debug of '{}' should contain '{}'",
debug_string, expected_text
);
}
}
#[test]
fn test_parse_max_results_edge_cases() {
assert_eq!(parse_max_results(Some(json!(0)), 10), 0);
assert_eq!(parse_max_results(Some(json!(-1)), 10), 10);
assert_eq!(parse_max_results(Some(json!(u32::MAX)), 10), u32::MAX);
let large_number = (u32::MAX as u64) + 1;
assert_eq!(parse_max_results(Some(json!(large_number)), 10), 10);
assert_eq!(parse_max_results(Some(json!("4294967295")), 10), u32::MAX);
assert_eq!(parse_max_results(Some(json!("")), 10), 10);
}
}