doido-controller 0.0.13

Action Controller + routing + Tower middleware for Doido: handlers, Context, responses, filters, routes! DSL, sessions, and middleware stacks.
Documentation
use axum::{routing::get, Router};
use doido_controller::config::Config;
use doido_controller::{MiddlewareStack, YamlConfig};
use http::{Request, StatusCode};
use tower::ServiceExt;

#[tokio::test]
async fn cors_enabled_from_config_sets_allow_origin() {
    let yaml = "middleware:\n  cors:\n    enabled: true\n    allowed_origins: [\"https://app.example\"]\n    allowed_methods: [\"GET\", \"POST\"]\n";
    let config = YamlConfig::from_yaml(yaml).unwrap();
    let stack = MiddlewareStack::new().with_cors_config(config.middleware().cors.clone());
    let app = stack.apply(Router::new().route("/", get(|| async { "ok" })));

    let req = Request::builder()
        .uri("/")
        .header("origin", "https://app.example")
        .body(axum::body::Body::empty())
        .unwrap();
    let resp = app.oneshot(req).await.unwrap();
    assert_eq!(resp.status(), StatusCode::OK);
    let allow = resp
        .headers()
        .get("access-control-allow-origin")
        .expect("configured CORS layer sets the allow-origin header");
    assert_eq!(allow, "https://app.example");
}

#[tokio::test]
async fn cors_disabled_by_default() {
    let config = YamlConfig::from_yaml("server:\n  bind: 0.0.0.0\n  port: 3000\n").unwrap();
    assert!(
        !config.middleware().cors.enabled,
        "CORS is opt-in: off unless configured"
    );
}