doido-controller 0.0.10

Action Controller + routing + Tower middleware for Doido: handlers, Context, responses, filters, routes! DSL, sessions, and middleware stacks.
Documentation
use doido_controller::params::Params;
use serde::Deserialize;
use serde_json::json;

#[derive(Debug, Deserialize, PartialEq)]
struct PostForm {
    title: String,
    body: String,
}

#[test]
fn require_returns_nested_params() {
    let p = Params::new(json!({"post": {"title": "Hi", "body": "x"}}));
    let post = p.require("post").expect("post key present");
    assert_eq!(post.get("title").unwrap(), "Hi");
}

#[test]
fn require_missing_key_is_error() {
    let p = Params::new(json!({"other": {}}));
    assert!(p.require("post").is_err());
}

#[test]
fn permit_drops_unlisted_keys() {
    let p = Params::new(json!({"post": {"title": "Hi", "body": "x", "admin": true}}));
    let permitted = p.require("post").unwrap().permit(&["title", "body"]);
    assert!(
        permitted.get("admin").is_none(),
        "mass-assignment key filtered out"
    );
    assert_eq!(permitted.get("title").unwrap(), "Hi");
    assert_eq!(permitted.get("body").unwrap(), "x");
}

#[test]
fn permitted_params_deserialize_into_a_struct() {
    let p = Params::new(json!({"post": {"title": "Hi", "body": "x", "admin": true}}));
    let form: PostForm = p
        .require("post")
        .unwrap()
        .permit(&["title", "body"])
        .deserialize()
        .unwrap();
    assert_eq!(
        form,
        PostForm {
            title: "Hi".into(),
            body: "x".into()
        }
    );
}