diff --git a/examples/manual_routes/Cargo.toml b/examples/manual_routes/Cargo.toml index af75e891..3b20079f 100644 --- a/examples/manual_routes/Cargo.toml +++ b/examples/manual_routes/Cargo.toml @@ -5,3 +5,6 @@ workspace = "../../" [dependencies] rocket = { path = "../../lib" } + +[dev-dependencies] +rocket = { path = "../../lib", features = ["testing"] } diff --git a/examples/manual_routes/src/main.rs b/examples/manual_routes/src/main.rs index c95c7e90..1e23f3f7 100644 --- a/examples/manual_routes/src/main.rs +++ b/examples/manual_routes/src/main.rs @@ -1,5 +1,8 @@ extern crate rocket; +#[cfg(test)] +mod tests; + use std::io; use std::fs::File; @@ -7,6 +10,7 @@ use rocket::{Request, Route, Data, Catcher, Error}; use rocket::http::Status; use rocket::request::FromParam; use rocket::response::{self, Responder}; +use rocket::response::status::Custom; use rocket::handler::Outcome; use rocket::http::Method::*; @@ -23,7 +27,10 @@ fn name<'a>(req: &'a Request, _: Data) -> Outcome<'a> { } fn echo_url(req: &Request, _: Data) -> Outcome<'static> { - let param = req.uri().as_str().split_at(6).1; + let param = req.uri() + .as_str() + .split_at(6) + .1; Outcome::of(String::from_param(param).unwrap()) } @@ -52,10 +59,10 @@ fn get_upload(_: &Request, _: Data) -> Outcome<'static> { } fn not_found_handler<'r>(_: Error, req: &'r Request) -> response::Result<'r> { - format!("Couldn't find: {}", req.uri()).respond() + Custom(Status::NotFound, format!("Couldn't find: {}", req.uri())).respond() } -fn main() { +fn rocket() -> rocket::Rocket { let always_forward = Route::ranked(1, Get, "/", forward); let hello = Route::ranked(2, Get, "/", hi); @@ -72,5 +79,8 @@ fn main() { .mount("/hello", vec![name.clone()]) .mount("/hi", vec![name]) .catch(vec![not_found_catcher]) - .launch(); +} + +fn main() { + rocket().launch(); } diff --git a/examples/manual_routes/src/tests.rs b/examples/manual_routes/src/tests.rs new file mode 100644 index 00000000..859e050d --- /dev/null +++ b/examples/manual_routes/src/tests.rs @@ -0,0 +1,63 @@ +use super::*; +use rocket::testing::MockRequest; +use rocket::http::{ContentType, Status}; +use rocket::http::Method::*; + +fn test(uri: &str, content_type: ContentType, status: Status, body: String) { + let rocket = rocket(); + let mut request = MockRequest::new(Get, uri).header(content_type); + let mut response = request.dispatch_with(&rocket); + + assert_eq!(response.status(), status); + assert_eq!(response.body().and_then(|b| b.into_string()), Some(body)); +} + +#[test] +fn test_forward() { + test("/", ContentType::Plain, Status::Ok, "Hello!".to_string()); +} + +#[test] +fn test_name() { + for &name in &[("John"), ("Mike"), ("Angela")] { + let uri = format!("/hello/{}", name); + test(&uri, ContentType::Plain, Status::Ok, name.to_string()); + } +} + +#[test] +fn test_echo() { + let echo = "echo text"; + let uri = format!("/echo:echo text"); + test(&uri, ContentType::Plain, Status::Ok, echo.to_string()); +} + +#[test] +fn test_upload() { + let expected_body = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, \ + sed do eiusmod tempor incididunt ut labore et dolore \ + magna aliqua"; + let rocket = rocket(); + let mut request = MockRequest::new(Post, "/upload") + .header(ContentType::Plain) + .body(expected_body); + let response = request.dispatch_with(&rocket); + + assert_eq!(response.status(), Status::Ok); + + let mut request = MockRequest::new(Get, "/upload"); + let mut response = request.dispatch_with(&rocket); + + let expected = expected_body.to_string(); + assert_eq!(response.status(), Status::Ok); + assert_eq!(response.body().and_then(|b| b.into_string()), Some(expected)); +} + +#[test] +fn test_not_found() { + let uri = "/wrong_address"; + test(uri, + ContentType::Plain, + Status::NotFound, + format!("Couldn't find: {}", uri)); +}