#[cfg(test)] mod tests { use crate::{generate_unique_email, get_role_id, UsersRepository}; use axum::{http::StatusCode, response::Response}; use imphnen_iam::{ AuthLoginRequestDto, AuthLoginResponsetDto, AuthNewPasswordRequestDto, AuthRefreshTokenRequestDto, AuthRegisterRequestDto, AuthResendOtpRequestDto, AuthVerifyEmailRequestDto, MessageResponseDto, ResponseSuccessDto, TokenDto, }; use imphnen_utils::{make_thing_from_enum, ResourceEnum as UtilsResourceEnum}; use uuid::Uuid; #[tokio::test] async fn test_post_login_controller() { let app_state = crate::get_app_state().await; let repo = UsersRepository::new(&app_state); let role_id = get_role_id("user", &app_state).await; // Test data let email = generate_unique_email("test_login_controller"); let password = "password123".to_string(); // Create test user first let user_request = AuthRegisterRequestDto { email: email.clone(), password: password.clone(), fullname: "Test User Controller".to_string(), phone_number: Some("+1234567890".to_string()), }; let register_response = imphnen_iam::AuthController::mutation_register( &app_state, user_request, ) .await; assert_eq!(register_response.status(), StatusCode::CREATED); // Wait for email verification (simulate OTP verification in test) let verify_request = AuthVerifyEmailRequestDto { email: email.clone(), otp: "123456".to_string(), // Default test OTP }; let verify_response = imphnen_iam::AuthController::mutation_verify_email( &app_state, verify_request, ) .await; assert_eq!(verify_response.status(), StatusCode::OK); // Try to login let login_request = AuthLoginRequestDto { email: email.clone(), password: password.clone(), }; let response = imphnen_iam::AuthController::mutation_login( &app_state, login_request, ) .await; // Verify response assert_eq!(response.status(), StatusCode::OK); let login_response: ResponseSuccessDto = crate::common::response_helpers::parse_response(response, 8192).await; let data_val = login_response.data.expect("login should return data"); // Parse and verify token data 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 and non-empty"); assert!(!token_obj.refresh_token.is_empty(), "refresh_token must be present and non-empty"); assert!(!token_obj.user.id.is_empty(), "user id must be present and non-empty"); assert_eq!(token_obj.user.email, email, "user email must match login email"); assert_eq!(token_obj.user.fullname, "Test User Controller", "user fullname must match registered user"); assert!(!token_obj.user.status.is_empty(), "user status must be present and non-empty"); assert_eq!(token_obj.user.phone_number, Some("+1234567890".to_string()), "user phone_number must match registered phone number"); assert!(!token_obj.user.created_at.is_empty(), "user created_at must be present and non-empty"); assert!(!token_obj.user.updated_at.is_empty(), "user updated_at must be present and non-empty"); // Clean up let user = repo.query_user_by_email(email.clone()).await.unwrap(); let _ = repo.query_delete_user(user.id.id.to_raw()).await; } #[tokio::test] async fn test_post_login_controller_invalid_credentials() { let app_state = crate::get_app_state().await; // Test data let email = generate_unique_email("test_login_invalid"); let password = "wrongpassword".to_string(); // Try to login with non-existent user let login_request = AuthLoginRequestDto { email: email.clone(), password: password.clone(), }; let response = imphnen_iam::AuthController::mutation_login( &app_state, login_request, ) .await; // Verify response assert_eq!(response.status(), StatusCode::UNAUTHORIZED); 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")); } }