use crate::{Result, StatusCode};
use hyper::{body::Buf, Body, Response};
use serde::de::DeserializeOwned;
pub struct TestResponse {
inner: hyper::Response<Body>,
}
impl From<hyper::Response<Body>> for TestResponse {
fn from(resp: Response<Body>) -> Self {
Self { inner: resp }
}
}
impl TestResponse {
pub fn status(&self) -> StatusCode {
self.inner.status()
}
pub async fn body_string(&mut self) -> Result<String> {
let bytes = hyper::body::to_bytes(self.inner.body_mut()).await?;
Ok(String::from_utf8(bytes.to_vec())?)
}
pub async fn body_bytes(&mut self) -> Result<Vec<u8>> {
let bytes = hyper::body::to_bytes(self.inner.body_mut()).await?;
Ok(bytes.to_vec())
}
pub async fn body_json<T: DeserializeOwned>(&mut self) -> Result<T> {
let buffer = hyper::body::aggregate(self.inner.body_mut()).await?;
let data = serde_json::from_reader(buffer.reader())?;
Ok(data)
}
}
impl AsRef<hyper::Response<Body>> for TestResponse {
fn as_ref(&self) -> &hyper::Response<Body> {
&self.inner
}
}