示例#1
0
    public async Task Should_fail_if_ActualType_is_not_possible()
    {
        /* Given */
        var schema = await new SchemaBuilder()
                     .Add(@"
interface Character

type Human

type Query
").Build(new SchemaBuildOptions());
        InterfaceDefinition character         = "interface Character";
        ObjectDefinition    humanNotCharacter = "type Human";
        var value   = new object();
        var context = Substitute.For <IResolverContext>();

        context.ExecutionContext.Schema.Returns(schema);
        context.FieldName.Returns("field");
        context.Field.Returns("field: Character");


        var sut = new CompleteValueResult(value, humanNotCharacter);

        /* When */
        var exception =
            await Assert.ThrowsAsync <CompleteValueException>(() => sut.CompleteValueAsync(context).AsTask());

        /* Then */
        Assert.Equal(
            "Cannot complete value for field 'field: Character'. ActualType 'Human' does not implement interface 'Character'",
            exception.Message);
    }
示例#2
0
    public async Task Should_complete_value()
    {
        /* Given */
        var schema = await new SchemaBuilder()
                     .Add(@"
interface Character

type Human implements Character

type Query
").Build(new SchemaBuildOptions());
        ObjectDefinition humanCharacter = "type Human implements Character";
        var mockValue = new object();
        var context   = Substitute.For <IResolverContext>();

        context.ExecutionContext.Schema.Returns(schema);
        context.ExecutionContext.Document.Returns(new ExecutableDocument(null, null));
        context.Path.Returns(new NodePath());
        context.FieldName.Returns("field");
        context.Field.Returns("field: Character");


        var sut = new CompleteValueResult(mockValue, humanCharacter);

        /* When */
        var value = await sut.CompleteValueAsync(context);

        /* Then */
        Assert.NotNull(value);
    }
    public async Task Should_complete_value()
    {
        /* Given */
        var schema = await new SchemaBuilder()
                     .Add(@"
type Success
type Failure
union Result = Success | Failure
type Query
"
                          ).Build(new SchemaBuildOptions());
        var mockValue = new object();
        var context   = Substitute.For <IResolverContext>();

        context.ExecutionContext.Schema.Returns(schema);
        context.ExecutionContext.Document.Returns(new ExecutableDocument(null, null));
        context.Path.Returns(new NodePath());
        context.FieldName.Returns("field");
        context.Field.Returns("field: Result");


        var sut = new CompleteValueResult(mockValue, "type Success");

        /* When */
        var value = await sut.CompleteValueAsync(context);

        /* Then */
        Assert.NotNull(value);
    }
    public async Task Should_fail_if_ActualType_is_not_possible()
    {
        /* Given */
        ObjectDefinition notPossible = "type NotPossible";
        var schema = await new SchemaBuilder()
                     .Add(@"
type Success
type Failure
union Result = Success | Failure
type Query
"
                          ).Build(new SchemaBuildOptions());
        var value   = new object();
        var context = Substitute.For <IResolverContext>();

        context.ExecutionContext.Schema.Returns(schema);
        context.FieldName.Returns("field");
        context.Field.Returns("field: Result");


        var sut = new CompleteValueResult(value, notPossible);

        /* When */
        var exception =
            await Assert.ThrowsAsync <CompleteValueException>(() => sut.CompleteValueAsync(context).AsTask());

        /* Then */
        Assert.Equal(
            "Cannot complete value for field 'field: Result'. ActualType 'NotPossible' is not possible for 'Result'",
            exception.Message);
    }
示例#5
0
        public ValueTask <object> CompleteValueAsync(IResolverContext context)
        {
            if (_errors != null && _errors.Any())
            {
                var first = _errors.First();
                throw new CompleteValueException(
                          $"{first.Message}",
                          null,
                          context.Path,
                          new Dictionary <string, object>
                {
                    ["remoteError"] = new
                    {
                        error      = first,
                        data       = _data,
                        errors     = _errors,
                        extensions = _extensions
                    }
                },
                          context.Selection);
            }

            if (!_data.TryGetValue(context.FieldName, out var value))
            {
                throw new CompleteValueException(
                          $"Could not complete value for field '{context.FieldName}:{context.Field.Type}'. " +
                          $"Could not find field value from execution result. Fields found '{string.Join(",", _data.Keys)}'",
                          context.Path,
                          context.Selection);
            }

            var resolveResult = new CompleteValueResult(value, context.Field.Type);

            return(resolveResult.CompleteValueAsync(context));
        }
        public async Task Should_fail_if_no_ActualType_given()
        {
            /* Given */
            var success = new ObjectType("Success");
            var error   = new ObjectType("Error");
            var result  = new UnionType("Result", new [] { success, error });
            var value   = new object();
            var context = Substitute.For <IResolverContext>();

            context.FieldName.Returns("field");
            context.Field.Returns(new Field(result));


            var sut = new CompleteValueResult(value, null);

            /* When */
            var exception = await Assert.ThrowsAsync <CompleteValueException>(() => sut.CompleteValueAsync(context).AsTask());

            /* Then */
            Assert.Equal("Cannot complete value for field 'field':'Result'. ActualType is required for union values.", exception.Message);
        }
        public async Task Should_fail_if_no_ActualType_given()
        {
            /* Given */
            var character = new InterfaceType("Character");
            var value     = new object();
            var context   = Substitute.For <IResolverContext>();

            context.FieldName.Returns("field");
            context.Field.Returns(new Field(character));


            var sut = new CompleteValueResult(value, null);

            /* When */
            var exception =
                await Assert.ThrowsAsync <CompleteValueException>(() => sut.CompleteValueAsync(context).AsTask());

            /* Then */
            Assert.Equal(
                "Cannot complete value for field 'field':'Character'. ActualType is required for interface values.",
                exception.Message);
        }
        public async Task Should_complete_list_of_values()
        {
            /* Given */
            var character      = new InterfaceType("Character");
            var humanCharacter = new ObjectType("Human", implements: new[] { character });
            var mockValue      = new object();
            var context        = Substitute.For <IResolverContext>();

            context.ExecutionContext.Schema.Returns(Substitute.For <ISchema>());
            context.ExecutionContext.Document.Returns(new ExecutableDocument(null, null));
            context.Path.Returns(new NodePath());
            context.FieldName.Returns("field");
            context.Field.Returns(new Field(character));


            var sut = new CompleteValueResult(new[] { mockValue }, _ => humanCharacter);

            /* When */
            var value = await sut.CompleteValueAsync(context);

            /* Then */
            Assert.NotNull(value);
        }
        public async Task Should_fail_if_ActualType_is_not_possible()
        {
            /* Given */
            var character         = new InterfaceType("Character");
            var humanNotCharacter = new ObjectType("Human");
            var value             = new object();
            var context           = Substitute.For <IResolverContext>();

            context.FieldName.Returns("field");
            context.Field.Returns(new Field(character));


            var sut = new CompleteValueResult(value, humanNotCharacter);

            /* When */
            var exception =
                await Assert.ThrowsAsync <CompleteValueException>(() => sut.CompleteValueAsync(context).AsTask());

            /* Then */
            Assert.Equal(
                "Cannot complete value for field 'field':'Character'. ActualType 'Human' does not implement interface 'Character'",
                exception.Message);
        }
        public async Task Should_complete_list_of_values()
        {
            /* Given */
            var success   = new ObjectType("Success");
            var error     = new ObjectType("Error");
            var result    = new UnionType("Result", new [] { success, error });
            var mockValue = new object();
            var context   = Substitute.For <IResolverContext>();

            context.ExecutionContext.Schema.Returns(Substitute.For <ISchema>());
            context.ExecutionContext.Document.Returns(new ExecutableDocument(null, null));
            context.Path.Returns(new NodePath());
            context.FieldName.Returns("field");
            context.Field.Returns(new Field(result));


            var sut = new CompleteValueResult(new [] { mockValue }, _ => success);

            /* When */
            var value = await sut.CompleteValueAsync(context);

            /* Then */
            Assert.NotNull(value);
        }