//! Integration tests for embedded Web UI SPA and static asset endpoints. use axum::body::to_bytes; use axum::http::{Request, StatusCode}; use nx9_wg_api::routes::build_api_router; use nx9_wg_api::state::AppState; use nx9_wg_db::Store; use tower::ServiceExt; #[tokio::test] async fn test_ui_spa_index_and_stylesheet_endpoints() { let store = Store::connect_in_memory().await.expect("connect store"); store.migrate().await.expect("migrate store"); let state = AppState::new(store); let app = build_api_router(state); // 1. Test GET / (Root SPA Index) let res = app .clone() .oneshot( Request::builder() .uri("/") .body(axum::body::Body::empty()) .unwrap(), ) .await .expect("execute request"); assert_eq!(res.status(), StatusCode::OK); assert_eq!( res.headers() .get(axum::http::header::CONTENT_TYPE) .unwrap() .to_str() .unwrap(), "text/html; charset=utf-8" ); let body_bytes = to_bytes(res.into_body(), 1024 * 1024).await.unwrap(); let html = String::from_utf8_lossy(&body_bytes); assert!(html.contains("nx9-wg — Native WireGuard Appliance")); assert!(html.contains("NX9")); assert!(html.contains("id=\"app-layout\"")); assert!(html.contains("id=\"sidebar\"")); assert!(html.contains("Dashboard")); assert!(html.contains("Peers")); assert!(html.contains("Diagnostics")); assert!(html.contains("Administrator")); // 2. Test GET /ui (Alias) let res_ui = app .clone() .oneshot( Request::builder() .uri("/ui") .body(axum::body::Body::empty()) .unwrap(), ) .await .expect("execute request"); assert_eq!(res_ui.status(), StatusCode::OK); // 3. Test GET /assets/style.css (Compiled CSS) let res_css = app .oneshot( Request::builder() .uri("/assets/style.css") .body(axum::body::Body::empty()) .unwrap(), ) .await .expect("execute request"); assert_eq!(res_css.status(), StatusCode::OK); assert_eq!( res_css .headers() .get(axum::http::header::CONTENT_TYPE) .unwrap() .to_str() .unwrap(), "text/css; charset=utf-8" ); let css_bytes = to_bytes(res_css.into_body(), 1024 * 1024).await.unwrap(); let css = String::from_utf8_lossy(&css_bytes); assert!(css.contains("--bg-base: #0d1117;")); assert!(css.contains("[data-theme=\"dark\"]")); assert!(css.contains("[data-theme=\"light\"]")); assert!(css.contains(".status-pass")); assert!(css.contains(".status-fail")); assert!(css.contains("@media (max-width: 768px)")); }