Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ fn map_handler_error(err: HandlerError) -> (StatusCode, String) {
},

HandlerError::Referral(err) => match err {
ReferralHandlerError::ReferralNotFound(err) => (StatusCode::NOT_FOUND, err),
ReferralHandlerError::ReferralNotFound(err) => (StatusCode::OK, err),
ReferralHandlerError::InvalidReferral(err) => (StatusCode::BAD_REQUEST, err),
ReferralHandlerError::DuplicateReferral(err) => (StatusCode::CONFLICT, err),
},
Expand All @@ -141,7 +141,7 @@ fn map_handler_error(err: HandlerError) -> (StatusCode, String) {
fn map_db_error(err: DbError) -> (StatusCode, String) {
match err {
DbError::UniqueViolation(err) => (StatusCode::CONFLICT, err),
DbError::RecordNotFound(err) | DbError::AddressNotFound(err) => (StatusCode::NOT_FOUND, err),
DbError::RecordNotFound(err) | DbError::AddressNotFound(err) => (StatusCode::OK, err),

DbError::Database(err) => {
error!("Database error: {}", err);
Expand Down
43 changes: 37 additions & 6 deletions src/handlers/auth.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ use tower_cookies::{Cookie, Cookies};
use uuid::Uuid;

use crate::{
db_persistence::DbError,
handlers::{HandlerError, SuccessResponse},
http_server::{AppState, Challenge},
models::{
Expand Down Expand Up @@ -293,9 +292,8 @@ pub async fn handle_admin_login(
.admin
.find_by_username(&body.username)
.await?
.ok_or(AppError::Database(DbError::RecordNotFound(format!(
"Admin with username {} is not exist",
&body.username,
.ok_or(AppError::Handler(HandlerError::Auth(AuthHandlerError::Unauthorized(
"Invalid username or password".to_string(),
))))?;

let parsed_hash =
Expand Down Expand Up @@ -342,7 +340,7 @@ mod tests {
use std::sync::Arc;

use crate::{
handlers::auth::handle_x_oauth_callback,
handlers::auth::{handle_admin_login, handle_x_oauth_callback},
http_server::AppState,
models::x_association::XAssociation,
routes::auth::auth_routes,
Expand All @@ -351,7 +349,7 @@ mod tests {
test_db::{create_persisted_address, reset_database},
},
};
use axum::{body::Body, http, routing::get};
use axum::{body::Body, http, routing::get, routing::post};
use rusx::{
auth::TwitterToken,
resources::{
Expand Down Expand Up @@ -607,4 +605,37 @@ mod tests {
.unwrap();
assert_eq!(resp.status(), http::StatusCode::OK);
}

#[tokio::test]
async fn test_admin_login_nonexistent_username_returns_401() {
let state = create_test_app_state().await;
reset_database(&state.db.pool).await;

let router = axum::Router::new()
.route("/auth/admin/login", post(handle_admin_login))
.with_state(state);

let payload = serde_json::json!({
"username": "nonexistent_admin",
"password": "any_password"
});

let response = router
.oneshot(
http::Request::builder()
.method("POST")
.uri("/auth/admin/login")
.header(http::header::CONTENT_TYPE, "application/json")
.body(Body::from(serde_json::to_vec(&payload).unwrap()))
.unwrap(),
)
.await
.unwrap();

assert_eq!(response.status(), http::StatusCode::UNAUTHORIZED);

let body_bytes = axum::body::to_bytes(response.into_body(), usize::MAX).await.unwrap();
let body: serde_json::Value = serde_json::from_slice(&body_bytes).unwrap();
assert_eq!(body["error"], "Invalid username or password");
}
}
14 changes: 10 additions & 4 deletions src/handlers/raid_quest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -689,8 +689,11 @@ mod tests {
.await
.unwrap();

// 404/RecordNotFound for No Active Raid
assert!(response.status().is_server_error() || response.status() == StatusCode::NOT_FOUND);
// 200 OK / Handler Error
assert_eq!(response.status(), StatusCode::OK);
let body_bytes = axum::body::to_bytes(response.into_body(), usize::MAX).await.unwrap();
let body: Value = serde_json::from_slice(&body_bytes).unwrap();
assert_eq!(body["error"].as_str().unwrap(), "No active raid is found");
}

#[tokio::test]
Expand Down Expand Up @@ -727,8 +730,11 @@ mod tests {
.await
.unwrap();

// 400 Bad Request / Handler Error
assert_eq!(response.status(), StatusCode::NOT_FOUND);
// 200 OK / Handler Error
assert_eq!(response.status(), StatusCode::OK);
let body_bytes = axum::body::to_bytes(response.into_body(), usize::MAX).await.unwrap();
let body: Value = serde_json::from_slice(&body_bytes).unwrap();
assert_eq!(body["error"].as_str().unwrap(), "User doesn't have X association");
}

#[tokio::test]
Expand Down
5 changes: 4 additions & 1 deletion src/handlers/relevant_tweet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -379,6 +379,9 @@ mod tests {
.await
.unwrap();

assert_eq!(response.status(), 404);
assert_eq!(response.status(), 200);
let body_bytes = axum::body::to_bytes(response.into_body(), usize::MAX).await.unwrap();
let body: Value = serde_json::from_slice(&body_bytes).unwrap();
assert_eq!(body["error"].as_str().unwrap(), "Tweet non_existent_tweet not found");
}
}
8 changes: 7 additions & 1 deletion src/handlers/tweet_author.rs
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,13 @@ mod tests {
.await
.unwrap();

assert_eq!(response.status(), 404);
assert_eq!(response.status(), 200);
let body_bytes = axum::body::to_bytes(response.into_body(), usize::MAX).await.unwrap();
let body: Value = serde_json::from_slice(&body_bytes).unwrap();
assert_eq!(
body["error"].as_str().unwrap(),
"Tweet Author non_existent_id not found"
);
}

#[tokio::test]
Expand Down