public async Task TemplateIsInterface_SourceDataDoesNotImplementInterface_FailsRequest()
        {
            var server = new TestServerBuilder()
                         .AddGraphType <ResolverObject>()
                         .Build();

            var fieldContextBuilder = server.CreateFieldContextBuilder <ResolverObject>(nameof(ResolverObject.Address1));

            fieldContextBuilder.AddSourceData(new TwoPropertyObject());

            // set properties parent to be an interface
            // that hte source data is not castable to
            var parentMock = new Mock <IGraphTypeTemplate>();

            parentMock.Setup(x => x.ObjectType).Returns(typeof(ITestInterface));

            fieldContextBuilder.GraphMethod.Setup(x => x.Parent).Returns(parentMock.Object);

            var resolver = new GraphObjectPropertyResolver(fieldContextBuilder.GraphMethod.Object);

            var resolutionContext = fieldContextBuilder.CreateResolutionContext();
            await resolver.Resolve(resolutionContext);

            Assert.AreEqual(null, resolutionContext.Result);
            Assert.IsFalse(resolutionContext.Messages.IsSucessful);
            Assert.AreEqual(Constants.ErrorCodes.INVALID_OBJECT, resolutionContext.Messages[0].Code);
        }
        public async Task TemplateIsInterface_SourceDataDoesImplementInterface_RendersCorrectly()
        {
            var server = new TestServerBuilder()
                         .AddGraphType <ResolverObject>()
                         .AddGraphType <IResolverInterface>()
                         .Build();

            var fieldContextBuilder = server.CreateFieldContextBuilder <ResolverObject>(nameof(ResolverObject.Address1));

            var item = new ResolverObject();

            item.Address1 = "15th Street";
            fieldContextBuilder.AddSourceData(item);

            // set properties parent to be an interface that the source data is castable
            // this scenario shouldnt be possible in general execution but exists
            // in case of developers extending the framework
            var parentMock = new Mock <IGraphTypeTemplate>();

            parentMock.Setup(x => x.ObjectType).Returns(typeof(IResolverInterface));

            fieldContextBuilder.GraphMethod.Setup(x => x.Parent).Returns(parentMock.Object);
            var resolver = new GraphObjectPropertyResolver(fieldContextBuilder.GraphMethod.Object);

            var resolutionContext = fieldContextBuilder.CreateResolutionContext();
            await resolver.Resolve(resolutionContext);

            Assert.AreEqual("15th Street", resolutionContext.Result);
            Assert.IsTrue(resolutionContext.Messages.IsSucessful);
        }
        public async Task NullSourceData_FailsRequest()
        {
            var server = new TestServerBuilder()
                         .AddGraphType <ResolverObject>()
                         .Build();

            var fieldContextBuilder = server.CreateFieldContextBuilder <ResolverObject>(
                nameof(ResolverObject.Address1));

            fieldContextBuilder.AddSourceData(null);
            var resolutionContext = fieldContextBuilder.CreateResolutionContext();

            var resolver = new GraphObjectPropertyResolver(fieldContextBuilder.GraphMethod.Object);
            await resolver.Resolve(resolutionContext);

            Assert.AreEqual(null, resolutionContext.Result);
            Assert.IsFalse(resolutionContext.Messages.IsSucessful);
            Assert.AreEqual(Constants.ErrorCodes.INVALID_OBJECT, resolutionContext.Messages[0].Code);
        }
        public async Task PropertyThrowsException_FailsRequest()
        {
            var server = new TestServerBuilder()
                         .AddGraphType <ResolverObject>()
                         .Build();

            var fieldContextBuilder = server.CreateFieldContextBuilder <ResolverObject>(
                nameof(ResolverObject.PropertyThrowException));

            // source data is not of the type the resolver is for
            fieldContextBuilder.AddSourceData(new ResolverObject());
            var resolver = new GraphObjectPropertyResolver(fieldContextBuilder.GraphMethod.Object);

            var resolutionContext = fieldContextBuilder.CreateResolutionContext();
            await resolver.Resolve(resolutionContext);

            Assert.AreEqual(null, resolutionContext.Result);
            Assert.IsFalse(resolutionContext.Messages.IsSucessful);
            Assert.IsTrue(resolutionContext.Messages[0].Exception is InvalidOperationException);
            Assert.AreEqual("resolver.property.throwException", resolutionContext.Messages[0].Exception.Message);
            Assert.AreEqual(Constants.ErrorCodes.UNHANDLED_EXCEPTION, resolutionContext.Messages[0].Code);
        }