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,
                     );