algohub-server 0.1.18

Extremely fast async online judge backend based on Rust
Documentation
mod utils;

use algohub_server::models::{
    account::Register,
    category::{Category, CategoryData, CreateCategory, ListCategories},
    response::{Empty, Response},
    OwnedCredentials, OwnedId, Token, UserRecordId,
};
use anyhow::Result;
use rocket::local::asynchronous::Client;
use utils::rocket;

#[rocket::async_test]
async fn test_category() -> Result<()> {
    let rocket = rocket().await;
    let client = Client::tracked(rocket).await?;

    println!("Testing category...");
    let response = client
        .post("/account/create")
        .json(&Register {
            username: "fu050409".to_string(),
            password: "password".to_string(),
            email: "email@example.com".to_string(),
        })
        .dispatch()
        .await;

    assert_eq!(response.status().code, 200);

    let Response {
        success,
        message: _,
        data,
    } = response.into_json().await.unwrap();
    let data: OwnedCredentials = data.unwrap();

    let id = data.id.clone();
    let token = data.token.clone();

    assert!(success);

    let mut new_category_ids: Vec<String> = Vec::new();

    for i in 0..10 {
        let response = client
            .post("/category/create")
            .json(&CreateCategory {
                id: &id,
                token: &token,
                data: CategoryData {
                    name: &format!("test_category_{}", i),
                    owner: UserRecordId {
                        tb: "account".to_string(),
                        id: id.clone(),
                    },
                },
            })
            .dispatch()
            .await;

        assert_eq!(response.status().code, 200);

        let Response {
            success,
            message: _,
            data,
        } = response.into_json().await.unwrap();
        let data: OwnedId = data.unwrap();

        assert!(success);
        println!("Created category: {}", data.id);
        new_category_ids.push(data.id);
    }

    let response = client
        .post("/category/list")
        .json(&ListCategories {
            owner: UserRecordId {
                tb: "account".to_string(),
                id: id.clone(),
            },
        })
        .dispatch()
        .await;

    assert_eq!(response.status().code, 200);

    let Response {
        success,
        message: _,
        data,
    } = response.into_json().await.unwrap();
    let data: Vec<Category> = data.unwrap();

    assert!(success);
    println!("Listed categories: {:#?}", data);

    for new_category_id in new_category_ids.iter().take(10) {
        let response = client
            .post(format!("/category/delete/{}", new_category_id))
            .json(&CreateCategory {
                id: &id,
                token: &token,
                data: CategoryData {
                    name: "test_category",
                    owner: UserRecordId {
                        tb: "account".to_string(),
                        id: id.clone(),
                    },
                },
            })
            .dispatch()
            .await;

        response.into_json::<Response<Empty>>().await.unwrap();
    }

    client
        .post(format!("/account/delete/{}", id))
        .json(&Token { token: &token })
        .dispatch()
        .await
        .into_json::<Response<Empty>>()
        .await
        .unwrap();
    Ok(())
}