use std::{cell::Cell, rc::Rc};
use super::*;
use crate::{Pipeline, fn_factory, service};
#[derive(Debug, Clone)]
struct Srv(bool, Rc<Cell<usize>>);
impl Service<(), ()> for Srv {
type Res = ();
type Error = ();
async fn ready(&self, _: Ctx<'_, Self>) -> Result<(), Self::Error> {
if self.0 { Err(()) } else { Ok(()) }
}
async fn call(&self, _m: (), _: Ctx<'_, Self>) -> Result<(), ()> {
Err(())
}
async fn shutdown(&self, _: Ctx<'_, Self, ()>) {
self.1.set(self.1.get() + 1);
}
}
#[ntex::test]
async fn test_ready() {
let cnt_sht = Rc::new(Cell::new(0));
let srv = Pipeline::new(
(),
service(Srv(true, cnt_sht.clone())).map_err(|()| "error"),
);
let res = srv.ready().await;
assert_eq!(res, Err("error"));
srv.shutdown().await;
assert_eq!(cnt_sht.get(), 1);
}
#[ntex::test]
async fn test_service() {
let srv = Pipeline::new(
(),
Srv(false, Rc::new(Cell::new(0)))
.map_err(|()| "error")
.clone(),
);
let res = srv.call(()).await;
assert!(res.is_err());
assert_eq!(res.err().unwrap(), "error");
let _ = format!("{srv:?}");
}
#[ntex::test]
async fn test_pipeline() {
let srv = Pipeline::new(
(),
crate::service(Srv(false, Rc::new(Cell::new(0))))
.map_err(|()| "error")
.clone(),
);
let res = srv.call(()).await;
assert!(res.is_err());
assert_eq!(res.err().unwrap(), "error");
let _ = format!("{srv:?}");
}
#[ntex::test]
async fn test_factory() {
let new_srv =
crate::fn_factory(|(): &()| async { Ok::<_, ()>(Srv(false, Rc::new(Cell::new(0)))) })
.map_err(|()| "error");
let srv = Pipeline::new((), new_srv.create(&()).await.unwrap());
let res = srv.call(()).await;
assert!(res.is_err());
assert_eq!(res.err().unwrap(), "error");
let _ = format!("{new_srv:?}");
}
#[ntex::test]
async fn test_pipeline_factory() {
let new_srv =
fn_factory(|(): &()| async move { Ok::<Srv, ()>(Srv(false, Rc::new(Cell::new(0)))) })
.map_err(|()| "error")
.clone();
let srv = Pipeline::new((), new_srv.create(&()).await.unwrap());
let res = srv.call(()).await;
assert!(res.is_err());
assert_eq!(res.err().unwrap(), "error");
let _ = format!("{new_srv:?}");
}