parent
47b534f8c3
commit
8b5be3fb41
@ -125,7 +125,7 @@ ORDER BY amount_seats DESC
|
|||||||
res
|
res
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn create(db: &SqlitePool, boat: BoatToAdd<'_>) -> bool {
|
pub async fn create(db: &SqlitePool, boat: BoatToAdd<'_>) -> Result<(), String> {
|
||||||
sqlx::query!(
|
sqlx::query!(
|
||||||
"INSERT INTO boat(name, amount_seats, year_built, boatbuilder, default_shipmaster_only_steering, skull, external, location_id, owner) VALUES (?,?,?,?,?,?,?,?,?)",
|
"INSERT INTO boat(name, amount_seats, year_built, boatbuilder, default_shipmaster_only_steering, skull, external, location_id, owner) VALUES (?,?,?,?,?,?,?,?,?)",
|
||||||
boat.name,
|
boat.name,
|
||||||
@ -139,7 +139,8 @@ ORDER BY amount_seats DESC
|
|||||||
boat.owner
|
boat.owner
|
||||||
)
|
)
|
||||||
.execute(db)
|
.execute(db)
|
||||||
.await.is_ok()
|
.await.map_err(|e| e.to_string())?;
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn update(&self, db: &SqlitePool, boat: BoatToUpdate<'_>) -> Result<(), String> {
|
pub async fn update(&self, db: &SqlitePool, boat: BoatToUpdate<'_>) -> Result<(), String> {
|
||||||
@ -221,7 +222,7 @@ mod test {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
.await,
|
.await,
|
||||||
true
|
Ok(())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -245,7 +246,10 @@ mod test {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
.await,
|
.await,
|
||||||
false
|
Err(
|
||||||
|
"error returned from database: (code: 2067) UNIQUE constraint failed: boat.name"
|
||||||
|
.into()
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ mod test {
|
|||||||
|
|
||||||
#[sqlx::test]
|
#[sqlx::test]
|
||||||
fn test_find_true() {
|
fn test_find_true() {
|
||||||
let pool = testdb!();
|
let _ = testdb!();
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: write tests
|
//TODO: write tests
|
||||||
|
@ -74,16 +74,237 @@ async fn create(
|
|||||||
data: Form<BoatToAdd<'_>>,
|
data: Form<BoatToAdd<'_>>,
|
||||||
_admin: AdminUser,
|
_admin: AdminUser,
|
||||||
) -> Flash<Redirect> {
|
) -> Flash<Redirect> {
|
||||||
if Boat::create(db, data.into_inner()).await {
|
match Boat::create(db, data.into_inner()).await {
|
||||||
Flash::success(Redirect::to("/admin/boat"), "Successfully created boat")
|
Ok(_) => Flash::success(Redirect::to("/admin/boat"), "Successfully created boat"),
|
||||||
} else {
|
Err(e) => Flash::error(Redirect::to("/admin/boat"), e),
|
||||||
Flash::error(
|
|
||||||
Redirect::to("/admin/boat"),
|
|
||||||
"Error while creating the boat in DB",
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn routes() -> Vec<Route> {
|
pub fn routes() -> Vec<Route> {
|
||||||
routes![index, create, delete, update]
|
routes![index, create, delete, update]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use chrono::NaiveDate;
|
||||||
|
use rocket::{
|
||||||
|
http::{ContentType, Status},
|
||||||
|
local::asynchronous::Client,
|
||||||
|
};
|
||||||
|
use sqlx::SqlitePool;
|
||||||
|
|
||||||
|
use crate::tera::admin::boat::Boat;
|
||||||
|
use crate::{model::trip::Trip, testdb};
|
||||||
|
|
||||||
|
#[sqlx::test]
|
||||||
|
fn test_boat_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("/admin/boat");
|
||||||
|
let response = req.dispatch().await;
|
||||||
|
|
||||||
|
assert_eq!(response.status(), Status::Ok);
|
||||||
|
let text = response.into_string().await.unwrap();
|
||||||
|
assert!(&text.contains("Neues Boot hinzufügen"));
|
||||||
|
assert!(&text.contains("Kaputtes Boot :-("));
|
||||||
|
assert!(&text.contains("Haichenbach"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[sqlx::test]
|
||||||
|
fn test_succ_update() {
|
||||||
|
let db = testdb!();
|
||||||
|
|
||||||
|
let boat = Boat::find_by_id(&db, 1).await.unwrap();
|
||||||
|
assert_eq!(boat.name, "Haichenbach");
|
||||||
|
|
||||||
|
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("/admin/boat/1")
|
||||||
|
.header(ContentType::Form)
|
||||||
|
.body("name=Haichiii&amount_seats=1&location_id=1");
|
||||||
|
let response = req.dispatch().await;
|
||||||
|
|
||||||
|
assert_eq!(response.status(), Status::SeeOther);
|
||||||
|
assert_eq!(
|
||||||
|
response.headers().get("Location").next(),
|
||||||
|
Some("/admin/boat")
|
||||||
|
);
|
||||||
|
|
||||||
|
let flash_cookie = response
|
||||||
|
.cookies()
|
||||||
|
.get("_flash")
|
||||||
|
.expect("Expected flash cookie");
|
||||||
|
|
||||||
|
assert_eq!(flash_cookie.value(), "7:successSuccessfully updated boat");
|
||||||
|
|
||||||
|
let boat = Boat::find_by_id(&db, 1).await.unwrap();
|
||||||
|
assert_eq!(boat.name, "Haichiii");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[sqlx::test]
|
||||||
|
fn test_update_wrong_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 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("/admin/boat/1337")
|
||||||
|
.header(ContentType::Form)
|
||||||
|
.body("name=Haichiii&amount_seats=1&location_id=1");
|
||||||
|
let response = req.dispatch().await;
|
||||||
|
|
||||||
|
assert_eq!(response.status(), Status::SeeOther);
|
||||||
|
assert_eq!(
|
||||||
|
response.headers().get("Location").next(),
|
||||||
|
Some("/admin/boat")
|
||||||
|
);
|
||||||
|
|
||||||
|
let flash_cookie = response
|
||||||
|
.cookies()
|
||||||
|
.get("_flash")
|
||||||
|
.expect("Expected flash cookie");
|
||||||
|
|
||||||
|
assert_eq!(flash_cookie.value(), "5:errorBoat does not exist!");
|
||||||
|
|
||||||
|
let boat = Boat::find_by_id(&db, 1).await.unwrap();
|
||||||
|
assert_eq!(boat.name, "Haichenbach");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[sqlx::test]
|
||||||
|
fn test_update_wrong_foreign() {
|
||||||
|
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("/admin/boat/1")
|
||||||
|
.header(ContentType::Form)
|
||||||
|
.body("name=Haichiii&amount_seats=1&location_id=999");
|
||||||
|
let response = req.dispatch().await;
|
||||||
|
|
||||||
|
assert_eq!(response.status(), Status::SeeOther);
|
||||||
|
assert_eq!(
|
||||||
|
response.headers().get("Location").next(),
|
||||||
|
Some("/admin/boat")
|
||||||
|
);
|
||||||
|
|
||||||
|
let flash_cookie = response
|
||||||
|
.cookies()
|
||||||
|
.get("_flash")
|
||||||
|
.expect("Expected flash cookie");
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
flash_cookie.value(),
|
||||||
|
"5:errorerror returned from database: (code: 787) FOREIGN KEY constraint failed"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[sqlx::test]
|
||||||
|
fn test_succ_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("/admin/boat/new")
|
||||||
|
.header(ContentType::Form)
|
||||||
|
.body("name=completely-new-boat&amount_seats=1&location_id=1");
|
||||||
|
let response = req.dispatch().await;
|
||||||
|
|
||||||
|
assert_eq!(response.status(), Status::SeeOther);
|
||||||
|
assert_eq!(
|
||||||
|
response.headers().get("Location").next(),
|
||||||
|
Some("/admin/boat")
|
||||||
|
);
|
||||||
|
|
||||||
|
let flash_cookie = response
|
||||||
|
.cookies()
|
||||||
|
.get("_flash")
|
||||||
|
.expect("Expected flash cookie");
|
||||||
|
|
||||||
|
assert_eq!(flash_cookie.value(), "7:successSuccessfully created boat");
|
||||||
|
|
||||||
|
let boat = Boat::find_by_id(&db, 6).await.unwrap();
|
||||||
|
assert_eq!(boat.name, "completely-new-boat");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[sqlx::test]
|
||||||
|
fn test_create_db_error() {
|
||||||
|
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("/admin/boat/new")
|
||||||
|
.header(ContentType::Form)
|
||||||
|
.body("name=Haichenbach&amount_seats=1&location_id=1");
|
||||||
|
let response = req.dispatch().await;
|
||||||
|
|
||||||
|
assert_eq!(response.status(), Status::SeeOther);
|
||||||
|
assert_eq!(
|
||||||
|
response.headers().get("Location").next(),
|
||||||
|
Some("/admin/boat")
|
||||||
|
);
|
||||||
|
|
||||||
|
let flash_cookie = response
|
||||||
|
.cookies()
|
||||||
|
.get("_flash")
|
||||||
|
.expect("Expected flash cookie");
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
flash_cookie.value(),
|
||||||
|
"5:errorerror returned from database: (code: 2067) UNIQUE constraint failed: boat.name"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user