async-graphql/tests/federation.rs

90 lines
1.5 KiB
Rust
Raw Normal View History

2020-05-01 23:57:34 +00:00
#![allow(unreachable_code)]
2020-04-09 14:03:09 +00:00
use async_graphql::*;
struct User {
id: ID,
}
#[Object(extends)]
impl User {
#[field(external)]
async fn id(&self) -> &ID {
&self.id
}
async fn reviews(&self) -> Vec<Review> {
todo!()
}
}
struct Review;
#[Object]
impl Review {
async fn body(&self) -> String {
todo!()
}
#[field(provides = "username")]
async fn author(&self) -> User {
todo!()
}
async fn product(&self) -> Product {
todo!()
}
}
struct Product {
upc: String,
}
#[Object(extends)]
impl Product {
#[field(external)]
async fn upc(&self) -> &str {
&self.upc
}
async fn reviews(&self) -> Vec<Review> {
todo!()
}
}
struct QueryRoot;
#[Object]
impl QueryRoot {
#[entity]
async fn find_user_by_id(&self, id: ID) -> User {
User { id }
}
#[entity]
async fn find_product_by_upc(&self, upc: String) -> Product {
Product { upc }
}
}
#[async_std::test]
pub async fn test_federation() {
let schema = Schema::new(QueryRoot, EmptyMutation, EmptySubscription);
2020-05-01 23:57:34 +00:00
let query = r#"{
_entities(representations: [{__typename: "Product", upc: "B00005N5PF"}]) {
2020-04-09 14:03:09 +00:00
__typename
2020-05-01 23:57:34 +00:00
... on Product {
2020-04-09 14:03:09 +00:00
upc
2020-05-01 23:57:34 +00:00
}
}
}"#;
2020-04-09 14:03:09 +00:00
assert_eq!(
2020-09-10 11:35:48 +00:00
schema.execute(query).await.data,
2020-04-09 14:03:09 +00:00
serde_json::json!({
"_entities": [
{"__typename": "Product", "upc": "B00005N5PF"},
]
})
);
}