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); }
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); }
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); }