rocket-validation 0.2.0

Rocket Guards to support validation using validator
Documentation
#[macro_use]
extern crate rocket;

use rocket::{
    local::blocking::LocalResponse,
    serde::{json::Json, Deserialize, Serialize},
};
use rocket_validation::{Validate, Validated};

#[derive(Copy, Clone, Debug, Serialize, Deserialize, Validate, FromForm)]
#[serde(crate = "rocket::serde")]
struct HelloData<'a> {
    #[validate(length(min = 3))]
    name: &'a str,
    #[validate(range(min = 1, max = 100))]
    age: u8,
}

#[get("/hello?<name>&<age>")]
fn hello(name: &'_ str, age: u8) -> Json<HelloData> {
    Json(HelloData { name, age })
}

#[post("/hello", data = "<data>")]
fn validated_hello(data: Validated<Json<HelloData>>) -> Json<HelloData> {
    Json(data.into_deep_inner())
}

#[launch]
fn rocket() -> _ {
    rocket::build().mount("/", routes![hello, validated_hello])
}

use rocket::{
    http::{ContentType, Status},
    local::blocking::Client,
};

#[test]
pub fn valid_get() {
    let client = Client::tracked(rocket()).unwrap();

    let req = client.get("/hello?name=chris&age=17");

    let response: LocalResponse = req.dispatch();

    assert_eq!(response.status(), Status::Ok);
    assert_eq!(response.content_type(), Some(ContentType::JSON));
}

#[test]
pub fn valid_post() {
    let client = Client::tracked(rocket()).unwrap();

    let req = client.post("/hello").json(&HelloData {
        name: "Chris",
        age: 18,
    });

    let response: LocalResponse = req.dispatch();

    assert_eq!(response.status(), Status::Ok);
    assert_eq!(response.content_type(), Some(ContentType::JSON));
}

#[test]
pub fn invalid_short_name() {
    let client = Client::tracked(rocket()).unwrap();

    let req = client.post("/hello").json(&HelloData {
        name: "CH",
        age: 18,
    });

    let response: LocalResponse = req.dispatch();

    assert_eq!(response.status(), Status::UnprocessableEntity);
    assert_eq!(response.content_type(), Some(ContentType::HTML));
}

#[test]
pub fn invalid_min_age() {
    let client = Client::tracked(rocket()).unwrap();

    let req = client.post("/hello").json(&HelloData {
        name: "Chris",
        age: 0,
    });

    let response: LocalResponse = req.dispatch();

    assert_eq!(response.status(), Status::UnprocessableEntity);
    assert_eq!(response.content_type(), Some(ContentType::HTML));
}

#[test]
pub fn invalid_max_age() {
    let client = Client::tracked(rocket()).unwrap();

    let req = client.post("/hello").json(&HelloData {
        name: "Chris",
        age: 102,
    });

    let response: LocalResponse = req.dispatch();

    assert_eq!(response.status(), Status::UnprocessableEntity);
    assert_eq!(response.content_type(), Some(ContentType::HTML));
}

#[test]
pub fn invalid_request_catcher_response() {
    let rocket = rocket().register("/", catchers![rocket_validation::validation_catcher]);
    let client = Client::tracked(rocket).unwrap();

    let req = client.post("/hello").json(&HelloData {
        name: "Chris",
        age: 102,
    });

    let response: LocalResponse = req.dispatch();

    assert_eq!(response.status(), Status::UnprocessableEntity);
    assert_eq!(response.content_type(), Some(ContentType::JSON));
}