summaryrefslogtreecommitdiff
path: root/server/src/tests.rs
diff options
context:
space:
mode:
authorJoel Klinghed <the_jk@spawned.biz>2025-01-09 21:52:34 +0100
committerJoel Klinghed <the_jk@spawned.biz>2025-01-09 22:07:54 +0100
commitf7d3d4a1ea50f3d2abad76cb809e43e6d8636bb7 (patch)
treed893df15f91a6d1897c71550f30f78e9246ceb45 /server/src/tests.rs
parent3747204267e8b75bc77d6c0962b67bbe018dad15 (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.rs241
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);
+}