#[allow(dead_code)]
use allframe_macros::api_handler;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
struct CreateUserRequest {
name: String,
email: String,
}
#[derive(Debug, Serialize, Deserialize)]
struct CreateUserResponse {
id: i32,
name: String,
email: String,
}
#[test]
fn test_api_handler_basic() {
#[api_handler(path = "/users", method = "POST", description = "Create a new user")]
async fn create_user(req: CreateUserRequest) -> CreateUserResponse {
CreateUserResponse {
id: 1,
name: req.name,
email: req.email,
}
}
let schema = create_user_openapi_schema();
assert!(schema.contains("/users"));
assert!(schema.contains("POST") || schema.contains("post"));
assert!(schema.contains("Create a new user"));
assert!(schema.contains("CreateUserRequest") || schema.contains("requestBody"));
assert!(schema.contains("CreateUserResponse") || schema.contains("responses"));
}
#[test]
fn test_api_handler_with_query() {
#[derive(Debug, Serialize, Deserialize)]
struct ListUsersQuery {
page: Option<i32>,
limit: Option<i32>,
}
#[derive(Debug, Serialize, Deserialize)]
struct User {
id: i32,
name: String,
}
#[api_handler(
path = "/users",
method = "GET",
description = "List all users with pagination"
)]
async fn list_users(query: ListUsersQuery) -> Vec<User> {
let _page = query.page.unwrap_or(1);
let _limit = query.limit.unwrap_or(10);
vec![
User {
id: 1,
name: "Alice".to_string(),
},
User {
id: 2,
name: "Bob".to_string(),
},
]
}
let schema = list_users_openapi_schema();
assert!(schema.contains("page") || schema.contains("parameters"));
assert!(schema.contains("limit"));
}
#[test]
fn test_api_handler_with_path_params() {
#[derive(Debug, Serialize, Deserialize)]
struct UserResponse {
id: i32,
name: String,
}
#[api_handler(path = "/users/{id}", method = "GET", description = "Get user by ID")]
async fn get_user(id: i32) -> Option<UserResponse> {
if id == 1 {
Some(UserResponse {
id,
name: "Test User".to_string(),
})
} else {
None
}
}
let schema = get_user_openapi_schema();
assert!(schema.contains("{id}") || schema.contains("parameters"));
assert!(schema.contains("id"));
}
#[test]
fn test_api_handler_with_error_responses() {
#[derive(Debug, Serialize, Deserialize)]
struct SuccessResponse {
message: String,
}
#[derive(Debug, Serialize, Deserialize)]
struct ErrorResponse {
error: String,
}
#[api_handler(
path = "/validate",
method = "POST",
description = "Validate data",
responses = {
200: SuccessResponse,
400: ErrorResponse,
}
)]
async fn validate_data(data: String) -> Result<SuccessResponse, ErrorResponse> {
if data.is_empty() {
Err(ErrorResponse {
error: "Data cannot be empty".to_string(),
})
} else {
Ok(SuccessResponse {
message: "Valid".to_string(),
})
}
}
let schema = validate_data_openapi_schema();
assert!(schema.contains("200"));
assert!(schema.contains("400"));
assert!(schema.contains("SuccessResponse") || schema.contains("responses"));
assert!(schema.contains("ErrorResponse") || schema.contains("error"));
}
#[test]
fn test_api_handler_valid_json_schema() {
#[api_handler(
path = "/health",
method = "GET",
description = "Health check endpoint"
)]
async fn health_check() -> String {
"OK".to_string()
}
let schema = health_check_openapi_schema();
let parsed: serde_json::Value =
serde_json::from_str(&schema).expect("Schema should be valid JSON");
assert!(parsed.is_object());
}
#[test]
fn test_api_handler_with_validation() {
#[derive(Debug, Serialize, Deserialize)]
struct ValidatedRequest {
#[serde(default)]
email: String,
}
#[api_handler(
path = "/register",
method = "POST",
description = "Register user with email validation",
validate = true
)]
async fn register_user(req: ValidatedRequest) -> String {
format!("Registered: {}", req.email)
}
let schema = register_user_openapi_schema();
assert!(schema.contains("email"));
}
#[test]
fn test_openapi_schema_aggregation() {
#[api_handler(path = "/users", method = "GET")]
async fn get_users() -> Vec<String> {
vec![]
}
#[api_handler(path = "/posts", method = "GET")]
async fn get_posts() -> Vec<String> {
vec![]
}
let schema_1 = get_users_openapi_schema();
let schema_2 = get_posts_openapi_schema();
assert!(schema_1.contains("/users"));
assert!(schema_2.contains("/posts"));
}