From 86e9fd42bb1e511828395d7a98e5a81611bcaee5 Mon Sep 17 00:00:00 2001 From: GW_MC <72297530+GWMCwing@users.noreply.github.com> Date: Fri, 24 Apr 2026 12:08:08 +0000 Subject: [PATCH] test: Add unit tests for frontend routing and file handling --- apps/nxmesh-master/src/routes/frontend/mod.rs | 80 +++++++++++++++++++ apps/nxmesh-master/src/routes/mod.rs | 27 +++++++ 2 files changed, 107 insertions(+) diff --git a/apps/nxmesh-master/src/routes/frontend/mod.rs b/apps/nxmesh-master/src/routes/frontend/mod.rs index 9f677c4..d510d1e 100644 --- a/apps/nxmesh-master/src/routes/frontend/mod.rs +++ b/apps/nxmesh-master/src/routes/frontend/mod.rs @@ -67,3 +67,83 @@ async fn get_file_handler( .map(|html| html.into_response()), } } + +#[cfg(test)] +#[allow(clippy::expect_used)] +mod tests { + use super::*; + + #[tokio::test] + async fn test_get_index_html() { + let index_html = get_index_html(); + assert!( + index_html.is_some(), + "Expected to find index.html in embedded assets" + ); + } + + #[tokio::test] + async fn test_get_file_handler_existing_file() { + let response = get_file_handler(axum::extract::Path("index.html".to_string())).await; + assert!( + response.is_ok(), + "Expected to successfully retrieve index.html" + ); + let response = response.expect("Expected response to be Ok"); + assert_eq!(response.status(), axum::http::StatusCode::OK); + assert!( + response + .headers() + .get(axum::http::header::CONTENT_TYPE) + .map(|ct| ct.to_str().unwrap_or("")) + .expect("Content-Type header should be present") + .starts_with("text/html") + ); + } + + #[tokio::test] + async fn test_get_file_handler_nonexistent_file() { + let response = get_file_handler(axum::extract::Path("nonexistent.txt".to_string())).await; + assert!( + response.is_ok(), + "Expected to fallback to index.html for nonexistent file" + ); + let response = response.expect("Expected response to be Ok"); + assert_eq!(response.status(), axum::http::StatusCode::OK); + assert!( + response + .headers() + .get(axum::http::header::CONTENT_TYPE) + .map(|ct| ct.to_str().unwrap_or("")) + .expect("Content-Type header should be present") + .starts_with("text/html") + ) + } +} + +#[cfg(test)] +mod axum_tests { + use super::*; + use axum_test::TestServer; + + #[tokio::test] + async fn test_should_return_index_html_for_root_path() { + let router = get_router().await; + let server = TestServer::new(router); + let response = server.get("/").await; + assert_eq!(response.status_code(), 200); + } + + #[tokio::test] + async fn test_should_return_index_html_for_nonexistent_path() { + let router = get_router().await; + let server = TestServer::new(router); + let fallback_response = server.get("/nonexistent").await; + assert_eq!(fallback_response.status_code(), 200); + + let index_response = server.get("/").await; + assert_eq!(index_response.status_code(), 200); + + assert_eq!(fallback_response.text(), index_response.text()); + } +} diff --git a/apps/nxmesh-master/src/routes/mod.rs b/apps/nxmesh-master/src/routes/mod.rs index 80164a8..0583ef2 100644 --- a/apps/nxmesh-master/src/routes/mod.rs +++ b/apps/nxmesh-master/src/routes/mod.rs @@ -7,3 +7,30 @@ pub async fn get_root_router() -> Router { .merge(frontend::get_router().await) .fallback(frontend::get_fallback_handler().await) } + +#[cfg(test)] +mod tests { + use super::*; + use axum_test::TestServer; + + #[tokio::test] + async fn test_should_return_index_html_for_root_path() { + let router = get_root_router().await; + let server = TestServer::new(router); + let response = server.get("/").await; + assert_eq!(response.status_code(), 200); + } + + #[tokio::test] + async fn test_should_return_index_html_for_nonexistent_path() { + let router = get_root_router().await; + let server = TestServer::new(router); + let fallback_response = server.get("/nonexistent").await; + assert_eq!(fallback_response.status_code(), 200); + + let index_response = server.get("/").await; + assert_eq!(index_response.status_code(), 200); + + assert_eq!(fallback_response.text(), index_response.text()); + } +}