From 705b0ad826db859f33c3052c355bc8dc7dc11f68 Mon Sep 17 00:00:00 2001 From: ryan Date: Thu, 7 Sep 2023 15:17:29 -0500 Subject: [PATCH] keyforkd: add tests for middleware, relax serde service trait bounds --- keyforkd/src/middleware.rs | 50 +++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/keyforkd/src/middleware.rs b/keyforkd/src/middleware.rs index 9aa7578..d6a90f4 100644 --- a/keyforkd/src/middleware.rs +++ b/keyforkd/src/middleware.rs @@ -50,10 +50,10 @@ pub enum SerdeServiceError { impl Service> for SerdeService where - S: Service + Send + Sync, - Request: DeserializeOwned + Send, - >::Error: std::error::Error + Send, - >::Response: Serialize + Send, + S: Service, + Request: DeserializeOwned, + >::Response: Serialize, + >::Error: std::error::Error, >::Future: Send + 'static, { type Response = Vec; @@ -89,3 +89,45 @@ where }) } } + +#[cfg(test)] +mod tests { + use super::*; + use serde::{Deserialize, Serialize}; + use std::{future::Future, pin::Pin, task::Poll}; + use tower::{ServiceBuilder, ServiceExt}; + + #[derive(Serialize, Deserialize)] + struct Test { + field: String, + } + + struct App; + + #[derive(Debug, thiserror::Error)] + enum Infallible {} + + impl Service for App { + type Response = Test; + type Error = Infallible; + type Future = Pin> + Send>>; + + fn poll_ready(&mut self, _cx: &mut std::task::Context<'_>) -> std::task::Poll> { + Poll::Ready(Ok(())) + } + + fn call(&mut self, req: Test) -> Self::Future { + Box::pin(async { Ok(req) }) + } + } + + #[tokio::test] + async fn can_serde_responses() { + let content = serialize(&Test { field: "hello world!".to_string() }).unwrap(); + let mut service = ServiceBuilder::new() + .layer(SerdeLayer::::new()) + .service(App); + let result = service.ready().await.unwrap().call(content.clone()).await.unwrap(); + assert_eq!(result, content); + } +}