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