feat: success test

This commit is contained in:
Maulana Sodiqin
2025-03-30 14:13:45 +07:00
parent 0816566d03
commit 3ae9dbd717
5 changed files with 87 additions and 36 deletions
+17 -10
View File
@@ -38,6 +38,8 @@ async fn test_list_users_should_fail_with_invalid_page() {
.layer(Extension(state));
let server = TestServer::new(app).unwrap();
let res = server.get("/v1/users?page=0&per_page=10").await;
dbg!(res.text());
dbg!(res.status_code());
assert_eq!(res.status_code(), StatusCode::BAD_REQUEST);
}
@@ -114,7 +116,7 @@ async fn test_create_user_should_return_201() {
let server = TestServer::new(app).unwrap();
let payload = UsersCreateRequestDto {
fullname: "Create Data #1".into(),
email: "test@create.com".into(),
email: format!("test-{}@create.com", Uuid::new_v4()).into(),
role_id,
password: "Password1!".into(),
student_type: "general".into(),
@@ -247,9 +249,10 @@ async fn test_update_user_should_return_200() {
.nest("/v1/users", users_router())
.layer(Extension(state.clone()));
let server = TestServer::new(app).unwrap();
let unique_email = format!("update_{}@test.com", Uuid::new_v4());
let payload = UsersCreateRequestDto {
fullname: "Old Name".into(),
email: "update@test.com".into(),
email: unique_email.clone(),
password: "Password1!".into(),
role_id: role_id.clone(),
student_type: "general".into(),
@@ -258,15 +261,16 @@ async fn test_update_user_should_return_200() {
referral_code: None,
referred_by: None,
};
server.post("/v1/users/create").json(&payload).await;
let user = repo.query_user_by_email(payload.email).await.unwrap();
let create_res = server.post("/v1/users/create").json(&payload).await;
assert_eq!(create_res.status_code(), StatusCode::CREATED);
let user = repo.query_user_by_email(unique_email).await.unwrap();
let user_id = user.id.id.to_raw();
let update_payload = UsersUpdateRequestDto {
fullname: "Updated Name".into(),
email: "update@test.com".into(),
email: payload.email.clone(),
student_type: "general".into(),
phone_number: "081234567890".into(),
role_id: role_id.clone(),
role_id: user.role.id.id.to_raw(),
is_active: true,
referral_code: None,
referred_by: None,
@@ -281,7 +285,8 @@ async fn test_update_user_should_return_200() {
.json(&update_payload)
.await;
let status = res.status_code();
assert_eq!(status, StatusCode::OK);
let body = res.text();
assert_eq!(status, StatusCode::OK, "Response body: {}", body);
}
#[tokio::test]
@@ -297,9 +302,10 @@ async fn test_create_user_should_fail_if_email_taken() {
.nest("/v1/users", users_router())
.layer(Extension(state.clone()));
let server = TestServer::new(app).unwrap();
let email = format!("test_{}@example.com", Uuid::new_v4());
let payload = UsersCreateRequestDto {
fullname: "User Satu".into(),
email: "taken@example.com".into(),
email: email.clone(),
password: "Password1!".into(),
student_type: "general".into(),
role_id,
@@ -362,7 +368,7 @@ async fn test_delete_user_should_fail_if_already_deleted() {
let res2 = server.delete(&format!("/v1/users/delete/{}", id)).await;
assert_eq!(res2.status_code(), StatusCode::BAD_REQUEST);
let body = res2.text();
assert!(body.contains("User not found"));
assert!(body.contains("User already deleted"));
}
#[tokio::test]
@@ -531,6 +537,7 @@ async fn test_user_detail_should_fail_if_user_is_soft_deleted() {
let user_id = user.id.id.to_raw();
let _ = repo.query_delete_user(user_id.clone()).await.unwrap();
let res = server.get(&format!("/v1/users/detail/{}", user_id)).await;
dbg!(res.text());
assert_eq!(res.status_code(), StatusCode::NOT_FOUND);
let body = res.text();
assert!(body.contains("User not found"));
@@ -586,7 +593,7 @@ async fn test_update_user_should_fail_if_user_is_deleted() {
.await;
assert_eq!(res.status_code(), StatusCode::BAD_REQUEST);
let body = res.text();
assert!(body.contains("User not found"));
assert!(body.contains("User already deleted"));
}
#[tokio::test]
+12 -4
View File
@@ -7,7 +7,7 @@ use crate::{
PermissionsItemDto, PermissionsItemDtoRaw, ResourceEnum, ResponseListSuccessDto,
RolesItemDto, RolesItemDtoRaw,
};
use anyhow::{bail, Result};
use anyhow::{anyhow, bail, Result};
pub struct UsersRepository<'a> {
state: &'a AppState,
@@ -45,7 +45,14 @@ impl<'a> UsersRepository<'a> {
};
let limit = meta.per_page.unwrap_or(10);
let start = (meta.page.unwrap_or(1) - 1) * limit;
let page = meta.page.unwrap_or(1);
// Validate pagination parameters explicitly
if page < 1 || limit < 1 {
return Err(anyhow!("Invalid pagination parameters"));
}
let start = (page - 1) * limit;
let select_query = format!(
"
@@ -98,7 +105,7 @@ impl<'a> UsersRepository<'a> {
referral_code: user.referral_code,
student_type: user.student_type,
is_active: user.is_active,
role: user.role.unwrap_or_else(|| "-".into()), // Handle role safely
role: user.role.unwrap_or_else(|| "-".into()),
})
.collect::<Vec<_>>();
@@ -247,6 +254,7 @@ impl<'a> UsersRepository<'a> {
let merged = UsersSchema {
password: existing.password,
created_at: existing.created_at,
role: make_thing("app_roles", &existing.role.id),
..data.clone()
};
let record: Option<UsersSchema> = db.update(record_key).merge(merged).await?;
@@ -264,7 +272,7 @@ impl<'a> UsersRepository<'a> {
let db = &self.state.surrealdb_ws;
let user = self.query_user_by_email(email.clone()).await?;
if user.is_deleted {
bail!("User not found");
bail!("User already deleted");
}
let record_key = get_id(&user.id)?;
let record: Option<UsersSchema> = db
+1 -1
View File
@@ -210,7 +210,7 @@ async fn test_delete_user_twice_should_fail_on_second_attempt() {
assert!(first.is_ok());
let second = repo.query_delete_user(user.id.id.to_raw()).await;
assert!(second.is_err());
assert_eq!(second.unwrap_err().to_string(), "User not found");
assert_eq!(second.unwrap_err().to_string(), "User already deleted");
}
#[tokio::test]
+2 -1
View File
@@ -35,7 +35,7 @@ impl UsersService {
pub async fn get_user_by_id(state: &AppState, id: String) -> Response {
let repo = UsersRepository::new(state);
match repo.query_user_by_id(id).await {
Ok(user) => success_response(ResponseSuccessDto {
Ok(user) if !user.is_deleted => success_response(ResponseSuccessDto {
data: UsersDetailItemDto {
id: user.id,
role: user.role,
@@ -54,6 +54,7 @@ impl UsersService {
birthdate: user.birthdate,
},
}),
Ok(_) => common_response(StatusCode::NOT_FOUND, "User not found"),
Err(e) => common_response(StatusCode::NOT_FOUND, &e.to_string()),
}
}