From 31b2ed3b37be484d8bb35432b519103ce341dff3 Mon Sep 17 00:00:00 2001 From: philipp Date: Thu, 26 Oct 2023 18:50:43 +0200 Subject: [PATCH] deploy :O --- src/tera/boatdamage.rs | 4 - src/tera/log.rs | 1203 ++++++++++++++++++++-------------------- 2 files changed, 599 insertions(+), 608 deletions(-) diff --git a/src/tera/boatdamage.rs b/src/tera/boatdamage.rs index 696c320..89260cd 100644 --- a/src/tera/boatdamage.rs +++ b/src/tera/boatdamage.rs @@ -75,7 +75,6 @@ async fn create<'r>( data: Form>, user: NonGuestUser, ) -> Flash { - return Flash::error(Redirect::to("/log"), "Du musst noch kurz geduldig sein. Sobald wir unser Logbuch umgestellt haben, kannst du es hier im Ruderassistenten verwenden ;)"); let boatdamage_to_add = BoatDamageToAdd { boat_id: data.boat_id, desc: data.desc, @@ -105,7 +104,6 @@ async fn create_from_kiosk<'r>( data: Form>, _kiosk: KioskCookie, ) -> Flash { - return Flash::error(Redirect::to("/log"), "Du musst noch kurz geduldig sein. Sobald wir unser Logbuch umgestellt haben, kannst du es hier im Ruderassistenten verwenden ;)"); let boatdamage_to_add = BoatDamageToAdd { boat_id: data.boat_id, desc: data.desc, @@ -133,7 +131,6 @@ async fn fixed<'r>( boatdamage_id: i32, coxuser: CoxUser, ) -> Flash { - return Flash::error(Redirect::to("/log"), "Du musst noch kurz geduldig sein. Sobald wir unser Logbuch umgestellt haben, kannst du es hier im Ruderassistenten verwenden ;)"); let boatdamage = BoatDamage::find_by_id(db, boatdamage_id).await.unwrap(); //TODO: Fix let boatdamage_fixed = BoatDamageFixed { desc: data.desc, @@ -157,7 +154,6 @@ async fn verified<'r>( boatdamage_id: i32, techuser: TechUser, ) -> Flash { - return Flash::error(Redirect::to("/log"), "Du musst noch kurz geduldig sein. Sobald wir unser Logbuch umgestellt haben, kannst du es hier im Ruderassistenten verwenden ;)"); let boatdamage = BoatDamage::find_by_id(db, boatdamage_id).await.unwrap(); //TODO: Fix let boatdamage_verified = BoatDamageVerified { desc: data.desc, diff --git a/src/tera/log.rs b/src/tera/log.rs index e6b35ec..a9178a5 100644 --- a/src/tera/log.rs +++ b/src/tera/log.rs @@ -162,8 +162,6 @@ async fn create_logbook( data: Form, user: &NonGuestUser, ) -> Flash { - return Flash::error(Redirect::to("/log"), "Du musst noch kurz geduldig sein. Sobald wir unser Logbuch umgestellt haben, kannst du es hier im Ruderassistenten verwenden ;)"); - match Logbook::create( db, data.into_inner(), @@ -213,7 +211,6 @@ async fn home_logbook( logbook_id: i32, user: &NonGuestUser, ) -> Flash { - return Flash::error(Redirect::to("/log"), "Du musst noch kurz geduldig sein. Sobald wir unser Logbuch umgestellt haben, kannst du es hier im Ruderassistenten verwenden ;)"); let logbook: Option = Logbook::find_by_id(db, logbook_id).await; let Some(logbook) = logbook else { return Flash::error( @@ -266,7 +263,6 @@ async fn home( #[get("//delete", rank = 2)] async fn delete(db: &State, logbook_id: i32, user: User) -> Flash { - return Flash::error(Redirect::to("/log"), "Du musst noch kurz geduldig sein. Sobald wir unser Logbuch umgestellt haben, kannst du es hier im Ruderassistenten verwenden ;)"); let logbook = Logbook::find_by_id(db, logbook_id).await; if let Some(logbook) = logbook { match logbook.delete(db, &user).await { @@ -293,7 +289,6 @@ async fn delete_kiosk( logbook_id: i32, _kiosk: KioskCookie, ) -> Flash { - return Flash::error(Redirect::to("/log"), "Du musst noch kurz geduldig sein. Sobald wir unser Logbuch umgestellt haben, kannst du es hier im Ruderassistenten verwenden ;)"); let logbook = Logbook::find_by_id(db, logbook_id).await; if let Some(logbook) = logbook { let cox = User::find_by_id(db, logbook.shipmaster as i32) @@ -333,602 +328,602 @@ pub fn routes() -> Vec { ] } -//#[cfg(test)] -//mod test { -// use rocket::http::ContentType; -// use rocket::{http::Status, local::asynchronous::Client}; -// use sqlx::SqlitePool; -// -// use crate::model::logbook::Logbook; -// use crate::tera::{log::Boat, User}; -// use crate::testdb; -// -// #[sqlx::test] -// fn test_kiosk_cookie() { -// let db = testdb!(); -// -// let rocket = rocket::build().manage(db.clone()); -// let rocket = crate::tera::config(rocket); -// -// let client = Client::tracked(rocket).await.unwrap(); -// let req = client.get("/log"); -// let response = req.dispatch().await; -// -// assert_eq!(response.status(), Status::SeeOther); -// assert_eq!(response.headers().get("Location").next(), Some("/auth")); -// -// let req = client.get("/log/kiosk/ekrv2019/Linz"); -// let response = req.dispatch().await; -// -// assert_eq!(response.status(), Status::SeeOther); -// assert_eq!(response.headers().get("Location").next(), Some("/log")); -// -// let req = client.get("/log"); -// let response = req.dispatch().await; -// -// assert_eq!(response.status(), Status::Ok); -// let text = response.into_string().await.unwrap(); -// assert!(text.contains("Logbuch")); -// assert!(text.contains("Neue Ausfahrt")); -// -// assert!(!text.contains("Ottensheim Boot")); -// } -// -// #[sqlx::test] -// fn test_kiosk_cookie_boat() { -// let db = testdb!(); -// -// let rocket = rocket::build().manage(db.clone()); -// let rocket = crate::tera::config(rocket); -// -// let client = Client::tracked(rocket).await.unwrap(); -// let req = client.get("/log/kiosk/ekrv2019/Ottensheim"); -// let response = req.dispatch().await; -// -// assert_eq!(response.status(), Status::SeeOther); -// assert_eq!(response.headers().get("Location").next(), Some("/log")); -// -// let req = client.get("/log"); -// let response = req.dispatch().await; -// -// assert_eq!(response.status(), Status::Ok); -// let text = response.into_string().await.unwrap(); -// assert!(text.contains("Logbuch")); -// assert!(text.contains("Neue Ausfahrt")); -// -// assert!(text.contains("Ottensheim Boot")); -// } -// -// #[sqlx::test] -// fn test_index() { -// let db = testdb!(); -// -// let rocket = rocket::build().manage(db.clone()); -// let rocket = crate::tera::config(rocket); -// -// let client = Client::tracked(rocket).await.unwrap(); -// let login = client -// .post("/auth") -// .header(ContentType::Form) // Set the content type to form -// .body("name=admin&password=admin"); // Add the form data to the request body; -// login.dispatch().await; -// -// let req = client.get("/log"); -// let response = req.dispatch().await; -// -// let text = response.into_string().await.unwrap(); -// assert!(text.contains("Logbuch")); -// assert!(text.contains("Neue Ausfahrt")); -// } -// -// #[sqlx::test] -// fn test_show() { -// let db = testdb!(); -// -// let rocket = rocket::build().manage(db.clone()); -// let rocket = crate::tera::config(rocket); -// -// let client = Client::tracked(rocket).await.unwrap(); -// let login = client -// .post("/auth") -// .header(ContentType::Form) // Set the content type to form -// .body("name=admin&password=admin"); // Add the form data to the request body; -// login.dispatch().await; -// -// let req = client.get("/log/show"); -// let response = req.dispatch().await; -// -// let text = response.into_string().await.unwrap(); -// println!("{text:?}"); -// assert!(text.contains("Logbuch")); -// assert!(text.contains("Joe")); -// } -// -// #[sqlx::test] -// fn test_show_kiosk() { -// let db = testdb!(); -// -// let rocket = rocket::build().manage(db.clone()); -// let rocket = crate::tera::config(rocket); -// -// let client = Client::tracked(rocket).await.unwrap(); -// let req = client.get("/log/kiosk/ekrv2019/Linz"); -// let _ = req.dispatch().await; -// -// let req = client.get("/log/show"); -// let response = req.dispatch().await; -// -// let text = response.into_string().await.unwrap(); -// assert!(text.contains("Logbuch")); -// assert!(text.contains("Joe")); -// } -// -// #[sqlx::test] -// fn test_create() { -// let db = testdb!(); -// -// let rocket = rocket::build().manage(db.clone()); -// let rocket = crate::tera::config(rocket); -// -// let client = Client::tracked(rocket).await.unwrap(); -// let login = client -// .post("/auth") -// .header(ContentType::Form) // Set the content type to form -// .body("name=admin&password=admin"); // Add the form data to the request body; -// login.dispatch().await; -// -// let req = client -// .post("/log") -// .header(ContentType::Form) -// .body("boat_id=1&shipmaster=4&departure=2199-12-31T10:00"); -// let response = req.dispatch().await; -// -// assert_eq!(response.status(), Status::SeeOther); -// assert_eq!(response.headers().get("Location").next(), Some("/log")); -// -// let flash_cookie = response -// .cookies() -// .get("_flash") -// .expect("Expected flash cookie"); -// -// assert_eq!( -// flash_cookie.value(), -// "7:successAusfahrt erfolgreich hinzugefügt" -// ); -// } -// -// #[sqlx::test] -// fn test_home_kiosk() { -// let db = testdb!(); -// -// let rocket = rocket::build().manage(db.clone()); -// let rocket = crate::tera::config(rocket); -// -// let client = Client::tracked(rocket).await.unwrap(); -// let req = client.get("/log/kiosk/ekrv2019/Linz"); -// let _ = req.dispatch().await; -// -// let req = client -// .post("/log/1") -// .header(ContentType::Form) -// .body("destination=Ottensheim&distance_in_km=25"); -// let response = req.dispatch().await; -// -// assert_eq!(response.status(), Status::SeeOther); -// assert_eq!(response.headers().get("Location").next(), Some("/log")); -// -// let flash_cookie = response -// .cookies() -// .get("_flash") -// .expect("Expected flash cookie"); -// -// assert_eq!( -// flash_cookie.value(), -// "7:successAusfahrt korrekt eingetragen" -// ); -// } -// -// //Kiosk mode -// // i see all boats -// #[sqlx::test] -// fn test_kiosks_sees_all_boats() { -// let db = testdb!(); -// -// let rocket = rocket::build().manage(db.clone()); -// let rocket = crate::tera::config(rocket); -// -// let client = Client::tracked(rocket).await.unwrap(); -// let req = client.get("/log/kiosk/ekrv2019/Linz"); -// let _ = req.dispatch().await; -// -// let req = client.get("/log"); -// let response = req.dispatch().await; -// -// let text = response.into_string().await.unwrap(); -// //Sees all boats stationed in Linz -// assert!(text.contains("Haichenbach")); -// assert!(text.contains("Joe")); -// assert!(text.contains("Kaputtes Boot :-(")); -// assert!(text.contains("Sehr kaputtes Boot :-((")); -// assert!(text.contains("second_private_boat_from_rower")); -// assert!(text.contains("private_boat_from_rower")); -// -// //Doesn't see the one's in Ottensheim -// assert!(!text.contains("Ottensheim Boot")); -// } -// -// #[sqlx::test] -// fn test_kiosks_can_start_trips_with_all_boats() { -// let db = testdb!(); -// -// let rocket = rocket::build().manage(db.clone()); -// let rocket = crate::tera::config(rocket); -// -// sqlx::query("DELETE FROM logbook;") -// .execute(&db) -// .await -// .unwrap(); -// -// let mut client = Client::tracked(rocket).await.unwrap(); -// let req = client.get("/log/kiosk/ekrv2019/Linz"); -// let _ = req.dispatch().await; -// -// can_start_and_end_trip(&db, &mut client, "Haichenbach".into(), "admin".into()).await; -// can_start_and_end_trip(&db, &mut client, "Joe".into(), "admin".into()).await; -// can_start_and_end_trip(&db, &mut client, "Kaputtes Boot :-(".into(), "admin".into()).await; -// cant_start_trip( -// &db, -// &mut client, -// "Sehr kaputtes Boot :-((".into(), -// "admin".into(), -// "Boot gesperrt".into(), -// ) -// .await; -// can_start_and_end_trip( -// &db, -// &mut client, -// "second_private_boat_from_rower".into(), -// "rower".into(), -// ) -// .await; -// } -// -// #[sqlx::test] -// fn test_shipowner_can_allow_others_to_drive() { -// let db = testdb!(); -// -// let rocket = rocket::build().manage(db.clone()); -// let rocket = crate::tera::config(rocket); -// -// sqlx::query("DELETE FROM logbook;") -// .execute(&db) -// .await -// .unwrap(); -// -// let client = Client::tracked(rocket).await.unwrap(); -// let login = client -// .post("/auth") -// .header(ContentType::Form) // Set the content type to form -// .body("name=rower&password=rower"); // Add the form data to the request body; -// login.dispatch().await; -// -// // Owner can start trip: -// let boat_id = Boat::find_by_name(&db, "private_boat_from_rower".into()) -// .await -// .unwrap() -// .id; -// let shipmaster_id = User::find_by_name(&db, "rower2".into()).await.unwrap().id; -// -// let req = client.post("/log").header(ContentType::Form).body(format!( -// "boat_id={boat_id}&shipmaster={shipmaster_id}&departure=1199-12-31T10:00" -// )); -// let response = req.dispatch().await; -// -// assert_eq!(response.status(), Status::SeeOther); -// assert_eq!(response.headers().get("Location").next(), Some("/log")); -// -// let flash_cookie = response -// .cookies() -// .get("_flash") -// .expect("Expected flash cookie"); -// -// assert_eq!( -// flash_cookie.value(), -// "7:successAusfahrt erfolgreich hinzugefügt" -// ); -// -// // Shipmaster can end it -// let log_id = Logbook::highest_id(&db).await; -// -// let login = client -// .post("/auth") -// .header(ContentType::Form) // Set the content type to form -// .body("name=rower2&password=rower"); // Add the form data to the request body; -// login.dispatch().await; -// -// let req = client -// .post(format!("/log/{log_id}")) -// .header(ContentType::Form) -// .body("destination=Ottensheim&distance_in_km=25"); -// let response = req.dispatch().await; -// -// assert_eq!(response.status(), Status::SeeOther); -// assert_eq!(response.headers().get("Location").next(), Some("/log")); -// -// let flash_cookie = response -// .cookies() -// .get("_flash") -// .expect("Expected flash cookie"); -// -// assert_eq!( -// flash_cookie.value(), -// "7:successAusfahrt korrekt eingetragen" -// ); -// } -// -// #[sqlx::test] -// fn test_normal_user_sees_appropriate_boats() { -// let db = testdb!(); -// -// let rocket = rocket::build().manage(db.clone()); -// let rocket = crate::tera::config(rocket); -// -// let mut client = Client::tracked(rocket).await.unwrap(); -// let login = client -// .post("/auth") -// .header(ContentType::Form) // Set the content type to form -// .body("name=rower&password=rower"); // Add the form data to the request body; -// login.dispatch().await; -// -// let req = client.get("/log"); -// let response = req.dispatch().await; -// -// let text = response.into_string().await.unwrap(); -// -// sqlx::query("DELETE FROM logbook;") -// .execute(&db) -// .await -// .unwrap(); -// -// //Sees all 1x -// assert!(text.contains("Haichenbach")); -// can_start_and_end_trip(&db, &mut client, "Haichenbach".into(), "rower".into()).await; -// -// assert!(text.contains("private_boat_from_rower")); -// can_start_and_end_trip( -// &db, -// &mut client, -// "private_boat_from_rower".into(), -// "rower".into(), -// ) -// .await; -// -// assert!(text.contains("second_private_boat_from_rower")); -// can_start_and_end_trip( -// &db, -// &mut client, -// "second_private_boat_from_rower".into(), -// "rower".into(), -// ) -// .await; -// -// //Don't see anything else -// assert!(!text.contains("Joe")); -// cant_start_trip( -// &db, -// &mut client, -// "Joe".into(), -// "rower".into(), -// "Schiffsführer darf dieses Boot nicht verwenden".into(), -// ) -// .await; -// -// assert!(!text.contains("Kaputtes Boot :-(")); -// cant_start_trip( -// &db, -// &mut client, -// "Kaputtes Boot :-(".into(), -// "rower".into(), -// "Schiffsführer darf dieses Boot nicht verwenden".into(), -// ) -// .await; -// -// assert!(!text.contains("Sehr kaputtes Boot :-((")); -// cant_start_trip( -// &db, -// &mut client, -// "Sehr kaputtes Boot :-((".into(), -// "rower".into(), -// "Boot gesperrt".into(), -// ) -// .await; -// -// assert!(!text.contains("Ottensheim Boot")); -// cant_start_trip( -// &db, -// &mut client, -// "Ottensheim Boot".into(), -// "rower".into(), -// "Schiffsführer darf dieses Boot nicht verwenden".into(), -// ) -// .await; -// } -// -// #[sqlx::test] -// fn test_cox_sees_appropriate_boats() { -// let db = testdb!(); -// -// let rocket = rocket::build().manage(db.clone()); -// let rocket = crate::tera::config(rocket); -// -// let mut client = Client::tracked(rocket).await.unwrap(); -// let login = client -// .post("/auth") -// .header(ContentType::Form) // Set the content type to form -// .body("name=cox&password=cox"); // Add the form data to the request body; -// login.dispatch().await; -// -// sqlx::query("DELETE FROM logbook;") -// .execute(&db) -// .await -// .unwrap(); -// -// let req = client.get("/log"); -// let response = req.dispatch().await; -// -// let text = response.into_string().await.unwrap(); -// -// //Sees all 1x -// assert!(text.contains("Haichenbach")); -// can_start_and_end_trip(&db, &mut client, "Haichenbach".into(), "cox".into()).await; -// -// assert!(text.contains("Joe")); -// can_start_and_end_trip(&db, &mut client, "Joe".into(), "cox".into()).await; -// -// assert!(text.contains("Kaputtes Boot :-(")); -// can_start_and_end_trip(&db, &mut client, "Kaputtes Boot :-(".into(), "cox".into()).await; -// -// assert!(text.contains("Sehr kaputtes Boot :-((")); -// cant_start_trip( -// &db, -// &mut client, -// "Sehr kaputtes Boot :-((".into(), -// "cox".into(), -// "Boot gesperrt".into(), -// ) -// .await; -// -// assert!(text.contains("Ottensheim Boot")); -// can_start_and_end_trip(&db, &mut client, "Ottensheim Boot".into(), "cox".into()).await; -// -// //Can't use private boats -// assert!(!text.contains("private_boat_from_rower")); -// cant_start_trip( -// &db, -// &mut client, -// "private_boat_from_rower".into(), -// "cox".into(), -// "Schiffsführer darf dieses Boot nicht verwenden".into(), -// ) -// .await; -// -// assert!(!text.contains("second_private_boat_from_rower")); -// cant_start_trip( -// &db, -// &mut client, -// "second_private_boat_from_rower".into(), -// "cox".into(), -// "Schiffsführer darf dieses Boot nicht verwenden".into(), -// ) -// .await; -// } -// -// #[sqlx::test] -// fn test_cant_end_trip_other_user() { -// let db = testdb!(); -// -// let rocket = rocket::build().manage(db.clone()); -// let rocket = crate::tera::config(rocket); -// -// let client = Client::tracked(rocket).await.unwrap(); -// let login = client -// .post("/auth") -// .header(ContentType::Form) // Set the content type to form -// .body("name=rower2&password=rower"); // Add the form data to the request body; -// login.dispatch().await; -// -// let req = client -// .post("/log/1") -// .header(ContentType::Form) -// .body("destination=Ottensheim&distance_in_km=25"); -// let response = req.dispatch().await; -// -// assert_eq!(response.status(), Status::SeeOther); -// assert_eq!(response.headers().get("Location").next(), Some("/log")); -// -// let flash_cookie = response -// .cookies() -// .get("_flash") -// .expect("Expected flash cookie"); -// -// assert_eq!( -// flash_cookie.value(), -// "5:errorEintrag 1 konnte nicht abgesendet werden!" -// ); -// } -// -// async fn can_start_and_end_trip( -// db: &SqlitePool, -// client: &mut Client, -// boat_name: String, -// shipmaster_name: String, -// ) { -// let boat_id = Boat::find_by_name(db, boat_name).await.unwrap().id; -// let shipmaster_id = User::find_by_name(db, &shipmaster_name).await.unwrap().id; -// -// let req = client.post("/log").header(ContentType::Form).body(format!( -// "boat_id={boat_id}&shipmaster={shipmaster_id}&departure=1199-12-31T10:00" -// )); -// let response = req.dispatch().await; -// -// assert_eq!(response.status(), Status::SeeOther); -// assert_eq!(response.headers().get("Location").next(), Some("/log")); -// -// let flash_cookie = response -// .cookies() -// .get("_flash") -// .expect("Expected flash cookie"); -// -// assert_eq!( -// flash_cookie.value(), -// "7:successAusfahrt erfolgreich hinzugefügt" -// ); -// -// let log_id = Logbook::highest_id(db).await; -// -// let req = client -// .post(format!("/log/{log_id}")) -// .header(ContentType::Form) -// .body("destination=Ottensheim&distance_in_km=25"); -// let response = req.dispatch().await; -// -// assert_eq!(response.status(), Status::SeeOther); -// assert_eq!(response.headers().get("Location").next(), Some("/log")); -// -// let flash_cookie = response -// .cookies() -// .get("_flash") -// .expect("Expected flash cookie"); -// -// assert_eq!( -// flash_cookie.value(), -// "7:successAusfahrt korrekt eingetragen" -// ); -// } -// -// async fn cant_start_trip( -// db: &SqlitePool, -// client: &mut Client, -// boat_name: String, -// shipmaster_name: String, -// reason: String, -// ) { -// let boat_id = Boat::find_by_name(db, boat_name).await.unwrap().id; -// let shipmaster_id = User::find_by_name(db, &shipmaster_name).await.unwrap().id; -// -// let req = client.post("/log").header(ContentType::Form).body(format!( -// "boat_id={boat_id}&shipmaster={shipmaster_id}&departure=2199-12-31T10:00" -// )); -// let response = req.dispatch().await; -// -// assert_eq!(response.status(), Status::SeeOther); -// assert_eq!(response.headers().get("Location").next(), Some("/log")); -// -// let flash_cookie = response -// .cookies() -// .get("_flash") -// .expect("Expected flash cookie"); -// -// assert_eq!(flash_cookie.value(), format!("5:error{}", reason)); -// } -//} +#[cfg(test)] +mod test { + use rocket::http::ContentType; + use rocket::{http::Status, local::asynchronous::Client}; + use sqlx::SqlitePool; + + use crate::model::logbook::Logbook; + use crate::tera::{log::Boat, User}; + use crate::testdb; + + #[sqlx::test] + fn test_kiosk_cookie() { + let db = testdb!(); + + let rocket = rocket::build().manage(db.clone()); + let rocket = crate::tera::config(rocket); + + let client = Client::tracked(rocket).await.unwrap(); + let req = client.get("/log"); + let response = req.dispatch().await; + + assert_eq!(response.status(), Status::SeeOther); + assert_eq!(response.headers().get("Location").next(), Some("/auth")); + + let req = client.get("/log/kiosk/ekrv2019/Linz"); + let response = req.dispatch().await; + + assert_eq!(response.status(), Status::SeeOther); + assert_eq!(response.headers().get("Location").next(), Some("/log")); + + let req = client.get("/log"); + let response = req.dispatch().await; + + assert_eq!(response.status(), Status::Ok); + let text = response.into_string().await.unwrap(); + assert!(text.contains("Logbuch")); + assert!(text.contains("Neue Ausfahrt")); + + assert!(!text.contains("Ottensheim Boot")); + } + + #[sqlx::test] + fn test_kiosk_cookie_boat() { + let db = testdb!(); + + let rocket = rocket::build().manage(db.clone()); + let rocket = crate::tera::config(rocket); + + let client = Client::tracked(rocket).await.unwrap(); + let req = client.get("/log/kiosk/ekrv2019/Ottensheim"); + let response = req.dispatch().await; + + assert_eq!(response.status(), Status::SeeOther); + assert_eq!(response.headers().get("Location").next(), Some("/log")); + + let req = client.get("/log"); + let response = req.dispatch().await; + + assert_eq!(response.status(), Status::Ok); + let text = response.into_string().await.unwrap(); + assert!(text.contains("Logbuch")); + assert!(text.contains("Neue Ausfahrt")); + + assert!(text.contains("Ottensheim Boot")); + } + + #[sqlx::test] + fn test_index() { + let db = testdb!(); + + let rocket = rocket::build().manage(db.clone()); + let rocket = crate::tera::config(rocket); + + let client = Client::tracked(rocket).await.unwrap(); + let login = client + .post("/auth") + .header(ContentType::Form) // Set the content type to form + .body("name=admin&password=admin"); // Add the form data to the request body; + login.dispatch().await; + + let req = client.get("/log"); + let response = req.dispatch().await; + + let text = response.into_string().await.unwrap(); + assert!(text.contains("Logbuch")); + assert!(text.contains("Neue Ausfahrt")); + } + + #[sqlx::test] + fn test_show() { + let db = testdb!(); + + let rocket = rocket::build().manage(db.clone()); + let rocket = crate::tera::config(rocket); + + let client = Client::tracked(rocket).await.unwrap(); + let login = client + .post("/auth") + .header(ContentType::Form) // Set the content type to form + .body("name=admin&password=admin"); // Add the form data to the request body; + login.dispatch().await; + + let req = client.get("/log/show"); + let response = req.dispatch().await; + + let text = response.into_string().await.unwrap(); + println!("{text:?}"); + assert!(text.contains("Logbuch")); + assert!(text.contains("Joe")); + } + + #[sqlx::test] + fn test_show_kiosk() { + let db = testdb!(); + + let rocket = rocket::build().manage(db.clone()); + let rocket = crate::tera::config(rocket); + + let client = Client::tracked(rocket).await.unwrap(); + let req = client.get("/log/kiosk/ekrv2019/Linz"); + let _ = req.dispatch().await; + + let req = client.get("/log/show"); + let response = req.dispatch().await; + + let text = response.into_string().await.unwrap(); + assert!(text.contains("Logbuch")); + assert!(text.contains("Joe")); + } + + #[sqlx::test] + fn test_create() { + let db = testdb!(); + + let rocket = rocket::build().manage(db.clone()); + let rocket = crate::tera::config(rocket); + + let client = Client::tracked(rocket).await.unwrap(); + let login = client + .post("/auth") + .header(ContentType::Form) // Set the content type to form + .body("name=admin&password=admin"); // Add the form data to the request body; + login.dispatch().await; + + let req = client + .post("/log") + .header(ContentType::Form) + .body("boat_id=1&shipmaster=4&departure=2199-12-31T10:00"); + let response = req.dispatch().await; + + assert_eq!(response.status(), Status::SeeOther); + assert_eq!(response.headers().get("Location").next(), Some("/log")); + + let flash_cookie = response + .cookies() + .get("_flash") + .expect("Expected flash cookie"); + + assert_eq!( + flash_cookie.value(), + "7:successAusfahrt erfolgreich hinzugefügt" + ); + } + + #[sqlx::test] + fn test_home_kiosk() { + let db = testdb!(); + + let rocket = rocket::build().manage(db.clone()); + let rocket = crate::tera::config(rocket); + + let client = Client::tracked(rocket).await.unwrap(); + let req = client.get("/log/kiosk/ekrv2019/Linz"); + let _ = req.dispatch().await; + + let req = client + .post("/log/1") + .header(ContentType::Form) + .body("destination=Ottensheim&distance_in_km=25"); + let response = req.dispatch().await; + + assert_eq!(response.status(), Status::SeeOther); + assert_eq!(response.headers().get("Location").next(), Some("/log")); + + let flash_cookie = response + .cookies() + .get("_flash") + .expect("Expected flash cookie"); + + assert_eq!( + flash_cookie.value(), + "7:successAusfahrt korrekt eingetragen" + ); + } + + //Kiosk mode + // i see all boats + #[sqlx::test] + fn test_kiosks_sees_all_boats() { + let db = testdb!(); + + let rocket = rocket::build().manage(db.clone()); + let rocket = crate::tera::config(rocket); + + let client = Client::tracked(rocket).await.unwrap(); + let req = client.get("/log/kiosk/ekrv2019/Linz"); + let _ = req.dispatch().await; + + let req = client.get("/log"); + let response = req.dispatch().await; + + let text = response.into_string().await.unwrap(); + //Sees all boats stationed in Linz + assert!(text.contains("Haichenbach")); + assert!(text.contains("Joe")); + assert!(text.contains("Kaputtes Boot :-(")); + assert!(text.contains("Sehr kaputtes Boot :-((")); + assert!(text.contains("second_private_boat_from_rower")); + assert!(text.contains("private_boat_from_rower")); + + //Doesn't see the one's in Ottensheim + assert!(!text.contains("Ottensheim Boot")); + } + + #[sqlx::test] + fn test_kiosks_can_start_trips_with_all_boats() { + let db = testdb!(); + + let rocket = rocket::build().manage(db.clone()); + let rocket = crate::tera::config(rocket); + + sqlx::query("DELETE FROM logbook;") + .execute(&db) + .await + .unwrap(); + + let mut client = Client::tracked(rocket).await.unwrap(); + let req = client.get("/log/kiosk/ekrv2019/Linz"); + let _ = req.dispatch().await; + + can_start_and_end_trip(&db, &mut client, "Haichenbach".into(), "admin".into()).await; + can_start_and_end_trip(&db, &mut client, "Joe".into(), "admin".into()).await; + can_start_and_end_trip(&db, &mut client, "Kaputtes Boot :-(".into(), "admin".into()).await; + cant_start_trip( + &db, + &mut client, + "Sehr kaputtes Boot :-((".into(), + "admin".into(), + "Boot gesperrt".into(), + ) + .await; + can_start_and_end_trip( + &db, + &mut client, + "second_private_boat_from_rower".into(), + "rower".into(), + ) + .await; + } + + #[sqlx::test] + fn test_shipowner_can_allow_others_to_drive() { + let db = testdb!(); + + let rocket = rocket::build().manage(db.clone()); + let rocket = crate::tera::config(rocket); + + sqlx::query("DELETE FROM logbook;") + .execute(&db) + .await + .unwrap(); + + let client = Client::tracked(rocket).await.unwrap(); + let login = client + .post("/auth") + .header(ContentType::Form) // Set the content type to form + .body("name=rower&password=rower"); // Add the form data to the request body; + login.dispatch().await; + + // Owner can start trip: + let boat_id = Boat::find_by_name(&db, "private_boat_from_rower".into()) + .await + .unwrap() + .id; + let shipmaster_id = User::find_by_name(&db, "rower2".into()).await.unwrap().id; + + let req = client.post("/log").header(ContentType::Form).body(format!( + "boat_id={boat_id}&shipmaster={shipmaster_id}&departure=1199-12-31T10:00" + )); + let response = req.dispatch().await; + + assert_eq!(response.status(), Status::SeeOther); + assert_eq!(response.headers().get("Location").next(), Some("/log")); + + let flash_cookie = response + .cookies() + .get("_flash") + .expect("Expected flash cookie"); + + assert_eq!( + flash_cookie.value(), + "7:successAusfahrt erfolgreich hinzugefügt" + ); + + // Shipmaster can end it + let log_id = Logbook::highest_id(&db).await; + + let login = client + .post("/auth") + .header(ContentType::Form) // Set the content type to form + .body("name=rower2&password=rower"); // Add the form data to the request body; + login.dispatch().await; + + let req = client + .post(format!("/log/{log_id}")) + .header(ContentType::Form) + .body("destination=Ottensheim&distance_in_km=25"); + let response = req.dispatch().await; + + assert_eq!(response.status(), Status::SeeOther); + assert_eq!(response.headers().get("Location").next(), Some("/log")); + + let flash_cookie = response + .cookies() + .get("_flash") + .expect("Expected flash cookie"); + + assert_eq!( + flash_cookie.value(), + "7:successAusfahrt korrekt eingetragen" + ); + } + + #[sqlx::test] + fn test_normal_user_sees_appropriate_boats() { + let db = testdb!(); + + let rocket = rocket::build().manage(db.clone()); + let rocket = crate::tera::config(rocket); + + let mut client = Client::tracked(rocket).await.unwrap(); + let login = client + .post("/auth") + .header(ContentType::Form) // Set the content type to form + .body("name=rower&password=rower"); // Add the form data to the request body; + login.dispatch().await; + + let req = client.get("/log"); + let response = req.dispatch().await; + + let text = response.into_string().await.unwrap(); + + sqlx::query("DELETE FROM logbook;") + .execute(&db) + .await + .unwrap(); + + //Sees all 1x + assert!(text.contains("Haichenbach")); + can_start_and_end_trip(&db, &mut client, "Haichenbach".into(), "rower".into()).await; + + assert!(text.contains("private_boat_from_rower")); + can_start_and_end_trip( + &db, + &mut client, + "private_boat_from_rower".into(), + "rower".into(), + ) + .await; + + assert!(text.contains("second_private_boat_from_rower")); + can_start_and_end_trip( + &db, + &mut client, + "second_private_boat_from_rower".into(), + "rower".into(), + ) + .await; + + //Don't see anything else + assert!(!text.contains("Joe")); + cant_start_trip( + &db, + &mut client, + "Joe".into(), + "rower".into(), + "Schiffsführer darf dieses Boot nicht verwenden".into(), + ) + .await; + + assert!(!text.contains("Kaputtes Boot :-(")); + cant_start_trip( + &db, + &mut client, + "Kaputtes Boot :-(".into(), + "rower".into(), + "Schiffsführer darf dieses Boot nicht verwenden".into(), + ) + .await; + + assert!(!text.contains("Sehr kaputtes Boot :-((")); + cant_start_trip( + &db, + &mut client, + "Sehr kaputtes Boot :-((".into(), + "rower".into(), + "Boot gesperrt".into(), + ) + .await; + + assert!(!text.contains("Ottensheim Boot")); + cant_start_trip( + &db, + &mut client, + "Ottensheim Boot".into(), + "rower".into(), + "Schiffsführer darf dieses Boot nicht verwenden".into(), + ) + .await; + } + + #[sqlx::test] + fn test_cox_sees_appropriate_boats() { + let db = testdb!(); + + let rocket = rocket::build().manage(db.clone()); + let rocket = crate::tera::config(rocket); + + let mut client = Client::tracked(rocket).await.unwrap(); + let login = client + .post("/auth") + .header(ContentType::Form) // Set the content type to form + .body("name=cox&password=cox"); // Add the form data to the request body; + login.dispatch().await; + + sqlx::query("DELETE FROM logbook;") + .execute(&db) + .await + .unwrap(); + + let req = client.get("/log"); + let response = req.dispatch().await; + + let text = response.into_string().await.unwrap(); + + //Sees all 1x + assert!(text.contains("Haichenbach")); + can_start_and_end_trip(&db, &mut client, "Haichenbach".into(), "cox".into()).await; + + assert!(text.contains("Joe")); + can_start_and_end_trip(&db, &mut client, "Joe".into(), "cox".into()).await; + + assert!(text.contains("Kaputtes Boot :-(")); + can_start_and_end_trip(&db, &mut client, "Kaputtes Boot :-(".into(), "cox".into()).await; + + assert!(text.contains("Sehr kaputtes Boot :-((")); + cant_start_trip( + &db, + &mut client, + "Sehr kaputtes Boot :-((".into(), + "cox".into(), + "Boot gesperrt".into(), + ) + .await; + + assert!(text.contains("Ottensheim Boot")); + can_start_and_end_trip(&db, &mut client, "Ottensheim Boot".into(), "cox".into()).await; + + //Can't use private boats + assert!(!text.contains("private_boat_from_rower")); + cant_start_trip( + &db, + &mut client, + "private_boat_from_rower".into(), + "cox".into(), + "Schiffsführer darf dieses Boot nicht verwenden".into(), + ) + .await; + + assert!(!text.contains("second_private_boat_from_rower")); + cant_start_trip( + &db, + &mut client, + "second_private_boat_from_rower".into(), + "cox".into(), + "Schiffsführer darf dieses Boot nicht verwenden".into(), + ) + .await; + } + + #[sqlx::test] + fn test_cant_end_trip_other_user() { + let db = testdb!(); + + let rocket = rocket::build().manage(db.clone()); + let rocket = crate::tera::config(rocket); + + let client = Client::tracked(rocket).await.unwrap(); + let login = client + .post("/auth") + .header(ContentType::Form) // Set the content type to form + .body("name=rower2&password=rower"); // Add the form data to the request body; + login.dispatch().await; + + let req = client + .post("/log/1") + .header(ContentType::Form) + .body("destination=Ottensheim&distance_in_km=25"); + let response = req.dispatch().await; + + assert_eq!(response.status(), Status::SeeOther); + assert_eq!(response.headers().get("Location").next(), Some("/log")); + + let flash_cookie = response + .cookies() + .get("_flash") + .expect("Expected flash cookie"); + + assert_eq!( + flash_cookie.value(), + "5:errorEintrag 1 konnte nicht abgesendet werden!" + ); + } + + async fn can_start_and_end_trip( + db: &SqlitePool, + client: &mut Client, + boat_name: String, + shipmaster_name: String, + ) { + let boat_id = Boat::find_by_name(db, boat_name).await.unwrap().id; + let shipmaster_id = User::find_by_name(db, &shipmaster_name).await.unwrap().id; + + let req = client.post("/log").header(ContentType::Form).body(format!( + "boat_id={boat_id}&shipmaster={shipmaster_id}&departure=1199-12-31T10:00" + )); + let response = req.dispatch().await; + + assert_eq!(response.status(), Status::SeeOther); + assert_eq!(response.headers().get("Location").next(), Some("/log")); + + let flash_cookie = response + .cookies() + .get("_flash") + .expect("Expected flash cookie"); + + assert_eq!( + flash_cookie.value(), + "7:successAusfahrt erfolgreich hinzugefügt" + ); + + let log_id = Logbook::highest_id(db).await; + + let req = client + .post(format!("/log/{log_id}")) + .header(ContentType::Form) + .body("destination=Ottensheim&distance_in_km=25"); + let response = req.dispatch().await; + + assert_eq!(response.status(), Status::SeeOther); + assert_eq!(response.headers().get("Location").next(), Some("/log")); + + let flash_cookie = response + .cookies() + .get("_flash") + .expect("Expected flash cookie"); + + assert_eq!( + flash_cookie.value(), + "7:successAusfahrt korrekt eingetragen" + ); + } + + async fn cant_start_trip( + db: &SqlitePool, + client: &mut Client, + boat_name: String, + shipmaster_name: String, + reason: String, + ) { + let boat_id = Boat::find_by_name(db, boat_name).await.unwrap().id; + let shipmaster_id = User::find_by_name(db, &shipmaster_name).await.unwrap().id; + + let req = client.post("/log").header(ContentType::Form).body(format!( + "boat_id={boat_id}&shipmaster={shipmaster_id}&departure=2199-12-31T10:00" + )); + let response = req.dispatch().await; + + assert_eq!(response.status(), Status::SeeOther); + assert_eq!(response.headers().get("Location").next(), Some("/log")); + + let flash_cookie = response + .cookies() + .get("_flash") + .expect("Expected flash cookie"); + + assert_eq!(flash_cookie.value(), format!("5:error{}", reason)); + } +}