use std::sync::Arc;
use fraiseql_core::{db::traits::DatabaseAdapter, schema::CompiledSchema};
use fraiseql_server::{Server, server_config::ServerConfig};
use tokio::{net::TcpListener, sync::oneshot};
pub struct TestServer {
pub url: String,
pub port: u16,
_shutdown: oneshot::Sender<()>,
}
impl TestServer {
pub async fn start<A>(schema: CompiledSchema, adapter: Arc<A>) -> Self
where
A: DatabaseAdapter + Clone + Send + Sync + 'static,
{
let listener = TcpListener::bind("127.0.0.1:0").await.expect("bind to ephemeral port");
let port = listener.local_addr().expect("local addr").port();
let config = ServerConfig::default();
let server = Server::new(config, schema, adapter, None).await.expect("Server::new");
let (tx, rx) = oneshot::channel::<()>();
tokio::spawn(async move {
server
.serve_on_listener(listener, async {
let _ = rx.await; })
.await
.expect("server task failed");
});
tokio::time::sleep(std::time::Duration::from_millis(50)).await;
Self {
url: format!("http://127.0.0.1:{port}"),
port,
_shutdown: tx,
}
}
}