use std::{future::Future, pin::Pin};
use allframe_core::router::{ProtocolAdapter, Router};
#[tokio::test]
async fn test_register_handler() {
let mut router = Router::new();
router.register("get_user", || async move { "User 42".to_string() });
assert_eq!(router.handlers_count(), 1);
}
#[tokio::test]
async fn test_execute_handler() {
let mut router = Router::new();
router.register("get_user", || async move { "User 42".to_string() });
let result = router.execute("get_user").await.unwrap();
assert_eq!(result, "User 42");
}
#[tokio::test]
async fn test_handler_with_result() {
let mut router = Router::new();
router.register("get_user_ok", || async move { "User 42".to_string() });
let result = router.execute("get_user_ok").await;
assert!(result.is_ok());
let error = router.execute("nonexistent").await;
assert!(error.is_err());
}
#[tokio::test]
async fn test_multiple_handler_signatures() {
let mut router = Router::new();
router.register("get_user", || async move { "User 42".to_string() });
router.register("list_users", || async move { "All users".to_string() });
router.register("update_user", || async move { "Updated user".to_string() });
assert_eq!(router.handlers_count(), 3);
}
#[tokio::test]
async fn test_register_protocol_adapter() {
struct RestAdapter;
impl ProtocolAdapter for RestAdapter {
fn name(&self) -> &str {
"rest"
}
fn handle(
&self,
_request: &str,
) -> Pin<Box<dyn Future<Output = Result<String, String>> + Send + '_>> {
Box::pin(async move { Ok("REST response".to_string()) })
}
}
let mut router = Router::new();
router.add_adapter(Box::new(RestAdapter));
assert!(router.has_adapter("rest"));
assert!(!router.has_adapter("graphql"));
}