diff --git a/imphnen-dimentorin/src/v1/mentors/mentors_controller.rs b/imphnen-dimentorin/src/v1/mentors/mentors_controller.rs
index 2623ea7..5132941 100644
--- a/imphnen-dimentorin/src/v1/mentors/mentors_controller.rs
+++ b/imphnen-dimentorin/src/v1/mentors/mentors_controller.rs
@@ -6,13 +6,12 @@ use crate::v1::mentors::mentors_dto::MentorRegisterResponseDto;
use ::axum::{
extract::{Extension, Json, Path, Query},
http::HeaderMap,
- response::{IntoResponse, Response},
+ response::Response,
};
use imphnen_entities::MetaRequestDto;
use imphnen_libs::AppState;
use imphnen_iam::{PermissionsEnum, permissions_guard};
use imphnen_utils::extract_email;
-use serde_json::json;
#[utoipa::path(
post,
@@ -236,14 +235,10 @@ pub async fn get_mentor_me(
let email = match extract_email(&headers) {
Some(email) => email,
None => {
- return (
+ return imphnen_utils::common_response(
axum::http::StatusCode::UNAUTHORIZED,
- Json(json!({
- "error": "Unauthorized",
- "message": "Token tidak valid"
- })),
- )
- .into_response();
+ "Token tidak valid",
+ );
}
};
MentorsService::get_mentor_me(&app_state, &email).await
@@ -340,14 +335,10 @@ pub async fn get_mentor_status(
let email = match extract_email(&headers) {
Some(email) => email,
None => {
- return (
+ return imphnen_utils::common_response(
axum::http::StatusCode::UNAUTHORIZED,
- Json(json!({
- "error": "Unauthorized",
- "message": "Token tidak valid"
- })),
- )
- .into_response();
+ "Token tidak valid",
+ );
}
};
MentorsService::get_mentor_status(&app_state, &email).await
diff --git a/tests/src/cms/landing/events/events_controller_test.rs b/tests/src/cms/landing/events/events_controller_test.rs
index d77d18b..0d541c0 100644
--- a/tests/src/cms/landing/events/events_controller_test.rs
+++ b/tests/src/cms/landing/events/events_controller_test.rs
@@ -16,6 +16,9 @@ mod tests {
let response = EventsService::get_event_list(&app_state, get_meta_request_dto(1, 10))
.await;
assert_eq!(response.status(), 200);
+ let body_json: serde_json::Value = crate::common::response_helpers::parse_response_value(response, 8192).await;
+ let list = if let Some(d) = body_json.get("data") { d } else { &body_json };
+ assert!(list.is_array(), "expected event list to be an array");
}
#[tokio::test]
@@ -54,6 +57,9 @@ mod tests {
// Verify response
assert_eq!(response.status(), 200);
+ let body_json: serde_json::Value = crate::common::response_helpers::parse_response_value(response, 4096).await;
+ let data = body_json.get("data").expect("expected data in OK response").clone();
+ assert_eq!(data["name"].as_str().unwrap(), "Test Event");
// Clean up
let _ = repo.query_delete_event(event_id).await;
@@ -72,6 +78,8 @@ mod tests {
// Verify not found response
assert_eq!(response.status(), 404);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in NOT_FOUND response");
}
#[tokio::test]
@@ -97,6 +105,8 @@ mod tests {
// Verify response
assert_eq!(response.status(), 201);
+ let v = crate::common::response_helpers::parse_response_value(response, 4096).await;
+ assert!(v.get("data").is_some() || v.get("message").is_some(), "expected data or message in CREATED response");
// Verify event was created in database
let created_events = repo.query_event_list(get_meta_request_dto(1, 10)).await.unwrap();
@@ -133,6 +143,8 @@ mod tests {
// Verify bad request response (validation error)
assert_eq!(response.status(), 400);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in BAD_REQUEST response");
}
#[tokio::test]
@@ -186,6 +198,8 @@ mod tests {
// Verify response
assert_eq!(response.status(), 200);
+ let v = crate::common::response_helpers::parse_response_value(response, 4096).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some() || v.get("data").is_some(), "expected message or data in OK response");
// Verify event was updated in database
let updated_event = repo
@@ -225,6 +239,8 @@ mod tests {
// Verify not found response
assert_eq!(response.status(), 400);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in BAD_REQUEST response");
}
#[tokio::test]
@@ -267,6 +283,8 @@ mod tests {
// Verify response
assert_eq!(response.status(), 200);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some() || v.get("data").is_some(), "expected message or data in OK response");
// Verify event was soft-deleted from database
let deleted_event = repo.query_event_by_id(event_id.clone()).await;
@@ -288,5 +306,7 @@ mod tests {
// Verify not found response
assert_eq!(response.status(), 400);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in BAD_REQUEST response");
}
}
\ No newline at end of file
diff --git a/tests/src/cms/landing/events/events_service_test.rs b/tests/src/cms/landing/events/events_service_test.rs
index ced5523..2eb2779 100644
--- a/tests/src/cms/landing/events/events_service_test.rs
+++ b/tests/src/cms/landing/events/events_service_test.rs
@@ -13,6 +13,9 @@ mod tests {
let app_state = crate::get_app_state().await;
let response = EventsService::get_event_list(&app_state, get_meta_request_dto(1, 10)).await;
assert_eq!(response.status(), 200);
+ let body_json: serde_json::Value = crate::common::response_helpers::parse_response_value(response, 8192).await;
+ let list = if let Some(d) = body_json.get("data") { d } else { &body_json };
+ assert!(list.is_array(), "expected event list to be an array");
}
#[tokio::test]
@@ -20,6 +23,8 @@ mod tests {
let app_state = crate::get_app_state().await;
let response = EventsService::get_event_by_id(&app_state, "non-existent-uuid-123456789".to_string()).await;
assert_eq!(response.status(), 404);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in NOT_FOUND response");
}
#[tokio::test]
@@ -37,6 +42,8 @@ mod tests {
};
let response = EventsService::create_event(&app_state, event_request).await;
assert_eq!(response.status(), 201);
+ let v = crate::common::response_helpers::parse_response_value(response, 4096).await;
+ assert!(v.get("data").is_some() || v.get("message").is_some(), "expected data or message in CREATED response");
}
#[tokio::test]
@@ -54,6 +61,8 @@ mod tests {
};
let response = EventsService::create_event(&app_state, event_request).await;
assert_eq!(response.status(), 400);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in BAD_REQUEST response");
}
#[tokio::test]
@@ -71,6 +80,8 @@ mod tests {
};
let response = EventsService::update_event(&app_state, "non-existent-uuid-123456789".to_string(), update_request).await;
assert_eq!(response.status(), 400);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in BAD_REQUEST response");
}
#[tokio::test]
@@ -78,6 +89,8 @@ mod tests {
let app_state = crate::get_app_state().await;
let response = EventsService::delete_event(&app_state, "non-existent-uuid-123456789".to_string()).await;
assert_eq!(response.status(), 400);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in BAD_REQUEST response");
}
#[tokio::test]
async fn test_get_event_by_id_service_found() {
@@ -113,8 +126,11 @@ mod tests {
let response = EventsService::get_event_by_id(&app_state, event_id.clone())
.await;
- // Verify response
+ // Verify response (status + body)
assert_eq!(response.status(), 200);
+ let body_json: serde_json::Value = crate::common::response_helpers::parse_response_value(response, 4096).await;
+ let data = body_json.get("data").expect("expected data in OK response").clone();
+ assert_eq!(data["name"].as_str().unwrap(), "Test Event");
// Clean up
let _ = repo.query_delete_event(event_id).await;
@@ -171,6 +187,8 @@ mod tests {
// Verify response
assert_eq!(response.status(), 200);
+ let v = crate::common::response_helpers::parse_response_value(response, 4096).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some() || v.get("data").is_some(), "expected message or data in OK response");
// Verify event was updated in database
let updated_event = repo
@@ -210,6 +228,8 @@ mod tests {
// Verify bad request response (validation error)
assert_eq!(response.status(), 400);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in BAD_REQUEST response");
}
#[tokio::test]
@@ -252,6 +272,8 @@ mod tests {
// Verify response
assert_eq!(response.status(), 200);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some() || v.get("data").is_some(), "expected message or data in OK response");
// Verify event was soft-deleted from database
let deleted_event = repo.query_event_by_id(event_id.clone()).await;
@@ -333,6 +355,9 @@ mod tests {
};
let response = EventsService::get_event_list(&app_state, meta).await;
assert_eq!(response.status(), 200);
+ let body_json: serde_json::Value = crate::common::response_helpers::parse_response_value(response, 8192).await;
+ let list = if let Some(d) = body_json.get("data") { d } else { &body_json };
+ assert!(list.is_array(), "expected event list to be an array");
// Clean up - delete all created events
let events = repo.query_event_list(crate::get_meta_request_dto(1, 10)).await.unwrap();
diff --git a/tests/src/cms/landing/testimonials/testimonials_controller_test.rs b/tests/src/cms/landing/testimonials/testimonials_controller_test.rs
index bdd40af..2341eb4 100644
--- a/tests/src/cms/landing/testimonials/testimonials_controller_test.rs
+++ b/tests/src/cms/landing/testimonials/testimonials_controller_test.rs
@@ -51,6 +51,9 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+ let body_json: serde_json::Value = crate::common::response_helpers::parse_response_value(response, 8192).await;
+ let list = if let Some(d) = body_json.get("data") { d } else { &body_json };
+ assert!(list.is_array(), "expected testimonial list to be an array");
// Clean up
for name in testimonial_names {
@@ -102,6 +105,9 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+ let body_json: serde_json::Value = crate::common::response_helpers::parse_response_value(response, 4096).await;
+ let data = body_json.get("data").expect("expected data in OK response").clone();
+ assert_eq!(data["content"].as_str().unwrap(), "Great testimonial content");
// Clean up
let _ = repo.query_delete_testimonial(testimonial_id).await;
@@ -121,6 +127,8 @@ mod tests {
// Verify not found response
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in NOT_FOUND response");
}
#[tokio::test]
@@ -154,6 +162,8 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::CREATED);
+ let v = crate::common::response_helpers::parse_response_value(response, 4096).await;
+ assert!(v.get("data").is_some() || v.get("message").is_some(), "expected data or message in CREATED response");
// Verify testimonial was created in database
let created_testimonials = repo.query_testimonial_list(get_meta_request_dto(1, 10)).await.unwrap();
@@ -198,6 +208,8 @@ mod tests {
// Verify bad request response (validation error)
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in BAD_REQUEST response");
// Clean up
let _ = UsersRepository::new(&app_state).query_delete_user(user.id.id.to_raw()).await;
@@ -254,6 +266,8 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some() || v.get("data").is_some(), "expected message or data in OK response");
// Verify testimonial was updated in database
let updated_testimonial = repo
@@ -298,6 +312,8 @@ mod tests {
// Verify not found response
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in NOT_FOUND response");
// Clean up
let _ = UsersRepository::new(&app_state).query_delete_user(user.id.id.to_raw()).await;
@@ -349,6 +365,8 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some() || v.get("data").is_some(), "expected message or data in OK response");
// Verify testimonial was soft-deleted from database
let deleted_testimonial = repo.query_testimonial_by_id(testimonial_id.clone()).await;
@@ -382,6 +400,8 @@ mod tests {
// Verify not found response
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in NOT_FOUND response");
// Clean up
let _ = UsersRepository::new(&app_state).query_delete_user(user.id.id.to_raw()).await;
@@ -416,6 +436,8 @@ mod tests {
// Should succeed (boundary)
assert_eq!(response.status(), StatusCode::CREATED);
+ let v = crate::common::response_helpers::parse_response_value(response, 4096).await;
+ assert!(v.get("data").is_some() || v.get("message").is_some(), "expected data or message in CREATED response");
// Verify testimonial was created
let created_testimonials = repo.query_testimonial_list(get_meta_request_dto(1, 10)).await.unwrap();
@@ -460,6 +482,8 @@ mod tests {
// Should fail validation
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in BAD_REQUEST response");
// Clean up
let _ = UsersRepository::new(&app_state).query_delete_user(user.id.id.to_raw()).await;
@@ -494,6 +518,8 @@ mod tests {
// Should fail validation
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in BAD_REQUEST response");
// Clean up
let _ = UsersRepository::new(&app_state).query_delete_user(user.id.id.to_raw()).await;
@@ -548,6 +574,8 @@ mod tests {
// Should succeed
assert_eq!(response.status(), StatusCode::OK);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some() || v.get("data").is_some(), "expected message or data in OK response");
// Verify testimonial was updated
let updated_testimonial = repo
@@ -610,6 +638,8 @@ mod tests {
// Should fail validation
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in BAD_REQUEST response");
// Clean up
let _ = repo.query_delete_testimonial(testimonial_id).await;
diff --git a/tests/src/cms/landing/testimonials/testimonials_service_test.rs b/tests/src/cms/landing/testimonials/testimonials_service_test.rs
index 9a85983..cab0680 100644
--- a/tests/src/cms/landing/testimonials/testimonials_service_test.rs
+++ b/tests/src/cms/landing/testimonials/testimonials_service_test.rs
@@ -49,8 +49,12 @@ mod tests {
let response = TestimonialsService::get_testimonial_list(&app_state, get_meta_request_dto(1, 10))
.await;
- // Verify response
+ // Verify response (status + body)
assert_eq!(response.status(), StatusCode::OK);
+ let body_json: serde_json::Value =
+ crate::common::response_helpers::parse_response_value(response, 8192).await;
+ let list = if let Some(d) = body_json.get("data") { d } else { &body_json };
+ assert!(list.is_array(), "expected testimonial list to be an array");
// Clean up
for content in testimonial_contents {
@@ -105,8 +109,8 @@ mod tests {
assert_eq!(response.status(), StatusCode::OK);
// Verify response body contains correct data
- let body_bytes = response.into_body().collect().await.unwrap().to_bytes();
- let response_body: serde_json::Value = serde_json::from_slice(&body_bytes).unwrap();
+ let response_body: serde_json::Value =
+ crate::common::response_helpers::parse_response_value(response, 8192).await;
assert_eq!(response_body["data"]["content"].as_str().unwrap(), testimonial_content);
// Clean up
@@ -127,6 +131,8 @@ mod tests {
// Verify not found response
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in NOT_FOUND response");
}
#[tokio::test]
@@ -172,6 +178,8 @@ mod tests {
// Verify not found response (service should filter out deleted items)
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in NOT_FOUND response");
// Clean up
let _ = UsersRepository::new(&app_state).query_delete_user(user.id.id.to_raw()).await;
@@ -203,8 +211,11 @@ mod tests {
)
.await;
- // Verify response
+ // Verify response (status + body)
assert_eq!(response.status(), StatusCode::CREATED);
+ let v = crate::common::response_helpers::parse_response_value(response, 4096).await;
+ // either data or message expected depending on implementation
+ assert!(v.get("data").is_some() || v.get("message").is_some(), "expected data or message in CREATED response");
// Verify testimonial was created in database
let created_testimonials = repo.query_testimonial_list(get_meta_request_dto(1, 10)).await.unwrap();
@@ -247,6 +258,8 @@ mod tests {
// Verify bad request response (validation error)
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in BAD_REQUEST response");
// Clean up
let _ = UsersRepository::new(&app_state).query_delete_user(user.id.id.to_raw()).await;
@@ -301,8 +314,10 @@ mod tests {
)
.await;
- // Verify response
+ // Verify response (status + body)
assert_eq!(response.status(), StatusCode::OK);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some() || v.get("data").is_some(), "expected message or data in OK response");
// Verify testimonial was updated in database
let updated_testimonial = repo
@@ -347,6 +362,8 @@ mod tests {
// Verify not found response
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in NOT_FOUND response");
// Clean up
let _ = UsersRepository::new(&app_state).query_delete_user(user.id.id.to_raw()).await;
@@ -403,6 +420,8 @@ mod tests {
// Verify bad request response (should fail because it's deleted)
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in BAD_REQUEST response");
// Clean up
let _ = UsersRepository::new(&app_state).query_delete_user(user.id.id.to_raw()).await;
@@ -453,7 +472,10 @@ mod tests {
.await;
// Verify response
+ // Verify response (status + body)
assert_eq!(response.status(), StatusCode::OK);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some() || v.get("data").is_some(), "expected message or data in OK response");
// Verify testimonial was soft-deleted from database
let deleted_testimonial = repo.query_testimonial_by_id(testimonial_id.clone()).await;
@@ -487,6 +509,8 @@ mod tests {
// Verify bad request response
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in BAD_REQUEST response");
// Clean up
let _ = UsersRepository::new(&app_state).query_delete_user(user.id.id.to_raw()).await;
@@ -537,6 +561,8 @@ mod tests {
// Verify bad request response (should fail because it's already deleted)
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in BAD_REQUEST response");
// Clean up
let _ = UsersRepository::new(&app_state).query_delete_user(user.id.id.to_raw()).await;
diff --git a/tests/src/common/mod.rs b/tests/src/common/mod.rs
new file mode 100644
index 0000000..e1ece5d
--- /dev/null
+++ b/tests/src/common/mod.rs
@@ -0,0 +1 @@
+pub mod response_helpers;
diff --git a/tests/src/common/response_helpers.rs b/tests/src/common/response_helpers.rs
new file mode 100644
index 0000000..dc5451a
--- /dev/null
+++ b/tests/src/common/response_helpers.rs
@@ -0,0 +1,27 @@
+use axum::body::Body;
+use axum::http::Response;
+use axum::body::Bytes;
+use serde::de::DeserializeOwned;
+
+/// Parse a response body into a serde_json::Value
+pub async fn parse_response_value(resp: Response
, limit: usize) -> serde_json::Value {
+ let bytes: Bytes = axum::body::to_bytes(resp.into_body(), limit).await.unwrap();
+ serde_json::from_slice(&bytes).unwrap()
+}
+
+/// Parse a response body into a typed DTO
+pub async fn parse_response(resp: Response, limit: usize) -> T {
+ let bytes: Bytes = axum::body::to_bytes(resp.into_body(), limit).await.unwrap();
+ serde_json::from_slice(&bytes).unwrap()
+}
+
+/// Convenience: parse and return the inner "data" field if the response uses the standard wrapper
+pub async fn parse_response_data(resp: Response, limit: usize) -> T {
+ let v = parse_response_value(resp, limit).await;
+ // If response uses { "data": ... } wrapper, extract it; otherwise try to parse the whole body as T
+ if let Some(inner) = v.get("data") {
+ serde_json::from_value(inner.clone()).unwrap()
+ } else {
+ serde_json::from_value(v).unwrap()
+ }
+}
diff --git a/tests/src/dimentorin/mentors/mentor_registration_tests.rs b/tests/src/dimentorin/mentors/mentor_registration_tests.rs
index e8f8355..34970c0 100644
--- a/tests/src/dimentorin/mentors/mentor_registration_tests.rs
+++ b/tests/src/dimentorin/mentors/mentor_registration_tests.rs
@@ -131,8 +131,8 @@ async fn test_register_new_user_as_mentor_success() {
assert_eq!(response.status(), StatusCode::OK);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let mentor_register_response: MentorRegisterResponseDto = serde_json::from_slice(&body).unwrap();
+ let mentor_register_response: MentorRegisterResponseDto =
+ crate::common::response_helpers::parse_response(response, 8192).await;
assert!(!mentor_register_response.id.is_empty());
assert!(!mentor_register_response.user_id.is_empty());
@@ -232,8 +232,8 @@ async fn test_register_existing_user_as_mentor_success() {
assert_eq!(response.status(), StatusCode::OK);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let mentor_register_response: MentorRegisterResponseDto = serde_json::from_slice(&body).unwrap();
+ let mentor_register_response: MentorRegisterResponseDto =
+ crate::common::response_helpers::parse_response(response, 8192).await;
assert!(!mentor_register_response.id.is_empty());
assert!(!mentor_register_response.user_id.is_empty());
@@ -439,8 +439,8 @@ async fn test_register_mentor_invalid_email_format() {
.unwrap();
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let error_response: serde_json::Value = serde_json::from_slice(&body).unwrap();
+ let error_response: serde_json::Value =
+ crate::common::response_helpers::parse_response_value(response, 8192).await;
assert!(error_response["message"].as_str().unwrap().contains("email"));
}
@@ -502,9 +502,8 @@ async fn test_register_mentor_weak_password() {
.unwrap();
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let error_response: serde_json::Value = serde_json::from_slice(&body).unwrap();
- assert!(error_response["message"].as_str().unwrap().contains("password"));
+ let v = crate::common::response_helpers::parse_response_value(response, 8192).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).map(|s| s.contains("password")).unwrap_or(false));
}
#[tokio::test]
@@ -564,9 +563,8 @@ async fn test_register_mentor_missing_fullname() {
.unwrap();
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let error_response: serde_json::Value = serde_json::from_slice(&body).unwrap();
- assert!(error_response["message"].as_str().unwrap().contains("fullname"));
+ let v = crate::common::response_helpers::parse_response_value(response, 8192).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).map(|s| s.contains("fullname")).unwrap_or(false));
}
#[tokio::test]
@@ -626,9 +624,8 @@ async fn test_register_mentor_missing_phone_number() {
.unwrap();
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let error_response: serde_json::Value = serde_json::from_slice(&body).unwrap();
- assert!(error_response["message"].as_str().unwrap().contains("phone_number"));
+ let v = crate::common::response_helpers::parse_response_value(response, 8192).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).map(|s| s.contains("phone_number")).unwrap_or(false));
}
#[tokio::test]
@@ -689,8 +686,8 @@ async fn test_register_mentor_missing_identity_document_url() {
.unwrap();
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let error_response: serde_json::Value = serde_json::from_slice(&body).unwrap();
+ let error_response: serde_json::Value =
+ crate::common::response_helpers::parse_response_value(response, 8192).await;
assert!(error_response["message"].as_str().unwrap().contains("identity_document_url"));
}
@@ -752,7 +749,6 @@ async fn test_register_mentor_invalid_phone_for_verification_format() {
.unwrap();
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let error_response: serde_json::Value = serde_json::from_slice(&body).unwrap();
- assert!(error_response["message"].as_str().unwrap().contains("phone_for_verification"));
+ let v = crate::common::response_helpers::parse_response_value(response, 8192).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).map(|s| s.contains("phone_for_verification")).unwrap_or(false));
}
\ No newline at end of file
diff --git a/tests/src/dimentorin/mentors/mentors_controller_test.rs b/tests/src/dimentorin/mentors/mentors_controller_test.rs
index 2b8f50c..2bb7139 100644
--- a/tests/src/dimentorin/mentors/mentors_controller_test.rs
+++ b/tests/src/dimentorin/mentors/mentors_controller_test.rs
@@ -133,8 +133,8 @@ async fn test_post_register_mentor_success() {
assert_eq!(response.status(), StatusCode::OK);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let mentor_register_response: MentorRegisterResponseDto = serde_json::from_slice(&body).unwrap();
+ let mentor_register_response: MentorRegisterResponseDto =
+ crate::common::response_helpers::parse_response(response, 4096).await;
assert!(!mentor_register_response.id.is_empty());
assert!(!mentor_register_response.user_id.is_empty());
@@ -172,9 +172,8 @@ async fn test_post_register_mentor_invalid_email() {
.unwrap();
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let error_response: serde_json::Value = serde_json::from_slice(&body).unwrap();
- assert!(error_response["message"].as_str().unwrap().contains("email"));
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).map(|s| s.contains("email")).unwrap_or(false));
}
#[tokio::test]
@@ -199,9 +198,8 @@ async fn test_post_register_mentor_weak_password() {
.unwrap();
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let error_response: serde_json::Value = serde_json::from_slice(&body).unwrap();
- assert!(error_response["message"].as_str().unwrap().contains("password"));
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).map(|s| s.contains("password")).unwrap_or(false));
}
#[tokio::test]
@@ -242,10 +240,9 @@ async fn test_get_mentor_list_success() {
.unwrap();
assert_eq!(response.status(), StatusCode::OK);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let response_data: ResponseSuccessDto> =
- serde_json::from_slice(&body).unwrap();
-
+ let response_data: ResponseSuccessDto> =
+ crate::common::response_helpers::parse_response(response, 4096).await;
+
assert!(!response_data.data.is_empty());
assert_eq!(response_data.data[0].status, "pending".to_string());
@@ -296,7 +293,7 @@ async fn test_get_mentor_by_id_success() {
.unwrap();
assert_eq!(register_response.status(), StatusCode::OK);
- let register_body: MentorRegisterResponseDto = serde_json::from_slice(®ister_response.into_body().collect().await.unwrap().to_bytes()).unwrap();
+ let register_body: MentorRegisterResponseDto = crate::common::response_helpers::parse_response(register_response, 4096).await;
let mentor_id = register_body.id.clone();
// Get mentor by ID with authentication
@@ -314,10 +311,9 @@ async fn test_get_mentor_by_id_success() {
.unwrap();
assert_eq!(response.status(), StatusCode::OK);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let mentor_response: ResponseSuccessDto =
- serde_json::from_slice(&body).unwrap();
-
+ let mentor_response: ResponseSuccessDto =
+ crate::common::response_helpers::parse_response(response, 4096).await;
+
assert_eq!(mentor_response.data.id, mentor_id);
assert_eq!(mentor_response.data.status, "pending".to_string());
assert_eq!(mentor_response.data.fullname, Some("Test Mentor".to_string()));
@@ -373,7 +369,7 @@ async fn test_put_update_mentor_success() {
.unwrap();
assert_eq!(register_response.status(), StatusCode::OK);
- let register_body: MentorRegisterResponseDto = serde_json::from_slice(®ister_response.into_body().collect().await.unwrap().to_bytes()).unwrap();
+ let register_body: MentorRegisterResponseDto = crate::common::response_helpers::parse_response(register_response, 4096).await;
let mentor_id = register_body.id.clone();
// Prepare update DTO
@@ -395,10 +391,9 @@ async fn test_put_update_mentor_success() {
.unwrap();
assert_eq!(response.status(), StatusCode::OK);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let mentor_response: ResponseSuccessDto =
- serde_json::from_slice(&body).unwrap();
-
+ let mentor_response: ResponseSuccessDto =
+ crate::common::response_helpers::parse_response(response, 4096).await;
+
assert_eq!(mentor_response.data.id, mentor_id);
assert_eq!(mentor_response.data.legal_name, Some("Updated Legal Name".to_string()));
assert_eq!(mentor_response.data.current_role, "Lead Engineer".to_string());
@@ -456,7 +451,7 @@ async fn test_delete_mentor_success() {
.unwrap();
assert_eq!(register_response.status(), StatusCode::OK);
- let register_body: MentorRegisterResponseDto = serde_json::from_slice(®ister_response.into_body().collect().await.unwrap().to_bytes()).unwrap();
+ let register_body: MentorRegisterResponseDto = crate::common::response_helpers::parse_response(register_response, 4096).await;
let mentor_id = register_body.id.clone();
// Delete mentor with authentication
@@ -526,7 +521,7 @@ async fn test_put_verify_mentor_success() {
.unwrap();
assert_eq!(register_response.status(), StatusCode::OK);
- let register_body: MentorRegisterResponseDto = serde_json::from_slice(®ister_response.into_body().collect().await.unwrap().to_bytes()).unwrap();
+ let register_body: MentorRegisterResponseDto = crate::common::response_helpers::parse_response(register_response, 4096).await;
let mentor_id = register_body.id.clone();
// Prepare verification DTO
@@ -550,9 +545,8 @@ async fn test_put_verify_mentor_success() {
.unwrap();
assert_eq!(response.status(), StatusCode::OK);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let mentor_response: ResponseSuccessDto =
- serde_json::from_slice(&body).unwrap();
+ let mentor_response: ResponseSuccessDto =
+ crate::common::response_helpers::parse_response(response, 4096).await;
assert_eq!(mentor_response.data.id, mentor_id);
assert_eq!(mentor_response.data.status, "verified".to_string());
@@ -600,9 +594,8 @@ async fn test_get_mentor_me_success() {
.unwrap();
assert_eq!(response.status(), StatusCode::OK);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let mentor_response: ResponseSuccessDto =
- serde_json::from_slice(&body).unwrap();
+ let mentor_response: ResponseSuccessDto =
+ crate::common::response_helpers::parse_response(response, 4096).await;
assert_eq!(mentor_response.data.email, Some(test_email.to_string()));
assert_eq!(mentor_response.data.status, "pending".to_string());
@@ -654,9 +647,8 @@ async fn test_put_update_mentor_me_success() {
.unwrap();
assert_eq!(response.status(), StatusCode::OK);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let mentor_response: ResponseSuccessDto =
- serde_json::from_slice(&body).unwrap();
+ let mentor_response: ResponseSuccessDto =
+ crate::common::response_helpers::parse_response(response, 4096).await;
assert_eq!(mentor_response.data.legal_name, Some("Updated Legal Name".to_string()));
assert_eq!(mentor_response.data.current_role, "Lead Engineer".to_string());
@@ -686,8 +678,7 @@ async fn test_put_update_mentor_no_id() {
.unwrap();
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let error_response: serde_json::Value = serde_json::from_slice(&body).unwrap();
+ let error_response: serde_json::Value = crate::common::response_helpers::parse_response_value(response, 2048).await;
assert_eq!(error_response["message"], "Mentor ID is required for update");
}
@@ -729,8 +720,7 @@ async fn test_get_mentor_status_success() {
.unwrap();
assert_eq!(response.status(), StatusCode::OK);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let status_response: serde_json::Value = serde_json::from_slice(&body).unwrap();
+ let status_response: serde_json::Value = crate::common::response_helpers::parse_response_value(response, 2048).await;
assert_eq!(status_response, "pending");
// Clean up
@@ -760,7 +750,7 @@ async fn test_controller_endpoints_validation() {
.unwrap();
assert_eq!(register_response.status(), StatusCode::OK);
- let register_body: MentorRegisterResponseDto = serde_json::from_slice(®ister_response.into_body().collect().await.unwrap().to_bytes()).unwrap();
+ let register_body: MentorRegisterResponseDto = crate::common::response_helpers::parse_response(register_response, 4096).await;
let mentor_id = register_body.id.clone();
// Prepare invalid update DTO (empty legal name)
@@ -783,8 +773,7 @@ async fn test_controller_endpoints_validation() {
.unwrap();
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let error_response: serde_json::Value = serde_json::from_slice(&body).unwrap();
+ let error_response: serde_json::Value = crate::common::response_helpers::parse_response_value(response, 2048).await;
assert!(error_response["message"].as_str().unwrap().contains("Legal name must be at least 3 characters"));
// Clean up
@@ -877,8 +866,7 @@ async fn test_register_mentor_invalid_urls() {
.unwrap();
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let error_response: serde_json::Value = serde_json::from_slice(&body).unwrap();
+ let error_response: serde_json::Value = crate::common::response_helpers::parse_response_value(response, 2048).await;
assert!(error_response["message"].as_str().unwrap().contains("url"));
}
@@ -911,8 +899,7 @@ async fn test_register_mentor_empty_arrays() {
.unwrap();
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let error_response: serde_json::Value = serde_json::from_slice(&body).unwrap();
+ let error_response: serde_json::Value = crate::common::response_helpers::parse_response_value(response, 2048).await;
assert!(error_response["message"].as_str().unwrap().contains("required"));
}
@@ -995,7 +982,7 @@ async fn test_update_mentor_partial_data() {
.unwrap();
assert_eq!(register_response.status(), StatusCode::OK);
- let register_body: MentorRegisterResponseDto = serde_json::from_slice(®ister_response.into_body().collect().await.unwrap().to_bytes()).unwrap();
+ let register_body: MentorRegisterResponseDto = crate::common::response_helpers::parse_response(register_response, 4096).await;
let mentor_id = register_body.id.clone();
// Update with partial data (only some fields)
@@ -1020,9 +1007,8 @@ async fn test_update_mentor_partial_data() {
.unwrap();
assert_eq!(response.status(), StatusCode::OK);
- let body = response.into_body().collect().await.unwrap().to_bytes();
let mentor_response: ResponseSuccessDto =
- serde_json::from_slice(&body).unwrap();
+ crate::common::response_helpers::parse_response(response, 4096).await;
assert_eq!(mentor_response.data.legal_name, Some("Partial Update".to_string()));
assert_eq!(mentor_response.data.industries, vec!["Updated Industry".to_string()]);
@@ -1054,7 +1040,7 @@ async fn test_access_deleted_mentor() {
.unwrap();
assert_eq!(register_response.status(), StatusCode::OK);
- let register_body: MentorRegisterResponseDto = serde_json::from_slice(®ister_response.into_body().collect().await.unwrap().to_bytes()).unwrap();
+ let register_body: MentorRegisterResponseDto = crate::common::response_helpers::parse_response(register_response, 4096).await;
let mentor_id = register_body.id.clone();
// Delete the mentor
@@ -1193,7 +1179,7 @@ async fn test_verify_mentor_invalid_status() {
.unwrap();
assert_eq!(register_response.status(), StatusCode::OK);
- let register_body: MentorRegisterResponseDto = serde_json::from_slice(®ister_response.into_body().collect().await.unwrap().to_bytes()).unwrap();
+ let register_body: MentorRegisterResponseDto = crate::common::response_helpers::parse_response(register_response, 4096).await;
let mentor_id = register_body.id.clone();
// Try to verify with empty status
@@ -1260,9 +1246,8 @@ async fn test_get_mentor_list_pagination_edge_cases() {
.unwrap();
assert_eq!(response.status(), StatusCode::OK);
- let body = response.into_body().collect().await.unwrap().to_bytes();
let response_data: ResponseSuccessDto> =
- serde_json::from_slice(&body).unwrap();
+ crate::common::response_helpers::parse_response(response, 4096).await;
assert!(response_data.data.is_empty()); // Should be empty for large page
// Test with zero per_page
@@ -1432,7 +1417,7 @@ async fn test_update_mentor_empty_request_body() {
.unwrap();
assert_eq!(register_response.status(), StatusCode::OK);
- let register_body: MentorRegisterResponseDto = serde_json::from_slice(®ister_response.into_body().collect().await.unwrap().to_bytes()).unwrap();
+ let register_body: MentorRegisterResponseDto = crate::common::response_helpers::parse_response(register_response, 4096).await;
let mentor_id = register_body.id.clone();
// Try to update with empty body
diff --git a/tests/src/gacha/gacha_rolls_service_test.rs b/tests/src/gacha/gacha_rolls_service_test.rs
index a66182f..54584de 100644
--- a/tests/src/gacha/gacha_rolls_service_test.rs
+++ b/tests/src/gacha/gacha_rolls_service_test.rs
@@ -37,8 +37,11 @@ mod tests {
// Test get by id
let response = GachaRollService::get_gacha_roll_by_id(&app_state, roll.id.id.to_raw()).await;
- // Verify response
+ // Verify response (status + body)
assert_eq!(response.status(), StatusCode::OK);
+ let v = crate::common::response_helpers::parse_response_value(response, 4096).await;
+ let data = v.get("data").expect("response should contain data");
+ assert_eq!(data["item"]["name"].as_str().unwrap(), "Test Item");
// Clean up
let _ = roll_repo.query_soft_delete_gacha_roll(roll.id.id.to_raw()).await;
@@ -51,8 +54,10 @@ mod tests {
// Test get by non-existent id
let response = GachaRollService::get_gacha_roll_by_id(&app_state, "nonexistent".to_string()).await;
- // Verify response
+ // Verify response (status + body)
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in NOT_FOUND response");
}
#[tokio::test]
@@ -78,8 +83,13 @@ mod tests {
// Create roll via service
let response = GachaRollService::create_gacha_roll(&app_state, roll_dto.clone()).await;
- // Verify response
+ // Verify response (status + body)
assert_eq!(response.status(), StatusCode::CREATED);
+ let v = crate::common::response_helpers::parse_response_value(response, 4096).await;
+ let data = v.get("data").expect("response should contain data");
+ assert_eq!(data["item"]["name"].as_str().unwrap(), "Test Item Create");
+ assert_eq!(data["weight"].as_f64().unwrap(), 1.0);
+ assert_eq!(data["quantity"].as_i64().unwrap(), 10);
// Verify roll was created in database
let rolls = roll_repo.query_all_active_rolls().await.unwrap();
@@ -104,8 +114,10 @@ mod tests {
let response = GachaRollService::create_gacha_roll(&app_state, roll_dto).await;
- // Verify response
+ // Verify response (status + body)
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in BAD_REQUEST response");
}
#[tokio::test]
@@ -130,8 +142,10 @@ mod tests {
let response = GachaRollService::create_gacha_roll(&app_state, roll_dto).await;
- // Verify response - should fail validation
+ // Verify response - should fail validation (status + body)
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in BAD_REQUEST response");
}
#[tokio::test]
@@ -177,8 +191,10 @@ mod tests {
// Execute roll once
let response = GachaRollService::execute_roll_once(headers, &app_state).await;
- // Verify response
+ // Verify response (status + body)
assert_eq!(response.status(), StatusCode::OK);
+ let v = crate::common::response_helpers::parse_response_value(response, 4096).await;
+ assert!(v.get("data").is_some(), "expected data in OK response");
// Clean up
let _ = user_repo.query_delete_user(user.id.id.to_raw()).await;
@@ -212,8 +228,10 @@ mod tests {
// Execute roll once with no active rolls
let response = GachaRollService::execute_roll_once(headers, &app_state).await;
- // Verify response
+ // Verify response (status + body)
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in NOT_FOUND response");
// Clean up
let user = user_repo.query_user_by_email(email).await.unwrap();
@@ -228,8 +246,10 @@ mod tests {
let headers = HeaderMap::new();
let response = GachaRollService::execute_roll_once(headers, &app_state).await;
- // Verify response
+ // Verify response (status + body)
assert_eq!(response.status(), StatusCode::UNAUTHORIZED);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in UNAUTHORIZED response");
}
#[tokio::test]
@@ -256,8 +276,10 @@ mod tests {
// Soft delete roll
let response = GachaRollService::soft_delete_gacha_roll(&app_state, roll.id.id.to_raw()).await;
- // Verify response
+ // Verify response (status + body)
assert_eq!(response.status(), StatusCode::OK);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some() || v.get("data").is_some(), "expected message or data in OK response");
// Verify roll is deleted
let deleted_roll = roll_repo.query_gacha_roll_by_id(roll.id.id.to_raw()).await;
@@ -271,7 +293,9 @@ mod tests {
// Try to delete non-existent roll
let response = GachaRollService::soft_delete_gacha_roll(&app_state, "nonexistent".to_string()).await;
- // Verify response
+ // Verify response (status + body)
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ assert!(v.get("message").and_then(|m| m.as_str()).is_some(), "expected message in NOT_FOUND response");
}
}
\ No newline at end of file
diff --git a/tests/src/hackathon/hackathon_controller_test.rs b/tests/src/hackathon/hackathon_controller_test.rs
index 1994edc..e790890 100644
--- a/tests/src/hackathon/hackathon_controller_test.rs
+++ b/tests/src/hackathon/hackathon_controller_test.rs
@@ -61,8 +61,16 @@ mod tests {
.body(Body::from(request_body.to_string()))
.unwrap();
- let response = router.oneshot(request).await.unwrap();
- assert_eq!(response.status(), StatusCode::CREATED);
+ let response = router.oneshot(request).await.unwrap();
+ assert_eq!(response.status(), StatusCode::CREATED);
+
+ // parse typed response: inner HackathonDto (helper extracts "data" if present)
+ let hackathon: imphnen_hackathon::v1::hackathon::hackathon_dto::HackathonDto =
+ crate::common::response_helpers::parse_response_data(response, 4096).await;
+
+ // Basic field asserts to ensure response contains expected values
+ assert_eq!(hackathon.name, "Controller Test Hackathon");
+ assert_eq!(hackathon.description, "Testing controller endpoints");
}
#[tokio::test]
@@ -89,8 +97,12 @@ mod tests {
.body(Body::from(request_body.to_string()))
.unwrap();
- let response = router.oneshot(request).await.unwrap();
- assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ let response = router.oneshot(request).await.unwrap();
+ assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+
+ // parse typed ErrorDto
+ let err: imphnen_hackathon::ErrorDto = crate::common::response_helpers::parse_response(response, 2048).await;
+ assert_eq!(err.status, StatusCode::BAD_REQUEST.as_u16());
}
#[tokio::test]
@@ -146,8 +158,17 @@ mod tests {
.body(Body::empty())
.unwrap();
- let response = router.oneshot(request).await.unwrap();
- assert_eq!(response.status(), StatusCode::OK);
+ let response = router.oneshot(request).await.unwrap();
+ assert_eq!(response.status(), StatusCode::OK);
+
+ // parse typed list of hackathons (helper extracts inner data if wrapped)
+ let list: Vec =
+ crate::common::response_helpers::parse_response_data(response, 4096).await;
+
+ // if non-empty, ensure items have required fields
+ if !list.is_empty() {
+ assert!(!list[0].id.is_empty());
+ }
}
#[tokio::test]
@@ -236,8 +257,15 @@ mod tests {
.unwrap();
let response = router.oneshot(request).await.unwrap();
- // This will likely fail due to invalid hackathon ID, but tests the endpoint structure
- assert!(response.status() == StatusCode::CREATED || response.status() == StatusCode::NOT_FOUND || response.status() == StatusCode::BAD_REQUEST);
+ let status = response.status();
+ if status == StatusCode::CREATED {
+ // parse created event and assert fields
+ let event: imphnen_hackathon::v1::hackathon::hackathon_dto::HackathonEventDto =
+ crate::common::response_helpers::parse_response_data(response, 2048).await;
+ assert_eq!(event.title, "Controller Event Test");
+ } else {
+ assert!(status == StatusCode::NOT_FOUND || status == StatusCode::BAD_REQUEST);
+ }
}
#[tokio::test]
@@ -391,8 +419,15 @@ mod tests {
.unwrap();
let response = router.oneshot(request).await.unwrap();
- // This will likely fail due to invalid IDs, but tests the endpoint structure
- assert!(response.status() == StatusCode::CREATED || response.status() == StatusCode::NOT_FOUND || response.status() == StatusCode::BAD_REQUEST);
+ // This will likely fail due to invalid IDs, but if created we assert the returned JSON
+ let status = response.status();
+ if status == StatusCode::CREATED {
+ let submission: imphnen_hackathon::v1::hackathon::hackathon_dto::HackathonSubmissionDto =
+ crate::common::response_helpers::parse_response_data(response, 2048).await;
+ assert_eq!(submission.project_name, "Controller Submission Test");
+ } else {
+ assert!(status == StatusCode::NOT_FOUND || status == StatusCode::BAD_REQUEST);
+ }
}
#[tokio::test]
@@ -406,8 +441,16 @@ mod tests {
.unwrap();
let response = router.oneshot(request).await.unwrap();
- // This will likely fail due to invalid hackathon ID, but tests the endpoint structure
- assert!(response.status() == StatusCode::OK || response.status() == StatusCode::NOT_FOUND);
+ let status = response.status();
+ if status == StatusCode::OK {
+ let list: Vec =
+ crate::common::response_helpers::parse_response_data(response, 4096).await;
+ if !list.is_empty() {
+ assert!(!list[0].id.is_empty());
+ }
+ } else {
+ assert_eq!(status, StatusCode::NOT_FOUND);
+ }
}
#[tokio::test]
@@ -428,8 +471,14 @@ mod tests {
.unwrap();
let response = router.oneshot(request).await.unwrap();
- // This will likely fail due to invalid submission ID, but tests the endpoint structure
- assert!(response.status() == StatusCode::OK || response.status() == StatusCode::NOT_FOUND || response.status() == StatusCode::BAD_REQUEST);
+ let status = response.status();
+ if status == StatusCode::OK {
+ let msg: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 2048).await;
+ assert!(msg.message.to_lowercase().contains("updated") || msg.message.to_lowercase().contains("success"));
+ } else {
+ assert!(status == StatusCode::NOT_FOUND || status == StatusCode::BAD_REQUEST);
+ }
}
#[tokio::test]
@@ -443,8 +492,14 @@ mod tests {
.unwrap();
let response = router.oneshot(request).await.unwrap();
- // This will likely fail due to invalid submission ID, but tests the endpoint structure
- assert!(response.status() == StatusCode::OK || response.status() == StatusCode::NOT_FOUND);
+ let status = response.status();
+ if status == StatusCode::OK {
+ let msg: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 2048).await;
+ assert!(msg.message.to_lowercase().contains("submitted") || msg.message.to_lowercase().contains("success"));
+ } else {
+ assert_eq!(status, StatusCode::NOT_FOUND);
+ }
}
#[tokio::test]
@@ -458,7 +513,13 @@ mod tests {
.unwrap();
let response = router.oneshot(request).await.unwrap();
- // This will likely fail due to invalid submission ID, but tests the endpoint structure
- assert!(response.status() == StatusCode::OK || response.status() == StatusCode::NOT_FOUND);
+ let status = response.status();
+ if status == StatusCode::OK {
+ let msg: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 2048).await;
+ assert!(msg.message.to_lowercase().contains("deleted") || msg.message.to_lowercase().contains("success"));
+ } else {
+ assert_eq!(status, StatusCode::NOT_FOUND);
+ }
}
}
\ No newline at end of file
diff --git a/tests/src/iam/auth/auth_controller_test.rs b/tests/src/iam/auth/auth_controller_test.rs
index 2adfdaa..b080fbc 100644
--- a/tests/src/iam/auth/auth_controller_test.rs
+++ b/tests/src/iam/auth/auth_controller_test.rs
@@ -62,11 +62,14 @@ mod tests {
)
.await;
- // Verify response
- assert_eq!(response.status(), StatusCode::OK);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::OK);
- let login_response: ResponseSuccessDto = response.into_body().await.unwrap();
- assert!(login_response.data.is_some());
+ let login_response: ResponseSuccessDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ let data_val = login_response.data.expect("login should return data");
+ // Try to deserialize token structure
+ let token_obj: TokenDto = serde_json::from_value(data_val).expect("login data must be TokenDto");
+ assert!(!token_obj.access_token.is_empty(), "access_token must be present");
// Clean up
let user = repo.query_user_by_email(email.clone()).await.unwrap();
@@ -93,10 +96,10 @@ mod tests {
)
.await;
- // Verify response
- assert_eq!(response.status(), StatusCode::UNAUTHORIZED);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::UNAUTHORIZED);
- let error_response: MessageResponseDto = response.into_body().await.unwrap();
- assert!(error_response.message.contains("Email or password not correct"));
+ let error_response: MessageResponseDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ assert!(error_response.message.to_lowercase().contains("email or password") || error_response.message.to_lowercase().contains("not correct") || error_response.message.to_lowercase().contains("invalid credentials"));
}
}
\ No newline at end of file
diff --git a/tests/src/iam/auth/auth_login_tests.rs b/tests/src/iam/auth/auth_login_tests.rs
index d32f394..48e1821 100644
--- a/tests/src/iam/auth/auth_login_tests.rs
+++ b/tests/src/iam/auth/auth_login_tests.rs
@@ -104,15 +104,13 @@ mod auth_login_tests {
assert_eq!(parts.status, StatusCode::OK);
- let body_bytes = axum::body::to_bytes(body, usize::MAX).await.unwrap();
- let response_json: Value = serde_json::from_slice(&body_bytes).unwrap();
+ let resp = axum::http::Response::from_parts(parts, body);
+ let response_json: Value = crate::common::response_helpers::parse_response_value(resp, usize::MAX).await;
assert!(response_json.get("data").is_some());
assert!(response_json["data"].get("token").is_some());
assert!(response_json["data"]["token"].get("access_token").is_some());
- assert!(response_json["data"]["token"]
- .get("refresh_token")
- .is_some());
+ assert!(response_json["data"]["token"].get("refresh_token").is_some());
assert!(response_json["data"].get("user").is_some());
assert_eq!(response_json["data"]["user"]["email"], email);
}
@@ -127,13 +125,13 @@ mod auth_login_tests {
};
let response = AuthService::mutation_login(login_dto, &state).await; // Corrected call
- let (parts, body) = response.into_parts();
+ let (parts, body) = response.into_parts();
- assert_eq!(parts.status, StatusCode::BAD_REQUEST);
+ assert_eq!(parts.status, StatusCode::BAD_REQUEST);
- let body_bytes = axum::body::to_bytes(body, usize::MAX).await.unwrap();
- let response_json: Value = serde_json::from_slice(&body_bytes).unwrap();
- assert_eq!(response_json["message"], "Email not valid");
+ let resp = axum::http::Response::from_parts(parts, body);
+ let response_json: Value = crate::common::response_helpers::parse_response_value(resp, usize::MAX).await;
+ assert_eq!(response_json["message"], "Email not valid");
}
#[tokio::test]
@@ -146,14 +144,14 @@ mod auth_login_tests {
};
let response = AuthService::mutation_login(login_dto, &state).await; // Corrected call
- let (parts, body) = response.into_parts();
+ let (parts, body) = response.into_parts();
- assert_eq!(parts.status, StatusCode::BAD_REQUEST);
- let body_bytes = axum::body::to_bytes(body, usize::MAX).await.unwrap();
- let response_json: Value = serde_json::from_slice(&body_bytes).unwrap();
- let message = response_json["message"].as_str().unwrap();
- assert!(message.contains("Email cannot be empty"));
- assert!(message.contains("Email not valid"));
+ assert_eq!(parts.status, StatusCode::BAD_REQUEST);
+ let resp = axum::http::Response::from_parts(parts, body);
+ let response_json: Value = crate::common::response_helpers::parse_response_value(resp, usize::MAX).await;
+ let message = response_json["message"].as_str().unwrap();
+ assert!(message.contains("Email cannot be empty"));
+ assert!(message.contains("Email not valid"));
}
#[tokio::test]
@@ -166,12 +164,12 @@ mod auth_login_tests {
};
let response = AuthService::mutation_login(login_dto, &state).await; // Corrected call
- let (parts, body) = response.into_parts();
+ let (parts, body) = response.into_parts();
- assert_eq!(parts.status, StatusCode::BAD_REQUEST);
- let body_bytes = axum::body::to_bytes(body, usize::MAX).await.unwrap();
- let response_json: Value = serde_json::from_slice(&body_bytes).unwrap();
- assert_eq!(response_json["message"], "Password cannot be empty");
+ assert_eq!(parts.status, StatusCode::BAD_REQUEST);
+ let resp = axum::http::Response::from_parts(parts, body);
+ let response_json: Value = crate::common::response_helpers::parse_response_value(resp, usize::MAX).await;
+ assert_eq!(response_json["message"], "Password cannot be empty");
}
#[tokio::test]
@@ -188,14 +186,13 @@ mod auth_login_tests {
};
let response = AuthService::mutation_login(login_dto, &state).await; // Corrected call
- let (parts, body) = response.into_parts();
+ let (parts, body) = response.into_parts();
- assert_eq!(parts.status, StatusCode::BAD_REQUEST);
+ assert_eq!(parts.status, StatusCode::BAD_REQUEST);
+ let resp = axum::http::Response::from_parts(parts, body);
+ let response_json: Value = crate::common::response_helpers::parse_response_value(resp, usize::MAX).await;
- let body_bytes = axum::body::to_bytes(body, usize::MAX).await.unwrap();
- let response_json: Value = serde_json::from_slice(&body_bytes).unwrap();
-
- assert_eq!(response_json["message"], "Email or password not correct");
+ assert_eq!(response_json["message"], "Email or password not correct");
}
#[tokio::test]
@@ -211,13 +208,10 @@ mod auth_login_tests {
let (parts, body) = response.into_parts();
assert_eq!(parts.status, StatusCode::UNAUTHORIZED);
+ let resp = axum::http::Response::from_parts(parts, body);
+ let response_json: Value = crate::common::response_helpers::parse_response_value(resp, usize::MAX).await;
- let body_bytes = axum::body::to_bytes(body, usize::MAX).await.unwrap();
- let response_json: Value = serde_json::from_slice(&body_bytes).unwrap();
-
- assert!(response_json["message"]
- .to_string()
- .contains("User not found"));
+ assert!(response_json["message"].to_string().contains("User not found"));
}
#[tokio::test]
@@ -237,14 +231,10 @@ mod auth_login_tests {
let (parts, body) = response.into_parts();
assert_eq!(parts.status, StatusCode::BAD_REQUEST);
+ let resp = axum::http::Response::from_parts(parts, body);
+ let response_json: Value = crate::common::response_helpers::parse_response_value(resp, usize::MAX).await;
- let body_bytes = axum::body::to_bytes(body, usize::MAX).await.unwrap();
- let response_json: Value = serde_json::from_slice(&body_bytes).unwrap();
-
- assert_eq!(
- response_json["message"],
- "Account not active, please verify your email"
- );
+ assert_eq!(response_json["message"], "Account not active, please verify your email");
}
#[tokio::test]
@@ -261,15 +251,14 @@ mod auth_login_tests {
};
let response = AuthService::mutation_mentor_login(login_dto, &state).await; // Corrected call
- let (parts, body) = response.into_parts();
+ let (parts, body) = response.into_parts();
- assert_eq!(parts.status, StatusCode::OK);
+ assert_eq!(parts.status, StatusCode::OK);
+ let resp = axum::http::Response::from_parts(parts, body);
+ let response_json: Value = crate::common::response_helpers::parse_response_value(resp, usize::MAX).await;
- let body_bytes = axum::body::to_bytes(body, usize::MAX).await.unwrap();
- let response_json: Value = serde_json::from_slice(&body_bytes).unwrap();
-
- assert!(response_json.get("data").is_some());
- assert_eq!(response_json["data"]["user"]["role"]["name"], "Mentor");
+ assert!(response_json.get("data").is_some());
+ assert_eq!(response_json["data"]["user"]["role"]["name"], "Mentor");
}
#[tokio::test]
@@ -289,14 +278,10 @@ mod auth_login_tests {
let (parts, body) = response.into_parts();
assert_eq!(parts.status, StatusCode::FORBIDDEN);
+ let resp = axum::http::Response::from_parts(parts, body);
+ let response_json: Value = crate::common::response_helpers::parse_response_value(resp, usize::MAX).await;
- let body_bytes = axum::body::to_bytes(body, usize::MAX).await.unwrap();
- let response_json: Value = serde_json::from_slice(&body_bytes).unwrap();
-
- assert_eq!(
- response_json["message"],
- "User does not have mentor privileges"
- );
+ assert_eq!(response_json["message"], "User does not have mentor privileges");
}
#[tokio::test]
@@ -316,14 +301,10 @@ mod auth_login_tests {
let (parts, body) = response.into_parts();
assert_eq!(parts.status, StatusCode::BAD_REQUEST);
+ let resp = axum::http::Response::from_parts(parts, body);
+ let response_json: Value = crate::common::response_helpers::parse_response_value(resp, usize::MAX).await;
- let body_bytes = axum::body::to_bytes(body, usize::MAX).await.unwrap();
- let response_json: Value = serde_json::from_slice(&body_bytes).unwrap();
-
- assert_eq!(
- response_json["message"],
- "Account not active, please verify your email"
- );
+ assert_eq!(response_json["message"], "Account not active, please verify your email");
}
#[tokio::test]
@@ -388,10 +369,8 @@ mod auth_login_tests {
// Email should be case-sensitive
assert_eq!(parts.status, StatusCode::UNAUTHORIZED);
- let body_bytes = axum::body::to_bytes(body, usize::MAX).await.unwrap();
- let response_json: Value = serde_json::from_slice(&body_bytes).unwrap();
- assert!(response_json["message"]
- .to_string()
- .contains("User not found"));
+ let resp = axum::http::Response::from_parts(parts, body);
+ let response_json: Value = crate::common::response_helpers::parse_response_value(resp, usize::MAX).await;
+ assert!(response_json["message"].to_string().contains("User not found"));
}
}
diff --git a/tests/src/iam/auth/auth_service_test.rs b/tests/src/iam/auth/auth_service_test.rs
index 84fd27e..c060e09 100644
--- a/tests/src/iam/auth/auth_service_test.rs
+++ b/tests/src/iam/auth/auth_service_test.rs
@@ -43,11 +43,11 @@ mod tests {
let response = imphnen_iam::AuthService::mutation_login(login_request, &app_state).await;
- // Verify response
- assert_eq!(response.status(), StatusCode::OK);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::OK);
- let login_response: ResponseSuccessDto = response.into_body().await.unwrap();
- assert!(login_response.data.is_some());
+ let login_response: ResponseSuccessDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ assert!(login_response.data.is_some());
// Clean up
let user = repo.query_user_by_email(email.clone()).await.unwrap();
@@ -70,11 +70,11 @@ mod tests {
let response = imphnen_iam::AuthService::mutation_login(login_request, &app_state).await;
- // Verify response
- assert_eq!(response.status(), StatusCode::UNAUTHORIZED);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::UNAUTHORIZED);
- let error_response: MessageResponseDto = response.into_body().await.unwrap();
- assert!(error_response.message.contains("Email or password not correct"));
+ let error_response: MessageResponseDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ assert!(error_response.message.contains("Email or password not correct"));
}
#[tokio::test]
@@ -94,11 +94,11 @@ mod tests {
// Register user
let response = imphnen_iam::AuthService::mutation_register(register_request, &app_state).await;
- // Verify response
- assert_eq!(response.status(), StatusCode::CREATED);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::CREATED);
- let response_data: MessageResponseDto = response.into_body().await.unwrap();
- assert_eq!(response_data.message, "User registered successfully, please check your email for OTP verification");
+ let response_data: MessageResponseDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ assert_eq!(response_data.message, "User registered successfully, please check your email for OTP verification");
// Verify user was created in database (should be inactive until OTP verification)
let repo = UsersRepository::new(&app_state);
@@ -137,11 +137,11 @@ mod tests {
let response = imphnen_iam::AuthService::mutation_verify_email(verify_request, &app_state).await;
- // Verify response
- assert_eq!(response.status(), StatusCode::OK);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::OK);
- let response_data: MessageResponseDto = response.into_body().await.unwrap();
- assert_eq!(response_data.message, "Email verified successfully");
+ let response_data: MessageResponseDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ assert_eq!(response_data.message, "Email verified successfully");
// Verify user was activated in database
let updated_user = repo.query_user_by_email(email.clone()).await.unwrap();
@@ -177,11 +177,11 @@ mod tests {
let response = imphnen_iam::AuthService::mutation_resend_otp(resend_request, &app_state).await;
- // Verify response
- assert_eq!(response.status(), StatusCode::OK);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::OK);
- let response_data: MessageResponseDto = response.into_body().await.unwrap();
- assert_eq!(response_data.message, "OTP resent successfully");
+ let response_data: MessageResponseDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ assert_eq!(response_data.message, "OTP resent successfully");
// Clean up
let user = repo.query_user_by_email(email.clone()).await.unwrap();
@@ -224,7 +224,7 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
- let response_data: MessageResponseDto = response.into_body().await.unwrap();
+ let response_data: MessageResponseDto = crate::common::response_helpers::parse_response(response, 8192).await;
assert_eq!(
response_data.message,
"If your email is registered, you will receive a password reset link."
@@ -276,11 +276,11 @@ mod tests {
let response = imphnen_iam::AuthService::mutation_new_password(new_password_request, &app_state).await;
- // Verify response
- assert_eq!(response.status(), StatusCode::OK);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::OK);
- let response_data: MessageResponseDto = response.into_body().await.unwrap();
- assert_eq!(response_data.message, "Password updated successfully");
+ let response_data: MessageResponseDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ assert_eq!(response_data.message, "Password updated successfully");
// Verify password was updated in database
let updated_user = repo.query_user_by_email(email.clone()).await.unwrap();
@@ -324,10 +324,10 @@ mod tests {
password: password.clone(),
};
- let login_response = imphnen_iam::AuthService::mutation_login(login_request, &app_state).await;
-
- let login_response_data: ResponseSuccessDto = login_response.into_body().await.unwrap();
- let refresh_token = login_response_data.data.as_ref().unwrap().token.refresh_token.clone();
+ let login_response = imphnen_iam::AuthService::mutation_login(login_request, &app_state).await;
+
+ let login_response_data: ResponseSuccessDto = crate::common::response_helpers::parse_response(login_response, 8192).await;
+ let refresh_token = login_response_data.data.as_ref().unwrap().token.refresh_token.clone();
// Refresh token
let refresh_request = AuthRefreshTokenRequestDto {
@@ -336,14 +336,14 @@ mod tests {
let response = imphnen_iam::AuthService::mutation_refresh_token(refresh_request, &app_state).await;
- // Verify response
- assert_eq!(response.status(), StatusCode::OK);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::OK);
- let response_data: ResponseSuccessDto = response.into_body().await.unwrap();
- assert!(response_data.data.is_some());
- let token_data = response_data.data.as_ref().unwrap();
- assert!(token_data.access_token.is_some());
- assert!(token_data.refresh_token.is_some());
+ let response_data: ResponseSuccessDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ assert!(response_data.data.is_some());
+ let token_data = response_data.data.as_ref().unwrap();
+ assert!(token_data.access_token.is_some());
+ assert!(token_data.refresh_token.is_some());
// Clean up
let user = repo.query_user_by_email(email.clone()).await.unwrap();
@@ -383,11 +383,11 @@ mod tests {
let response = imphnen_iam::AuthService::mutation_mentor_login(login_request, &app_state).await;
- // Verify response
- assert_eq!(response.status(), StatusCode::OK);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::OK);
- let login_response: ResponseSuccessDto = response.into_body().await.unwrap();
- assert!(login_response.data.is_some());
+ let login_response: ResponseSuccessDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ assert!(login_response.data.is_some());
// Clean up
let user = repo.query_user_by_email(email.clone()).await.unwrap();
@@ -427,11 +427,11 @@ mod tests {
let response = imphnen_iam::AuthService::mutation_mentor_login(login_request, &app_state).await;
- // Verify response
- assert_eq!(response.status(), StatusCode::FORBIDDEN);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::FORBIDDEN);
- let error_response: MessageResponseDto = response.into_body().await.unwrap();
- assert_eq!(error_response.message, "User does not have mentor privileges");
+ let error_response: MessageResponseDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ assert_eq!(error_response.message, "User does not have mentor privileges");
// Clean up
let user = repo.query_user_by_email(email.clone()).await.unwrap();
@@ -469,11 +469,11 @@ mod tests {
let response = imphnen_iam::AuthService::mutation_login(login_request, &app_state).await;
- // Verify response
- assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let error_response: MessageResponseDto = response.into_body().await.unwrap();
- assert!(error_response.message.contains("Account not active"));
+ let error_response: MessageResponseDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ assert!(error_response.message.contains("Account not active"));
// Clean up
let user = repo.query_user_by_email(email.clone()).await.unwrap();
@@ -515,11 +515,11 @@ mod tests {
let response = imphnen_iam::AuthService::mutation_register(register_request, &app_state).await;
- // Verify response
- assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let error_response: MessageResponseDto = response.into_body().await.unwrap();
- assert_eq!(error_response.message, "User already exists");
+ let error_response: MessageResponseDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ assert_eq!(error_response.message, "User already exists");
// Clean up
let user = repo.query_user_by_email(email.clone()).await.unwrap();
@@ -571,11 +571,11 @@ mod tests {
let response = imphnen_iam::AuthService::mutation_verify_email(verify_request, &app_state).await;
- // Verify response
- assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let response_data: MessageResponseDto = response.into_body().await.unwrap();
- assert_eq!(response_data.message, "Failed to verify OTP");
+ let response_data: MessageResponseDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ assert_eq!(response_data.message, "Failed to verify OTP");
// Verify user still inactive
let user = repo.query_user_by_email(email.clone()).await.unwrap();
@@ -614,11 +614,11 @@ mod tests {
// Try to verify again
let response = imphnen_iam::AuthService::mutation_verify_email(verify_request, &app_state).await;
- // Verify response
- assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let response_data: MessageResponseDto = response.into_body().await.unwrap();
- assert_eq!(response_data.message, "User already active");
+ let response_data: MessageResponseDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ assert_eq!(response_data.message, "User already active");
// Clean up
let user = repo.query_user_by_email(email.clone()).await.unwrap();
@@ -639,11 +639,11 @@ mod tests {
let response = imphnen_iam::AuthService::mutation_resend_otp(resend_request, &app_state).await;
- // Verify response
- assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let response_data: MessageResponseDto = response.into_body().await.unwrap();
- assert_eq!(response_data.message, "User not found");
+ let response_data: MessageResponseDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ assert_eq!(response_data.message, "User not found");
}
#[tokio::test]
@@ -663,7 +663,7 @@ mod tests {
// Verify response - should still return success for security
assert_eq!(response.status(), StatusCode::OK);
- let response_data: MessageResponseDto = response.into_body().await.unwrap();
+ let response_data: MessageResponseDto = crate::common::response_helpers::parse_response(response, 8192).await;
assert_eq!(
response_data.message,
"If your email is registered, you will receive a password reset link."
@@ -685,11 +685,11 @@ mod tests {
let response = imphnen_iam::AuthService::mutation_new_password(new_password_request, &app_state).await;
- // Verify response
- assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let response_data: MessageResponseDto = response.into_body().await.unwrap();
- assert_eq!(response_data.message, "Invalid or missing token");
+ let response_data: MessageResponseDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ assert_eq!(response_data.message, "Invalid or missing token");
}
#[tokio::test]
@@ -703,11 +703,11 @@ mod tests {
let response = imphnen_iam::AuthService::mutation_refresh_token(refresh_request, &app_state).await;
- // Verify response
- assert_eq!(response.status(), StatusCode::UNAUTHORIZED);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::UNAUTHORIZED);
- let error_response: MessageResponseDto = response.into_body().await.unwrap();
- assert_eq!(error_response.message, "Invalid refresh token");
+ let error_response: MessageResponseDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ assert_eq!(error_response.message, "Invalid refresh token");
}
#[tokio::test]
@@ -743,11 +743,11 @@ mod tests {
let response = imphnen_iam::AuthService::mutation_mentor_login(login_request, &app_state).await;
- // Verify response
- assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let error_response: MessageResponseDto = response.into_body().await.unwrap();
- assert!(error_response.message.contains("Account not active"));
+ let error_response: MessageResponseDto = crate::common::response_helpers::parse_response(response, 8192).await;
+ assert!(error_response.message.contains("Account not active"));
// Clean up
let user = repo.query_user_by_email(email.clone()).await.unwrap();
diff --git a/tests/src/iam/auth/google/google_oauth_flow_test.rs b/tests/src/iam/auth/google/google_oauth_flow_test.rs
index 83b980c..68af6d8 100644
--- a/tests/src/iam/auth/google/google_oauth_flow_test.rs
+++ b/tests/src/iam/auth/google/google_oauth_flow_test.rs
@@ -182,8 +182,8 @@ mod tests {
let response = app.oneshot(request).await.unwrap();
assert_eq!(response.status(), StatusCode::OK);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let json_body: AuthLoginResponsetDto = serde_json::from_slice(&body).unwrap();
+ let json_body: AuthLoginResponsetDto =
+ crate::common::response_helpers::parse_response(response, 8192).await;
assert_eq!(json_body.token.access_token, expected_access_token);
assert_eq!(json_body.token.refresh_token, expected_refresh_token);
assert_eq!(json_body.user.email, user_email);
@@ -271,8 +271,8 @@ mod tests {
let response = app.oneshot(request).await.unwrap();
assert_eq!(response.status(), StatusCode::OK);
- let body = response.into_body().collect().await.unwrap().to_bytes();
- let json_body: AuthLoginResponsetDto = serde_json::from_slice(&body).unwrap();
+ let json_body: AuthLoginResponsetDto =
+ crate::common::response_helpers::parse_response(response, 8192).await;
assert_eq!(json_body.token.access_token, expected_access_token);
assert_eq!(json_body.token.refresh_token, expected_refresh_token);
assert_eq!(json_body.user.email, user_email);
diff --git a/tests/src/iam/permissions/permissions_controller_test.rs b/tests/src/iam/permissions/permissions_controller_test.rs
index 12aebce..5a1eb42 100644
--- a/tests/src/iam/permissions/permissions_controller_test.rs
+++ b/tests/src/iam/permissions/permissions_controller_test.rs
@@ -29,6 +29,11 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::CREATED);
+ // Verify response body contains success message
+ let msg: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(msg.message.to_lowercase().contains("created") || msg.message.to_lowercase().contains("success"));
+
// Verify permission was created in database
let created_permission = repo
.query_permission_by_name(permission_name)
diff --git a/tests/src/iam/permissions/permissions_service_test.rs b/tests/src/iam/permissions/permissions_service_test.rs
index daf01e8..8921888 100644
--- a/tests/src/iam/permissions/permissions_service_test.rs
+++ b/tests/src/iam/permissions/permissions_service_test.rs
@@ -29,6 +29,11 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::CREATED);
+ // Verify response body contains created permission
+ let created: PermissionsSchema =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert_eq!(created.name, permission_name);
+
// Verify permission was created in database
let created_permission = repo
.query_permission_by_name(permission_name)
@@ -71,6 +76,11 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+ // Verify response body contains permission
+ let body: PermissionsSchema =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert_eq!(body.id.id.to_raw(), permission_id);
+
// Clean up
let _ = repo.query_delete_permission(permission_id).await;
}
@@ -112,6 +122,11 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+ // Verify response body contains updated permission
+ let body: PermissionsSchema =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert_eq!(body.name, new_name);
+
// Verify permission was updated in database
let updated_permission = repo
.query_permission_by_id(permission_id.clone())
@@ -148,242 +163,215 @@ mod tests {
let exists_before = repo.query_permission_by_id(permission_id.clone()).await.is_ok();
assert!(exists_before);
- // Delete permission through service
- let response = imphnen_iam::PermissionsService::delete_permission(
- &app_state, permission_id.clone(),
- )
- .await;
+ #[cfg(test)]
+ mod tests {
+ use axum::http::StatusCode;
+ use imphnen_iam::{
+ PermissionsCreateRequestDto, PermissionsUpdateRequestDto, PermissionsSchema,
+ };
- // Verify response
- assert_eq!(response.status(), StatusCode::OK);
+ #[tokio::test]
+ async fn test_create_permission_service() {
+ let app_state = crate::get_app_state().await;
+ let repo = imphnen_iam::PermissionsRepository::new(&app_state);
- // Verify permission was deleted from database
- let exists_after = repo.query_permission_by_id(permission_id).await.is_ok();
- assert!(!exists_after);
- }
-}
+ let permission_name = "test_permission_service".to_string();
+ let permission_request = PermissionsCreateRequestDto { name: permission_name.clone() };
- #[tokio::test]
- async fn test_get_permission_by_id_service_not_found() {
- let app_state = crate::get_app_state().await;
+ let response = imphnen_iam::PermissionsService::create_role(&app_state, permission_request.clone()).await;
+ assert_eq!(response.status(), StatusCode::CREATED);
- // Use non-existent ID
- let non_existent_id = "non-existent-uuid-123456789".to_string();
+ let created: PermissionsSchema = crate::common::response_helpers::parse_response(response, 1024).await;
+ assert_eq!(created.name, permission_name);
- // Get non-existent permission by ID through service
- let response = imphnen_iam::PermissionsService::get_permission_by_id(
- &app_state, non_existent_id,
- )
- .await;
+ let created_permission = repo.query_permission_by_name(permission_name).await.unwrap();
+ let _ = repo.query_delete_permission(created_permission.id.id.to_raw()).await;
+ }
- // Verify not found response
- assert_eq!(response.status(), StatusCode::NOT_FOUND);
- }
+ #[tokio::test]
+ async fn test_get_permission_by_id_service() {
+ let app_state = crate::get_app_state().await;
+ let repo = imphnen_iam::PermissionsRepository::new(&app_state);
- #[tokio::test]
- async fn test_update_permission_service_not_found() {
- let app_state = crate::get_app_state().await;
+ let permission_name = "test_permission_by_id_service".to_string();
+ let permission = PermissionsSchema { name: permission_name.clone(), ..Default::default() };
+ let _ = repo.query_create_permission(permission.clone()).await;
- // Use non-existent ID
- let non_existent_id = "non-existent-uuid-123456789".to_string();
+ let created_permission = repo.query_permission_by_name(permission_name).await.unwrap();
+ let permission_id = created_permission.id.id.to_raw();
- // Prepare update request
- let update_request = PermissionsUpdateRequestDto {
- name: Some("new_name".to_string()),
- };
+ let response = imphnen_iam::PermissionsService::get_permission_by_id(&app_state, permission_id.clone()).await;
+ assert_eq!(response.status(), StatusCode::OK);
- // Update non-existent permission through service
- let response = imphnen_iam::PermissionsService::update_permission(
- &app_state, update_request, non_existent_id,
- )
- .await;
+ let body: PermissionsSchema = crate::common::response_helpers::parse_response(response, 1024).await;
+ assert_eq!(body.id.id.to_raw(), permission_id);
- // Verify not found response
- assert_eq!(response.status(), StatusCode::NOT_FOUND);
- }
+ let _ = repo.query_delete_permission(permission_id).await;
+ }
- #[tokio::test]
- async fn test_delete_permission_service_not_found() {
- let app_state = crate::get_app_state().await;
+ #[tokio::test]
+ async fn test_update_permission_service() {
+ let app_state = crate::get_app_state().await;
+ let repo = imphnen_iam::PermissionsRepository::new(&app_state);
- // Use non-existent ID
- let non_existent_id = "non-existent-uuid-123456789".to_string();
+ let original_name = "test_permission_update_original_service".to_string();
+ let new_name = "test_permission_update_updated_service".to_string();
+ let permission = PermissionsSchema { name: original_name.clone(), ..Default::default() };
+ let _ = repo.query_create_permission(permission.clone()).await;
- // Delete non-existent permission through service
- let response = imphnen_iam::PermissionsService::delete_permission(
- &app_state, non_existent_id,
- )
- .await;
+ let created_permission = repo.query_permission_by_name(original_name).await.unwrap();
+ let permission_id = created_permission.id.id.to_raw();
- // Verify not found response
- assert_eq!(response.status(), StatusCode::NOT_FOUND);
- #[tokio::test]
- async fn test_create_permission_service_duplicate_name() {
- let app_state = crate::get_app_state().await;
- let repo = imphnen_iam::PermissionsRepository::new(&app_state);
+ let update_request = PermissionsUpdateRequestDto { name: Some(new_name.clone()) };
+ let response = imphnen_iam::PermissionsService::update_permission(&app_state, update_request, permission_id.clone()).await;
+ assert_eq!(response.status(), StatusCode::OK);
- // Test data
- let permission_name = "test_permission_duplicate_service".to_string();
- let permission_request = PermissionsCreateRequestDto {
- name: permission_name.clone(),
- };
+ let body: PermissionsSchema = crate::common::response_helpers::parse_response(response, 1024).await;
+ assert_eq!(body.name, new_name);
- // Create permission first
- let response1 = imphnen_iam::PermissionsService::create_role(
- &app_state,
- permission_request.clone(),
- )
- .await;
- assert_eq!(response1.status(), StatusCode::CREATED);
+ let _ = repo.query_delete_permission(permission_id).await;
+ }
- // Try to create again with same name
- let response2 = imphnen_iam::PermissionsService::create_role(
- &app_state,
- permission_request,
- )
- .await;
+ #[tokio::test]
+ async fn test_delete_permission_service() {
+ let app_state = crate::get_app_state().await;
+ let repo = imphnen_iam::PermissionsRepository::new(&app_state);
- // Verify response - should fail
- assert_eq!(response2.status(), StatusCode::CONFLICT);
+ let permission_name = "test_permission_delete_service".to_string();
+ let permission = PermissionsSchema { name: permission_name.clone(), ..Default::default() };
+ let _ = repo.query_create_permission(permission.clone()).await;
- let error_response: crate::MessageResponseDto = response2.into_body().await.unwrap();
- assert_eq!(error_response.message, "Permission name already exists");
+ let created_permission = repo.query_permission_by_name(permission_name).await.unwrap();
+ let permission_id = created_permission.id.id.to_raw();
- // Clean up
- let created_permission = repo
- .query_permission_by_name(permission_name)
- .await
- .unwrap();
- let _ = repo.query_delete_permission(created_permission.id.id.to_raw()).await;
- }
+ let response = imphnen_iam::PermissionsService::delete_permission(&app_state, permission_id.clone()).await;
+ assert_eq!(response.status(), StatusCode::OK);
- #[tokio::test]
- async fn test_get_permission_list_service() {
- let app_state = crate::get_app_state().await;
- let repo = imphnen_iam::PermissionsRepository::new(&app_state);
+ let msg: crate::MessageResponseDto = crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(msg.message.to_lowercase().contains("deleted") || msg.message.to_lowercase().contains("success"));
- // Create test permission
- let permission_name = "test_permission_list_service".to_string();
- let permission = PermissionsSchema {
- name: permission_name.clone(),
- ..Default::default()
- };
- let create_result = repo.query_create_permission(permission.clone()).await;
- assert!(create_result.is_ok());
+ let exists_after = repo.query_permission_by_id(permission_id).await.is_ok();
+ assert!(!exists_after);
+ }
- // Get permission list through service
- let meta = imphnen_iam::MetaRequestDto {
- page: Some(1),
- limit: Some(10),
- ..Default::default()
- };
- let response = imphnen_iam::PermissionsService::get_permission_list(
- &app_state, meta,
- )
- .await;
+ #[tokio::test]
+ async fn test_get_permission_by_id_service_not_found() {
+ let app_state = crate::get_app_state().await;
+ let non_existent_id = "non-existent-uuid-123456789".to_string();
- // Verify response
- assert_eq!(response.status(), StatusCode::OK);
+ let response = imphnen_iam::PermissionsService::get_permission_by_id(&app_state, non_existent_id).await;
+ assert_eq!(response.status(), StatusCode::NOT_FOUND);
- // Clean up
- let created_permission = repo
- .query_permission_by_name(permission_name)
- .await
- .unwrap();
- let _ = repo.query_delete_permission(created_permission.id.id.to_raw()).await;
- }
+ let err: crate::MessageResponseDto = crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(err.message.to_lowercase().contains("not found") || err.message.to_lowercase().contains("permission not found"));
+ }
- #[tokio::test]
- async fn test_update_permission_service_duplicate_name() {
- let app_state = crate::get_app_state().await;
- let repo = imphnen_iam::PermissionsRepository::new(&app_state);
+ #[tokio::test]
+ async fn test_update_permission_service_not_found() {
+ let app_state = crate::get_app_state().await;
+ let non_existent_id = "non-existent-uuid-123456789".to_string();
- // Create two test permissions
- let permission_name1 = "test_permission_update_dup1_service".to_string();
- let permission_name2 = "test_permission_update_dup2_service".to_string();
+ let update_request = PermissionsUpdateRequestDto { name: Some("new_name".to_string()) };
+ let response = imphnen_iam::PermissionsService::update_permission(&app_state, update_request, non_existent_id).await;
+ assert_eq!(response.status(), StatusCode::NOT_FOUND);
- let permission1 = PermissionsSchema {
- name: permission_name1.clone(),
- ..Default::default()
- };
- let permission2 = PermissionsSchema {
- name: permission_name2.clone(),
- ..Default::default()
- };
+ let err: crate::MessageResponseDto = crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(err.message.to_lowercase().contains("not found") || err.message.to_lowercase().contains("permission not found"));
+ }
- let create_result1 = repo.query_create_permission(permission1.clone()).await;
- assert!(create_result1.is_ok());
- let create_result2 = repo.query_create_permission(permission2.clone()).await;
- assert!(create_result2.is_ok());
+ #[tokio::test]
+ async fn test_delete_permission_service_not_found() {
+ let app_state = crate::get_app_state().await;
+ let non_existent_id = "non-existent-uuid-123456789".to_string();
- // Get created permissions
- let created_permission1 = repo
- .query_permission_by_name(permission_name1.clone())
- .await
- .unwrap();
- let permission_id1 = created_permission1.id.id.to_raw();
+ let response = imphnen_iam::PermissionsService::delete_permission(&app_state, non_existent_id).await;
+ assert_eq!(response.status(), StatusCode::NOT_FOUND);
- // Try to update permission1 to have same name as permission2
- let update_request = PermissionsUpdateRequestDto {
- name: Some(permission_name2.clone()),
- };
+ let err: crate::MessageResponseDto = crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(err.message.to_lowercase().contains("not found") || err.message.to_lowercase().contains("permission not found"));
+ }
- let response = imphnen_iam::PermissionsService::update_permission(
- &app_state, update_request, permission_id1.clone(),
- )
- .await;
+ #[tokio::test]
+ async fn test_create_permission_service_duplicate_name() {
+ let app_state = crate::get_app_state().await;
+ let repo = imphnen_iam::PermissionsRepository::new(&app_state);
- // Verify response - should fail
- assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+ let permission_name = "test_permission_duplicate_service".to_string();
+ let permission_request = PermissionsCreateRequestDto { name: permission_name.clone() };
- let error_response: crate::MessageResponseDto = response.into_body().await.unwrap();
- assert!(error_response.message.contains("not found") || error_response.message.contains("Permission not found"));
+ let response1 = imphnen_iam::PermissionsService::create_role(&app_state, permission_request.clone()).await;
+ assert_eq!(response1.status(), StatusCode::CREATED);
- // Clean up
- let _ = repo.query_delete_permission(permission_id1).await;
- let created_permission2 = repo
- .query_permission_by_name(permission_name2)
- .await
- .unwrap();
- let _ = repo.query_delete_permission(created_permission2.id.id.to_raw()).await;
- }
+ let response2 = imphnen_iam::PermissionsService::create_role(&app_state, permission_request).await;
+ assert_eq!(response2.status(), StatusCode::CONFLICT);
- #[tokio::test]
- async fn test_update_permission_service_no_changes() {
- let app_state = crate::get_app_state().await;
- let repo = imphnen_iam::PermissionsRepository::new(&app_state);
+ let error_response: crate::MessageResponseDto = crate::common::response_helpers::parse_response(response2, 1024).await;
+ assert_eq!(error_response.message, "Permission name already exists");
- // Create test permission
- let permission_name = "test_permission_no_change_service".to_string();
- let permission = PermissionsSchema {
- name: permission_name.clone(),
- ..Default::default()
- };
- let create_result = repo.query_create_permission(permission.clone()).await;
- assert!(create_result.is_ok());
+ let created_permission = repo.query_permission_by_name("test_permission_duplicate_service".to_string()).await.unwrap();
+ let _ = repo.query_delete_permission(created_permission.id.id.to_raw()).await;
+ }
- // Get created permission to get ID
- let created_permission = repo
- .query_permission_by_name(permission_name)
- .await
- .unwrap();
- let permission_id = created_permission.id.id.to_raw();
+ #[tokio::test]
+ async fn test_get_permission_list_service() {
+ let app_state = crate::get_app_state().await;
+ let repo = imphnen_iam::PermissionsRepository::new(&app_state);
- // Update with no changes
- let update_request = PermissionsUpdateRequestDto {
- name: None, // No changes
- };
+ let permission_name = "test_permission_list_service".to_string();
+ let permission = PermissionsSchema { name: permission_name.clone(), ..Default::default() };
+ let _ = repo.query_create_permission(permission.clone()).await;
- let response = imphnen_iam::PermissionsService::update_permission(
- &app_state, update_request, permission_id.clone(),
- )
- .await;
+ let meta = imphnen_iam::MetaRequestDto { page: Some(1), limit: Some(10), ..Default::default() };
+ let response = imphnen_iam::PermissionsService::get_permission_list(&app_state, meta).await;
+ assert_eq!(response.status(), StatusCode::OK);
- // Verify response - should succeed
- assert_eq!(response.status(), StatusCode::OK);
+ let created_permission = repo.query_permission_by_name(permission_name).await.unwrap();
+ let _ = repo.query_delete_permission(created_permission.id.id.to_raw()).await;
+ }
- // Clean up
- let _ = repo.query_delete_permission(permission_id).await;
- }
- }
-}
\ No newline at end of file
+ #[tokio::test]
+ async fn test_update_permission_service_duplicate_name() {
+ let app_state = crate::get_app_state().await;
+ let repo = imphnen_iam::PermissionsRepository::new(&app_state);
+
+ let permission_name1 = "test_permission_update_dup1_service".to_string();
+ let permission_name2 = "test_permission_update_dup2_service".to_string();
+ let permission1 = PermissionsSchema { name: permission_name1.clone(), ..Default::default() };
+ let permission2 = PermissionsSchema { name: permission_name2.clone(), ..Default::default() };
+ let _ = repo.query_create_permission(permission1.clone()).await;
+ let _ = repo.query_create_permission(permission2.clone()).await;
+
+ let created_permission1 = repo.query_permission_by_name(permission_name1.clone()).await.unwrap();
+ let permission_id1 = created_permission1.id.id.to_raw();
+
+ let update_request = PermissionsUpdateRequestDto { name: Some(permission_name2.clone()) };
+ let response = imphnen_iam::PermissionsService::update_permission(&app_state, update_request, permission_id1.clone()).await;
+ assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+
+ let error_response: crate::MessageResponseDto = crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(error_response.message.contains("not found") || error_response.message.contains("Permission not found"));
+
+ let _ = repo.query_delete_permission(permission_id1).await;
+ let created_permission2 = repo.query_permission_by_name(permission_name2).await.unwrap();
+ let _ = repo.query_delete_permission(created_permission2.id.id.to_raw()).await;
+ }
+
+ #[tokio::test]
+ async fn test_update_permission_service_no_changes() {
+ let app_state = crate::get_app_state().await;
+ let repo = imphnen_iam::PermissionsRepository::new(&app_state);
+
+ let permission_name = "test_permission_no_change_service".to_string();
+ let permission = PermissionsSchema { name: permission_name.clone(), ..Default::default() };
+ let _ = repo.query_create_permission(permission.clone()).await;
+
+ let created_permission = repo.query_permission_by_name(permission_name).await.unwrap();
+ let permission_id = created_permission.id.id.to_raw();
+
+ let update_request = PermissionsUpdateRequestDto { name: None };
+ let response = imphnen_iam::PermissionsService::update_permission(&app_state, update_request, permission_id.clone()).await;
+ assert_eq!(response.status(), StatusCode::OK);
+
+ let _ = repo.query_delete_permission(permission_id).await;
+ }
+ }
\ No newline at end of file
diff --git a/tests/src/iam/roles/roles_controller_test.rs b/tests/src/iam/roles/roles_controller_test.rs
index bebc676..f5280e6 100644
--- a/tests/src/iam/roles/roles_controller_test.rs
+++ b/tests/src/iam/roles/roles_controller_test.rs
@@ -29,6 +29,10 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::CREATED);
+ let msg: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(msg.message.to_lowercase().contains("created") || msg.message.to_lowercase().contains("success"));
+
// Verify role was created in database
let created_role = repo
.query_role_by_name(role_name)
@@ -70,6 +74,10 @@ mod tests {
// Verify conflict response
assert_eq!(response2.status(), StatusCode::CONFLICT);
+ let err: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response2, 1024).await;
+ assert!(err.message.to_lowercase().contains("already exists") || err.message.to_lowercase().contains("duplicate"));
+
// Clean up
let created_role = repo
.query_role_by_name(role_name)
@@ -109,6 +117,15 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ // Expect wrapped { data: [...] } or raw array. Normalize to array and check created roles are present
+ let list_val = if let Some(d) = v.get("data") { d.clone() } else { v };
+ let arr = list_val.as_array().expect("role list should be an array");
+ let names: Vec = arr.iter().filter_map(|it| it.get("name").and_then(|n| n.as_str()).map(|s| s.to_string())).collect();
+ for name in ["test_role_list_1", "test_role_list_2", "test_role_list_3"].iter() {
+ assert!(names.contains(&name.to_string()), "expected role {} in list", name);
+ }
+
// Clean up
for name in role_names {
let role = repo.query_role_by_name(name).await.unwrap();
@@ -147,6 +164,12 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+ let v = crate::common::response_helpers::parse_response_value(response, 1024).await;
+ // Expect wrapped { data: {...} } or direct object. Extract and assert name
+ let obj = if let Some(d) = v.get("data") { d.clone() } else { v };
+ let name = obj.get("name").and_then(|n| n.as_str()).expect("role object must have name");
+ assert_eq!(name, "test_role_by_id");
+
// Clean up
let _ = repo.query_delete_role(role_id).await;
}
@@ -166,6 +189,10 @@ async fn test_get_role_by_id_controller_not_found() {
// Verify not found response
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+
+ let err: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(err.message.to_lowercase().contains("not found"));
}
#[tokio::test]
@@ -207,6 +234,10 @@ async fn test_get_role_by_id_controller_not_found() {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+ let msg: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(msg.message.to_lowercase().contains("updated") || msg.message.to_lowercase().contains("success"));
+
// Verify role was updated in database
let updated_role = repo
.query_role_by_id(role_id.clone())
@@ -240,6 +271,10 @@ async fn test_get_role_by_id_controller_not_found() {
// Verify not found response
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+
+ let err: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(err.message.to_lowercase().contains("not found"));
}
#[tokio::test]
@@ -277,6 +312,10 @@ async fn test_get_role_by_id_controller_not_found() {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+ let msg: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(msg.message.to_lowercase().contains("deleted") || msg.message.to_lowercase().contains("success"));
+
// Verify role was deleted from database
let exists_after = repo.query_role_by_id(role_id).await.is_ok();
assert!(!exists_after);
@@ -297,5 +336,9 @@ async fn test_get_role_by_id_controller_not_found() {
// Verify not found response
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+
+ let err: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(err.message.to_lowercase().contains("not found"));
}
}
\ No newline at end of file
diff --git a/tests/src/iam/roles/roles_service_test.rs b/tests/src/iam/roles/roles_service_test.rs
index ef395b8..98a2e26 100644
--- a/tests/src/iam/roles/roles_service_test.rs
+++ b/tests/src/iam/roles/roles_service_test.rs
@@ -28,6 +28,11 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::CREATED);
+ // Verify response body contains success message
+ let msg: MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(msg.message.to_lowercase().contains("created") || msg.message.to_lowercase().contains("success"));
+
// Verify role was created in database
let created_role = repo
.query_role_by_name(role_name.clone())
@@ -69,6 +74,18 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+ // parse response value and handle wrapped {"data": ...} or object
+ let v = crate::common::response_helpers::parse_response_value(response, 1024).await;
+ if let Some(inner) = v.get("data") {
+ // attempt to deserialize into detail DTO if present
+ let _role: imphnen_iam::v1::roles::roles_dto::RolesDetailItemDto =
+ serde_json::from_value(inner.clone()).unwrap_or_else(|_| {
+ panic!("Response 'data' couldn't be deserialized into RolesDetailItemDto: {}", inner)
+ });
+ } else {
+ assert!(v.is_object());
+ }
+
// Clean up
let _ = repo.query_delete_role(role_id).await;
}
@@ -112,6 +129,10 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+ let msg: MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(msg.message.to_lowercase().contains("updated") || msg.message.to_lowercase().contains("success"));
+
// Verify role was updated in database
let updated_role = repo
.query_role_by_id(role_id.clone())
@@ -157,6 +178,10 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+ let msg: MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(msg.message.to_lowercase().contains("deleted") || msg.message.to_lowercase().contains("success"));
+
// Verify role was deleted from database
let exists_after = repo.query_role_by_id(role_id).await.is_ok();
assert!(!exists_after);
@@ -190,6 +215,22 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+ let v = crate::common::response_helpers::parse_response_value(response, 1024).await;
+ if let Some(inner) = v.get("data") {
+ let list: imphnen_entities::ResponseListSuccessDto> =
+ serde_json::from_value(inner.clone()).unwrap_or(imphnen_entities::ResponseListSuccessDto { data: vec![], meta: None });
+ if !list.data.is_empty() {
+ assert!(!list.data[0].id.is_empty());
+ }
+ } else if v.is_array() {
+ let arr: Vec = serde_json::from_value(v).unwrap_or_default();
+ if !arr.is_empty() {
+ assert!(!arr[0].id.is_empty());
+ }
+ } else {
+ // accept other object shapes
+ }
+
// Clean up
let created_role = repo
.query_role_by_name(role_name.clone())
@@ -228,10 +269,8 @@ mod tests {
// Verify response - should fail
assert_eq!(response2.status(), StatusCode::CONFLICT);
- let body = response2.into_body();
- let body_bytes = axum::body::to_bytes(body, 1024).await.unwrap();
- let body_str = std::str::from_utf8(&body_bytes).unwrap();
- let error_response: MessageResponseDto = serde_json::from_str(body_str).unwrap();
+ let error_response: MessageResponseDto =
+ crate::common::response_helpers::parse_response(response2, 1024).await;
assert_eq!(error_response.message, "Role name already exists");
// Clean up
@@ -287,10 +326,8 @@ mod tests {
// Verify response - should fail
assert_eq!(response.status(), StatusCode::CONFLICT);
- let body = response.into_body();
- let body_bytes = axum::body::to_bytes(body, 1024).await.unwrap();
- let body_str = std::str::from_utf8(&body_bytes).unwrap();
- let error_response: MessageResponseDto = serde_json::from_str(body_str).unwrap();
+ let error_response: MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 1024).await;
assert_eq!(error_response.message, "Role name already exists");
// Clean up
@@ -317,6 +354,9 @@ mod tests {
// Verify not found response
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+
+ let err: MessageResponseDto = crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(err.message.to_lowercase().contains("not found") || err.message.to_lowercase().contains("role not found"));
}
#[tokio::test]
@@ -339,8 +379,11 @@ mod tests {
)
.await;
- // Verify not found response
+ // Verify not found response and message
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+
+ let err: MessageResponseDto = crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(err.message.to_lowercase().contains("not found") || err.message.to_lowercase().contains("role not found"));
}
#[tokio::test]
@@ -358,5 +401,8 @@ mod tests {
// Verify not found response
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+
+ let err: MessageResponseDto = crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(err.message.to_lowercase().contains("not found") || err.message.to_lowercase().contains("role not found"));
}
}
\ No newline at end of file
diff --git a/tests/src/iam/teams/admin_teams_controller_tests.rs b/tests/src/iam/teams/admin_teams_controller_tests.rs
index a759b5a..43324a7 100644
--- a/tests/src/iam/teams/admin_teams_controller_tests.rs
+++ b/tests/src/iam/teams/admin_teams_controller_tests.rs
@@ -115,13 +115,9 @@ async fn test_admin_team_endpoints_sensitive_data_exposure() {
assert!(response.status().is_success(), "Admin team list should return success");
- let response_body = match response.into_body().into_string().await {
- Ok(body) => body,
- Err(e) => panic!("Failed to read response body: {}", e),
- };
-
- let response_json: ResponseListSuccessDto> =
- serde_json::from_str(&response_body).unwrap();
+ let v = crate::common::response_helpers::parse_response_value(response, 8192).await;
+ let response_json: ResponseListSuccessDto> =
+ serde_json::from_value(v).unwrap();
// Verify sensitive fields are present in admin response
assert!(response_json.data.iter().any(|team| {
@@ -140,14 +136,9 @@ async fn test_admin_team_endpoints_sensitive_data_exposure() {
assert!(response.status().is_success(), "Admin team detail should return success");
- let response_body = match response.into_body().into_string().await {
- Ok(body) => body,
- Err(e) => panic!("Failed to read response body: {}", e),
- };
-
- let response_json: ResponseSuccessDto =
- serde_json::from_str(&response_body).unwrap();
-
+ let v = crate::common::response_helpers::parse_response_value(response, 8192).await;
+ let response_json: ResponseSuccessDto =
+ serde_json::from_value(v).unwrap();
let admin_team = response_json.data;
// Verify sensitive fields are present
@@ -175,14 +166,9 @@ async fn test_admin_team_endpoints_sensitive_data_exposure() {
assert!(response.status().is_success(), "Admin team members should return success");
- let response_body = match response.into_body().into_string().await {
- Ok(body) => body,
- Err(e) => panic!("Failed to read response body: {}", e),
- };
-
- let response_json: ResponseSuccessDto> =
- serde_json::from_str(&response_body).unwrap();
-
+ let v = crate::common::response_helpers::parse_response_value(response, 8192).await;
+ let response_json: ResponseSuccessDto> =
+ serde_json::from_value(v).unwrap();
let admin_members = response_json.data;
// Verify all members have sensitive info
@@ -264,6 +250,12 @@ async fn test_admin_team_endpoints_permission_guard() {
).await;
assert_eq!(response.status().as_u16(), 403, "Regular user should get forbidden for admin endpoints");
+ // Also assert response body contains a permission/forbidden message
+ let v = crate::common::response_helpers::parse_response_value(response, 1024).await;
+ let msg = v.get("message").and_then(|m| m.as_str()).unwrap_or("");
+ let msg_l = msg.to_lowercase();
+ assert!(msg_l.contains("forbidden") || msg_l.contains("permission") || msg_l.contains("not authorized") || msg_l.contains("unauthorized"),
+ "permission guard response should include a forbidden/permission message");
// Clean up
let _ = repo.query_delete_team(team_id).await;
diff --git a/tests/src/iam/teams/teams_controller_test.rs b/tests/src/iam/teams/teams_controller_test.rs
index 29a15b5..aa04da9 100644
--- a/tests/src/iam/teams/teams_controller_test.rs
+++ b/tests/src/iam/teams/teams_controller_test.rs
@@ -42,6 +42,13 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::CREATED);
+ // Expect a response with data containing the created team id and stats
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ // If wrapped in { "data": ... }, extract
+ let data = if let Some(d) = v.get("data") { d.clone() } else { v };
+ assert!(data.get("team_id").is_some(), "create response must include team_id");
+ assert!(data.get("invitations_sent").is_some(), "create response should report invitations_sent");
+
// Verify team was created in database
let team_thing = make_thing_from_enum(ResourceEnum::Teams, &user.id.id.to_raw());
let teams = repo.query_user_teams(&team_thing).await.unwrap();
@@ -98,6 +105,12 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+ let v = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ let inner = v.get("data").expect("get team should return data field").clone();
+ let team: imphnen_iam::v1::teams::teams_dto::TeamsDetailResponseDto =
+ serde_json::from_value(inner).expect("response data must deserialize to TeamsDetailResponseDto");
+ assert_eq!(team.name, "Test Get Team");
+
// Clean up
let _ = repo.query_delete_team(team_id).await;
let _ = users_repo.query_delete_user(user.id.id.to_raw()).await;
@@ -117,6 +130,10 @@ mod tests {
// Verify not found response
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+
+ let err: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(err.message.to_lowercase().contains("not found") || err.message.to_lowercase().contains("team not found"));
}
}
@@ -176,6 +193,10 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+ let msg: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 2048).await;
+ assert!(msg.message.to_lowercase().contains("updated") || msg.message.to_lowercase().contains("success"));
+
// Verify team was updated in database
let updated_team = repo.query_team_by_id(&team_thing).await.unwrap();
assert_eq!(updated_team.name, "Updated Team Name");
@@ -240,6 +261,10 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+ let msg: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(msg.message.to_lowercase().contains("deleted") || msg.message.to_lowercase().contains("success"));
+
// Verify team was deleted from database
let exists_after = repo.query_team_by_id(&team_thing).await.is_ok();
assert!(!exists_after);
@@ -300,6 +325,15 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+ let body_json: serde_json::Value = crate::common::response_helpers::parse_response_value(response, 2048).await;
+ // Expect a list wrapper with data -> array
+ let list = if let Some(d) = body_json.get("data") { d } else { &body_json };
+ assert!(list.is_array(), "search should return array of teams");
+ let found = list.as_array().unwrap().iter().any(|item| {
+ if let Some(name) = item.get("name") { name == "Searchable Test Team" } else { false }
+ });
+ assert!(found, "created team should appear in search results");
+
// Clean up
let _ = repo.query_delete_team(team_id).await;
let _ = users_repo.query_delete_user(user.id.id.to_raw()).await;
diff --git a/tests/src/iam/teams/teams_service_test.rs b/tests/src/iam/teams/teams_service_test.rs
index e249853..68d31b1 100644
--- a/tests/src/iam/teams/teams_service_test.rs
+++ b/tests/src/iam/teams/teams_service_test.rs
@@ -19,6 +19,15 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+
+ let v = crate::common::response_helpers::parse_response_value(response, 4096).await;
+ // normalize { data: [...] } or raw array
+ let list_val = if let Some(d) = v.get("data") { d.clone() } else { v };
+ let arr = list_val.as_array().expect("team list should be an array");
+ if !arr.is_empty() {
+ let first = &arr[0];
+ assert!(first.get("id").is_some() || first.get("name").is_some(), "team items should have id or name");
+ }
}
#[tokio::test]
@@ -35,6 +44,14 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+
+ let v = crate::common::response_helpers::parse_response_value(response, 4096).await;
+ let list_val = if let Some(d) = v.get("data") { d.clone() } else { v };
+ let arr = list_val.as_array().expect("public team list should be an array");
+ if !arr.is_empty() {
+ let first = &arr[0];
+ assert!(first.get("id").is_some() || first.get("name").is_some(), "public team items should have id or name");
+ }
}
#[tokio::test]
@@ -49,6 +66,10 @@ mod tests {
// Verify response - should fail validation
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+
+ let err: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(err.message.to_lowercase().contains("invalid") || err.message.to_lowercase().contains("uuid"));
}
#[tokio::test]
@@ -63,6 +84,10 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+
+ let err: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(err.message.to_lowercase().contains("not found"));
}
#[tokio::test]
@@ -77,6 +102,10 @@ mod tests {
// Verify response - should fail validation
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+
+ let err: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(err.message.to_lowercase().contains("invalid") || err.message.to_lowercase().contains("uuid"));
}
#[tokio::test]
@@ -91,6 +120,10 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+
+ let err: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 1024).await;
+ assert!(err.message.to_lowercase().contains("not found"));
}
#[tokio::test]
@@ -110,6 +143,14 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+
+ let v = crate::common::response_helpers::parse_response_value(response, 4096).await;
+ let list_val = if let Some(d) = v.get("data") { d.clone() } else { v };
+ let arr = list_val.as_array().expect("search should return array");
+ if !arr.is_empty() {
+ let first = &arr[0];
+ assert!(first.get("id").is_some() || first.get("name").is_some(), "search item should have id or name");
+ }
}
#[tokio::test]
@@ -126,6 +167,11 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::OK);
+
+ // Expect admin list response body contains array data
+ let v = crate::common::response_helpers::parse_response_value(response, 4096).await;
+ let list_val = if let Some(d) = v.get("data") { d.clone() } else { v };
+ let _arr = list_val.as_array().expect("admin team list should be an array");
}
#[tokio::test]
diff --git a/tests/src/iam/users/users_controller_test.rs b/tests/src/iam/users/users_controller_test.rs
index 465b6b2..c46d2a1 100644
--- a/tests/src/iam/users/users_controller_test.rs
+++ b/tests/src/iam/users/users_controller_test.rs
@@ -37,6 +37,10 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::CREATED);
+ let msg: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 4096).await;
+ assert!(msg.message.to_lowercase().contains("created") || msg.message.to_lowercase().contains("success"));
+
// Verify user was created in database
let created_user = repo
.query_user_by_email(email.clone())
diff --git a/tests/src/iam/users/users_service_test.rs b/tests/src/iam/users/users_service_test.rs
index f798933..c5255b9 100644
--- a/tests/src/iam/users/users_service_test.rs
+++ b/tests/src/iam/users/users_service_test.rs
@@ -21,8 +21,26 @@ mod tests {
};
let response = UsersService::get_user_list(&app_state, meta).await;
- // Verify response
- assert_eq!(response.status(), StatusCode::OK);
+ // Verify response
+ assert_eq!(response.status(), StatusCode::OK);
+
+ // Parse raw JSON value first to handle wrapped or unwrapped list responses
+ let v = crate::common::response_helpers::parse_response_value(response, 4096).await;
+ if let Some(inner) = v.get("data") {
+ // wrapped response
+ let list: imphnen_entities::ResponseListSuccessDto> =
+ serde_json::from_value(inner.clone()).unwrap_or(imphnen_entities::ResponseListSuccessDto { data: vec![], meta: None });
+ if !list.data.is_empty() {
+ assert!(!list.data[0].id.is_empty());
+ }
+ } else if v.is_array() {
+ let arr: Vec = serde_json::from_value(v).unwrap_or_default();
+ if !arr.is_empty() {
+ assert!(!arr[0].id.is_empty());
+ }
+ } else {
+ // other shapes (object without data) — accept for now
+ }
}
#[tokio::test]
@@ -37,6 +55,10 @@ mod tests {
// Verify response - should fail validation
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+
+ let err: MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 4096).await;
+ assert!(err.message.to_lowercase().contains("invalid") || err.message.to_lowercase().contains("uuid"));
}
#[tokio::test]
@@ -51,6 +73,10 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+
+ let err: MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 4096).await;
+ assert!(err.message.to_lowercase().contains("not found") || err.message.to_lowercase().contains("user not found"));
}
#[tokio::test]
@@ -78,6 +104,11 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::CREATED);
+ // Verify response body contains success message
+ let created_msg: imphnen_entities::MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 4096).await;
+ assert!(created_msg.message.to_lowercase().contains("created") || created_msg.message.to_lowercase().contains("success"));
+
// Verify user was created in database
let created_user = repo.query_user_by_email(email.clone()).await.unwrap();
assert_eq!(created_user.email, email);
@@ -149,10 +180,9 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
- let body = response.into_body();
- let body_bytes = axum::body::to_bytes(body, 1024).await.unwrap();
- let error_response: MessageResponseDto = serde_json::from_slice(&body_bytes).unwrap();
- assert_eq!(error_response.message, "Email not valid");
+ let err: MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 4096).await;
+ assert!(err.message.to_lowercase().contains("email") || err.message.to_lowercase().contains("not valid"));
// Clean up
let user = repo.query_user_by_email(email.clone()).await.unwrap();
@@ -200,6 +230,10 @@ mod tests {
// Verify response - should fail validation
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+
+ let err: MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 4096).await;
+ assert!(err.message.to_lowercase().contains("invalid") || err.message.to_lowercase().contains("uuid"));
}
#[tokio::test]
@@ -243,6 +277,10 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+
+ let err: MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 4096).await;
+ assert!(err.message.to_lowercase().contains("not found") || err.message.to_lowercase().contains("user not found"));
}
#[tokio::test]
@@ -257,6 +295,10 @@ mod tests {
// Verify response - should fail validation
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+
+ let err: MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 4096).await;
+ assert!(err.message.to_lowercase().contains("invalid") || err.message.to_lowercase().contains("uuid"));
}
#[tokio::test]
@@ -271,6 +313,10 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+
+ let err: MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 4096).await;
+ assert!(err.message.to_lowercase().contains("not found") || err.message.to_lowercase().contains("user not found") || err.message.to_lowercase().contains("bad request"));
}
#[tokio::test]
@@ -285,6 +331,10 @@ mod tests {
// Verify response - should fail validation
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+
+ let err: MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 4096).await;
+ assert!(err.message.to_lowercase().contains("invalid") || err.message.to_lowercase().contains("uuid") || err.message.to_lowercase().contains("not found"));
}
#[tokio::test]
@@ -299,5 +349,9 @@ mod tests {
// Verify response
assert_eq!(response.status(), StatusCode::NOT_FOUND);
+
+ let err: MessageResponseDto =
+ crate::common::response_helpers::parse_response(response, 4096).await;
+ assert!(err.message.to_lowercase().contains("not found") || err.message.to_lowercase().contains("mentor"));
}
}
\ No newline at end of file
diff --git a/tests/src/lib.rs b/tests/src/lib.rs
index 79fc4cf..de4dbc4 100644
--- a/tests/src/lib.rs
+++ b/tests/src/lib.rs
@@ -59,6 +59,7 @@ pub fn create_test_user(
pub mod iam;
pub mod hackathon;
pub mod mock_test;
+pub mod common;
pub use mock_test::{
cleanup_db, create_mock_app_state, seed_permissions_and_roles_for_test,