Beispiel #1
0
        public void ActionMethodUnhandledExceptionLogEntry()
        {
            var server = new TestServerBuilder()
                         .AddGraphType <LogTestController>()
                         .Build();

            var package      = server.CreateFieldContextBuilder <LogTestController>(nameof(LogTestController.ExecuteField2));
            var graphMethod  = TemplateHelper.CreateActionMethodTemplate <LogTestController>(nameof(LogTestController.ExecuteField2)) as IGraphMethod;
            var fieldRequest = package.FieldRequest;

            var result = new object();

            var exception = new Exception("inner error");
            var entry     = new ActionMethodUnhandledExceptionLogEntry(graphMethod, fieldRequest, exception);

            Assert.AreEqual(LogEventIds.ControllerUnhandledException.Id, entry.EventId);
            Assert.AreEqual(fieldRequest.Id, entry.PipelineRequestId);
            Assert.AreEqual(graphMethod.Parent.InternalFullName, entry.ControllerTypeName);
            Assert.AreEqual(graphMethod.Name, entry.ActionName);
            Assert.IsNotNull(entry.ToString());

            var exceptionEntry = entry.Exception as ExceptionLogItem;

            Assert.IsNotNull(exceptionEntry);
            Assert.AreEqual(exception.Message, exceptionEntry.ExceptionMessage);
            Assert.AreEqual(exception.StackTrace, exceptionEntry.StackTrace);
            Assert.AreEqual(exception.GetType().FriendlyName(true), exceptionEntry.TypeName);
        }
        public async Task PublishSubEvent_UnusableListForSubscriptionEvents_ThrowsException()
        {
            var server = new TestServerBuilder()
                         .AddGraphController <InvokableController>()
                         .Build();

            var fieldContextBuilder = server.CreateFieldContextBuilder <InvokableController>(
                nameof(InvokableController.MutationRaisesSubEvent));

            var arg1Value = "random string";

            fieldContextBuilder.AddInputArgument("arg1", arg1Value);

            var resolutionContext = fieldContextBuilder.CreateResolutionContext();

            // prepopulate with a collection thats not really a collection
            var eventCollection = new TwoPropertyObject();

            resolutionContext.Request.Items.TryAdd(SubscriptionConstants.RAISED_EVENTS_COLLECTION_KEY, eventCollection);

            var controller = new InvokableController();

            Assert.ThrowsAsync <GraphExecutionException>(async() =>
            {
                var result = await controller.InvokeActionAsync(fieldContextBuilder.GraphMethod.Object, resolutionContext);
            });

            await Task.CompletedTask;
        }
        public async Task PublishSubEvent_NoDataYieldsNoEvent()
        {
            var server = new TestServerBuilder()
                         .AddGraphController <InvokableController>()
                         .Build();

            var fieldContextBuilder = server.CreateFieldContextBuilder <InvokableController>(
                nameof(InvokableController.MutationRaisesSubEventNoData));

            var arg1Value = "random string";

            fieldContextBuilder.AddInputArgument("arg1", arg1Value);

            var resolutionContext = fieldContextBuilder.CreateResolutionContext();

            var controller = new InvokableController();
            var result     = await controller.InvokeActionAsync(fieldContextBuilder.GraphMethod.Object, resolutionContext);

            // ensure the method executed completely
            Assert.IsNotNull(result);
            Assert.IsTrue(result is ObjectReturnedGraphActionResult);

            // ensure the event collection was not created
            Assert.IsFalse(resolutionContext
                           .Request
                           .Items
                           .ContainsKey(SubscriptionConstants.RAISED_EVENTS_COLLECTION_KEY));
        }
        public void ValidModelItem_BuildsLogEntry()
        {
            var server = new TestServerBuilder()
                         .AddGraphType <LogTestController>()
                         .Build();

            var builder = server.CreateFieldContextBuilder <LogTestController>(nameof(LogTestController.ValidatableInputObject));

            var context = builder.CreateExecutionContext();

            // valid range 0 - 35
            var item = new ValidatableObject()
            {
                Age = 18,
            };

            var generator      = new ModelStateGenerator();
            var argumentToTest = CreateArgument("testItem", item);
            var dictionary     = generator.CreateStateDictionary(argumentToTest);

            var entry = new ActionMethodModelStateValidatedLogEntry(
                builder.GraphMethod.Object,
                context.Request,
                dictionary);

            this.ValidateModelDictionaryToLogEntry(builder.GraphMethod.Object, context.Request, dictionary, entry);
        }
        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);
        }
Beispiel #6
0
        public async Task KnownExecutionError_FailsRequest()
        {
            var server = new TestServerBuilder()
                         .AddGraphType <ResolverObject>()
                         .Build();

            var builder = server.CreateFieldContextBuilder <ResolverObject>(
                nameof(ResolverObject.MethodWithArgument));

            // the method declares one input argument which is not provided on this request
            // resulting in a GraphExecutionException which
            // is absorbed into a message (with no attached exception)

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

            var context = builder.CreateResolutionContext();
            await resolver.Resolve(context);

            Assert.AreEqual(null, context.Result);
            Assert.IsFalse(context.Messages.IsSucessful);
            Assert.AreEqual(null, context.Messages[0].Exception);
            Assert.AreEqual(Constants.ErrorCodes.EXECUTION_ERROR, context.Messages[0].Code);
        }
        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 PublishSubEvent_ExistingEventCollectionisAppendedTo()
        {
            var server = new TestServerBuilder()
                         .AddGraphController <InvokableController>()
                         .Build();

            var fieldContextBuilder = server.CreateFieldContextBuilder <InvokableController>(
                nameof(InvokableController.MutationRaisesSubEvent));

            var arg1Value = "random string";

            fieldContextBuilder.AddInputArgument("arg1", arg1Value);

            var resolutionContext = fieldContextBuilder.CreateResolutionContext();
            var eventCollection   = new List <SubscriptionEventProxy>();

            resolutionContext.Request.Items.TryAdd(SubscriptionConstants.RAISED_EVENTS_COLLECTION_KEY, eventCollection);

            var controller = new InvokableController();
            var result     = await controller.InvokeActionAsync(fieldContextBuilder.GraphMethod.Object, resolutionContext);

            // ensure the method executed completely
            Assert.IsNotNull(result);
            Assert.IsTrue(result is ObjectReturnedGraphActionResult);

            Assert.AreEqual(1, eventCollection.Count);
        }
        public async Task MethodInvocation_EnsureInternalPropertiesAreSet()
        {
            var server = new TestServerBuilder()
                         .AddGraphController <InvokableController>()
                         .Build();

            var fieldContextBuilder = server.CreateFieldContextBuilder <InvokableController>(nameof(InvokableController.AsyncActionMethod));

            fieldContextBuilder.AddInputArgument("arg1", "random string");

            var resolutionContext = fieldContextBuilder.CreateResolutionContext();

            var controller = new InvokableController();
            var result     = await controller.InvokeActionAsync(fieldContextBuilder.GraphMethod.Object, resolutionContext);

            Assert.IsNotNull(result);
            Assert.IsTrue(result is ObjectReturnedGraphActionResult);

            Assert.AreEqual(3, controller.CapturedItems.Count);

            Assert.AreEqual(server.ServiceProvider, controller.CapturedItems["RequestServices"]);
            Assert.AreEqual(resolutionContext.Request, controller.CapturedItems["Request"]);
            var modelState = controller.CapturedItems["ModelState"] as InputModelStateDictionary;

            Assert.IsTrue(modelState.IsValid);
            Assert.IsTrue(modelState.ContainsKey("arg1"));
        }
        private FieldResolutionContext CreateResolutionContext(object sourceData = null)
        {
            var server = new TestServerBuilder()
                         .AddGraphType <ActionableController>()
                         .Build();

            var builder = server
                          .CreateFieldContextBuilder <ActionableController>(nameof(ActionableController.DoStuff), sourceData);

            return(builder.CreateResolutionContext());
        }
        public void MethodInvocation_UserCodeExceptionIsAllowedToThrow()
        {
            var tester = new TestServerBuilder().Build();
            var fieldContextBuilder = tester.CreateFieldContextBuilder <InvokableController>(nameof(InvokableController.AsyncActionMethodToCauseException));

            fieldContextBuilder.AddInputArgument("arg1", "random string");

            var controller        = new InvokableController();
            var resolutionContext = fieldContextBuilder.CreateResolutionContext();

            Assert.ThrowsAsync <UserThrownException>(async() => await controller.InvokeActionAsync(fieldContextBuilder.GraphMethod.Object, resolutionContext));
        }
        public async Task NotFoundResult_ViaCustomErrorMessage()
        {
            var server = new TestServerBuilder().Build();
            var fieldContextBuilder = server.CreateFieldContextBuilder <InvokableController>(nameof(InvokableController.CreateNotFoundResult));

            var controller        = new InvokableController();
            var resolutionContext = fieldContextBuilder.CreateResolutionContext();
            var result            = await controller.InvokeActionAsync(
                fieldContextBuilder.GraphMethod.Object,
                resolutionContext) as RouteNotFoundGraphActionResult;

            Assert.IsNotNull(result);
            Assert.AreEqual("it was not found", result.Message);
        }
        public async Task MethodInvocation_SyncMethodReturnsObjectNotTask()
        {
            var tester = new TestServerBuilder().Build();
            var fieldContextBuilder = tester.CreateFieldContextBuilder <InvokableController>(nameof(InvokableController.SyncronousActionMethod));

            fieldContextBuilder.AddInputArgument("arg1", "random string");

            var controller        = new InvokableController();
            var resolutionContext = fieldContextBuilder.CreateResolutionContext();
            var result            = await controller.InvokeActionAsync(fieldContextBuilder.GraphMethod.Object, resolutionContext);

            Assert.IsNotNull(result);
            Assert.IsTrue(result is ObjectReturnedGraphActionResult);
        }
        public async Task MethodInvocation_MissingMethodInfo_ReturnsInternalServerError()
        {
            var tester = new TestServerBuilder().Build();
            var fieldContextBuilder = tester.CreateFieldContextBuilder <InvokableController>(nameof(InvokableController.SyncronousActionMethod));

            fieldContextBuilder.AddInputArgument("arg1", "random string");
            fieldContextBuilder.GraphMethod.Setup(x => x.Method).Returns <MethodInfo>(null);

            var controller        = new InvokableController();
            var resolutionContext = fieldContextBuilder.CreateResolutionContext();
            var result            = await controller.InvokeActionAsync(fieldContextBuilder.GraphMethod.Object, resolutionContext);

            // ensure a server error reslt is generated
            Assert.IsNotNull(result);
            Assert.IsTrue(result is InternalServerErrorGraphActionResult);
        }
        public async Task ErrorResult()
        {
            var server = new TestServerBuilder().Build();
            var fieldContextBuilder = server.CreateFieldContextBuilder <InvokableController>(nameof(InvokableController.ErrorResult));

            var controller        = new InvokableController();
            var resolutionContext = fieldContextBuilder.CreateResolutionContext();
            var result            = await controller.InvokeActionAsync(
                fieldContextBuilder.GraphMethod.Object,
                resolutionContext) as GraphFieldErrorActionResult;

            Assert.IsNotNull(result);
            Assert.AreEqual("an error happened", result.Message);
            Assert.AreEqual("12345", result.Code);
            Assert.IsNotNull(result.Exception);
            Assert.AreEqual("exception text", result.Exception.Message);
        }
Beispiel #16
0
        public void FieldResolutionStartedLogEntry()
        {
            var server = new TestServerBuilder()
                         .AddGraphType <LogTestController>()
                         .Build();

            var package           = server.CreateFieldContextBuilder <LogTestController>(nameof(LogTestController.ExecuteField2));
            var resolutionContext = package.CreateResolutionContext();

            var entry = new FieldResolutionStartedLogEntry(resolutionContext);

            Assert.AreEqual(LogEventIds.FieldResolutionStarted.Id, entry.EventId);
            Assert.AreEqual(resolutionContext.Request.Id, entry.PipelineRequestId);
            Assert.AreEqual(resolutionContext.Request.Field.Mode.ToString(), entry.FieldExecutionMode);
            Assert.AreEqual(resolutionContext.Request.Field.Route.Path, entry.FieldPath);
            Assert.IsNotNull(entry.ToString());
        }
Beispiel #17
0
        public async Task NullSourceData_FailsRequest()
        {
            var server = new TestServerBuilder()
                         .AddGraphType <ResolverObject>()
                         .Build();

            var builder = server.CreateFieldContextBuilder <ResolverObject>(
                nameof(ResolverObject.MethodRetrieveData));

            var resolver = new GraphObjectMethodResolver(builder.GraphMethod.Object);

            var context = builder.CreateResolutionContext();
            await resolver.Resolve(context);

            Assert.AreEqual(null, context.Result);
            Assert.IsFalse(context.Messages.IsSucessful);
            Assert.AreEqual(Constants.ErrorCodes.INVALID_OBJECT, context.Messages[0].Code);
        }
Beispiel #18
0
        public void ActionMethodInvocationStartedLogEntry()
        {
            var server = new TestServerBuilder()
                         .AddGraphType <LogTestController>()
                         .Build();
            var graphMethod  = TemplateHelper.CreateActionMethodTemplate <LogTestController>(nameof(LogTestController.ExecuteField2)) as IGraphMethod;
            var package      = server.CreateFieldContextBuilder <LogTestController>(nameof(LogTestController.ExecuteField2));
            var fieldRequest = package.FieldRequest;

            var entry = new ActionMethodInvocationStartedLogEntry(graphMethod, fieldRequest);

            Assert.AreEqual(LogEventIds.ControllerInvocationStarted.Id, entry.EventId);
            Assert.AreEqual(fieldRequest.Id, entry.PipelineRequestId);
            Assert.AreEqual(graphMethod.Parent.InternalFullName, entry.ControllerName);
            Assert.AreEqual(graphMethod.Name, entry.ActionName);
            Assert.AreEqual(graphMethod.Route.Path, entry.FieldPath);
            Assert.AreEqual(graphMethod.ObjectType.ToString(), entry.SourceObjectType);
            Assert.AreEqual(graphMethod.IsAsyncField, entry.IsAsync);
            Assert.IsNotNull(entry.ToString());
        }
        public async Task SourceDataIsNotOfTheTemplate_FailsRequest()
        {
            var server = new TestServerBuilder()
                         .AddGraphType <ResolverObject>()
                         .Build();

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

            // source data is not of the type the resolver is for
            fieldContextBuilder.AddSourceData(new TwoPropertyObject());
            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);
        }
Beispiel #20
0
        public void FieldResolutionCompletedLogEntry()
        {
            var server = new TestServerBuilder()
                         .AddGraphType <LogTestController>()
                         .Build();

            var package           = server.CreateFieldContextBuilder <LogTestController>(nameof(LogTestController.ExecuteField2));
            var resolutionContext = package.CreateResolutionContext();
            var fieldRequest      = package.FieldRequest;

            resolutionContext.Result = "15";

            var entry = new FieldResolutionCompletedLogEntry(resolutionContext);

            Assert.AreEqual(LogEventIds.FieldResolutionCompleted.Id, entry.EventId);
            Assert.AreEqual(fieldRequest.Id, entry.PipelineRequestId);
            Assert.AreEqual(fieldRequest.Field.Route.Path, entry.FieldPath);
            Assert.AreEqual(fieldRequest.Field.TypeExpression.ToString(), entry.TypeExpression);
            Assert.AreEqual(true, entry.HasData);
            Assert.AreEqual(true, entry.ResultIsValid);
            Assert.IsNotNull(entry.ToString());
        }
Beispiel #21
0
        public async Task SingleFieldResolution_ViaPipeline_YieldsCorrectResult()
        {
            var server = new TestServerBuilder()
                         .AddGraphType <SimpleExecutionController>()
                         .Build();

            var builder = server.CreateFieldContextBuilder <SimpleExecutionController>(
                nameof(SimpleExecutionController.SimpleQueryMethod));

            builder.AddInputArgument("arg1", "my value");
            builder.AddInputArgument("arg2", 15L);

            builder.AddSourceData(new object());

            var context = builder.CreateExecutionContext();
            await server.ExecuteField(context);

            var data = context.Result as TwoPropertyObject;

            Assert.IsNotNull(data);
            Assert.AreEqual("my value", data.Property1);
        }
        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);
        }
        public async Task PublishSubEvent_PublishesEventWithCorrectData()
        {
            var server = new TestServerBuilder()
                         .AddGraphController <InvokableController>()
                         .Build();

            var fieldContextBuilder = server.CreateFieldContextBuilder <InvokableController>(
                nameof(InvokableController.MutationRaisesSubEvent));

            var arg1Value = "random string";

            fieldContextBuilder.AddInputArgument("arg1", arg1Value);

            var resolutionContext = fieldContextBuilder.CreateResolutionContext();

            var controller = new InvokableController();
            var result     = await controller.InvokeActionAsync(fieldContextBuilder.GraphMethod.Object, resolutionContext);

            // ensure the method executed completely
            Assert.IsNotNull(result);
            Assert.IsTrue(result is ObjectReturnedGraphActionResult);

            // ensure the event collection was created on the context
            Assert.IsTrue(resolutionContext.Request.Items.ContainsKey(SubscriptionConstants.RAISED_EVENTS_COLLECTION_KEY));
            var raisedEvents = resolutionContext.Request.Items[SubscriptionConstants.RAISED_EVENTS_COLLECTION_KEY]
                               as List <SubscriptionEventProxy>;

            // ensure only one event was added
            Assert.AreEqual(1, raisedEvents.Count);
            var eventData = raisedEvents[0];

            // ensure event properties
            Assert.AreEqual("event1", eventData.EventName);
            var obj = eventData.DataObject as TwoPropertyObject;

            Assert.IsNotNull(obj);
            Assert.AreEqual(arg1Value, obj.Property1);
        }
Beispiel #24
0
        public void ActionMethodInvocationCompletedLogEntry()
        {
            var server = new TestServerBuilder()
                         .AddGraphType <LogTestController>()
                         .Build();

            var graphMethod       = TemplateHelper.CreateActionMethodTemplate <LogTestController>(nameof(LogTestController.ExecuteField2)) as IGraphMethod;
            var package           = server.CreateFieldContextBuilder <LogTestController>(nameof(LogTestController.ExecuteField2));
            var resolutionContext = package.CreateResolutionContext();
            var fieldRequest      = package.FieldRequest;

            var result = new object();

            var entry = new ActionMethodInvocationCompletedLogEntry(graphMethod, fieldRequest, result);

            Assert.AreEqual(LogEventIds.ControllerInvocationCompleted.Id, entry.EventId);
            Assert.AreEqual(fieldRequest.Id, entry.PipelineRequestId);
            Assert.AreEqual(graphMethod.Parent.InternalFullName, entry.ControllerName);
            Assert.AreEqual(graphMethod.Name, entry.ActionName);
            Assert.AreEqual(graphMethod.Route.Path, entry.FieldPath);
            Assert.AreEqual(result.GetType().FriendlyName(true), entry.ResultTypeName);
            Assert.IsNotNull(entry.ToString());
        }
        public async Task PublishSubEvent_NoEventNameFailsTheResolver_BubblesExceptionUp()
        {
            var server = new TestServerBuilder()
                         .AddGraphController <InvokableController>()
                         .Build();

            var fieldContextBuilder = server.CreateFieldContextBuilder <InvokableController>(
                nameof(InvokableController.MutationRaiseSubEventWithNoEventName));

            var arg1Value = "random string";

            fieldContextBuilder.AddInputArgument("arg1", arg1Value);

            var resolutionContext = fieldContextBuilder.CreateResolutionContext();
            var controller        = new InvokableController();

            Assert.ThrowsAsync <ArgumentException>(async() =>
            {
                var result = await controller.InvokeActionAsync(fieldContextBuilder.GraphMethod.Object, resolutionContext);
            });

            await Task.CompletedTask;
        }