async-graphql 7.2.1

A GraphQL server library implemented in Rust
Documentation
#[cfg(feature = "dynamic-schema")]
mod tests {
    use async_graphql::{
        Value,
        dynamic::{
            Directive, Enum, EnumItem, Field, FieldFuture, InputObject, InputValue, Interface,
            InterfaceField, Object, ResolverContext, Scalar, Schema, SchemaError, TypeRef, Union,
        },
    };

    fn mock_resolver_fn(_ctx: ResolverContext) -> FieldFuture {
        FieldFuture::Value(None)
    }

    pub fn schema() -> Result<Schema, SchemaError> {
        let test_enum = Enum::new("TestEnum")
            .item(EnumItem::new("A"))
            .item(EnumItem::new("B").directive(Directive::new("default")))
            .item(EnumItem::new("C"))
            .directive(Directive::new("oneOf"));

        let interface = Interface::new("TestInterface")
            .field(
                InterfaceField::new("id", TypeRef::named_nn(TypeRef::STRING))
                    .directive(Directive::new("id")),
            )
            .field(InterfaceField::new(
                "name",
                TypeRef::named_nn(TypeRef::STRING),
            ))
            .directive(
                Directive::new("test")
                    .argument("a", Value::from(5))
                    .argument("b", Value::from(true))
                    .argument("c", Value::from("str")),
            );

        let output_type = Object::new("OutputType")
            .implement(interface.type_name())
            .field(
                Field::new("id", TypeRef::named_nn(TypeRef::STRING), mock_resolver_fn)
                    .directive(Directive::new("test")),
            )
            .field(Field::new(
                "name",
                TypeRef::named_nn(TypeRef::STRING),
                mock_resolver_fn,
            ))
            .field(Field::new(
                "body",
                TypeRef::named(TypeRef::STRING),
                mock_resolver_fn,
            ))
            .directive(Directive::new("type"));

        let output_type_2 = Object::new("OutputType2").field(Field::new(
            "a",
            TypeRef::named_nn_list_nn(TypeRef::INT),
            mock_resolver_fn,
        ));

        let union_type = Union::new("TestUnion")
            .possible_type(output_type.type_name())
            .possible_type(output_type_2.type_name())
            .directive(Directive::new("wrap"));

        let input_type = InputObject::new("InputType")
            .field(
                InputValue::new("a", TypeRef::named_nn(TypeRef::STRING))
                    .directive(Directive::new("input_a").argument("test", Value::from(5))),
            )
            .directive(Directive::new("a"))
            .directive(Directive::new("b"));

        let scalar = Scalar::new("TestScalar").directive(Directive::new("json"));

        let query = Object::new("Query")
            .field(
                Field::new(
                    "interface",
                    TypeRef::named_nn(interface.type_name()),
                    mock_resolver_fn,
                )
                .argument(
                    InputValue::new("x", TypeRef::named(test_enum.type_name()))
                        .directive(Directive::new("validate")),
                ),
            )
            .field(
                Field::new(
                    "output_type",
                    TypeRef::named(output_type.type_name()),
                    mock_resolver_fn,
                )
                .argument(InputValue::new(
                    "input",
                    TypeRef::named_nn(input_type.type_name()),
                )),
            )
            .field(
                Field::new(
                    "enum",
                    TypeRef::named(test_enum.type_name()),
                    mock_resolver_fn,
                )
                .argument(InputValue::new(
                    "input",
                    TypeRef::named_list_nn(test_enum.type_name()),
                ))
                .directive(Directive::new("pin")),
            )
            .field(Field::new(
                "union",
                TypeRef::named_nn(union_type.type_name()),
                mock_resolver_fn,
            ))
            .field(Field::new(
                "scalar",
                TypeRef::named(scalar.type_name()),
                mock_resolver_fn,
            ));

        Schema::build(query.type_name(), None, None)
            .register(test_enum)
            .register(interface)
            .register(input_type)
            .register(output_type)
            .register(output_type_2)
            .register(union_type)
            .register(scalar)
            .register(query)
            .finish()
    }

    #[test]
    fn test_schema_sdl() {
        let schema = schema().unwrap();
        let sdl = schema.sdl();

        let expected = include_str!("schemas/test_dynamic_schema.graphql");

        assert_eq!(sdl, expected);
    }
}