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 })
}

#[get("/validated-hello?<params..>")]
fn validated_hello(params: Validated<HelloData>) -> Json<HelloData> {
    Json(params.into_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.get("/validated-hello?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.get("/validated-hello?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.get("/validated-hello?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.get("/validated-hello?name=Chris&age=102");

    let response: LocalResponse = req.dispatch();

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