use async_graphql::*; use futures_util::stream::Stream; #[tokio::test] pub async fn test_fieldresult() { struct Query; #[Object] impl Query { async fn error(&self) -> Result { Err("TestError".into()) } async fn opt_error(&self) -> Option> { Some(Err("TestError".into())) } async fn vec_error(&self) -> Vec> { vec![Ok(1), Err("TestError".into())] } } let schema = Schema::new(Query, EmptyMutation, EmptySubscription); assert_eq!( schema.execute("{ error }").await.into_result().unwrap_err(), vec![ServerError { message: "TestError".to_string(), locations: vec![Pos { line: 1, column: 3 }], path: vec![PathSegment::Field("error".to_owned())], extensions: None, }] ); assert_eq!( schema .execute("{ optError }") .await .into_result() .unwrap_err(), vec![ServerError { message: "TestError".to_string(), locations: vec![Pos { line: 1, column: 3 }], path: vec![PathSegment::Field("optError".to_owned())], extensions: None, }] ); assert_eq!( schema .execute("{ vecError }") .await .into_result() .unwrap_err(), vec![ServerError { message: "TestError".to_string(), locations: vec![Pos { line: 1, column: 3 }], path: vec![ PathSegment::Field("vecError".to_owned()), PathSegment::Index(1) ], extensions: None, }] ); } #[tokio::test] pub async fn test_custom_error() { #[derive(Clone)] struct MyError; impl From for Error { fn from(_: MyError) -> Self { Error::new("custom error") } } #[derive(SimpleObject)] #[graphql(complex)] struct MyObj { value1: i32, } #[ComplexObject] impl MyObj { async fn value2(&self) -> Result { Err(MyError) } } #[derive(Interface)] #[graphql(field(name = "value2", type = "i32"))] enum MyInterface { MyObj(MyObj), } struct Query; #[Object] impl Query { async fn value(&self) -> Result { Err(MyError) } } struct Subscription; #[Subscription] impl Subscription { async fn value1(&self) -> Result, MyError> { Err::>, _>(MyError) } async fn value2(&self) -> impl Stream> { futures_util::stream::once(async move { Err(MyError) }) } } }