anycms-core 0.4.0

A unified API response library supporting multiple Rust web frameworks
Documentation
use anycms_core::{ApiResult, ResponseData, ResultPagination};
use serde::Serialize;
use serde_json::json;

#[derive(Debug, Serialize, PartialEq)]
struct User {
    id: u32,
    name: String,
}

#[test]
fn test_single_value_serialization() {
    let user = User {
        id: 1,
        name: "Alice".to_string(),
    };

    let result: ApiResult<User> = ApiResult::value(user);

    let json = serde_json::to_value(&result).unwrap();
    let expected = json!({
        "success": true,
        "data": {
            "id": 1,
            "name": "Alice"
        }
    });

    assert_eq!(json, expected);
}

#[test]
fn test_list_serialization() {
    let users = vec![
        User {
            id: 1,
            name: "Alice".to_string(),
        },
        User {
            id: 2,
            name: "Bob".to_string(),
        },
    ];

    let pagination = ResultPagination::new(100, 1, 10);
    let result: ApiResult<User> = ApiResult::list(users).with_pagination(pagination);

    let json = serde_json::to_value(&result).unwrap();
    let expected = json!({
        "success": true,
        "data": [
            { "id": 1, "name": "Alice" },
            { "id": 2, "name": "Bob" }
        ],
        "pagination": {
            "total": 100,
            "page": 1,
            "pageSize": 10,
            "currentPage": 1
        }
    });

    assert_eq!(json, expected);
}

#[test]
fn test_empty_success() {
    let result: ApiResult<()> = ApiResult::ok();

    let json = serde_json::to_value(&result).unwrap();
    let expected = json!({
        "success": true
    });

    assert_eq!(json, expected);
}

#[test]
fn test_error_response() {
    let result: ApiResult<User> = ApiResult::failure("User not found").with_code(404);

    let json = serde_json::to_value(&result).unwrap();
    let expected = json!({
        "success": false,
        "message": "User not found",
        "code": 404
    });

    assert_eq!(json, expected);
}

#[test]
fn test_response_data_single() {
    let user = User {
        id: 1,
        name: "Alice".to_string(),
    };

    let data = ResponseData::single(user);
    let json = serde_json::to_value(&data).unwrap();

    let expected = json!({
        "id": 1,
        "name": "Alice"
    });

    assert_eq!(json, expected);
    assert!(data.is_single());
    assert!(!data.is_multiple());
}

#[test]
fn test_response_data_multiple() {
    let users = vec![
        User {
            id: 1,
            name: "Alice".to_string(),
        },
        User {
            id: 2,
            name: "Bob".to_string(),
        },
    ];

    let data = ResponseData::multiple(users);
    let json = serde_json::to_value(&data).unwrap();

    let expected = json!([
        { "id": 1, "name": "Alice" },
        { "id": 2, "name": "Bob" }
    ]);

    assert_eq!(json, expected);
    assert!(!data.is_single());
    assert!(data.is_multiple());
}

#[test]
fn test_with_extra() {
    let user = User {
        id: 1,
        name: "Alice".to_string(),
    };

    let result: ApiResult<User> = ApiResult::value(user)
        .with_extra("timestamp", serde_json::json!(1234567890))
        .with_extra("version", serde_json::json!("1.0.0"));

    let json = serde_json::to_value(&result).unwrap();
    let expected = json!({
        "success": true,
        "data": {
            "id": 1,
            "name": "Alice"
        },
        "extra": {
            "timestamp": 1234567890,
            "version": "1.0.0"
        }
    });

    assert_eq!(json, expected);
}