use std::net::SocketAddr; use api::AppState; use db::Db; use server::serve; use tokio::net::TcpListener; #[tokio::test] async fn serves_health_live_over_tcp() { let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set for this test"); let db = Db::connect(&database_url) .await .expect("connect to database"); let state = AppState { db, app_name: "Test".to_string(), }; let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); let addr: SocketAddr = listener.local_addr().unwrap(); let handle = tokio::spawn(async move { serve(listener, state).await.unwrap(); }); let url = format!("http://{addr}/health/live"); let body: serde_json::Value = reqwest::get(&url) .await .expect("request succeeds") .json() .await .expect("json body"); assert_eq!(body["status"], "ok"); handle.abort(); }