async-graphql-test 1.0.0

A test framework for Rust GraphQL servers.
Documentation
use async_graphql::async_trait::async_trait;
use async_graphql::{Context, CustomDirective, Directive, Error, ResolveFut, ServerResult, Value};

use super::MatcherError;

/// Use `@shouldBeNotNull` when you want to check that something is **not** null.
#[Directive(location = "Field", name = "shouldBeNotNull")]
pub fn should_be_not_null() -> impl CustomDirective {
    ShouldBeNotNull
}

struct ShouldBeNotNull;

#[async_trait]
impl CustomDirective for ShouldBeNotNull {
    async fn resolve_field(
        &self,
        ctx: &Context<'_>,
        resolve: ResolveFut<'_>,
    ) -> ServerResult<Option<Value>> {
        match resolve.await {
            Ok(None) => Ok(None),
            // | Ok(Some(Value::Null)) => Err(MatcherError::new(
            //   ctx.item.pos,
            //   "Expected: not null\nReceived: null".to_string(),
            // )),
            Ok(Some(Value::Null)) => Err(ctx.set_error_path(
                Error {
                    message: "Expected: not null\nReceived: null".to_string(),
                    source: Some(std::sync::Arc::new(MatcherError)),
                    extensions: None,
                }
                .into_server_error(ctx.item.pos),
            )),
            Ok(Some(other)) => Ok(Some(other)),
            Err(err) => Err(ctx.set_error_path(
                Error {
                    message: format!("Unexpected error occurred:\n\n{}", err.message),
                    source: Some(std::sync::Arc::new(MatcherError)),
                    extensions: None,
                }
                .into_server_error(ctx.item.pos),
            )),
        }
    }
}