From a16504b94157351dd6698a5e1f87d08b03f06c0e Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Mon, 26 Mar 2018 14:44:52 +0200 Subject: [PATCH] Added failing test for #7546 --- .../ApiBehaviorApplicationModelProvider.cs | 3 +- ...ApiBehaviorApplicationModelProviderTest.cs | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Internal/ApiBehaviorApplicationModelProvider.cs b/src/Microsoft.AspNetCore.Mvc.Core/Internal/ApiBehaviorApplicationModelProvider.cs index 7bc6c6892d..adc39963a7 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/Internal/ApiBehaviorApplicationModelProvider.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/Internal/ApiBehaviorApplicationModelProvider.cs @@ -139,7 +139,8 @@ namespace Microsoft.AspNetCore.Mvc.Internal actionModel.Filters.Add(_modelStateInvalidFilter); } - private void InferParameterBindingSources(ActionModel actionModel) + // Internal for unit testing + internal void InferParameterBindingSources(ActionModel actionModel) { if (_modelMetadataProvider == null || _apiBehaviorOptions.SuppressInferBindingSourcesForParameters) { diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/Internal/ApiBehaviorApplicationModelProviderTest.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/Internal/ApiBehaviorApplicationModelProviderTest.cs index a9a01f5aba..445706ec8a 100644 --- a/test/Microsoft.AspNetCore.Mvc.Core.Test/Internal/ApiBehaviorApplicationModelProviderTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/Internal/ApiBehaviorApplicationModelProviderTest.cs @@ -5,6 +5,7 @@ using System; using System.ComponentModel; using System.Linq; using System.Reflection; +using System.Threading; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ApplicationModels; using Microsoft.AspNetCore.Mvc.Infrastructure; @@ -383,6 +384,31 @@ namespace Microsoft.AspNetCore.Mvc.Internal Assert.Same(BindingSource.Body, result); } + [Fact] + public void InferParameterBindingSources_SetsCorrectBindingSourceForComplexTypesWithCancellationToken() + { + // Arrange + var actionName = nameof(ParameterBindingController.ComplexTypeModelWithCancellationToken); + var actionModel = GetActionModel(typeof(ParameterBindingController), actionName); + + // Go through MvcOptions and MvcCoreMvcOptionsSetup to make + // sure we pick up the proper ModelMetadataDetailsProviders from the options. + var options = new MvcOptions(); + new MvcCoreMvcOptionsSetup(new TestHttpRequestStreamReaderFactory()).Configure(options); + var metadataProvider = TestModelMetadataProvider.CreateProvider(options.ModelMetadataDetailsProviders); + var provider = GetProvider(modelMetadataProvider: metadataProvider); + + // Act + provider.InferParameterBindingSources(actionModel); + + // Assert + var model = GetParameterModel(actionModel); + Assert.Same(BindingSource.Body, model.BindingInfo.BindingSource); + + var cancellationToken = GetParameterModel(actionModel); + Assert.Same(BindingSource.Special, cancellationToken.BindingInfo.BindingSource); + } + [Fact] public void InferBindingSourceForParameter_ReturnsBodyForSimpleTypes() { @@ -535,6 +561,11 @@ namespace Microsoft.AspNetCore.Mvc.Internal return Assert.Single(action.Parameters); } + private static ParameterModel GetParameterModel(ActionModel action) + { + return Assert.Single(action.Parameters.Where(x => typeof(T).IsAssignableFrom(x.ParameterType))); + } + [ApiController] [Route("TestApi")] private class TestApiController : Controller @@ -612,6 +643,9 @@ namespace Microsoft.AspNetCore.Mvc.Internal [HttpPost] [Consumes("application/json")] public IActionResult ActionWithConsumesAttribute([FromForm] string parameter) => null; + + [HttpPut("cancellation")] + public IActionResult ComplexTypeModelWithCancellationToken(TestModel model, CancellationToken cancellationToken) => null; } [ApiController]