rama 0.2.0

modular service framework
Documentation
use super::utils;
use rama::{
    Context,
    http::{BodyExtractExt, StatusCode},
};

const ADDRESS: &str = "127.0.0.1:62018";

#[tokio::test]
#[ignore]
async fn test_http_web_router() {
    utils::init_tracing();

    let runner = utils::ExampleRunner::interactive("http_web_router", None);

    let req_uri = format!("http://{ADDRESS}");
    let response = runner.get(req_uri).send(Context::default()).await.unwrap();
    assert_eq!(response.status(), StatusCode::OK);
    let homepage = response.try_into_string().await.unwrap();
    assert!(homepage.contains("<h1>Rama - Web Router</h1>"));

    #[derive(serde::Deserialize)]
    struct Greet {
        method: String,
        message: String,
    }

    let req_uri = format!("http://{ADDRESS}/greet/world");
    let response = runner.post(req_uri).send(Context::default()).await.unwrap();
    assert_eq!(response.status(), StatusCode::OK);
    let json: Greet = response.try_into_json().await.unwrap();
    assert_eq!(json.message, "Hello, world!");
    assert_eq!(json.method, "POST");

    #[derive(serde::Deserialize)]
    struct Lang {
        message: String,
    }

    let test_cases = [
        ("en", "Welcome to our site!"),
        ("fr", "Bienvenue sur notre site!"),
        ("es", "¡Bienvenido a nuestro sitio!"),
        ("de", "Language not supported"),
    ];

    for (code, expected_message) in test_cases.iter() {
        let req_uri = format!("http://{ADDRESS}/lang/{}", code);
        let response = runner.get(req_uri).send(Context::default()).await.unwrap();
        assert_eq!(response.status(), StatusCode::OK);
        let json: Lang = response.try_into_json().await.unwrap();
        assert_eq!(json.message, *expected_message);
    }

    #[derive(serde::Deserialize)]
    struct ApiStatus {
        status: String,
    }

    let test_cases = [
        ("/api/v1/status", "API v1 is up and running"),
        ("/api/v2/status", "API v2 is up and running"),
    ];

    for (path, expected_status) in test_cases.iter() {
        let req_uri = format!("http://{ADDRESS}{}", path);
        let response = runner.get(req_uri).send(Context::default()).await.unwrap();
        assert_eq!(response.status(), StatusCode::OK);
        let json: ApiStatus = response.try_into_json().await.unwrap();
        assert_eq!(json.status, *expected_status);
    }
}