diff options
| author | Joel Klinghed <the_jk@spawned.biz> | 2025-01-09 21:52:34 +0100 |
|---|---|---|
| committer | Joel Klinghed <the_jk@spawned.biz> | 2025-01-09 22:07:54 +0100 |
| commit | f7d3d4a1ea50f3d2abad76cb809e43e6d8636bb7 (patch) | |
| tree | d893df15f91a6d1897c71550f30f78e9246ceb45 /server/src/tests.rs | |
| parent | 3747204267e8b75bc77d6c0962b67bbe018dad15 (diff) | |
Improve (and test) error handling
Non existent projects, users and such.
Diffstat (limited to 'server/src/tests.rs')
| -rw-r--r-- | server/src/tests.rs | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/server/src/tests.rs b/server/src/tests.rs index 72bdd78..b96a5b3 100644 --- a/server/src/tests.rs +++ b/server/src/tests.rs @@ -4,6 +4,7 @@ use rocket::http::{ContentType, Header, Status}; use rocket::local::asynchronous::{Client, LocalRequest}; use sqlx::mysql::{MySql, MySqlConnectOptions, MySqlPoolOptions}; use sqlx::{Acquire, Executor, Pool}; +use std::fmt::Display; use std::sync::OnceLock; use stdext::function_name; @@ -191,6 +192,17 @@ async fn new_project(client: &Client) -> api_model::Project { .await } +async fn get_reviews<'a>(client: &Client, project_url: impl Display) -> api_model::Reviews { + client + .get(format!("{project_url}/reviews")) + .header(&FAKE_IP) + .dispatch() + .await + .into_json::<api_model::Reviews>() + .await + .unwrap() +} + #[rocket::async_test] async fn test_not_logged_in_status() { let client = async_client_with_private_database(function_name!().to_string()).await; @@ -305,6 +317,31 @@ async fn test_project_new() { } #[rocket::async_test] +async fn test_project_new_duplicate() { + let client = async_client_with_private_database(function_name!().to_string()).await; + + login(&client).await; + + new_project(&client).await; + + let duplicate_project = client + .post("/api/v1/project/test/new") + .json(&api_model::ProjectData { + title: Some("foo"), + description: Some("bar"), + remote: Some("fum"), + main_branch: Some("zod"), + }) + .header(&FAKE_IP) + .dispatch() + .await; + assert_eq!(duplicate_project.status(), Status::Conflict); + + let projects = get_projects(&client).await; + assert_eq!(projects.total_count, 1); +} + +#[rocket::async_test] async fn test_project_update() { let client = async_client_with_private_database(function_name!().to_string()).await; @@ -343,6 +380,26 @@ async fn test_project_update() { } #[rocket::async_test] +async fn test_project_update_unknown() { + let client = async_client_with_private_database(function_name!().to_string()).await; + + login(&client).await; + + let update = client + .post("/api/v1/project/does_not_exist") + .json(&api_model::ProjectData { + title: Some("foo"), + description: Some("bar"), + remote: Some("fum"), + main_branch: Some("zod"), + }) + .header(&FAKE_IP) + .dispatch() + .await; + assert_eq!(update.status(), Status::NotFound); +} + +#[rocket::async_test] async fn test_project_new_user() { let client = async_client_with_private_database(function_name!().to_string()).await; @@ -378,6 +435,41 @@ async fn test_project_new_user() { } #[rocket::async_test] +async fn test_project_new_user_duplicate() { + let client = async_client_with_private_database(function_name!().to_string()).await; + + login(&client).await; + + let project = new_project(&client).await; + let project_url = format!("/api/v1/project/{}", project.id); + + let users = get_users(&client).await; + let other = users.users.iter().find(|u| u.id == "other").unwrap(); + + let new = client + .post(format!("{project_url}/user/{}/new", other.id)) + .json(&api_model::ProjectUserEntryData { + default_role: Some(api_model::UserReviewRole::Watcher), + maintainer: Some(true), + }) + .header(&FAKE_IP) + .dispatch() + .await; + assert_eq!(new.status(), Status::Ok); + + let duplicate = client + .post(format!("{project_url}/user/{}/new", other.id)) + .json(&api_model::ProjectUserEntryData { + default_role: Some(api_model::UserReviewRole::Reviewer), + maintainer: Some(false), + }) + .header(&FAKE_IP) + .dispatch() + .await; + assert_eq!(duplicate.status(), Status::Conflict); +} + +#[rocket::async_test] async fn test_project_change_user() { let client = async_client_with_private_database(function_name!().to_string()).await; @@ -425,6 +517,72 @@ async fn test_project_change_user() { } #[rocket::async_test] +async fn test_project_change_user_unknown_project() { + let client = async_client_with_private_database(function_name!().to_string()).await; + + login(&client).await; + + let users = get_users(&client).await; + let other = users.users.iter().find(|u| u.id == "other").unwrap(); + + let update = client + .post(format!("/api/v1/project/does_not_exist/user/{}", other.id)) + .json(&api_model::ProjectUserEntryData { + default_role: Some(api_model::UserReviewRole::Watcher), + maintainer: Some(true), + }) + .header(&FAKE_IP) + .dispatch() + .await; + assert_eq!(update.status(), Status::NotFound); +} + +#[rocket::async_test] +async fn test_project_change_user_unknown_user() { + let client = async_client_with_private_database(function_name!().to_string()).await; + + login(&client).await; + + let project = new_project(&client).await; + let project_url = format!("/api/v1/project/{}", project.id); + + let update = client + .post(format!("{project_url}/user/does_not_exist")) + .json(&api_model::ProjectUserEntryData { + default_role: Some(api_model::UserReviewRole::Watcher), + maintainer: Some(true), + }) + .header(&FAKE_IP) + .dispatch() + .await; + assert_eq!(update.status(), Status::NotFound); +} + +#[rocket::async_test] +async fn test_project_change_user_not_in_project() { + let client = async_client_with_private_database(function_name!().to_string()).await; + + login(&client).await; + + let project = new_project(&client).await; + let project_url = format!("/api/v1/project/{}", project.id); + + let users = get_users(&client).await; + let other = users.users.iter().find(|u| u.id == "other").unwrap(); + + let update = client + .post(format!("{project_url}/user/{}", other.id)) + .json(&api_model::ProjectUserEntryData { + default_role: None, + maintainer: Some(false), + }) + .header(&FAKE_IP) + .dispatch() + .await; + assert_eq!(update.status(), Status::NotFound); +} + +#[rocket::async_test] async fn test_project_check_maintainer() { let client = async_client_with_private_database(function_name!().to_string()).await; @@ -572,3 +730,86 @@ async fn test_project_delete_user() { let other_entry = updated_project.users.get(0).unwrap(); assert_eq!(other_entry.user, *other); } + +#[rocket::async_test] +async fn test_project_delete_user_unknown_project() { + let client = async_client_with_private_database(function_name!().to_string()).await; + + login(&client).await; + + let users = get_users(&client).await; + let user = users.users.iter().find(|u| u.id == "user").unwrap(); + + let delete = client + .delete(format!("/api/v1/project/does_not_exist/user/{}", user.id)) + .header(&FAKE_IP) + .dispatch() + .await; + assert_eq!(delete.status(), Status::NotFound); +} + +#[rocket::async_test] +async fn test_project_delete_user_unknown_user() { + let client = async_client_with_private_database(function_name!().to_string()).await; + + login(&client).await; + + let project = new_project(&client).await; + let project_url = format!("/api/v1/project/{}", project.id); + + let delete = client + .delete(format!("{project_url}/user/does_not_exist")) + .header(&FAKE_IP) + .dispatch() + .await; + assert_eq!(delete.status(), Status::NotFound); +} + +#[rocket::async_test] +async fn test_project_delete_user_not_in_project() { + let client = async_client_with_private_database(function_name!().to_string()).await; + + login(&client).await; + + let project = new_project(&client).await; + let project_url = format!("/api/v1/project/{}", project.id); + + let users = get_users(&client).await; + let other = users.users.iter().find(|u| u.id == "other").unwrap(); + + let delete = client + .delete(format!("{project_url}/user/{}", other.id)) + .header(&FAKE_IP) + .dispatch() + .await; + assert_eq!(delete.status(), Status::NotFound); +} + +#[rocket::async_test] +async fn test_project_reviews_empty_project() { + let client = async_client_with_private_database(function_name!().to_string()).await; + + login(&client).await; + + let project = new_project(&client).await; + let project_url = format!("/api/v1/project/{}", project.id); + + let reviews = get_reviews(&client, project_url).await; + assert_eq!(reviews.total_count, 0); + assert_eq!(reviews.more, false); + assert_eq!(reviews.reviews.len(), 0); +} + +#[rocket::async_test] +async fn test_project_reviews_unknown_project() { + let client = async_client_with_private_database(function_name!().to_string()).await; + + login(&client).await; + + let reviews = client + .get("/api/v1/project/does_not_exist/reviews") + .header(&FAKE_IP) + .dispatch() + .await; + assert_eq!(reviews.status(), Status::NotFound); +} |
