From 469c3933244b6370276d14640e29986374d74283 Mon Sep 17 00:00:00 2001 From: Abigail Emery Date: Tue, 28 Oct 2025 18:17:37 +0000 Subject: [PATCH 1/2] Move test into model --- src/handlers.rs | 37 ------------------------------------- src/model.rs | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/handlers.rs b/src/handlers.rs index 55d437d..b0270fe 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -19,40 +19,3 @@ pub async fn graphql_handler( pub async fn graphiql_handler() -> impl IntoResponse { Html(GraphiQLSource::build().endpoint("/graphql").finish()) } - -#[cfg(test)] -mod tests { - use async_graphql::{EmptyMutation, EmptySubscription, Schema}; - use httpmock::MockServer; - use url::Url; - - use crate::TiledQuery; - use crate::clients::TiledClient; - - #[tokio::test] - async fn test_api_version_query() { - let mock_server = MockServer::start(); - - let mock = mock_server - .mock_async(|when, then| { - when.method("GET").path("/api/v1/"); - then.status(200) - .body_from_file("resources/tiled_metadata.json"); - }) - .await; - - let schema = Schema::build( - TiledQuery(TiledClient { - address: Url::parse(&mock_server.base_url()).unwrap(), - }), - EmptyMutation, - EmptySubscription, - ) - .finish(); - - let response = schema.execute("{metadata { apiVersion } }").await; - - assert_eq!(response.data.to_string(), "{metadata: {apiVersion: 0}}"); - mock.assert(); - } -} diff --git a/src/model.rs b/src/model.rs index 3dc83e8..f6b88b1 100644 --- a/src/model.rs +++ b/src/model.rs @@ -12,3 +12,40 @@ impl TiledQuery { self.0.metadata().await } } + +#[cfg(test)] +mod tests { + use async_graphql::{EmptyMutation, EmptySubscription, Schema}; + use httpmock::MockServer; + use url::Url; + + use crate::TiledQuery; + use crate::clients::TiledClient; + + #[tokio::test] + async fn test_api_version_query() { + let mock_server = MockServer::start(); + + let mock = mock_server + .mock_async(|when, then| { + when.method("GET").path("/api/v1/"); + then.status(200) + .body_from_file("resources/tiled_metadata.json"); + }) + .await; + + let schema = Schema::build( + TiledQuery(TiledClient { + address: Url::parse(&mock_server.base_url()).unwrap(), + }), + EmptyMutation, + EmptySubscription, + ) + .finish(); + + let response = schema.execute("{metadata { apiVersion } }").await; + + assert_eq!(response.data.to_string(), "{metadata: {apiVersion: 0}}"); + mock.assert(); + } +} From 86f7119e1fa1523c26fe937767d85c461aa99dd6 Mon Sep 17 00:00:00 2001 From: Abigail Emery Date: Wed, 29 Oct 2025 10:54:21 +0000 Subject: [PATCH 2/2] Add tests for errors (#20) --- src/model.rs | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 2 deletions(-) diff --git a/src/model.rs b/src/model.rs index f6b88b1..b953ebc 100644 --- a/src/model.rs +++ b/src/model.rs @@ -15,7 +15,7 @@ impl TiledQuery { #[cfg(test)] mod tests { - use async_graphql::{EmptyMutation, EmptySubscription, Schema}; + use async_graphql::{EmptyMutation, EmptySubscription, Schema, Value}; use httpmock::MockServer; use url::Url; @@ -25,7 +25,6 @@ mod tests { #[tokio::test] async fn test_api_version_query() { let mock_server = MockServer::start(); - let mock = mock_server .mock_async(|when, then| { when.method("GET").path("/api/v1/"); @@ -46,6 +45,88 @@ mod tests { let response = schema.execute("{metadata { apiVersion } }").await; assert_eq!(response.data.to_string(), "{metadata: {apiVersion: 0}}"); + assert_eq!(response.errors, &[]); + mock.assert(); + } + + #[tokio::test] + async fn test_server_unavailable() { + let schema = Schema::build( + TiledQuery(TiledClient { + address: Url::parse("http://tiled.example.com").unwrap(), + }), + EmptyMutation, + EmptySubscription, + ) + .finish(); + + let response = schema.execute("{metadata { apiVersion } }").await; + assert_eq!(response.data, Value::Null); + assert_eq!( + response.errors[0].message, + "Tiled server error: error sending request for url (http://tiled.example.com/api/v1/)" + ); + assert_eq!(response.errors.len(), 1); + } + + #[tokio::test] + async fn test_internal_tiled_error() { + let mock_server = MockServer::start(); + let mock = mock_server + .mock_async(|when, then| { + when.method("GET").path("/api/v1/"); + then.status(503); + }) + .await; + + let schema = Schema::build( + TiledQuery(TiledClient { + address: Url::parse(&mock_server.base_url()).unwrap(), + }), + EmptyMutation, + EmptySubscription, + ) + .finish(); + + let response = schema.execute("{metadata { apiVersion } }").await; + let actual = &response.errors[0].message; + let expected = + "Tiled server error: HTTP status server error (503 Service Unavailable) for url"; + assert_eq!(response.data, Value::Null); + assert!( + actual.starts_with(expected), + "Unexpected error: {actual} \nExpected: {expected} [...]" + ); + assert_eq!(response.errors.len(), 1); + mock.assert(); + } + + #[tokio::test] + async fn test_invalid_server_response() { + let mock_server = MockServer::start(); + let mock = mock_server + .mock_async(|when, then| { + when.method("GET").path("/api/v1/"); + then.status(200).body("{}"); + }) + .await; + + let schema = Schema::build( + TiledQuery(TiledClient { + address: Url::parse(&mock_server.base_url()).unwrap(), + }), + EmptyMutation, + EmptySubscription, + ) + .finish(); + + let response = schema.execute("{metadata { apiVersion } }").await; + assert_eq!(response.data, Value::Null); + assert_eq!(response.errors.len(), 1); + assert_eq!( + response.errors[0].message, + "Invalid response: missing field `api_version` at line 1 column 2, response: {}" + ); mock.assert(); } }