oxidite_testing/
server.rs1use oxidite_core::{Router, OxiditeRequest, OxiditeResponse, Result};
2use tower::Service;
3use std::future::Future;
4use std::pin::Pin;
5use std::task::{Context, Poll};
6
7pub struct TestServer<S> {
9 service: S,
10}
11
12impl<S> TestServer<S>
13where
14 S: Service<OxiditeRequest, Response = OxiditeResponse> + Clone + Send + 'static,
15 S::Error: Into<Box<dyn std::error::Error + Send + Sync>>,
16 S::Future: Send,
17{
18 pub fn new(service: S) -> Self {
20 Self { service }
21 }
22
23 pub async fn call(&mut self, request: OxiditeRequest) -> Result<OxiditeResponse> {
25 use tower::ServiceExt;
26 self.service
27 .ready()
28 .await
29 .map_err(|e| oxidite_core::Error::InternalServerError(format!("Service not ready: {:?}", e.into())))?
30 .call(request)
31 .await
32 .map_err(|e| oxidite_core::Error::InternalServerError(format!("Request failed: {:?}", e.into())))
33 }
34}
35
36pub fn test_router(router: Router) -> TestServer<Router> {
38 TestServer::new(router)
39}