use allframe_core::router::{ProtocolAdapter, RestAdapter, RestResponse, Router};
#[tokio::test]
async fn test_rest_get_request() {
let mut router = Router::new();
router.register("get_user", || async move { "User 42".to_string() });
let mut adapter = RestAdapter::new();
adapter.route("GET", "/users/:id", "get_user");
assert_eq!(adapter.name(), "rest");
let request = adapter.build_request("GET", "/users/42", None, None);
assert_eq!(request.method, "GET");
assert_eq!(request.path, "/users/42");
let response = adapter.handle("GET /users/42").await.unwrap();
assert!(response.contains("HTTP 200") || response.contains("get_user"));
}
#[tokio::test]
async fn test_rest_post_with_body() {
let mut router = Router::new();
router.register(
"create_user",
|| async move { "Created user: John".to_string() },
);
let adapter = RestAdapter::new();
let request = adapter.build_request(
"POST",
"/users",
Some(r#"{"name": "John", "email": "john@example.com"}"#),
None,
);
assert_eq!(request.method, "POST");
assert_eq!(request.path, "/users");
let response = adapter.handle("create_user").await;
assert!(response.is_ok());
}
#[tokio::test]
async fn test_rest_query_parameters() {
let mut router = Router::new();
router.register("search_users", || async move {
"Search: john (limit: 10)".to_string()
});
let adapter = RestAdapter::new();
let request = adapter.build_request("GET", "/users/search?query=john&limit=10", None, None);
assert_eq!(request.method, "GET");
assert!(request.path.contains("query=john"));
assert!(request.path.contains("limit=10"));
let result = router.execute("search_users").await.unwrap();
assert!(result.contains("Search: john"));
assert!(result.contains("limit: 10"));
}
#[tokio::test]
async fn test_rest_error_handling() {
let router = Router::new();
let adapter = RestAdapter::new();
let result = adapter.handle("invalid request").await;
assert!(result.is_ok());
let error = router.execute("nonexistent").await;
assert!(error.is_err());
assert!(error.unwrap_err().contains("not found"));
}
#[tokio::test]
async fn test_rest_route_matching() {
let mut router = Router::new();
router.register("get_user", || async move { "User 42".to_string() });
router.register("create_user", || async move { "Created: John".to_string() });
let adapter = RestAdapter::new();
let get_request = adapter.build_request("GET", "/users/42", None, None);
assert_eq!(get_request.method, "GET");
let get_result = router.execute("get_user").await.unwrap();
assert_eq!(get_result, "User 42");
let post_request = adapter.build_request("POST", "/users", Some(r#""John""#), None);
assert_eq!(post_request.method, "POST");
let post_result = router.execute("create_user").await.unwrap();
assert!(post_result.contains("Created"));
let response = RestResponse::new(200, "OK".to_string());
assert_eq!(response.status(), 200);
assert_eq!(response.body(), "OK");
}