use rocket::{catch, catchers, get, response::Redirect, routes, Build, Rocket}; use rocket_dyn_templates::{context, Template}; use sqlx::SqlitePool; use crate::model::user::User; mod admin; mod auth; #[get("/")] fn index(user: User) -> Template { Template::render("index", context! {loggedin_user: user}) } #[catch(401)] //unauthorized fn unauthorized_error() -> Redirect { Redirect::to("/auth") } pub fn start(db: SqlitePool) -> Rocket { rocket::build() .manage(db) .mount("/", routes![index]) .mount("/auth", auth::routes()) .mount("/admin", admin::routes()) .register("/", catchers![unauthorized_error]) .attach(Template::fairing()) } #[cfg(test)] mod test { use crate::testdb; use super::start; use rocket::http::Status; use rocket::local::asynchronous::Client; use rocket::uri; use sqlx::SqlitePool; #[sqlx::test] fn test_not_logged_in() { let pool = testdb!(); let client = Client::tracked(start(pool)) .await .expect("valid rocket instance"); let response = client.get(uri!(super::index)).dispatch().await; assert_eq!(response.status(), Status::SeeOther); let location = response.headers().get("Location").next().unwrap(); assert_eq!(location, "/auth"); } }