zero-to-axum/tests/fixture/mod.rs
2023-12-20 14:26:20 -06:00

46 lines
1.2 KiB
Rust

use anyhow::Result;
use futures_util::FutureExt;
use std::net::SocketAddr;
use tokio::task::JoinHandle;
use tracing::info;
use zero_to_axum::{Conf, ZeroToAxum};
pub struct TestServer {
server_task_handle: JoinHandle<()>,
addr: SocketAddr,
}
impl TestServer {
pub async fn spawn() -> TestServer {
info!("start server");
let server = ZeroToAxum::serve(Conf {
listen: "[::]:0".parse().unwrap(),
database: zero_to_axum::conf::Database {
url: "memory:".into(),
},
debug: true,
})
.await;
let addr = server.local_addr();
let server_task_handle = tokio::spawn(server.map(|res| res.unwrap()));
info!("server spawned");
TestServer {
server_task_handle,
addr,
}
}
/// format a URL for the given path
pub fn url(&self, path: &str) -> String {
format!("http://{}{path}", self.addr)
}
/// Request a graceful shutdown and then wait for shutdown to complete
pub async fn shutdown(self) -> Result<()> {
self.server_task_handle.abort();
let _ = self.server_task_handle.await;
Ok(())
}
}