#![cfg(all(feature = "graphql-client", feature = "reqwest"))]
use std::time::Duration;
use assert_matches::assert_matches;
use graphql_client::GraphQLQuery;
use reqwest::Url;
use thegraph_graphql_http::http_client::ReqwestExt;
const TEST_SERVER_URL: &str = "https://graphql.org/graphql/";
mod test_queries {
#[derive(graphql_client::GraphQLQuery)]
#[graphql(
schema_path = "tests/assets/schema.graphql",
query_path = "tests/assets/queries.graphql"
)]
pub struct AllFilms;
#[derive(graphql_client::GraphQLQuery)]
#[graphql(
schema_path = "tests/assets/schema.graphql",
query_path = "tests/assets/queries.graphql"
)]
pub struct FilmByFilmId;
}
#[tokio::test]
async fn send_valid_graphql_request_no_variables() {
let client = reqwest::Client::new();
let server_url: Url = TEST_SERVER_URL.parse().unwrap();
#[derive(Debug, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
struct QueryResponse {
all_films: QueryResponseAllFilms,
}
#[derive(Debug, serde::Deserialize)]
struct QueryResponseAllFilms {
films: Vec<QueryResponseFilm>,
}
#[derive(Debug, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
struct QueryResponseFilm {
title: String,
director: String,
release_date: String,
}
let query = test_queries::AllFilms::build_query(test_queries::all_films::Variables {});
let req_fut = client.post(server_url).send_graphql::<QueryResponse>(query);
let response = tokio::time::timeout(Duration::from_secs(30), req_fut)
.await
.expect("Request timed out")
.expect("Request failed");
assert_matches!(response, Ok(QueryResponse { all_films: QueryResponseAllFilms { films } }) => {
assert_eq!(films.len(), 6);
assert_matches!(films.iter().find(|film| film.title == "A New Hope"), Some(film) => {
assert_eq!(film.title, "A New Hope");
assert_eq!(film.director, "George Lucas");
assert_eq!(film.release_date, "1977-05-25");
});
assert_matches!(films.iter().find(|film| film.title == "The Empire Strikes Back"), Some(film) => {
assert_eq!(film.title, "The Empire Strikes Back");
assert_eq!(film.director, "Irvin Kershner");
assert_eq!(film.release_date, "1980-05-17");
});
assert_matches!(films.iter().find(|film| film.title == "Return of the Jedi"), Some(film) => {
assert_eq!(film.title, "Return of the Jedi");
assert_eq!(film.director, "Richard Marquand");
assert_eq!(film.release_date, "1983-05-25");
});
});
}
#[tokio::test]
async fn send_valid_graphql_request_with_variables() {
let client = reqwest::Client::new();
let server_url: Url = TEST_SERVER_URL.parse().unwrap();
#[derive(Debug, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
struct QueryResponse {
film: Film,
}
#[derive(Debug, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
struct Film {
title: String,
director: String,
release_date: String,
}
let request =
test_queries::FilmByFilmId::build_query(test_queries::film_by_film_id::Variables {
id: "1".to_string(),
});
let req_fut = client
.post(server_url)
.send_graphql::<QueryResponse>(request);
let response = tokio::time::timeout(Duration::from_secs(30), req_fut)
.await
.expect("Request timed out")
.expect("Request failed");
assert_matches!(response, Ok(QueryResponse { film }) => {
assert_eq!(film.title, "A New Hope");
assert_eq!(film.director, "George Lucas");
assert_eq!(film.release_date, "1977-05-25");
});
}