218 lines
6.7 KiB
Rust
218 lines
6.7 KiB
Rust
use crate::create_mock_app_state;
|
|
use crate::{
|
|
make_thing, MetaRequestDto, UsersActiveInactiveSchema, UsersRepository,
|
|
UsersSchema, UsersSetNewPasswordSchema,
|
|
};
|
|
use surrealdb::Uuid;
|
|
|
|
fn create_test_user(email: &str, fullname: &str, is_active: bool) -> UsersSchema {
|
|
UsersSchema {
|
|
id: make_thing("app_users", &Uuid::new_v4().to_string()),
|
|
email: email.to_string(),
|
|
fullname: fullname.to_string(),
|
|
password: "password".to_string(),
|
|
is_deleted: false,
|
|
avatar: None,
|
|
phone_number: "081234567890".to_string(),
|
|
referral_code: None,
|
|
referred_by: None,
|
|
identity_number: None,
|
|
is_active,
|
|
student_type: "general".to_string(),
|
|
religion: None,
|
|
gender: None,
|
|
birthdate: None,
|
|
is_profile_completed: false,
|
|
role: make_thing("roles", "user"),
|
|
created_at: None,
|
|
updated_at: None,
|
|
}
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_create_and_get_user() {
|
|
let app_state = create_mock_app_state().await;
|
|
let repo = UsersRepository::new(&app_state);
|
|
let user = create_test_user("testuser@example.com", "Test User", true);
|
|
let create_result = repo.query_create_user(user.clone()).await;
|
|
assert!(create_result.is_ok());
|
|
let fetched = repo
|
|
.query_user_by_email("testuser@example.com".into())
|
|
.await;
|
|
assert!(fetched.is_ok());
|
|
assert_eq!(fetched.unwrap().email, "testuser@example.com");
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_update_password_user() {
|
|
let app_state = create_mock_app_state().await;
|
|
let repo = UsersRepository::new(&app_state);
|
|
let email = "changepass@example.com";
|
|
let user = create_test_user(email, "Change Password", true);
|
|
repo.query_create_user(user).await.unwrap();
|
|
let result = repo
|
|
.query_update_password_user(
|
|
email.into(),
|
|
UsersSetNewPasswordSchema {
|
|
password: "newpass".into(),
|
|
},
|
|
)
|
|
.await;
|
|
assert!(result.is_ok());
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_query_user_list_with_pagination_and_filter() {
|
|
let app_state = create_mock_app_state().await;
|
|
let repo = UsersRepository::new(&app_state);
|
|
for i in 0..10 {
|
|
let email = format!("user{}@example.com", i);
|
|
let fullname = format!("User {}", i);
|
|
let is_active = i % 2 == 0;
|
|
let user = create_test_user(&email, &fullname, is_active);
|
|
repo.query_create_user(user).await.unwrap();
|
|
}
|
|
let meta = MetaRequestDto {
|
|
page: Some(1),
|
|
per_page: Some(5),
|
|
search: None,
|
|
sort_by: Some("email".into()),
|
|
order: Some("ASC".into()),
|
|
filter: Some("true".into()),
|
|
filter_by: Some("is_active".into()),
|
|
};
|
|
let result = repo.query_user_list(meta).await.unwrap();
|
|
assert!(result.data.len() <= 5);
|
|
assert!(result.data.iter().all(|u| u.is_active));
|
|
assert!(result.meta.as_ref().unwrap().total.is_some());
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_query_user_list_basic() {
|
|
let app_state = create_mock_app_state().await;
|
|
let repo = UsersRepository::new(&app_state);
|
|
for i in 0..10 {
|
|
let email = format!("basic{}@example.com", i);
|
|
let user = create_test_user(&email, &format!("Basic User {}", i), true);
|
|
repo.query_create_user(user).await.unwrap();
|
|
}
|
|
let meta = MetaRequestDto {
|
|
page: Some(1),
|
|
per_page: Some(5),
|
|
search: None,
|
|
sort_by: None,
|
|
order: None,
|
|
filter: None,
|
|
filter_by: None,
|
|
};
|
|
let result = repo.query_user_list(meta).await.unwrap();
|
|
assert!(result.meta.as_ref().unwrap().total.unwrap() >= 1);
|
|
assert_eq!(result.meta.as_ref().unwrap().page.unwrap(), 1);
|
|
assert_eq!(result.meta.as_ref().unwrap().per_page.unwrap(), 5);
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_query_active_inactive_user() {
|
|
let app_state = create_mock_app_state().await;
|
|
let repo = UsersRepository::new(&app_state);
|
|
let email = "inactive@example.com";
|
|
let user = create_test_user(email, "Inactive User", false);
|
|
repo.query_create_user(user).await.unwrap();
|
|
let result = repo
|
|
.query_active_inactive_user(
|
|
email.into(),
|
|
UsersActiveInactiveSchema { is_active: true },
|
|
)
|
|
.await;
|
|
assert!(result.is_ok());
|
|
let updated = repo
|
|
.query_user_by_email("inactive@example.com".into())
|
|
.await
|
|
.unwrap();
|
|
assert_eq!(updated.is_active, true);
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_query_user_by_invalid_email_should_fail() {
|
|
let app_state = create_mock_app_state().await;
|
|
let repo = UsersRepository::new(&app_state);
|
|
let result = repo
|
|
.query_user_by_email("nonexistent@example.com".into())
|
|
.await;
|
|
assert!(result.is_err());
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_query_update_password_for_nonexistent_user_should_fail() {
|
|
let app_state = create_mock_app_state().await;
|
|
let repo = UsersRepository::new(&app_state);
|
|
let result = repo
|
|
.query_update_password_user(
|
|
"ghost@example.com".into(),
|
|
UsersSetNewPasswordSchema {
|
|
password: "secret".into(),
|
|
},
|
|
)
|
|
.await;
|
|
assert!(result.is_err());
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_query_delete_user() {
|
|
let app_state = create_mock_app_state().await;
|
|
let repo = UsersRepository::new(&app_state);
|
|
let email = "deleteuser@example.com";
|
|
let user = create_test_user(email, "Delete User", true);
|
|
repo.query_create_user(user.clone()).await.unwrap();
|
|
let user_detail = repo
|
|
.query_user_by_email(email.to_string().clone())
|
|
.await
|
|
.unwrap();
|
|
let delete_result = repo
|
|
.query_delete_user(user_detail.id.id.to_raw().clone())
|
|
.await;
|
|
assert!(delete_result.is_ok());
|
|
let fetch_result = repo
|
|
.query_user_by_email(user_detail.id.id.to_raw().clone())
|
|
.await;
|
|
assert!(fetch_result.is_err());
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_delete_non_existent_user_should_fail() {
|
|
let app_state = create_mock_app_state().await;
|
|
let repo = UsersRepository::new(&app_state);
|
|
let result = repo.query_delete_user("lklklklk".to_string()).await;
|
|
assert!(result.is_err());
|
|
assert_eq!(result.unwrap_err().to_string(), "User not found");
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_delete_user_twice_should_fail_on_second_attempt() {
|
|
let app_state = create_mock_app_state().await;
|
|
let repo = UsersRepository::new(&app_state);
|
|
let email = "twice@example.com";
|
|
let user = create_test_user(email, "Delete Twice", true);
|
|
repo.query_create_user(user.clone()).await.unwrap();
|
|
let first = repo.query_delete_user(user.id.id.to_raw()).await;
|
|
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");
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn test_query_update_user_should_succeed() {
|
|
let state = create_mock_app_state().await;
|
|
let repo = UsersRepository::new(&state);
|
|
let mut user = create_test_user("update@example.com", "Old Name", true);
|
|
repo.query_create_user(user.clone()).await.unwrap();
|
|
user.fullname = "Updated Name".into();
|
|
user.phone_number = "089876543210".into();
|
|
let result = repo.query_update_user(user.clone()).await;
|
|
assert!(result.is_ok(), "Update failed: {:?}", result.err());
|
|
let updated = repo.query_user_by_id(user.id.id.to_raw()).await.unwrap();
|
|
assert_eq!(updated.fullname, "Updated Name");
|
|
assert_eq!(updated.phone_number, "089876543210");
|
|
}
|