diff --git a/tests/interface.rs b/tests/interface.rs index a92fc2d8..5581beb6 100644 --- a/tests/interface.rs +++ b/tests/interface.rs @@ -162,6 +162,86 @@ 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 + }] + }) + ); + } + #[async_std::test] pub async fn test_interface_field_result() { struct MyObj; @@ -206,3 +286,4 @@ pub async fn test_interface_field_result() { }) ); } +