From a3ade99c245dcd67196b83d423b1f1e34f1cfedd Mon Sep 17 00:00:00 2001 From: Blaine Bublitz Date: Tue, 21 Apr 2020 22:18:36 -0700 Subject: [PATCH] Add failing interface test --- tests/interface.rs | 80 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/tests/interface.rs b/tests/interface.rs index 2fa13349..45f9229a 100644 --- a/tests/interface.rs +++ b/tests/interface.rs @@ -161,3 +161,83 @@ pub async fn test_multiple_interfaces() { }) ); } + +#[async_std::test] +pub async fn test_multiple_objects_in_multiple_interfaces() { + struct MyObjOne; + + #[async_graphql::Object] + impl MyObjOne { + #[field] + async fn value_a(&self) -> i32 { + 1 + } + + #[field] + async fn value_b(&self) -> i32 { + 2 + } + + #[field] + async fn value_c(&self) -> i32 { + 3 + } + } + + struct MyObjTwo; + + #[async_graphql::Object] + impl MyObjTwo { + #[field] + async fn value_a(&self) -> i32 { + 1 + } + } + + #[async_graphql::Interface(field(name = "value_a", type = "i32"))] + struct InterfaceA(MyObjOne, MyObjTwo); + + #[async_graphql::Interface(field(name = "value_b", type = "i32"))] + struct InterfaceB(MyObjOne); + + struct Query; + + #[Object] + impl Query { + #[field] + async fn my_obj(&self) -> Vec { + vec![MyObjOne.into(), MyObjTwo.into()] + } + } + + let schema = Schema::build(Query, EmptyMutation, EmptySubscription) + .register_type::() // `InterfaceA` is not directly referenced, so manual registration is required. + .finish(); + let query = format!( + r#"{{ + myObj {{ + ... on InterfaceA {{ + valueA + }} + ... on InterfaceB {{ + valueB + }} + ... on MyObjOne {{ + valueC + }} + }} + }}"# + ); + assert_eq!( + schema.execute(&query).await.unwrap().data, + serde_json::json!({ + "myObj": [{ + "valueA": 1, + "valueB": 2, + "valueC": 3, + }, { + "valueA": 1 + }] + }) + ); +}