From 05a8a93eec30b9bacc79d42cbc4e595cad2eaab7 Mon Sep 17 00:00:00 2001 From: Sergio Benitez Date: Tue, 4 Jul 2017 14:51:41 -0700 Subject: [PATCH] Add tests for the 'session' example. Closes #316. --- examples/session/src/main.rs | 9 ++++- examples/session/src/tests.rs | 70 +++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 examples/session/src/tests.rs diff --git a/examples/session/src/main.rs b/examples/session/src/main.rs index fbb8b09c..da57043c 100644 --- a/examples/session/src/main.rs +++ b/examples/session/src/main.rs @@ -4,6 +4,8 @@ extern crate rocket_contrib; extern crate rocket; +#[cfg(test)] mod tests; + use std::collections::HashMap; use rocket::outcome::IntoOutcome; @@ -76,9 +78,12 @@ fn index() -> Redirect { Redirect::to("/login") } -fn main() { +fn rocket() -> rocket::Rocket { rocket::ignite() .attach(Template::fairing()) .mount("/", routes![index, user_index, login, logout, login_user, login_page]) - .launch(); +} + +fn main() { + rocket().launch(); } diff --git a/examples/session/src/tests.rs b/examples/session/src/tests.rs new file mode 100644 index 00000000..7530f1a0 --- /dev/null +++ b/examples/session/src/tests.rs @@ -0,0 +1,70 @@ +use super::rocket; +use rocket::Response; +use rocket::local::Client; +use rocket::http::{Status, Cookie, ContentType}; + +fn user_id_cookie(response: &Response) -> Option> { + let cookie = response.headers() + .get("Set-Cookie") + .filter(|v| v.starts_with("user_id")) + .nth(0) + .and_then(|val| Cookie::parse_encoded(val).ok()); + + cookie.map(|c| c.into_owned()) +} + +fn login(client: &Client, user: &str, pass: &str) -> Option> { + let response = client.post("/login") + .header(ContentType::Form) + .body(format!("username={}&password={}", user, pass)) + .dispatch(); + + user_id_cookie(&response) +} + +#[test] +fn redirect_on_index() { + let client = Client::new(rocket()).unwrap(); + let response = client.get("/").dispatch(); + assert_eq!(response.status(), Status::SeeOther); + assert_eq!(response.headers().get_one("Location"), Some("/login")); +} + +#[test] +fn can_login() { + let client = Client::new(rocket()).unwrap(); + + let mut response = client.get("/login").dispatch(); + let body = response.body_string().unwrap(); + assert_eq!(response.status(), Status::Ok); + assert!(body.contains("Please login to continue.")); +} + +#[test] +fn login_fails() { + let client = Client::new(rocket()).unwrap(); + assert!(login(&client, "Seergio", "password").is_none()); + assert!(login(&client, "Sergio", "idontknow").is_none()); +} + +#[test] +fn login_logout_succeeds() { + let client = Client::new(rocket()).unwrap(); + let login_cookie = login(&client, "Sergio", "password").expect("logged in"); + + // Ensure we're logged in. + let mut response = client.get("/").cookie(login_cookie.clone()).dispatch(); + let body = response.body_string().unwrap(); + assert_eq!(response.status(), Status::Ok); + assert!(body.contains("Logged in with user ID 1")); + + // One more. + let response = client.get("/login").cookie(login_cookie.clone()).dispatch(); + assert_eq!(response.status(), Status::SeeOther); + assert_eq!(response.headers().get_one("Location"), Some("/")); + + // Logout. + let response = client.post("/logout").cookie(login_cookie).dispatch(); + let cookie = user_id_cookie(&response).expect("logout cookie"); + assert!(cookie.value().is_empty()); +}