async-graphql/tests/defer.rs

95 lines
2.1 KiB
Rust
Raw Normal View History

use async_graphql::*;
2020-05-20 00:18:28 +00:00
use futures::StreamExt;
#[async_std::test]
pub async fn test_defer() {
2020-05-20 00:18:28 +00:00
#[derive(Clone)]
struct MyObj;
#[Object]
impl MyObj {
async fn value(&self) -> i32 {
20
}
async fn obj(&self) -> Deferred<MyObj> {
MyObj.into()
}
}
2020-05-20 00:18:28 +00:00
struct Query;
#[Object]
impl Query {
async fn value(&self) -> Deferred<i32> {
10.into()
}
2020-05-20 00:18:28 +00:00
async fn obj(&self) -> Deferred<MyObj> {
MyObj.into()
}
}
2020-05-20 00:18:28 +00:00
let schema = Schema::new(Query, EmptyMutation, EmptySubscription);
let query = r#"{
2020-05-20 00:18:28 +00:00
value @defer
}"#;
assert_eq!(
schema.execute(&query).await.unwrap().data,
serde_json::json!({
"value": 10,
})
);
2020-05-20 00:18:28 +00:00
let query = r#"{
value @defer
obj @defer {
value
obj @defer {
value
}
}
}"#;
assert_eq!(
schema.execute(&query).await.unwrap().data,
serde_json::json!({
"value": 10,
"obj": {
"value": 20,
"obj": {
"value": 20
}
}
})
);
2020-05-20 12:10:40 +00:00
let mut stream = schema.execute_stream(&query);
2020-05-20 00:18:28 +00:00
assert_eq!(
stream.next().await.unwrap().unwrap().data,
serde_json::json!({
"value": null,
"obj": null,
})
);
let next_resp = stream.next().await.unwrap().unwrap();
assert_eq!(next_resp.path, Some(vec![serde_json::json!("value")]));
assert_eq!(next_resp.data, serde_json::json!(10));
let next_resp = stream.next().await.unwrap().unwrap();
assert_eq!(next_resp.path, Some(vec![serde_json::json!("obj")]));
assert_eq!(
next_resp.data,
serde_json::json!({"value": 20, "obj": null})
);
let next_resp = stream.next().await.unwrap().unwrap();
assert_eq!(
next_resp.path,
Some(vec![serde_json::json!("obj"), serde_json::json!("obj")])
);
assert_eq!(next_resp.data, serde_json::json!({"value": 20}));
assert!(stream.next().await.is_none());
}