async-graphql/tests/federation.rs

90 lines
1.6 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)]
2020-04-09 14:03:09 +00:00
impl User {
2020-09-28 09:44:00 +00:00
#[graphql(external)]
2020-04-09 14:03:09 +00:00
async fn id(&self) -> &ID {
&self.id
}
async fn reviews(&self) -> Vec<Review> {
todo!()
}
}
struct Review;
#[Object]
2020-04-09 14:03:09 +00:00
impl Review {
async fn body(&self) -> String {
todo!()
}
2020-09-28 09:44:00 +00:00
#[graphql(provides = "username")]
2020-04-09 14:03:09 +00:00
async fn author(&self) -> User {
todo!()
}
async fn product(&self) -> Product {
todo!()
}
}
struct Product {
upc: String,
}
#[Object(extends)]
2020-04-09 14:03:09 +00:00
impl Product {
2020-09-28 09:44:00 +00:00
#[graphql(external)]
2020-04-09 14:03:09 +00:00
async fn upc(&self) -> &str {
&self.upc
}
async fn reviews(&self) -> Vec<Review> {
todo!()
}
}
struct QueryRoot;
#[Object]
2020-04-09 14:03:09 +00:00
impl QueryRoot {
2020-09-28 09:44:00 +00:00
#[graphql(entity)]
2020-04-09 14:03:09 +00:00
async fn find_user_by_id(&self, id: ID) -> User {
User { id }
}
2020-09-28 09:44:00 +00:00
#[graphql(entity)]
2020-04-09 14:03:09 +00:00
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-12 09:29:52 +00:00
schema.execute(query).await.into_result().unwrap().data,
2020-04-09 14:03:09 +00:00
serde_json::json!({
"_entities": [
{"__typename": "Product", "upc": "B00005N5PF"},
]
})
);
}