viz_test/
lib.rs

1use reqwest::Client;
2use std::{future::IntoFuture, net::SocketAddr};
3use tokio::net::TcpListener;
4use viz::{serve, Error, Result, Router};
5
6pub use http;
7pub use nano_id;
8pub use sessions;
9
10pub use reqwest::{multipart, RequestBuilder};
11
12pub struct TestServer {
13    addr: SocketAddr,
14    client: Client,
15}
16
17impl TestServer {
18    /// Creates new test server
19    ///
20    /// # Errors
21    ///
22    /// Will return `Err` if the server fails to start.
23    pub async fn new(router: Router) -> Result<Self> {
24        let listener = TcpListener::bind("127.0.0.1:0").await?;
25        let addr = listener.local_addr()?;
26        let client = reqwest::Client::builder()
27            .redirect(reqwest::redirect::Policy::none())
28            .build()
29            .map_err(Error::boxed)?;
30
31        tokio::spawn(serve(listener, router).into_future());
32
33        Ok(Self { addr, client })
34    }
35
36    fn path(&self, url: impl AsRef<str>) -> String {
37        format!("http://{}{}", self.addr, url.as_ref())
38    }
39
40    #[must_use]
41    pub fn addr(&self) -> SocketAddr {
42        self.addr
43    }
44
45    pub fn get(&self, url: impl AsRef<str>) -> RequestBuilder {
46        self.client.get(self.path(url))
47    }
48
49    pub fn post(&self, url: impl AsRef<str>) -> RequestBuilder {
50        self.client.post(self.path(url))
51    }
52
53    pub fn delete(&self, url: impl AsRef<str>) -> RequestBuilder {
54        self.client.delete(self.path(url))
55    }
56
57    pub fn put(&self, url: impl AsRef<str>) -> RequestBuilder {
58        self.client.put(self.path(url))
59    }
60}