-
SummaryHello, I'm trying to test a route in axum. But I can't do it because of the line: let app = Router::new().route("/login", post(login)); that returns the error:
Honestly, it's completely cryptic. Is it possible to fix it, and if so, how? Here is the code: use axum::{Json, http::StatusCode, response::IntoResponse};
use axum_extra::extract::{CookieJar, cookie::Cookie};
use serde_json::json;
use crate::{
middleware::jwt_cookie::create_jwt,
models::{auth::AuthPayload, user::User},
};
pub async fn login(
Json(payload): Json<AuthPayload>,
) -> (StatusCode, CookieJar, Json<serde_json::Value>) {
let email = payload.email;
let password = payload.password;
let mut jar = CookieJar::new();
if email == "test@example.com" && password == "password123" {
let user = User::get("123", "testuser", "https://avatar.com/image.png");
let token = create_jwt(&user.id, &user.name, &user.avatar_url);
let cookie = Cookie::build(("token", token))
.http_only(true)
.path("/")
.build();
jar = jar.add(cookie);
(StatusCode::OK, jar, Json(json!(user)))
} else {
(
StatusCode::UNAUTHORIZED,
jar, // Empty jar since login failed
Json(json!({ "error": "Invalid credentials" })),
)
}
}
#[cfg(test)]
mod tests {
use super::*;
use axum::{Router, http::StatusCode, routing::post};
use axum_test::TestServer;
use serde_json::json;
#[tokio::test]
async fn test_successful_login() {
let app = Router::new().route("/login", post(login));
let server = TestServer::new(app).unwrap();
let payload = json!({
"email": "test@example.com",
"password": "password123"
});
let response = server.post("/login").json(&payload).await;
response.assert_status(StatusCode::OK);
let json_response = response.json();
assert_eq!(json_response["id"], "123");
assert_eq!(json_response["name"], "testuser");
assert_eq!(json_response["avatar_url"], "https://avatar.com/image.png");
// Check that the response contains a `Set-Cookie` header for the token
let cookie = response.headers().get("set-cookie").unwrap();
assert!(cookie.to_str().unwrap().contains("token="));
}
#[tokio::test]
async fn test_failed_login() {
let app = Router::new().route("/login", axum::routing::post(login));
let server = TestServer::new(app).unwrap();
let payload = json!({
"email": "wrong@example.com",
"password": "wrongpassword"
});
let response = server.post("/login").json(&payload).await;
response.assert_status(StatusCode::UNAUTHORIZED);
let json_response = response.json();
assert_eq!(json_response["error"], "Invalid credentials");
}
} axum version0.8.1 |
Beta Was this translation helpful? Give feedback.
Answered by
yanns
Mar 21, 2025
Replies: 1 comment 1 reply
-
Have you tried using https://docs.rs/axum-macros/latest/axum_macros/attr.debug_handler.html ? |
Beta Was this translation helpful? Give feedback.
1 reply
Answer selected by
DoneDeal0
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Have you tried using https://docs.rs/axum-macros/latest/axum_macros/attr.debug_handler.html ?