From 48c924ea27daab36edb35baa1594246b8d81bb42 Mon Sep 17 00:00:00 2001
From: Christian Legnitto <LegNeato@users.noreply.github.com>
Date: Tue, 10 Mar 2020 19:11:40 -0700
Subject: [PATCH] Async tests (#559)

Convert more tests to async
---
 .../src/executor_tests/introspection/mod.rs   |  45 ++---
 juniper/src/integrations/chrono.rs            |   7 +-
 juniper/src/macros/tests/args.rs              | 123 ++++++++------
 juniper/src/macros/tests/field.rs             | 159 ++++++++++--------
 juniper/src/macros/tests/impl_object.rs       |  13 +-
 juniper/src/macros/tests/interface.rs         |  70 ++++----
 juniper/src/macros/tests/scalar.rs            |  35 ++--
 juniper/src/macros/tests/union.rs             |  35 ++--
 juniper/src/macros/tests/util.rs              |  23 +--
 juniper/src/tests/introspection_tests.rs      |  52 +++---
 juniper/src/tests/query_tests.rs              |  86 +++++-----
 11 files changed, 358 insertions(+), 290 deletions(-)

diff --git a/juniper/src/executor_tests/introspection/mod.rs b/juniper/src/executor_tests/introspection/mod.rs
index 9490991e..1c680d66 100644
--- a/juniper/src/executor_tests/introspection/mod.rs
+++ b/juniper/src/executor_tests/introspection/mod.rs
@@ -74,8 +74,8 @@ impl Root {
     }
 }
 
-#[test]
-fn test_execution() {
+#[tokio::test]
+async fn test_execution() {
     let doc = r#"
     {
         sampleEnum
@@ -85,8 +85,9 @@ fn test_execution() {
     "#;
     let schema = RootNode::new(Root, EmptyMutation::<()>::new());
 
-    let (result, errs) =
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &()).expect("Execution failed");
+    let (result, errs) = crate::execute(doc, None, &schema, &Variables::new(), &())
+        .await
+        .expect("Execution failed");
 
     assert_eq!(errs, []);
 
@@ -106,8 +107,8 @@ fn test_execution() {
     );
 }
 
-#[test]
-fn enum_introspection() {
+#[tokio::test]
+async fn enum_introspection() {
     let doc = r#"
     {
         __type(name: "SampleEnum") {
@@ -129,8 +130,9 @@ fn enum_introspection() {
     "#;
     let schema = RootNode::new(Root, EmptyMutation::<()>::new());
 
-    let (result, errs) =
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &()).expect("Execution failed");
+    let (result, errs) = crate::execute(doc, None, &schema, &Variables::new(), &())
+        .await
+        .expect("Execution failed");
 
     assert_eq!(errs, []);
 
@@ -201,8 +203,8 @@ fn enum_introspection() {
     )));
 }
 
-#[test]
-fn interface_introspection() {
+#[tokio::test]
+async fn interface_introspection() {
     let doc = r#"
     {
         __type(name: "SampleInterface") {
@@ -238,8 +240,9 @@ fn interface_introspection() {
     "#;
     let schema = RootNode::new(Root, EmptyMutation::<()>::new());
 
-    let (result, errs) =
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &()).expect("Execution failed");
+    let (result, errs) = crate::execute(doc, None, &schema, &Variables::new(), &())
+        .await
+        .expect("Execution failed");
 
     assert_eq!(errs, []);
 
@@ -337,8 +340,8 @@ fn interface_introspection() {
     )));
 }
 
-#[test]
-fn object_introspection() {
+#[tokio::test]
+async fn object_introspection() {
     let doc = r#"
     {
         __type(name: "Root") {
@@ -385,8 +388,9 @@ fn object_introspection() {
     "#;
     let schema = RootNode::new(Root, EmptyMutation::<()>::new());
 
-    let (result, errs) =
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &()).expect("Execution failed");
+    let (result, errs) = crate::execute(doc, None, &schema, &Variables::new(), &())
+        .await
+        .expect("Execution failed");
 
     assert_eq!(errs, []);
 
@@ -573,8 +577,8 @@ fn object_introspection() {
     )));
 }
 
-#[test]
-fn scalar_introspection() {
+#[tokio::test]
+async fn scalar_introspection() {
     let doc = r#"
     {
         __type(name: "SampleScalar") {
@@ -592,8 +596,9 @@ fn scalar_introspection() {
     "#;
     let schema = RootNode::new(Root, EmptyMutation::<()>::new());
 
-    let (result, errs) =
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &()).expect("Execution failed");
+    let (result, errs) = crate::execute(doc, None, &schema, &Variables::new(), &())
+        .await
+        .expect("Execution failed");
 
     assert_eq!(errs, []);
 
diff --git a/juniper/src/integrations/chrono.rs b/juniper/src/integrations/chrono.rs
index 3b3bf8e6..9bc79acd 100644
--- a/juniper/src/integrations/chrono.rs
+++ b/juniper/src/integrations/chrono.rs
@@ -206,8 +206,8 @@ mod integration_test {
         executor::Variables, schema::model::RootNode, types::scalars::EmptyMutation, value::Value,
     };
 
-    #[test]
-    fn test_serialization() {
+    #[tokio::test]
+    async fn test_serialization() {
         struct Root;
 
         #[crate::graphql_object_internal]
@@ -237,7 +237,8 @@ mod integration_test {
 
         let schema = RootNode::new(Root, EmptyMutation::<()>::new());
 
-        let (result, errs) = crate::execute_sync(doc, None, &schema, &Variables::new(), &())
+        let (result, errs) = crate::execute(doc, None, &schema, &Variables::new(), &())
+            .await
             .expect("Execution failed");
 
         assert_eq!(errs, []);
diff --git a/juniper/src/macros/tests/args.rs b/juniper/src/macros/tests/args.rs
index 0bc69410..6a355376 100644
--- a/juniper/src/macros/tests/args.rs
+++ b/juniper/src/macros/tests/args.rs
@@ -138,7 +138,7 @@ impl Root {
     }
 }
 
-fn run_args_info_query<F>(field_name: &str, f: F)
+async fn run_args_info_query<F>(field_name: &str, f: F)
 where
     F: Fn(&Vec<Value<DefaultScalarValue>>) -> (),
 {
@@ -164,8 +164,9 @@ where
     "#;
     let schema = RootNode::new(Root {}, EmptyMutation::<()>::new());
 
-    let (result, errs) =
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &()).expect("Execution failed");
+    let (result, errs) = crate::execute(doc, None, &schema, &Variables::new(), &())
+        .await
+        .expect("Execution failed");
 
     assert_eq!(errs, []);
 
@@ -214,22 +215,24 @@ where
     f(args);
 }
 
-#[test]
-fn introspect_field_simple() {
+#[tokio::test]
+async fn introspect_field_simple() {
     run_args_info_query("simple", |args| {
         assert_eq!(args.len(), 0);
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_field_exec_arg() {
+#[tokio::test]
+async fn introspect_field_exec_arg() {
     run_args_info_query("execArg", |args| {
         assert_eq!(args.len(), 0);
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_field_exec_arg_and_more() {
+#[tokio::test]
+async fn introspect_field_exec_arg_and_more() {
     run_args_info_query("execArgAndMore", |args| {
         assert_eq!(args.len(), 1);
 
@@ -258,11 +261,12 @@ fn introspect_field_exec_arg_and_more() {
             .into_iter()
             .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_field_single_arg() {
+#[tokio::test]
+async fn introspect_field_single_arg() {
     run_args_info_query("singleArg", |args| {
         assert_eq!(args.len(), 1);
 
@@ -291,11 +295,12 @@ fn introspect_field_single_arg() {
             .into_iter()
             .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_field_multi_args() {
+#[tokio::test]
+async fn introspect_field_multi_args() {
     run_args_info_query("multiArgs", |args| {
         assert_eq!(args.len(), 2);
 
@@ -350,11 +355,12 @@ fn introspect_field_multi_args() {
             .into_iter()
             .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_field_multi_args_trailing_comma() {
+#[tokio::test]
+async fn introspect_field_multi_args_trailing_comma() {
     run_args_info_query("multiArgsTrailingComma", |args| {
         assert_eq!(args.len(), 2);
 
@@ -409,11 +415,12 @@ fn introspect_field_multi_args_trailing_comma() {
             .into_iter()
             .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_field_single_arg_descr() {
+#[tokio::test]
+async fn introspect_field_single_arg_descr() {
     run_args_info_query("singleArgDescr", |args| {
         assert_eq!(args.len(), 1);
 
@@ -442,11 +449,12 @@ fn introspect_field_single_arg_descr() {
             .into_iter()
             .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_field_multi_args_descr() {
+#[tokio::test]
+async fn introspect_field_multi_args_descr() {
     run_args_info_query("multiArgsDescr", |args| {
         assert_eq!(args.len(), 2);
 
@@ -501,11 +509,12 @@ fn introspect_field_multi_args_descr() {
             .into_iter()
             .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_field_multi_args_descr_trailing_comma() {
+#[tokio::test]
+async fn introspect_field_multi_args_descr_trailing_comma() {
     run_args_info_query("multiArgsDescrTrailingComma", |args| {
         assert_eq!(args.len(), 2);
 
@@ -560,12 +569,13 @@ fn introspect_field_multi_args_descr_trailing_comma() {
             .into_iter()
             .collect(),
         )));
-    });
+    })
+    .await;
 }
 
 // TODO: enable once [parameter attributes are supported by proc macros]
 //       (https://github.com/graphql-rust/juniper/pull/441)
-// #[test]
+// #[tokio::test]
 // fn introspect_field_attr_arg_descr() {
 //     run_args_info_query("attrArgDescr", |args| {
 //         assert_eq!(args.len(), 1);
@@ -600,7 +610,7 @@ fn introspect_field_multi_args_descr_trailing_comma() {
 
 // TODO: enable once [parameter attributes are supported by proc macros]
 //       (https://github.com/graphql-rust/juniper/pull/441)
-// #[test]
+// #[tokio::test]
 // fn introspect_field_attr_arg_descr_collapse() {
 //     run_args_info_query("attrArgDescrCollapse", |args| {
 //         assert_eq!(args.len(), 1);
@@ -633,8 +643,8 @@ fn introspect_field_multi_args_descr_trailing_comma() {
 //     });
 // }
 
-#[test]
-fn introspect_field_arg_with_default() {
+#[tokio::test]
+async fn introspect_field_arg_with_default() {
     run_args_info_query("argWithDefault", |args| {
         assert_eq!(args.len(), 1);
 
@@ -655,11 +665,12 @@ fn introspect_field_arg_with_default() {
             .into_iter()
             .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_field_multi_args_with_default() {
+#[tokio::test]
+async fn introspect_field_multi_args_with_default() {
     run_args_info_query("multiArgsWithDefault", |args| {
         assert_eq!(args.len(), 2);
 
@@ -698,11 +709,12 @@ fn introspect_field_multi_args_with_default() {
             .into_iter()
             .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_field_multi_args_with_default_trailing_comma() {
+#[tokio::test]
+async fn introspect_field_multi_args_with_default_trailing_comma() {
     run_args_info_query("multiArgsWithDefaultTrailingComma", |args| {
         assert_eq!(args.len(), 2);
 
@@ -741,11 +753,12 @@ fn introspect_field_multi_args_with_default_trailing_comma() {
             .into_iter()
             .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_field_arg_with_default_descr() {
+#[tokio::test]
+async fn introspect_field_arg_with_default_descr() {
     run_args_info_query("argWithDefaultDescr", |args| {
         assert_eq!(args.len(), 1);
 
@@ -766,11 +779,12 @@ fn introspect_field_arg_with_default_descr() {
             .into_iter()
             .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_field_multi_args_with_default_descr() {
+#[tokio::test]
+async fn introspect_field_multi_args_with_default_descr() {
     run_args_info_query("multiArgsWithDefaultDescr", |args| {
         assert_eq!(args.len(), 2);
 
@@ -809,11 +823,12 @@ fn introspect_field_multi_args_with_default_descr() {
             .into_iter()
             .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_field_multi_args_with_default_trailing_comma_descr() {
+#[tokio::test]
+async fn introspect_field_multi_args_with_default_trailing_comma_descr() {
     run_args_info_query("multiArgsWithDefaultTrailingCommaDescr", |args| {
         assert_eq!(args.len(), 2);
 
@@ -852,11 +867,12 @@ fn introspect_field_multi_args_with_default_trailing_comma_descr() {
             .into_iter()
             .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_field_args_with_complex_default() {
+#[tokio::test]
+async fn introspect_field_args_with_complex_default() {
     run_args_info_query("argsWithComplexDefault", |args| {
         assert_eq!(args.len(), 2);
 
@@ -898,5 +914,6 @@ fn introspect_field_args_with_complex_default() {
             .into_iter()
             .collect(),
         )));
-    });
+    })
+    .await;
 }
diff --git a/juniper/src/macros/tests/field.rs b/juniper/src/macros/tests/field.rs
index 2497a8e0..07fe5ec1 100644
--- a/juniper/src/macros/tests/field.rs
+++ b/juniper/src/macros/tests/field.rs
@@ -143,7 +143,7 @@ graphql_interface!(Interface: () |&self| {
     }
 });
 
-fn run_field_info_query<F>(type_name: &str, field_name: &str, f: F)
+async fn run_field_info_query<F>(type_name: &str, field_name: &str, f: F)
 where
     F: Fn(&Object<DefaultScalarValue>) -> (),
 {
@@ -164,8 +164,9 @@ where
         .into_iter()
         .collect();
 
-    let (result, errs) =
-        crate::execute_sync(doc, None, &schema, &vars, &()).expect("Execution failed");
+    let (result, errs) = crate::execute(doc, None, &schema, &vars, &())
+        .await
+        .expect("Execution failed");
 
     assert_eq!(errs, []);
 
@@ -206,8 +207,8 @@ where
     f(field);
 }
 
-#[test]
-fn introspect_object_field_simple() {
+#[tokio::test]
+async fn introspect_object_field_simple() {
     run_field_info_query("Root", "simple", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -222,11 +223,12 @@ fn introspect_object_field_simple() {
             field.get_field_value("deprecationReason"),
             Some(&Value::null())
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_interface_field_simple() {
+#[tokio::test]
+async fn introspect_interface_field_simple() {
     run_field_info_query("Interface", "simple", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -241,11 +243,12 @@ fn introspect_interface_field_simple() {
             field.get_field_value("deprecationReason"),
             Some(&Value::null())
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_object_field_description() {
+#[tokio::test]
+async fn introspect_object_field_description() {
     run_field_info_query("Root", "description", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -263,11 +266,12 @@ fn introspect_object_field_description() {
             field.get_field_value("deprecationReason"),
             Some(&Value::null())
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_interface_field_description() {
+#[tokio::test]
+async fn introspect_interface_field_description() {
     run_field_info_query("Interface", "description", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -285,11 +289,12 @@ fn introspect_interface_field_description() {
             field.get_field_value("deprecationReason"),
             Some(&Value::null())
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_object_field_deprecated_outer() {
+#[tokio::test]
+async fn introspect_object_field_deprecated_outer() {
     run_field_info_query("Root", "deprecatedOuter", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -304,11 +309,12 @@ fn introspect_object_field_deprecated_outer() {
             field.get_field_value("deprecationReason"),
             Some(&Value::null()),
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_object_field_deprecated_outer_with_reason() {
+#[tokio::test]
+async fn introspect_object_field_deprecated_outer_with_reason() {
     run_field_info_query("Root", "deprecatedOuterWithReason", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -323,11 +329,12 @@ fn introspect_object_field_deprecated_outer_with_reason() {
             field.get_field_value("deprecationReason"),
             Some(&Value::scalar("Deprecation Reason")),
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_object_field_deprecated() {
+#[tokio::test]
+async fn introspect_object_field_deprecated() {
     run_field_info_query("Root", "deprecated", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -342,11 +349,12 @@ fn introspect_object_field_deprecated() {
             field.get_field_value("deprecationReason"),
             Some(&Value::scalar("Deprecation reason"))
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_interface_field_deprecated() {
+#[tokio::test]
+async fn introspect_interface_field_deprecated() {
     run_field_info_query("Interface", "deprecated", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -361,11 +369,12 @@ fn introspect_interface_field_deprecated() {
             field.get_field_value("deprecationReason"),
             Some(&Value::scalar("Deprecation reason"))
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_object_field_deprecated_descr() {
+#[tokio::test]
+async fn introspect_object_field_deprecated_descr() {
     run_field_info_query("Root", "deprecatedDescr", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -383,11 +392,12 @@ fn introspect_object_field_deprecated_descr() {
             field.get_field_value("deprecationReason"),
             Some(&Value::scalar("Deprecation reason"))
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_interface_field_deprecated_descr() {
+#[tokio::test]
+async fn introspect_interface_field_deprecated_descr() {
     run_field_info_query("Interface", "deprecatedDescr", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -405,11 +415,12 @@ fn introspect_interface_field_deprecated_descr() {
             field.get_field_value("deprecationReason"),
             Some(&Value::scalar("Deprecation reason"))
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_object_field_attr_description() {
+#[tokio::test]
+async fn introspect_object_field_attr_description() {
     run_field_info_query("Root", "attrDescription", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -427,11 +438,12 @@ fn introspect_object_field_attr_description() {
             field.get_field_value("deprecationReason"),
             Some(&Value::null())
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_interface_field_attr_description() {
+#[tokio::test]
+async fn introspect_interface_field_attr_description() {
     run_field_info_query("Interface", "attrDescription", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -449,11 +461,12 @@ fn introspect_interface_field_attr_description() {
             field.get_field_value("deprecationReason"),
             Some(&Value::null())
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_object_field_attr_description_long() {
+#[tokio::test]
+async fn introspect_object_field_attr_description_long() {
     run_field_info_query("Root", "attrDescriptionLong", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -471,11 +484,11 @@ fn introspect_object_field_attr_description_long() {
             field.get_field_value("deprecationReason"),
             Some(&Value::null())
         );
-    });
+    }).await;
 }
 
-#[test]
-fn introspect_interface_field_attr_description_long() {
+#[tokio::test]
+async fn introspect_interface_field_attr_description_long() {
     run_field_info_query("Interface", "attrDescriptionLong", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -493,11 +506,11 @@ fn introspect_interface_field_attr_description_long() {
             field.get_field_value("deprecationReason"),
             Some(&Value::null())
         );
-    });
+    }).await;
 }
 
-#[test]
-fn introspect_object_field_attr_description_collapse() {
+#[tokio::test]
+async fn introspect_object_field_attr_description_collapse() {
     run_field_info_query("Root", "attrDescriptionCollapse", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -517,11 +530,12 @@ fn introspect_object_field_attr_description_collapse() {
             field.get_field_value("deprecationReason"),
             Some(&Value::null())
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_interface_field_attr_description_collapse() {
+#[tokio::test]
+async fn introspect_interface_field_attr_description_collapse() {
     run_field_info_query("Interface", "attrDescriptionCollapse", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -541,11 +555,12 @@ fn introspect_interface_field_attr_description_collapse() {
             field.get_field_value("deprecationReason"),
             Some(&Value::null())
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_object_field_attr_deprecated() {
+#[tokio::test]
+async fn introspect_object_field_attr_deprecated() {
     run_field_info_query("Root", "attrDeprecated", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -560,11 +575,12 @@ fn introspect_object_field_attr_deprecated() {
             field.get_field_value("deprecationReason"),
             Some(&Value::null())
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_interface_field_attr_deprecated() {
+#[tokio::test]
+async fn introspect_interface_field_attr_deprecated() {
     run_field_info_query("Interface", "attrDeprecated", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -579,11 +595,12 @@ fn introspect_interface_field_attr_deprecated() {
             field.get_field_value("deprecationReason"),
             Some(&Value::null())
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_object_field_attr_deprecated_reason() {
+#[tokio::test]
+async fn introspect_object_field_attr_deprecated_reason() {
     run_field_info_query("Root", "attrDeprecatedReason", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -598,11 +615,12 @@ fn introspect_object_field_attr_deprecated_reason() {
             field.get_field_value("deprecationReason"),
             Some(&Value::scalar("Deprecation reason"))
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_interface_field_attr_deprecated_reason() {
+#[tokio::test]
+async fn introspect_interface_field_attr_deprecated_reason() {
     run_field_info_query("Interface", "attrDeprecatedReason", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -617,11 +635,12 @@ fn introspect_interface_field_attr_deprecated_reason() {
             field.get_field_value("deprecationReason"),
             Some(&Value::scalar("Deprecation reason"))
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_object_field_attr_deprecated_descr() {
+#[tokio::test]
+async fn introspect_object_field_attr_deprecated_descr() {
     run_field_info_query("Root", "attrDeprecatedDescr", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -639,11 +658,12 @@ fn introspect_object_field_attr_deprecated_descr() {
             field.get_field_value("deprecationReason"),
             Some(&Value::scalar("Deprecation reason"))
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_interface_field_attr_deprecated_descr() {
+#[tokio::test]
+async fn introspect_interface_field_attr_deprecated_descr() {
     run_field_info_query("Interface", "attrDeprecatedDescr", |field| {
         assert_eq!(
             field.get_field_value("name"),
@@ -661,5 +681,6 @@ fn introspect_interface_field_attr_deprecated_descr() {
             field.get_field_value("deprecationReason"),
             Some(&Value::scalar("Deprecation reason"))
         );
-    });
+    })
+    .await;
 }
diff --git a/juniper/src/macros/tests/impl_object.rs b/juniper/src/macros/tests/impl_object.rs
index 289addda..0e3ff3e6 100644
--- a/juniper/src/macros/tests/impl_object.rs
+++ b/juniper/src/macros/tests/impl_object.rs
@@ -122,9 +122,9 @@ impl Mutation {
     }
 }
 
-#[test]
-fn object_introspect() {
-    let res = util::run_info_query::<Query, Mutation, Context>("Query");
+#[tokio::test]
+async fn object_introspect() {
+    let res = util::run_info_query::<Query, Mutation, Context>("Query").await;
     assert_eq!(
         res,
         crate::graphql_value!({
@@ -243,8 +243,8 @@ fn object_introspect() {
     );
 }
 
-#[test]
-fn object_query() {
+#[tokio::test]
+async fn object_query() {
     let doc = r#"
     query {
         withSelf
@@ -269,7 +269,8 @@ fn object_query() {
     let schema = RootNode::new(Query { b: true }, EmptyMutation::<Context>::new());
     let vars = std::collections::HashMap::new();
 
-    let (result, errs) = crate::execute_sync(doc, None, &schema, &vars, &Context { flag1: true })
+    let (result, errs) = crate::execute(doc, None, &schema, &vars, &Context { flag1: true })
+        .await
         .expect("Execution failed");
     assert_eq!(errs, []);
     assert_eq!(
diff --git a/juniper/src/macros/tests/interface.rs b/juniper/src/macros/tests/interface.rs
index a42fd568..2400de6f 100644
--- a/juniper/src/macros/tests/interface.rs
+++ b/juniper/src/macros/tests/interface.rs
@@ -151,7 +151,7 @@ impl<'a> Root {
     }
 }
 
-fn run_type_info_query<F>(type_name: &str, f: F)
+async fn run_type_info_query<F>(type_name: &str, f: F)
 where
     F: Fn(&Object<DefaultScalarValue>, &Vec<Value<DefaultScalarValue>>) -> (),
 {
@@ -171,8 +171,9 @@ where
         .into_iter()
         .collect();
 
-    let (result, errs) =
-        crate::execute_sync(doc, None, &schema, &vars, &()).expect("Execution failed");
+    let (result, errs) = crate::execute(doc, None, &schema, &vars, &())
+        .await
+        .expect("Execution failed");
 
     assert_eq!(errs, []);
 
@@ -195,8 +196,8 @@ where
     f(type_info, fields);
 }
 
-#[test]
-fn introspect_custom_name() {
+#[tokio::test]
+async fn introspect_custom_name() {
     run_type_info_query("ACustomNamedInterface", |object, fields| {
         assert_eq!(
             object.get_field_value("name"),
@@ -209,11 +210,12 @@ fn introspect_custom_name() {
                 .into_iter()
                 .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_with_lifetime() {
+#[tokio::test]
+async fn introspect_with_lifetime() {
     run_type_info_query("WithLifetime", |object, fields| {
         assert_eq!(
             object.get_field_value("name"),
@@ -226,11 +228,12 @@ fn introspect_with_lifetime() {
                 .into_iter()
                 .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_with_generics() {
+#[tokio::test]
+async fn introspect_with_generics() {
     run_type_info_query("WithGenerics", |object, fields| {
         assert_eq!(
             object.get_field_value("name"),
@@ -243,11 +246,12 @@ fn introspect_with_generics() {
                 .into_iter()
                 .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_description_first() {
+#[tokio::test]
+async fn introspect_description_first() {
     run_type_info_query("DescriptionFirst", |object, fields| {
         assert_eq!(
             object.get_field_value("name"),
@@ -263,11 +267,12 @@ fn introspect_description_first() {
                 .into_iter()
                 .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_fields_first() {
+#[tokio::test]
+async fn introspect_fields_first() {
     run_type_info_query("FieldsFirst", |object, fields| {
         assert_eq!(
             object.get_field_value("name"),
@@ -283,11 +288,12 @@ fn introspect_fields_first() {
                 .into_iter()
                 .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_interfaces_first() {
+#[tokio::test]
+async fn introspect_interfaces_first() {
     run_type_info_query("InterfacesFirst", |object, fields| {
         assert_eq!(
             object.get_field_value("name"),
@@ -303,11 +309,12 @@ fn introspect_interfaces_first() {
                 .into_iter()
                 .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_commas_with_trailing() {
+#[tokio::test]
+async fn introspect_commas_with_trailing() {
     run_type_info_query("CommasWithTrailing", |object, fields| {
         assert_eq!(
             object.get_field_value("name"),
@@ -323,11 +330,12 @@ fn introspect_commas_with_trailing() {
                 .into_iter()
                 .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_commas_on_meta() {
+#[tokio::test]
+async fn introspect_commas_on_meta() {
     run_type_info_query("CommasOnMeta", |object, fields| {
         assert_eq!(
             object.get_field_value("name"),
@@ -343,11 +351,12 @@ fn introspect_commas_on_meta() {
                 .into_iter()
                 .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_resolvers_with_trailing_comma() {
+#[tokio::test]
+async fn introspect_resolvers_with_trailing_comma() {
     run_type_info_query("ResolversWithTrailingComma", |object, fields| {
         assert_eq!(
             object.get_field_value("name"),
@@ -363,5 +372,6 @@ fn introspect_resolvers_with_trailing_comma() {
                 .into_iter()
                 .collect(),
         )));
-    });
+    })
+    .await;
 }
diff --git a/juniper/src/macros/tests/scalar.rs b/juniper/src/macros/tests/scalar.rs
index 99f79ebb..79f624e6 100644
--- a/juniper/src/macros/tests/scalar.rs
+++ b/juniper/src/macros/tests/scalar.rs
@@ -96,14 +96,15 @@ impl Root {
     }
 }
 
-fn run_type_info_query<F>(doc: &str, f: F)
+async fn run_type_info_query<F>(doc: &str, f: F)
 where
     F: Fn(&Object<DefaultScalarValue>) -> (),
 {
     let schema = RootNode::new(Root {}, EmptyMutation::<()>::new());
 
-    let (result, errs) =
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &()).expect("Execution failed");
+    let (result, errs) = crate::execute(doc, None, &schema, &Variables::new(), &())
+        .await
+        .expect("Execution failed");
 
     assert_eq!(errs, []);
 
@@ -139,8 +140,8 @@ fn path_in_resolve_return_type() {
     });
 }
 
-#[test]
-fn default_name_introspection() {
+#[tokio::test]
+async fn default_name_introspection() {
     let doc = r#"
     {
         __type(name: "DefaultName") {
@@ -159,11 +160,12 @@ fn default_name_introspection() {
             type_info.get_field_value("description"),
             Some(&Value::null())
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn other_order_introspection() {
+#[tokio::test]
+async fn other_order_introspection() {
     let doc = r#"
     {
         __type(name: "OtherOrder") {
@@ -182,11 +184,12 @@ fn other_order_introspection() {
             type_info.get_field_value("description"),
             Some(&Value::null())
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn named_introspection() {
+#[tokio::test]
+async fn named_introspection() {
     let doc = r#"
     {
         __type(name: "ANamedScalar") {
@@ -205,11 +208,12 @@ fn named_introspection() {
             type_info.get_field_value("description"),
             Some(&Value::null())
         );
-    });
+    })
+    .await;
 }
 
-#[test]
-fn scalar_description_introspection() {
+#[tokio::test]
+async fn scalar_description_introspection() {
     let doc = r#"
     {
         __type(name: "ScalarDescription") {
@@ -228,5 +232,6 @@ fn scalar_description_introspection() {
             type_info.get_field_value("description"),
             Some(&Value::scalar("A sample scalar, represented as an integer"))
         );
-    });
+    })
+    .await;
 }
diff --git a/juniper/src/macros/tests/union.rs b/juniper/src/macros/tests/union.rs
index 27ae9082..3f68443c 100644
--- a/juniper/src/macros/tests/union.rs
+++ b/juniper/src/macros/tests/union.rs
@@ -106,7 +106,7 @@ impl<'a> Root {
     }
 }
 
-fn run_type_info_query<F>(type_name: &str, f: F)
+async fn run_type_info_query<F>(type_name: &str, f: F)
 where
     F: Fn(&Object<DefaultScalarValue>, &Vec<Value<DefaultScalarValue>>) -> (),
 {
@@ -126,8 +126,9 @@ where
         .into_iter()
         .collect();
 
-    let (result, errs) =
-        crate::execute_sync(doc, None, &schema, &vars, &()).expect("Execution failed");
+    let (result, errs) = crate::execute(doc, None, &schema, &vars, &())
+        .await
+        .expect("Execution failed");
 
     assert_eq!(errs, []);
 
@@ -150,8 +151,8 @@ where
     f(type_info, possible_types);
 }
 
-#[test]
-fn introspect_custom_name() {
+#[tokio::test]
+async fn introspect_custom_name() {
     run_type_info_query("ACustomNamedUnion", |union, possible_types| {
         assert_eq!(
             union.get_field_value("name"),
@@ -164,11 +165,12 @@ fn introspect_custom_name() {
                 .into_iter()
                 .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_with_lifetime() {
+#[tokio::test]
+async fn introspect_with_lifetime() {
     run_type_info_query("WithLifetime", |union, possible_types| {
         assert_eq!(
             union.get_field_value("name"),
@@ -181,11 +183,12 @@ fn introspect_with_lifetime() {
                 .into_iter()
                 .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_with_generics() {
+#[tokio::test]
+async fn introspect_with_generics() {
     run_type_info_query("WithGenerics", |union, possible_types| {
         assert_eq!(
             union.get_field_value("name"),
@@ -198,11 +201,12 @@ fn introspect_with_generics() {
                 .into_iter()
                 .collect(),
         )));
-    });
+    })
+    .await;
 }
 
-#[test]
-fn introspect_description_first() {
+#[tokio::test]
+async fn introspect_description_first() {
     run_type_info_query("DescriptionFirst", |union, possible_types| {
         assert_eq!(
             union.get_field_value("name"),
@@ -218,5 +222,6 @@ fn introspect_description_first() {
                 .into_iter()
                 .collect(),
         )));
-    });
+    })
+    .await;
 }
diff --git a/juniper/src/macros/tests/util.rs b/juniper/src/macros/tests/util.rs
index 0074dfa8..70bc5193 100644
--- a/juniper/src/macros/tests/util.rs
+++ b/juniper/src/macros/tests/util.rs
@@ -1,26 +1,27 @@
-use crate::{DefaultScalarValue, GraphQLType, RootNode, Value, Variables};
+use crate::{DefaultScalarValue, GraphQLTypeAsync, RootNode, Value, Variables};
 use std::default::Default;
 
-pub fn run_query<Query, Mutation, Context>(query: &str) -> Value
+pub async fn run_query<Query, Mutation, Context>(query: &str) -> Value
 where
-    Query: GraphQLType<DefaultScalarValue, TypeInfo = (), Context = Context> + Default,
-    Mutation: GraphQLType<DefaultScalarValue, TypeInfo = (), Context = Context> + Default,
-    Context: Default,
+    Query: GraphQLTypeAsync<DefaultScalarValue, TypeInfo = (), Context = Context> + Default,
+    Mutation: GraphQLTypeAsync<DefaultScalarValue, TypeInfo = (), Context = Context> + Default,
+    Context: Default + Sync + Send,
 {
     let schema = RootNode::new(Query::default(), Mutation::default());
     let (result, errs) =
-        crate::execute_sync(query, None, &schema, &Variables::new(), &Context::default())
+        crate::execute(query, None, &schema, &Variables::new(), &Context::default())
+            .await
             .expect("Execution failed");
 
     assert_eq!(errs, []);
     result
 }
 
-pub fn run_info_query<Query, Mutation, Context>(type_name: &str) -> Value
+pub async fn run_info_query<Query, Mutation, Context>(type_name: &str) -> Value
 where
-    Query: GraphQLType<DefaultScalarValue, TypeInfo = (), Context = Context> + Default,
-    Mutation: GraphQLType<DefaultScalarValue, TypeInfo = (), Context = Context> + Default,
-    Context: Default,
+    Query: GraphQLTypeAsync<DefaultScalarValue, TypeInfo = (), Context = Context> + Default,
+    Mutation: GraphQLTypeAsync<DefaultScalarValue, TypeInfo = (), Context = Context> + Default,
+    Context: Default + Sync + Send,
 {
     let query = format!(
         r#"
@@ -44,7 +45,7 @@ where
     "#,
         type_name
     );
-    let result = run_query::<Query, Mutation, Context>(&query);
+    let result = run_query::<Query, Mutation, Context>(&query).await;
     result
         .as_object_value()
         .expect("Result is not an object")
diff --git a/juniper/src/tests/introspection_tests.rs b/juniper/src/tests/introspection_tests.rs
index 7d4449ba..30b598ce 100644
--- a/juniper/src/tests/introspection_tests.rs
+++ b/juniper/src/tests/introspection_tests.rs
@@ -9,8 +9,8 @@ use crate::{
     types::scalars::EmptyMutation,
 };
 
-#[test]
-fn test_introspection_query_type_name() {
+#[tokio::test]
+async fn test_introspection_query_type_name() {
     let doc = r#"
         query IntrospectionQueryTypeQuery {
           __schema {
@@ -23,7 +23,7 @@ fn test_introspection_query_type_name() {
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &database),
+        crate::execute(doc, None, &schema, &Variables::new(), &database).await,
         Ok((
             graphql_value!({
                 "__schema": {
@@ -38,8 +38,8 @@ fn test_introspection_query_type_name() {
     );
 }
 
-#[test]
-fn test_introspection_type_name() {
+#[tokio::test]
+async fn test_introspection_type_name() {
     let doc = r#"
         query IntrospectionQueryTypeQuery {
           __type(name: "Droid") {
@@ -50,7 +50,7 @@ fn test_introspection_type_name() {
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &database),
+        crate::execute(doc, None, &schema, &Variables::new(), &database).await,
         Ok((
             graphql_value!({
                 "__type": {
@@ -62,8 +62,8 @@ fn test_introspection_type_name() {
     );
 }
 
-#[test]
-fn test_introspection_specific_object_type_name_and_kind() {
+#[tokio::test]
+async fn test_introspection_specific_object_type_name_and_kind() {
     let doc = r#"
         query IntrospectionDroidKindQuery {
           __type(name: "Droid") {
@@ -76,7 +76,7 @@ fn test_introspection_specific_object_type_name_and_kind() {
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &database),
+        crate::execute(doc, None, &schema, &Variables::new(), &database).await,
         Ok((
             graphql_value!({
                 "__type": {
@@ -89,8 +89,8 @@ fn test_introspection_specific_object_type_name_and_kind() {
     );
 }
 
-#[test]
-fn test_introspection_specific_interface_type_name_and_kind() {
+#[tokio::test]
+async fn test_introspection_specific_interface_type_name_and_kind() {
     let doc = r#"
         query IntrospectionDroidKindQuery {
           __type(name: "Character") {
@@ -103,7 +103,7 @@ fn test_introspection_specific_interface_type_name_and_kind() {
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &database),
+        crate::execute(doc, None, &schema, &Variables::new(), &database).await,
         Ok((
             graphql_value!({
                 "__type": {
@@ -116,8 +116,8 @@ fn test_introspection_specific_interface_type_name_and_kind() {
     );
 }
 
-#[test]
-fn test_introspection_documentation() {
+#[tokio::test]
+async fn test_introspection_documentation() {
     let doc = r#"
         query IntrospectionDroidDescriptionQuery {
           __type(name: "Droid") {
@@ -130,7 +130,7 @@ fn test_introspection_documentation() {
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &database),
+        crate::execute(doc, None, &schema, &Variables::new(), &database).await,
         Ok((
             graphql_value!({
                 "__type": {
@@ -143,8 +143,8 @@ fn test_introspection_documentation() {
     );
 }
 
-#[test]
-fn test_introspection_directives() {
+#[tokio::test]
+async fn test_introspection_directives() {
     let q = r#"
         query IntrospectionQuery {
           __schema {
@@ -159,7 +159,9 @@ fn test_introspection_directives() {
     let database = Database::new();
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
-    let mut result = crate::execute_sync(q, None, &schema, &Variables::new(), &database).unwrap();
+    let mut result = crate::execute(q, None, &schema, &Variables::new(), &database)
+        .await
+        .unwrap();
     sort_schema_value(&mut result.0);
 
     let mut expected = graphql_value!({
@@ -189,8 +191,8 @@ fn test_introspection_directives() {
     assert_eq!(result, (expected, vec![]));
 }
 
-#[test]
-fn test_introspection_possible_types() {
+#[tokio::test]
+async fn test_introspection_possible_types() {
     let doc = r#"
         query IntrospectionDroidDescriptionQuery {
           __type(name: "Character") {
@@ -203,7 +205,7 @@ fn test_introspection_possible_types() {
     let database = Database::new();
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
-    let result = crate::execute_sync(doc, None, &schema, &Variables::new(), &database);
+    let result = crate::execute(doc, None, &schema, &Variables::new(), &database).await;
 
     let (result, errors) = result.ok().expect("Query returned error");
 
@@ -234,8 +236,8 @@ fn test_introspection_possible_types() {
     assert_eq!(possible_types, vec!["Human", "Droid"].into_iter().collect());
 }
 
-#[test]
-fn test_builtin_introspection_query() {
+#[tokio::test]
+async fn test_builtin_introspection_query() {
     let database = Database::new();
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
     let mut result = crate::introspect(&schema, &database, IntrospectionFormat::default()).unwrap();
@@ -244,8 +246,8 @@ fn test_builtin_introspection_query() {
     assert_eq!(result, (expected, vec![]));
 }
 
-#[test]
-fn test_builtin_introspection_query_without_descriptions() {
+#[tokio::test]
+async fn test_builtin_introspection_query_without_descriptions() {
     let database = Database::new();
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
diff --git a/juniper/src/tests/query_tests.rs b/juniper/src/tests/query_tests.rs
index 4419087f..dcc98c57 100644
--- a/juniper/src/tests/query_tests.rs
+++ b/juniper/src/tests/query_tests.rs
@@ -7,8 +7,8 @@ use crate::{
     value::Value,
 };
 
-#[test]
-fn test_hero_name() {
+#[tokio::test]
+async fn test_hero_name() {
     let doc = r#"
         {
             hero {
@@ -19,7 +19,7 @@ fn test_hero_name() {
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &database),
+        crate::execute(doc, None, &schema, &Variables::new(), &database).await,
         Ok((
             Value::object(
                 vec![(
@@ -34,8 +34,8 @@ fn test_hero_name() {
     );
 }
 
-#[test]
-fn test_hero_field_order() {
+#[tokio::test]
+async fn test_hero_field_order() {
     let database = Database::new();
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
@@ -47,7 +47,7 @@ fn test_hero_field_order() {
             }
         }"#;
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &database),
+        crate::execute(doc, None, &schema, &Variables::new(), &database).await,
         Ok((
             Value::object(
                 vec![(
@@ -76,7 +76,7 @@ fn test_hero_field_order() {
             }
         }"#;
     assert_eq!(
-        crate::execute_sync(doc_reversed, None, &schema, &Variables::new(), &database),
+        crate::execute(doc_reversed, None, &schema, &Variables::new(), &database).await,
         Ok((
             Value::object(
                 vec![(
@@ -98,8 +98,8 @@ fn test_hero_field_order() {
     );
 }
 
-#[test]
-fn test_hero_name_and_friends() {
+#[tokio::test]
+async fn test_hero_name_and_friends() {
     let doc = r#"
         {
             hero {
@@ -114,7 +114,7 @@ fn test_hero_name_and_friends() {
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &database),
+        crate::execute(doc, None, &schema, &Variables::new(), &database).await,
         Ok((
             Value::object(
                 vec![(
@@ -156,8 +156,8 @@ fn test_hero_name_and_friends() {
     );
 }
 
-#[test]
-fn test_hero_name_and_friends_and_friends_of_friends() {
+#[tokio::test]
+async fn test_hero_name_and_friends_and_friends_of_friends() {
     let doc = r#"
         {
             hero {
@@ -176,7 +176,7 @@ fn test_hero_name_and_friends_and_friends_of_friends() {
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &database),
+        crate::execute(doc, None, &schema, &Variables::new(), &database).await,
         Ok((
             Value::object(
                 vec![(
@@ -330,14 +330,14 @@ fn test_hero_name_and_friends_and_friends_of_friends() {
     );
 }
 
-#[test]
-fn test_query_name() {
+#[tokio::test]
+async fn test_query_name() {
     let doc = r#"{ human(id: "1000") { name } }"#;
     let database = Database::new();
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &database),
+        crate::execute(doc, None, &schema, &Variables::new(), &database).await,
         Ok((
             Value::object(
                 vec![(
@@ -356,14 +356,14 @@ fn test_query_name() {
     );
 }
 
-#[test]
-fn test_query_alias_single() {
+#[tokio::test]
+async fn test_query_alias_single() {
     let doc = r#"{ luke: human(id: "1000") { name } }"#;
     let database = Database::new();
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &database),
+        crate::execute(doc, None, &schema, &Variables::new(), &database).await,
         Ok((
             Value::object(
                 vec![(
@@ -382,8 +382,8 @@ fn test_query_alias_single() {
     );
 }
 
-#[test]
-fn test_query_alias_multiple() {
+#[tokio::test]
+async fn test_query_alias_multiple() {
     let doc = r#"
         {
             luke: human(id: "1000") { name }
@@ -393,7 +393,7 @@ fn test_query_alias_multiple() {
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &database),
+        crate::execute(doc, None, &schema, &Variables::new(), &database).await,
         Ok((
             Value::object(
                 vec![
@@ -422,8 +422,8 @@ fn test_query_alias_multiple() {
     );
 }
 
-#[test]
-fn test_query_alias_multiple_with_fragment() {
+#[tokio::test]
+async fn test_query_alias_multiple_with_fragment() {
     let doc = r#"
         query UseFragment {
             luke: human(id: "1000") { ...HumanFragment }
@@ -438,7 +438,7 @@ fn test_query_alias_multiple_with_fragment() {
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &database),
+        crate::execute(doc, None, &schema, &Variables::new(), &database).await,
         Ok((
             Value::object(
                 vec![
@@ -473,8 +473,8 @@ fn test_query_alias_multiple_with_fragment() {
     );
 }
 
-#[test]
-fn test_query_name_variable() {
+#[tokio::test]
+async fn test_query_name_variable() {
     let doc = r#"query FetchSomeIDQuery($someId: String!) { human(id: $someId) { name } }"#;
     let database = Database::new();
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
@@ -484,7 +484,7 @@ fn test_query_name_variable() {
         .collect();
 
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &vars, &database),
+        crate::execute(doc, None, &schema, &vars, &database).await,
         Ok((
             Value::object(
                 vec![(
@@ -503,8 +503,8 @@ fn test_query_name_variable() {
     );
 }
 
-#[test]
-fn test_query_name_invalid_variable() {
+#[tokio::test]
+async fn test_query_name_invalid_variable() {
     let doc = r#"query FetchSomeIDQuery($someId: String!) { human(id: $someId) { name } }"#;
     let database = Database::new();
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
@@ -514,7 +514,7 @@ fn test_query_name_invalid_variable() {
         .collect();
 
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &vars, &database),
+        crate::execute(doc, None, &schema, &vars, &database).await,
         Ok((
             Value::object(vec![("human", Value::null())].into_iter().collect()),
             vec![]
@@ -522,14 +522,14 @@ fn test_query_name_invalid_variable() {
     );
 }
 
-#[test]
-fn test_query_friends_names() {
+#[tokio::test]
+async fn test_query_friends_names() {
     let doc = r#"{ human(id: "1000") { friends { name } } }"#;
     let database = Database::new();
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &database),
+        crate::execute(doc, None, &schema, &Variables::new(), &database).await,
         Ok((
             Value::object(
                 vec![(
@@ -568,8 +568,8 @@ fn test_query_friends_names() {
     );
 }
 
-#[test]
-fn test_query_inline_fragments_droid() {
+#[tokio::test]
+async fn test_query_inline_fragments_droid() {
     let doc = r#"
         query InlineFragments {
             hero {
@@ -586,7 +586,7 @@ fn test_query_inline_fragments_droid() {
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &database),
+        crate::execute(doc, None, &schema, &Variables::new(), &database).await,
         Ok((
             Value::object(
                 vec![(
@@ -609,8 +609,8 @@ fn test_query_inline_fragments_droid() {
     );
 }
 
-#[test]
-fn test_query_inline_fragments_human() {
+#[tokio::test]
+async fn test_query_inline_fragments_human() {
     let doc = r#"
         query InlineFragments {
             hero(episode: EMPIRE) {
@@ -623,7 +623,7 @@ fn test_query_inline_fragments_human() {
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &database),
+        crate::execute(doc, None, &schema, &Variables::new(), &database).await,
         Ok((
             Value::object(
                 vec![(
@@ -645,8 +645,8 @@ fn test_query_inline_fragments_human() {
     );
 }
 
-#[test]
-fn test_object_typename() {
+#[tokio::test]
+async fn test_object_typename() {
     let doc = r#"
         {
             human(id: "1000") {
@@ -657,7 +657,7 @@ fn test_object_typename() {
     let schema = RootNode::new(Query, EmptyMutation::<Database>::new());
 
     assert_eq!(
-        crate::execute_sync(doc, None, &schema, &Variables::new(), &database),
+        crate::execute(doc, None, &schema, &Variables::new(), &database).await,
         Ok((
             Value::object(
                 vec![(