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, ResolveFut, ServerResult, Value};

use super::MatcherError;

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

struct ShouldBeNull;

#[async_trait]
impl CustomDirective for ShouldBeNull {
    async fn resolve_field(
        &self,
        ctx: &Context<'_>,
        resolve: ResolveFut<'_>,
    ) -> ServerResult<Option<Value>> {
        match resolve.await {
            Ok(None) => Ok(None),
            Ok(Some(Value::Null)) => Ok(Some(Value::Null)),
            Ok(Some(other)) => Err(MatcherError::new(
                ctx.item.pos,
                format!("Expected: null\nReceived: {other}"),
            )),
            Err(mut err) => {
                err.message = format!("Expected null, thrown error instead:\n\n{}", err.message);
                err.source = Some(std::sync::Arc::new(MatcherError));
                Err(err)
            }
        }
    }
}