From d4fda786ba663974bb5d0600e33cc85609837fbc Mon Sep 17 00:00:00 2001 From: Idan Mintz <imintz@users.noreply.github.com> Date: Mon, 14 Jun 2021 00:52:41 -0700 Subject: [PATCH] Fixes panic when spreading untyped union fragment. (#946) * Fixes panic when spreading untyped union fragment. closes #945 * Fix ci breakage with explicit lifetime annotation in juniper_rocket_async --- .../juniper_tests/src/issue_945.rs | 95 +++++++++++++++++++ integration_tests/juniper_tests/src/lib.rs | 2 + juniper/CHANGELOG.md | 2 +- juniper/src/types/async_await.rs | 2 +- juniper/src/types/base.rs | 2 +- 5 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 integration_tests/juniper_tests/src/issue_945.rs diff --git a/integration_tests/juniper_tests/src/issue_945.rs b/integration_tests/juniper_tests/src/issue_945.rs new file mode 100644 index 00000000..763fcd69 --- /dev/null +++ b/integration_tests/juniper_tests/src/issue_945.rs @@ -0,0 +1,95 @@ +use juniper::*; + +struct Query; + +#[graphql_object] +impl Query { + fn artoo() -> Character { + Character::Droid(Droid { + id: 1, + name: "R2-D2".to_owned(), + sensor_color: "red".to_owned(), + }) + } +} + +#[derive(GraphQLUnion)] +enum Character { + Droid(Droid), + #[allow(dead_code)] + Human(Human), +} + +#[derive(GraphQLObject)] +struct Human { + pub id: i32, + pub name: String, + pub eye_color: String, +} + +#[derive(GraphQLObject)] +struct Droid { + pub id: i32, + pub name: String, + pub sensor_color: String, +} + +type Schema = RootNode<'static, Query, EmptyMutation<()>, EmptySubscription<()>>; + +#[tokio::test] +async fn test_fragment_on_interface() { + let query = r#" + query Query { + artoo { + ...CharacterFragment + } + } + + fragment CharacterFragment on Character { + __typename + ... on Human { + id + eyeColor + } + ... on Droid { + id + sensorColor + } + } + "#; + + let (res, errors) = execute( + query, + None, + &Schema::new(Query, EmptyMutation::new(), EmptySubscription::new()), + &Variables::new(), + &(), + ) + .await + .unwrap(); + + assert_eq!(errors.len(), 0); + assert_eq!( + res, + graphql_value!({ + "artoo": {"__typename": "Droid", "id": 1, "sensorColor": "red"} + }), + ); + + let (res, errors) = execute_sync( + query, + None, + &Schema::new(Query, EmptyMutation::new(), EmptySubscription::new()), + &Variables::new(), + &(), + ) + .unwrap(); + + assert_eq!(errors.len(), 0); + assert_eq!( + res, + graphql_value!({ + "artoo": {"__typename": "Droid", "id": 1, "sensorColor": "red"} + }), + ); +} diff --git a/integration_tests/juniper_tests/src/lib.rs b/integration_tests/juniper_tests/src/lib.rs index 0da4dad4..5592c146 100644 --- a/integration_tests/juniper_tests/src/lib.rs +++ b/integration_tests/juniper_tests/src/lib.rs @@ -25,4 +25,6 @@ mod issue_922; #[cfg(test)] mod issue_925; #[cfg(test)] +mod issue_945; +#[cfg(test)] mod pre_parse; diff --git a/juniper/CHANGELOG.md b/juniper/CHANGELOG.md index 990099bb..a95a471b 100644 --- a/juniper/CHANGELOG.md +++ b/juniper/CHANGELOG.md @@ -1,6 +1,6 @@ # master -- No changes yet +- Fix panic on spreading untyped union fragments ([#945](https://github.com/graphql-rust/juniper/issues/945)) # [[0.15.6] 2021-06-07](https://github.com/graphql-rust/juniper/releases/tag/juniper-v0.15.6) diff --git a/juniper/src/types/async_await.rs b/juniper/src/types/async_await.rs index 4fd16aad..ca253c1a 100644 --- a/juniper/src/types/async_await.rs +++ b/juniper/src/types/async_await.rs @@ -313,7 +313,7 @@ where let sub_result = instance .resolve_into_type_async( info, - fragment.type_condition.item, + &concrete_type_name, Some(&fragment.selection_set[..]), &sub_exec, ) diff --git a/juniper/src/types/base.rs b/juniper/src/types/base.rs index 911b561a..2102925a 100644 --- a/juniper/src/types/base.rs +++ b/juniper/src/types/base.rs @@ -521,7 +521,7 @@ where { let sub_result = instance.resolve_into_type( info, - fragment.type_condition.item, + &concrete_type_name, Some(&fragment.selection_set[..]), &sub_exec, );