public void ActionMethodExecutor_ExecutesActionsReturningActionResultOfT(bool withFilter) { // Arrange var mapper = new ActionResultTypeMapper(); var controller = new TestController(); var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnsActionResultOfT)); var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor); var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(), new ActionContext(), objectMethodExecutor, mapper, controller, Array.Empty <object>()); // Act var valueTask = Execute(actionMethodExecutor, filterContext, withFilter); // Assert var result = Assert.IsType <ObjectResult>(valueTask.Result); Assert.Equal("SyncObjectResultExecutor", actionMethodExecutor.GetType().Name); Assert.NotNull(result.Value); Assert.IsType <TestModel>(result.Value); Assert.Equal(typeof(TestModel), result.DeclaredType); }
public override async ValueTask <object?> Execute(ControllerEndpointFilterInvocationContext invocationContext) { var executor = invocationContext.Executor; var controller = invocationContext.Controller; var arguments = (object[])invocationContext.Arguments; await(Task) executor.Execute(controller, arguments) !; return(EmptyResultInstance); }
private async ValueTask <IActionResult> Execute(ActionMethodExecutor actionMethodExecutor, ControllerEndpointFilterInvocationContext context, bool withFilter) { if (withFilter) { return((IActionResult)await actionMethodExecutor.Execute(context)); } return(await actionMethodExecutor.Execute(context.ActionContext, context.Mapper, context.Executor, context.Controller, (object[])context.Arguments)); }
public override async ValueTask <IActionResult> Execute( ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, object controller, object?[]?arguments) { var context = new ControllerEndpointFilterInvocationContext(_controllerActionDescriptor, actionContext, executor, mapper, controller, arguments); var result = await _controllerActionDescriptor.FilterDelegate !(context); return(ConvertToActionResult(mapper, result, executor.IsMethodAsync ? executor.AsyncResultType ! : executor.MethodReturnType)); }
public override ValueTask <object?> Execute(ControllerEndpointFilterInvocationContext invocationContext) { var executor = invocationContext.Executor; var controller = invocationContext.Controller; var arguments = (object[])invocationContext.Arguments; var actionResult = (IActionResult)executor.Execute(controller, arguments) !; EnsureActionResultNotNull(executor, actionResult); return(new(actionResult)); }
public override async ValueTask <object?> Execute(ControllerEndpointFilterInvocationContext invocationContext) { var executor = invocationContext.Executor; var controller = invocationContext.Controller; var arguments = (object[])invocationContext.Arguments; var mapper = invocationContext.Mapper; var returnValue = await executor.ExecuteAsync(controller, arguments); var actionResult = ConvertToActionResult(mapper, returnValue, executor.AsyncResultType !); return(actionResult); }
public override async ValueTask <object?> Execute(ControllerEndpointFilterInvocationContext invocationContext) { var executor = invocationContext.Executor; var controller = invocationContext.Controller; var arguments = (object[])invocationContext.Arguments; // Async method returning awaitable-of-IActionResult (e.g., Task<ViewResult>) // We have to use ExecuteAsync because we don't know the awaitable's type at compile time. var actionResult = (IActionResult)await executor.ExecuteAsync(controller, arguments); EnsureActionResultNotNull(executor, actionResult); return(actionResult); }
public override ValueTask <object?> Execute(ControllerEndpointFilterInvocationContext invocationContext) { var executor = invocationContext.Executor; var controller = invocationContext.Controller; var arguments = (object[])invocationContext.Arguments; var mapper = invocationContext.Mapper; // Sync method returning arbitrary object var returnValue = executor.Execute(controller, arguments); var actionResult = ConvertToActionResult(mapper, returnValue, executor.MethodReturnType); return(new(actionResult)); }
public override async ValueTask <object?> Execute(ControllerEndpointFilterInvocationContext invocationContext) { var executor = invocationContext.Executor; var controller = invocationContext.Controller; var arguments = (object[])invocationContext.Arguments; // Async method returning Task<IActionResult> // Avoid extra allocations by calling Execute rather than ExecuteAsync and casting to Task<IActionResult>. var returnValue = executor.Execute(controller, arguments); var actionResult = await(Task <IActionResult>) returnValue !; EnsureActionResultNotNull(executor, actionResult); return(actionResult); }
public async Task ActionMethodExecutor_ThrowsIfIConvertFromIActionResult_ReturnsNull(bool withFilter) { // Arrange var mapper = new ActionResultTypeMapper(); var controller = new TestController(); var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnsCustomConvertibleFromIActionResult)); var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor); var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(), new ActionContext(), objectMethodExecutor, mapper, controller, Array.Empty <object>()); // Act & Assert var ex = await Assert.ThrowsAsync <InvalidOperationException>(() => Execute(actionMethodExecutor, filterContext, withFilter).AsTask()); Assert.Equal($"Cannot return null from an action method with a return type of '{typeof(CustomConvertibleFromAction)}'.", ex.Message); }
public void ActionMethodExecutor_ExecutesActionsReturningSubTypeOfActionResult(bool withFilter) { // Arrange var mapper = new ActionResultTypeMapper(); var controller = new TestController(); var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnsIActionResultSubType)); var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor); var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(), new ActionContext(), objectMethodExecutor, mapper, controller, Array.Empty <object>()); // Act var valueTask = Execute(actionMethodExecutor, filterContext, withFilter); // Assert Assert.Equal("SyncActionResultExecutor", actionMethodExecutor.GetType().Name); Assert.IsType <ContentResult>(valueTask.Result); }
public async Task ActionMethodExecutor_ExecutesActionsAsynchronouslyReturningActionResultSubType(bool withFilter) { // Arrange var mapper = new ActionResultTypeMapper(); var controller = new TestController(); var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnActionResultAsync)); var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor); var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(), new ActionContext(), objectMethodExecutor, mapper, controller, Array.Empty <object>()); // Act var valueTask = Execute(actionMethodExecutor, filterContext, withFilter); // Assert await valueTask; Assert.Equal("TaskOfActionResultExecutor", actionMethodExecutor.GetType().Name); Assert.IsType <ViewResult>(valueTask.Result); }
public override ValueTask <object?> Execute(ControllerEndpointFilterInvocationContext invocationContext) { // This is never called throw new NotSupportedException(); }