async-graphql/tests/complexity_and_depth.rs

140 lines
3.2 KiB
Rust

use async_graphql::*;
#[async_std::test]
pub async fn test_complexity_and_depth() {
struct Query;
struct MyObj;
#[Object]
impl MyObj {
async fn a(&self) -> i32 {
1
}
async fn b(&self) -> i32 {
2
}
async fn c(&self) -> MyObj {
MyObj
}
}
#[Object]
impl Query {
async fn value(&self) -> i32 {
1
}
async fn obj(&self) -> MyObj {
MyObj
}
}
let query = "{ a:value b:value c:value }";
let schema = Schema::build(Query, EmptyMutation, EmptySubscription)
.limit_complexity(2)
.finish();
assert_eq!(
schema.execute(query).await.into_result().unwrap_err(),
vec![ServerError {
message: "Query is too complex.".to_owned(),
locations: Vec::new(),
path: Vec::new(),
extensions: None,
}]
);
let query = "{ a:value b:value }";
let schema = Schema::build(Query, EmptyMutation, EmptySubscription)
.limit_complexity(2)
.finish();
assert_eq!(
schema.execute(query).await.data,
value!({
"a": 1,
"b": 1,
})
);
let query = "{ obj { a b } }";
let schema = Schema::build(Query, EmptyMutation, EmptySubscription)
.limit_complexity(2)
.finish();
assert_eq!(
schema.execute(query).await.into_result().unwrap_err(),
vec![ServerError {
message: "Query is too complex.".to_owned(),
locations: Vec::new(),
path: Vec::new(),
extensions: None,
}]
);
let query = "{ obj { a } }";
let schema = Schema::build(Query, EmptyMutation, EmptySubscription)
.limit_complexity(2)
.finish();
assert_eq!(
schema.execute(query).await.data,
value!({
"obj": { "a": 1 }
})
);
let query = r#"
{
obj { # 0
a b c { # 1
a b c { # 2
a b # 3
}
}
}
}"#;
let schema = Schema::build(Query, EmptyMutation, EmptySubscription)
.limit_depth(2)
.finish();
assert_eq!(
schema.execute(query).await.into_result().unwrap_err(),
vec![ServerError {
message: "Query is nested too deep.".to_owned(),
locations: Vec::new(),
path: Vec::new(),
extensions: None,
}]
);
let query = r#"
{
obj { # 0
a b c { # 1
a b c { # 2
a b # 3
}
}
}
}"#;
let schema = Schema::build(Query, EmptyMutation, EmptySubscription)
.limit_depth(3)
.finish();
assert_eq!(
schema.execute(query).await.data,
value!({
"obj": {
"a": 1,
"b": 2,
"c": {
"a": 1,
"b": 2,
"c": {
"a": 1,
"b": 2,
}
}
}
})
);
}