From a87eab45292aacec3e2ca3178f70e6a5c4abc72a Mon Sep 17 00:00:00 2001 From: Tyr Chen Date: Sun, 28 Apr 2024 21:33:35 -0700 Subject: [PATCH] feature: learn how to test middleware --- chat_server/src/middlewares/auth.rs | 51 +++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/chat_server/src/middlewares/auth.rs b/chat_server/src/middlewares/auth.rs index 15faf80..5159ccc 100644 --- a/chat_server/src/middlewares/auth.rs +++ b/chat_server/src/middlewares/auth.rs @@ -40,3 +40,54 @@ pub async fn verify_token(State(state): State, req: Request, next: Nex next.run(req).await } + +#[cfg(test)] +mod tests { + use crate::{AppConfig, User}; + + use super::*; + use anyhow::Result; + use axum::{body::Body, middleware::from_fn_with_state, routing::get, Router}; + use tower::ServiceExt; + + async fn handler(_req: Request) -> impl IntoResponse { + (StatusCode::OK, "ok") + } + + #[tokio::test] + async fn verify_token_middleware_should_work() -> Result<()> { + let config = AppConfig::load()?; + let (_tdb, state) = AppState::new_for_test(config).await?; + + let user = User::new(1, "Tyr Chen", "tchen@acme.org"); + let token = state.ek.sign(user)?; + + let app = Router::new() + .route("/", get(handler)) + .layer(from_fn_with_state(state.clone(), verify_token)) + .with_state(state); + + // good token + let req = Request::builder() + .uri("/") + .header("Authorization", format!("Bearer {}", token)) + .body(Body::empty())?; + let res = app.clone().oneshot(req).await?; + assert_eq!(res.status(), StatusCode::OK); + + // no token + let req = Request::builder().uri("/").body(Body::empty())?; + let res = app.clone().oneshot(req).await?; + assert_eq!(res.status(), StatusCode::UNAUTHORIZED); + + // bad token + let req = Request::builder() + .uri("/") + .header("Authorization", "Bearer bad-token") + .body(Body::empty())?; + let res = app.oneshot(req).await?; + assert_eq!(res.status(), StatusCode::FORBIDDEN); + + Ok(()) + } +}