2022-01-18 02:33:07 +00:00
|
|
|
use async_graphql::*;
|
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
async fn test_flatten() {
|
|
|
|
#[derive(SimpleObject)]
|
|
|
|
struct A {
|
|
|
|
a: i32,
|
|
|
|
b: i32,
|
|
|
|
}
|
|
|
|
|
|
|
|
struct B;
|
|
|
|
|
|
|
|
#[Object]
|
|
|
|
impl B {
|
|
|
|
#[graphql(flatten)]
|
|
|
|
async fn a(&self) -> A {
|
|
|
|
A { a: 100, b: 200 }
|
|
|
|
}
|
|
|
|
|
|
|
|
async fn c(&self) -> i32 {
|
|
|
|
300
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Query;
|
|
|
|
|
|
|
|
#[Object]
|
|
|
|
impl Query {
|
|
|
|
async fn obj(&self) -> B {
|
|
|
|
B
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let schema = Schema::new(Query, EmptyMutation, EmptySubscription);
|
|
|
|
let query = "{ __type(name: \"B\") { fields { name } } }";
|
|
|
|
assert_eq!(
|
|
|
|
schema.execute(query).await.data,
|
|
|
|
value!({
|
|
|
|
"__type": {
|
|
|
|
"fields": [
|
|
|
|
{"name": "a"},
|
|
|
|
{"name": "b"},
|
|
|
|
{"name": "c"}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
})
|
|
|
|
);
|
|
|
|
|
|
|
|
let query = "{ obj { a b c } }";
|
|
|
|
assert_eq!(
|
|
|
|
schema.execute(query).await.data,
|
|
|
|
value!({
|
|
|
|
"obj": {
|
|
|
|
"a": 100,
|
|
|
|
"b": 200,
|
|
|
|
"c": 300,
|
|
|
|
}
|
|
|
|
})
|
|
|
|
);
|
|
|
|
}
|
2022-02-04 16:30:58 +00:00
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
async fn test_flatten_with_context() {
|
|
|
|
#[derive(SimpleObject)]
|
|
|
|
struct A {
|
|
|
|
a: i32,
|
|
|
|
b: i32,
|
|
|
|
}
|
|
|
|
|
|
|
|
struct B;
|
|
|
|
|
|
|
|
#[Object]
|
|
|
|
impl B {
|
|
|
|
#[graphql(flatten)]
|
|
|
|
async fn a(&self, _ctx: &Context<'_>) -> A {
|
|
|
|
A { a: 100, b: 200 }
|
|
|
|
}
|
|
|
|
|
|
|
|
async fn c(&self) -> i32 {
|
|
|
|
300
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Query;
|
|
|
|
|
|
|
|
#[Object]
|
|
|
|
impl Query {
|
|
|
|
async fn obj(&self) -> B {
|
|
|
|
B
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let schema = Schema::new(Query, EmptyMutation, EmptySubscription);
|
|
|
|
let query = "{ __type(name: \"B\") { fields { name } } }";
|
|
|
|
assert_eq!(
|
|
|
|
schema.execute(query).await.data,
|
|
|
|
value!({
|
|
|
|
"__type": {
|
|
|
|
"fields": [
|
|
|
|
{"name": "a"},
|
|
|
|
{"name": "b"},
|
|
|
|
{"name": "c"}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
})
|
|
|
|
);
|
|
|
|
|
|
|
|
let query = "{ obj { a b c } }";
|
|
|
|
assert_eq!(
|
|
|
|
schema.execute(query).await.data,
|
|
|
|
value!({
|
|
|
|
"obj": {
|
|
|
|
"a": 100,
|
|
|
|
"b": 200,
|
|
|
|
"c": 300,
|
|
|
|
}
|
|
|
|
})
|
|
|
|
);
|
|
|
|
}
|
2022-02-28 07:26:33 +00:00
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
async fn test_oneof_field() {
|
|
|
|
#[derive(OneofObject)]
|
|
|
|
enum TestArg {
|
|
|
|
A(i32),
|
|
|
|
B(String),
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Query;
|
|
|
|
|
|
|
|
#[Object]
|
|
|
|
impl Query {
|
|
|
|
#[graphql(oneof)]
|
|
|
|
async fn test(&self, arg: TestArg) -> String {
|
|
|
|
match arg {
|
|
|
|
TestArg::A(a) => format!("a:{}", a),
|
|
|
|
TestArg::B(b) => format!("b:{}", b),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let schema = Schema::new(Query, EmptyMutation, EmptySubscription);
|
|
|
|
let query = "{ test(a: 10) }";
|
|
|
|
assert_eq!(
|
|
|
|
schema.execute(query).await.into_result().unwrap().data,
|
|
|
|
value!({
|
|
|
|
"test": "a:10"
|
|
|
|
})
|
|
|
|
);
|
|
|
|
|
|
|
|
let query = r#"{ test(b: "abc") }"#;
|
|
|
|
assert_eq!(
|
|
|
|
schema.execute(query).await.into_result().unwrap().data,
|
|
|
|
value!({
|
|
|
|
"test": "b:abc"
|
|
|
|
})
|
|
|
|
);
|
|
|
|
|
|
|
|
let query = r#"{
|
|
|
|
__type(name: "Query") {
|
|
|
|
fields {
|
|
|
|
name
|
|
|
|
args {
|
|
|
|
name
|
|
|
|
type {
|
|
|
|
kind
|
|
|
|
name
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}"#;
|
|
|
|
assert_eq!(
|
|
|
|
schema.execute(query).await.into_result().unwrap().data,
|
|
|
|
value!({
|
|
|
|
"__type": {
|
|
|
|
"fields": [{
|
|
|
|
"name": "test",
|
|
|
|
"args": [{
|
|
|
|
"name": "a",
|
|
|
|
"type": {
|
|
|
|
"kind": "SCALAR",
|
|
|
|
"name": "Int"
|
|
|
|
}
|
|
|
|
}, {
|
|
|
|
"name": "b",
|
|
|
|
"type": {
|
|
|
|
"kind": "SCALAR",
|
|
|
|
"name": "String"
|
|
|
|
}
|
|
|
|
}]
|
|
|
|
}]
|
|
|
|
}
|
|
|
|
})
|
|
|
|
);
|
|
|
|
}
|