use allframe_core::router::{GrpcAdapter, GrpcStatus, ProtocolAdapter, Router};
#[tokio::test]
async fn test_grpc_unary_call() {
let mut router = Router::new();
router.register("GetUser", || async move {
r#"{"id": 42, "name": "John Doe", "email": "john@example.com"}"#.to_string()
});
let mut adapter = GrpcAdapter::new();
adapter.unary("UserService", "GetUser", "GetUser");
assert_eq!(adapter.name(), "grpc");
let request = adapter.build_request("GetUser", r#"{"id": 42}"#);
assert_eq!(request.method, "GetUser");
assert_eq!(request.payload, r#"{"id": 42}"#);
let response = adapter.handle("GetUser:{}").await.unwrap();
assert!(!response.is_empty());
}
#[tokio::test]
async fn test_grpc_proto_generation() {
let mut router = Router::new();
router.register("GetUser", || async move {
r#"{"id": 42, "name": "John Doe"}"#.to_string()
});
router.register("ListUsers", || async move { "[]".to_string() });
let mut adapter = GrpcAdapter::new();
adapter.unary("UserService", "GetUser", "GetUser");
adapter.unary("UserService", "ListUsers", "ListUsers");
let proto = adapter.generate_proto();
assert!(proto.contains("service UserService"));
assert!(proto.contains("rpc GetUser"));
assert!(proto.contains("rpc ListUsers"));
assert!(proto.contains("syntax = \"proto3\""));
}
#[tokio::test]
async fn test_grpc_message_types() {
let mut router = Router::new();
router.register("GetUser", || async move {
r#"{"id": 42, "name": "John Doe", "email": "john@example.com"}"#.to_string()
});
let mut adapter = GrpcAdapter::new();
adapter.unary("UserService", "GetUser", "GetUser");
let response = adapter.handle("GetUser:{\"id\": 42}").await.unwrap();
assert!(!response.is_empty());
}
#[tokio::test]
async fn test_grpc_error_status() {
let adapter = GrpcAdapter::new();
let response = adapter.handle("UnknownMethod:{}").await.unwrap();
assert!(response.contains("grpc-status"));
assert_eq!(GrpcStatus::Ok.code_name(), "OK");
assert_eq!(GrpcStatus::InvalidArgument.code_name(), "INVALID_ARGUMENT");
assert_eq!(GrpcStatus::NotFound.code_name(), "NOT_FOUND");
assert_eq!(GrpcStatus::Unimplemented.code_name(), "UNIMPLEMENTED");
assert_eq!(GrpcStatus::Internal.code_name(), "INTERNAL");
}
#[tokio::test]
async fn test_grpc_service_registration() {
let mut router = Router::new();
router.register("GetUser", || async move {
r#"{"id": 42, "name": "John"}"#.to_string()
});
router.register("ListUsers", || async move { "[]".to_string() });
router.register("DeleteUser", || async move {
r#"{"deleted": true}"#.to_string()
});
let mut adapter = GrpcAdapter::new();
adapter.unary("UserService", "GetUser", "GetUser");
adapter.unary("UserService", "ListUsers", "ListUsers");
adapter.unary("UserService", "DeleteUser", "DeleteUser");
let proto = adapter.generate_proto();
assert!(proto.contains("service UserService"));
assert!(proto.contains("rpc GetUser"));
assert!(proto.contains("rpc ListUsers"));
assert!(proto.contains("rpc DeleteUser"));
let get_response = adapter.handle("GetUser:{}").await.unwrap();
assert!(!get_response.is_empty());
let list_response = adapter.handle("ListUsers:{}").await.unwrap();
assert!(!list_response.is_empty());
let delete_response = adapter.handle("DeleteUser:{}").await.unwrap();
assert!(!delete_response.is_empty());
}