trillium_testing/
with_server.rs1use crate::{ServerConnector, block_on, config};
2use std::{error::Error, future::Future};
3use trillium::{Handler, Transport};
4use trillium_server_common::RuntimeTrait;
5use url::Url;
6
7pub fn with_server<H, Fun, Fut>(handler: H, tests: Fun)
16where
17 H: Handler,
18 Fun: FnOnce(Url) -> Fut,
19 Fut: Future<Output = Result<(), Box<dyn Error>>>,
20{
21 let config = config().with_host("localhost").with_port(0);
22 let runtime = config.runtime();
23 runtime.block_on(async move {
24 let handle = config.spawn(handler);
25 let info = handle.info().await;
26 let url = info.shared_state().cloned().unwrap_or_else(|| {
27 let port = info.tcp_socket_addr().map(|t| t.port()).unwrap_or(0);
28 format!("http://localhost:{port}").parse().unwrap()
29 });
30 tests(url).await.unwrap();
31 handle.shut_down().await;
32 });
33}
34
35pub fn with_transport<H, Fun, Fut>(handler: H, tests: Fun)
38where
39 H: Handler,
40 Fun: FnOnce(Box<dyn Transport>) -> Fut,
41 Fut: Future<Output = Result<(), Box<dyn Error>>>,
42{
43 block_on(async move {
44 let transport = ServerConnector::new(handler).connect(false).await;
45 tests(Box::new(transport));
46 });
47}