use std::time::Duration;
use hyper::StatusCode;
use mini_serve::{RouteBuilder, handler};
use tokio::net::TcpListener;
use tokio::sync::oneshot;
#[tokio::test]
async fn run_serves_requests_until_shutdown_then_returns() {
let app = RouteBuilder::stateless()
.get("/health", handler(|_req, _state| async {
mini_serve::json(StatusCode::OK, &serde_json::json!({"ok": true}))
}))
.seal();
let listener = TcpListener::bind("127.0.0.1:0").await.unwrap();
let addr = listener.local_addr().unwrap();
let (shutdown_tx, shutdown_rx) = oneshot::channel::<()>();
let run_task = tokio::spawn(async move {
app.run(listener, async move {
let _ = shutdown_rx.await;
})
.await
});
let resp = reqwest::get(format!("http://{addr}/health")).await.unwrap();
assert_eq!(resp.status(), StatusCode::OK);
shutdown_tx.send(()).unwrap();
let result = tokio::time::timeout(Duration::from_secs(2), run_task)
.await
.expect("run() did not return after shutdown")
.expect("run task panicked");
assert!(result.is_ok());
}