camber 0.1.6

Opinionated async Rust for IO-bound services on top of Tokio
Documentation
mod common;

use camber::http::{self, Request, Response, Router};
use camber::runtime;

#[test]
fn form_extracts_field_from_post_body() {
    common::test_runtime()
        .run(|| {
            let mut router = Router::new();
            router.post("/login", |req: &Request| {
                let username = req.form("username").unwrap_or("none").to_owned();
                async move { Response::text(200, &username) }
            });

            let addr = common::spawn_server(router);
            let resp = common::block_on(http::post_form(
                &format!("http://{addr}/login"),
                "username=alice&password=secret",
            ))
            .unwrap();

            assert_eq!(resp.status(), 200);
            assert_eq!(resp.body(), "alice");

            runtime::request_shutdown();
        })
        .unwrap();
}

#[test]
fn form_returns_none_when_missing() {
    common::test_runtime()
        .run(|| {
            let mut router = Router::new();
            router.post("/login", |req: &Request| {
                let missing = req.form("missing").unwrap_or("none").to_owned();
                async move { Response::text(200, &missing) }
            });

            let addr = common::spawn_server(router);
            let resp = common::block_on(http::post_form(
                &format!("http://{addr}/login"),
                "username=alice",
            ))
            .unwrap();

            assert_eq!(resp.status(), 200);
            assert_eq!(resp.body(), "none");

            runtime::request_shutdown();
        })
        .unwrap();
}

#[test]
fn form_decodes_percent_encoding() {
    common::test_runtime()
        .run(|| {
            let mut router = Router::new();
            router.post("/submit", |req: &Request| {
                let message = req.form("message").unwrap_or("none").to_owned();
                async move { Response::text(200, &message) }
            });

            let addr = common::spawn_server(router);
            let resp = common::block_on(http::post_form(
                &format!("http://{addr}/submit"),
                "message=hello%20world%21",
            ))
            .unwrap();

            assert_eq!(resp.status(), 200);
            assert_eq!(resp.body(), "hello world!");

            runtime::request_shutdown();
        })
        .unwrap();
}