From 80b0069ed1fcfafc554f3766322465f5ff15345f Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Tue, 29 Mar 2016 05:45:19 -0700 Subject: [PATCH] updated --- .../ApiResponseType.cs | 7 +- .../DefaultApiDescriptionProvider.cs | 3 +- .../ProducesResponseTypeAttribute.cs | 2 +- .../DefaultApiDescriptionProviderTest.cs | 117 +++++++++--------- .../ApiExplorerTest.cs | 98 +++++++-------- 5 files changed, 112 insertions(+), 115 deletions(-) diff --git a/src/Microsoft.AspNetCore.Mvc.ApiExplorer/ApiResponseType.cs b/src/Microsoft.AspNetCore.Mvc.ApiExplorer/ApiResponseType.cs index 99ed710c74..1e32c3b481 100644 --- a/src/Microsoft.AspNetCore.Mvc.ApiExplorer/ApiResponseType.cs +++ b/src/Microsoft.AspNetCore.Mvc.ApiExplorer/ApiResponseType.cs @@ -12,15 +12,10 @@ namespace Microsoft.AspNetCore.Mvc.ApiExplorer /// public class ApiResponseType { - public ApiResponseType() - { - ApiResponseFormats = new List(); - } - /// /// Gets or sets the response formats supported by this type. /// - public IList ApiResponseFormats { get; set; } + public IList ApiResponseFormats { get; set; } = new List(); /// /// Gets or sets for the or null. diff --git a/src/Microsoft.AspNetCore.Mvc.ApiExplorer/DefaultApiDescriptionProvider.cs b/src/Microsoft.AspNetCore.Mvc.ApiExplorer/DefaultApiDescriptionProvider.cs index 2509ab7882..d22bdb81a6 100644 --- a/src/Microsoft.AspNetCore.Mvc.ApiExplorer/DefaultApiDescriptionProvider.cs +++ b/src/Microsoft.AspNetCore.Mvc.ApiExplorer/DefaultApiDescriptionProvider.cs @@ -8,6 +8,7 @@ using System.Reflection; #endif using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Formatters; @@ -361,7 +362,7 @@ private IReadOnlyList GetApiResponseTypes( { // This return type can be overriden by any response metadata // attributes later if the user wishes to. - objectTypes[200] = type; + objectTypes[StatusCodes.Status200OK] = type; } // Get the content type that the action explicitly set to support. diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ProducesResponseTypeAttribute.cs b/src/Microsoft.AspNetCore.Mvc.Core/ProducesResponseTypeAttribute.cs index d0a8891e83..da2a7ca33a 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/ProducesResponseTypeAttribute.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/ProducesResponseTypeAttribute.cs @@ -41,7 +41,7 @@ public ProducesResponseTypeAttribute(Type type, int statusCode) public int StatusCode { get; set; } /// - public void SetContentTypes(MediaTypeCollection contentTypes) + void IApiResponseMetadataProvider.SetContentTypes(MediaTypeCollection contentTypes) { // Users are supposed to use the 'Produces' attribute to set the content types that an action can support. } diff --git a/test/Microsoft.AspNetCore.Mvc.ApiExplorer.Test/DefaultApiDescriptionProviderTest.cs b/test/Microsoft.AspNetCore.Mvc.ApiExplorer.Test/DefaultApiDescriptionProviderTest.cs index 024486ab95..aaa88205f4 100644 --- a/test/Microsoft.AspNetCore.Mvc.ApiExplorer.Test/DefaultApiDescriptionProviderTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.ApiExplorer.Test/DefaultApiDescriptionProviderTest.cs @@ -413,8 +413,7 @@ public void GetApiDescription_DoesNotPopulatesResponseInformation_WhenUnknown(st Assert.Empty(description.SupportedResponseTypes); } - public static TheoryData> - ReturnsActionResultWithProducesAndProducesContentTypeData + public static TheoryData ReturnsActionResultWithProducesAndProducesContentTypeData { get { @@ -471,29 +470,29 @@ public void GetApiDescription_ReturnsActionResultWithProduces_And_ProducesConten var description = Assert.Single(descriptions); Assert.Equal(3, description.SupportedResponseTypes.Count); - var responseType = Assert.Single( - description.SupportedResponseTypes.Where(respType => respType.Type == typeof(Customer))); - Assert.Equal(200, responseType.StatusCode); - Assert.NotNull(responseType.ModelMetadata); - Assert.Equal( - expectedMediaTypes, - responseType.ApiResponseFormats.OrderBy(format => format.MediaType).Select(format => format.MediaType)); - - responseType = Assert.Single( - description.SupportedResponseTypes.Where(respType => respType.Type == typeof(BadData))); - Assert.Equal(400, responseType.StatusCode); - Assert.NotNull(responseType.ModelMetadata); - Assert.Equal( - expectedMediaTypes, - responseType.ApiResponseFormats.OrderBy(format => format.MediaType).Select(format => format.MediaType)); - - responseType = Assert.Single( - description.SupportedResponseTypes.Where(respFormat => respFormat.Type == typeof(ErrorDetails))); - Assert.Equal(500, responseType.StatusCode); - Assert.NotNull(responseType.ModelMetadata); - Assert.Equal( - expectedMediaTypes, - responseType.ApiResponseFormats.OrderBy(format => format.MediaType).Select(format => format.MediaType)); + Assert.Collection( + description.SupportedResponseTypes.OrderBy(responseType => responseType.StatusCode), + responseType => + { + Assert.Equal(200, responseType.StatusCode); + Assert.Equal(typeof(Customer), responseType.Type); + Assert.NotNull(responseType.ModelMetadata); + Assert.Equal(expectedMediaTypes, GetSortedMediaTypes(responseType)); + }, + responseType => + { + Assert.Equal(400, responseType.StatusCode); + Assert.Equal(typeof(BadData), responseType.Type); + Assert.NotNull(responseType.ModelMetadata); + Assert.Equal(expectedMediaTypes, GetSortedMediaTypes(responseType)); + }, + responseType => + { + Assert.Equal(500, responseType.StatusCode); + Assert.Equal(typeof(ErrorDetails), responseType.Type); + Assert.NotNull(responseType.ModelMetadata); + Assert.Equal(expectedMediaTypes, GetSortedMediaTypes(responseType)); + }); } public static TheoryData> ReturnsVoidOrTaskWithProducesContentTypeData @@ -555,6 +554,7 @@ public void GetApiDescription_ReturnsVoidWithProducesContentType( // Arrange var action = CreateActionDescriptor(methodName, controllerType); action.FilterDescriptors = filterDescriptors; + var expectedMediaTypes = new[] { "application/json", "text/json" }; // Act var descriptions = GetApiDescriptions(action); @@ -563,28 +563,29 @@ public void GetApiDescription_ReturnsVoidWithProducesContentType( var description = Assert.Single(descriptions); Assert.Equal(3, description.SupportedResponseTypes.Count); - var supportedResponseTypes = description.SupportedResponseTypes; - var responseType = Assert.Single(supportedResponseTypes.Where(respType => respType.Type == typeof(void))); - Assert.Equal(typeof(void), responseType.Type); - Assert.Equal(204, responseType.StatusCode); - Assert.Null(responseType.ModelMetadata); - Assert.Empty(responseType.ApiResponseFormats); - - responseType = Assert.Single( - description.SupportedResponseTypes.Where(respType => respType.Type == typeof(BadData))); - Assert.Equal(400, responseType.StatusCode); - Assert.NotNull(responseType.ModelMetadata); - var apiResponseFormats = responseType.ApiResponseFormats; - Assert.Single(apiResponseFormats.Where(responseFormat => responseFormat.MediaType == "text/json")); - Assert.Single(apiResponseFormats.Where(responseFormat => responseFormat.MediaType == "application/json")); - - responseType = Assert.Single( - supportedResponseTypes.Where(responseFormat => responseFormat.Type == typeof(ErrorDetails))); - Assert.Equal(500, responseType.StatusCode); - Assert.NotNull(responseType.ModelMetadata); - apiResponseFormats = responseType.ApiResponseFormats; - Assert.Single(apiResponseFormats.Where(frmt => frmt.MediaType == "text/json")); - Assert.Single(apiResponseFormats.Where(frmt => frmt.MediaType == "application/json")); + Assert.Collection( + description.SupportedResponseTypes.OrderBy(responseType => responseType.StatusCode), + responseType => + { + Assert.Equal(typeof(void), responseType.Type); + Assert.Equal(204, responseType.StatusCode); + Assert.Null(responseType.ModelMetadata); + Assert.Empty(responseType.ApiResponseFormats); + }, + responseType => + { + Assert.Equal(typeof(BadData), responseType.Type); + Assert.Equal(400, responseType.StatusCode); + Assert.NotNull(responseType.ModelMetadata); + Assert.Equal(expectedMediaTypes, GetSortedMediaTypes(responseType)); + }, + responseType => + { + Assert.Equal(typeof(ErrorDetails), responseType.Type); + Assert.Equal(500, responseType.StatusCode); + Assert.NotNull(responseType.ModelMetadata); + Assert.Equal(expectedMediaTypes, GetSortedMediaTypes(responseType)); + }); } [Theory] @@ -651,6 +652,7 @@ public void GetApiDescription_IncludesResponseFormats() { // Arrange var action = CreateActionDescriptor(nameof(ReturnsProduct)); + var expectedMediaTypes = new[] { "application/json", "application/xml", "text/json", "text/xml" }; // Act var descriptions = GetApiDescriptions(action); @@ -658,12 +660,7 @@ public void GetApiDescription_IncludesResponseFormats() // Assert var description = Assert.Single(descriptions); var responseType = Assert.Single(description.SupportedResponseTypes); - Assert.Collection( - responseType.ApiResponseFormats.OrderBy(responseFormat => responseFormat.MediaType.ToString()), - responseFormat => Assert.Equal("application/json", responseFormat.MediaType.ToString()), - responseFormat => Assert.Equal("application/xml", responseFormat.MediaType.ToString()), - responseFormat => Assert.Equal("text/json", responseFormat.MediaType.ToString()), - responseFormat => Assert.Equal("text/xml", responseFormat.MediaType.ToString())); + Assert.Equal(expectedMediaTypes, GetSortedMediaTypes(responseType)); } [Fact] @@ -671,7 +668,7 @@ public void GetApiDescription_IncludesResponseFormats_FilteredByAttribute() { // Arrange var action = CreateActionDescriptor(nameof(ReturnsProduct)); - + var expectedMediaTypes = new[] { "text/json", "text/xml" }; action.FilterDescriptors = new List(); action.FilterDescriptors.Add(new FilterDescriptor(new ContentTypeAttribute("text/*"), FilterScope.Action)); @@ -681,10 +678,7 @@ public void GetApiDescription_IncludesResponseFormats_FilteredByAttribute() // Assert var description = Assert.Single(descriptions); var responseType = Assert.Single(description.SupportedResponseTypes); - Assert.Collection( - responseType.ApiResponseFormats.OrderBy(responseFormat => responseFormat.MediaType.ToString()), - responseFormat => Assert.Equal("text/json", responseFormat.MediaType.ToString()), - responseFormat => Assert.Equal("text/xml", responseFormat.MediaType.ToString())); + Assert.Equal(expectedMediaTypes, GetSortedMediaTypes(responseType)); } [Fact] @@ -1376,6 +1370,13 @@ private ControllerActionDescriptor CreateActionDescriptor(string methodName = nu return action; } + private IEnumerable GetSortedMediaTypes(ApiResponseType apiResponseType) + { + return apiResponseType.ApiResponseFormats + .OrderBy(responseType => responseType.MediaType) + .Select(responseType => responseType.MediaType); + } + private object ReturnsObject() { return null; diff --git a/test/Microsoft.AspNetCore.Mvc.FunctionalTests/ApiExplorerTest.cs b/test/Microsoft.AspNetCore.Mvc.FunctionalTests/ApiExplorerTest.cs index 91cb38e6c5..dbc224ae35 100644 --- a/test/Microsoft.AspNetCore.Mvc.FunctionalTests/ApiExplorerTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.FunctionalTests/ApiExplorerTest.cs @@ -447,25 +447,14 @@ public async Task ApiExplorer_ResponseType_KnownWithoutAttribute(string action, var body = await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject>(body); + var expectedMediaTypes = new[] { "application/json", "application/xml", "text/json", "text/xml" }; // Assert var description = Assert.Single(result); var responseType = Assert.Single(description.SupportedResponseTypes); Assert.Equal(200, responseType.StatusCode); Assert.Equal(type, responseType.ResponseType); - - Assert.Single( - responseType.ResponseFormats, - responseFormat => responseFormat.MediaType == "text/json"); - Assert.Single( - responseType.ResponseFormats, - responseFormat => responseFormat.MediaType == "application/json"); - Assert.Single( - responseType.ResponseFormats, - responseFormat => responseFormat.MediaType == "text/xml"); - Assert.Single( - responseType.ResponseFormats, - responseFormat => responseFormat.MediaType == "application/xml"); + Assert.Equal(expectedMediaTypes, GetSortedMediaTypes(responseType)); } [Fact] @@ -473,6 +462,7 @@ public async Task ApiExplorer_ResponseType_KnownWithoutAttribute_ReturnVoid() { // Arrange var type = "ApiExplorerWebSite.Customer"; + var expectedMediaTypes = new[] { "application/json", "application/xml", "text/json", "text/xml" }; // Act var response = await Client.GetAsync( @@ -486,10 +476,7 @@ public async Task ApiExplorer_ResponseType_KnownWithoutAttribute_ReturnVoid() var responseType = Assert.Single(description.SupportedResponseTypes); Assert.Equal(200, responseType.StatusCode); Assert.Equal(type, responseType.ResponseType); - Assert.Single(responseType.ResponseFormats, formatterInfo => formatterInfo.MediaType == "text/json"); - Assert.Single(responseType.ResponseFormats, formatterInfo => formatterInfo.MediaType == "application/json"); - Assert.Single(responseType.ResponseFormats, formatterInfo => formatterInfo.MediaType == "text/xml"); - Assert.Single(responseType.ResponseFormats, formatterInfo => formatterInfo.MediaType == "application/xml"); + Assert.Equal(expectedMediaTypes, GetSortedMediaTypes(responseType)); } [Fact] @@ -497,6 +484,7 @@ public async Task ApiExplorer_ResponseType_DifferentOnAttributeThanReturnType() { // Arrange var type = "ApiExplorerWebSite.Customer"; + var expectedMediaTypes = new[] { "application/json", "application/xml", "text/json", "text/xml" }; // Act var response = await Client.GetAsync( @@ -510,10 +498,7 @@ public async Task ApiExplorer_ResponseType_DifferentOnAttributeThanReturnType() var responseType = Assert.Single(description.SupportedResponseTypes); Assert.Equal(200, responseType.StatusCode); Assert.Equal(type, responseType.ResponseType); - Assert.Single(responseType.ResponseFormats, formatterInfo => formatterInfo.MediaType == "text/json"); - Assert.Single(responseType.ResponseFormats, formatterInfo => formatterInfo.MediaType == "application/json"); - Assert.Single(responseType.ResponseFormats, formatterInfo => formatterInfo.MediaType == "text/xml"); - Assert.Single(responseType.ResponseFormats, formatterInfo => formatterInfo.MediaType == "application/xml"); + Assert.Equal(expectedMediaTypes, GetSortedMediaTypes(responseType)); } [Theory] @@ -555,19 +540,23 @@ public async Task ApiExplorer_ResponseType_InheritingFromController() // Assert var description = Assert.Single(result); Assert.Equal(2, description.SupportedResponseTypes.Count); - var responseType = Assert.Single(description.SupportedResponseTypes.Where( - responseFrmt => responseFrmt.ResponseType == type)); - Assert.Equal(type, responseType.ResponseType); - Assert.Equal(200, responseType.StatusCode); - var responseFormat = Assert.Single(responseType.ResponseFormats); - Assert.Equal("application/json", responseFormat.MediaType); - responseType = Assert.Single(description.SupportedResponseTypes.Where( - respData => respData.ResponseType == errorType)); - Assert.Equal(errorType, responseType.ResponseType); - Assert.Equal(500, responseType.StatusCode); - responseFormat = Assert.Single(responseType.ResponseFormats); - Assert.Equal("application/json", responseFormat.MediaType); + Assert.Collection( + description.SupportedResponseTypes.OrderBy(responseType => responseType.StatusCode), + responseType => + { + Assert.Equal(type, responseType.ResponseType); + Assert.Equal(200, responseType.StatusCode); + var responseFormat = Assert.Single(responseType.ResponseFormats); + Assert.Equal("application/json", responseFormat.MediaType); + }, + responseType => + { + Assert.Equal(errorType, responseType.ResponseType); + Assert.Equal(500, responseType.StatusCode); + var responseFormat = Assert.Single(responseType.ResponseFormats); + Assert.Equal("application/json", responseFormat.MediaType); + }); } [Fact] @@ -575,7 +564,9 @@ public async Task ApiExplorer_ResponseType_OverrideOnAction() { // Arrange var type = "ApiExplorerWebSite.Customer"; - var errorType = "ApiExplorerWebSite.ErrorInfoOverride"; // type overriding the one specified on the controller + // type overriding the one specified on the controller + var errorType = "ApiExplorerWebSite.ErrorInfoOverride"; + var expectedMediaTypes = new[] { "application/json", "application/xml", "text/json", "text/xml" }; // Act var response = await Client.GetAsync( @@ -587,21 +578,21 @@ public async Task ApiExplorer_ResponseType_OverrideOnAction() // Assert var description = Assert.Single(result); Assert.Equal(2, description.SupportedResponseTypes.Count); - var responseType = Assert.Single(description.SupportedResponseTypes - .Where(respData => respData.ResponseType == type && respData.StatusCode == 200)); - Assert.Equal(4, responseType.ResponseFormats.Count); - Assert.Single(responseType.ResponseFormats, frmt => frmt.MediaType == "text/json"); - Assert.Single(responseType.ResponseFormats, frmt => frmt.MediaType == "application/json"); - Assert.Single(responseType.ResponseFormats, frmt => frmt.MediaType == "text/xml"); - Assert.Single(responseType.ResponseFormats, frmt => frmt.MediaType == "application/xml"); - responseType = Assert.Single(description.SupportedResponseTypes - .Where(respData => respData.ResponseType == errorType && respData.StatusCode == 500)); - Assert.Equal(4, responseType.ResponseFormats.Count); - Assert.Single(responseType.ResponseFormats, frmt => frmt.MediaType == "text/json"); - Assert.Single(responseType.ResponseFormats, frmt => frmt.MediaType == "application/json"); - Assert.Single(responseType.ResponseFormats, frmt => frmt.MediaType == "text/xml"); - Assert.Single(responseType.ResponseFormats, frmt => frmt.MediaType == "application/xml"); + Assert.Collection( + description.SupportedResponseTypes.OrderBy(responseType => responseType.StatusCode), + responseType => + { + Assert.Equal(type, responseType.ResponseType); + Assert.Equal(200, responseType.StatusCode); + Assert.Equal(expectedMediaTypes, GetSortedMediaTypes(responseType)); + }, + responseType => + { + Assert.Equal(errorType, responseType.ResponseType); + Assert.Equal(500, responseType.StatusCode); + Assert.Equal(expectedMediaTypes, GetSortedMediaTypes(responseType)); + }); } [ConditionalFact] @@ -647,7 +638,9 @@ public async Task ApiExplorer_ResponseContentType_Specific() var responseType = Assert.Single(description.SupportedResponseTypes); Assert.Equal(2, responseType.ResponseFormats.Count); - var applicationJson = Assert.Single(responseType.ResponseFormats, f => f.MediaType == "application/json"); + var applicationJson = Assert.Single( + responseType.ResponseFormats, + format => format.MediaType == "application/json"); Assert.Equal(typeof(JsonOutputFormatter).FullName, applicationJson.FormatterType); var textJson = Assert.Single(responseType.ResponseFormats, f => f.MediaType == "text/json"); @@ -836,6 +829,13 @@ public async Task ApiExplorer_Parameters_SimpleTypes_ComplexModel() Assert.Equal(typeof(string).FullName, feedback.Type); } + private IEnumerable GetSortedMediaTypes(ApiExplorerResponseType apiResponseType) + { + return apiResponseType.ResponseFormats + .OrderBy(format => format.MediaType) + .Select(format => format.MediaType); + } + // Used to serialize data between client and server private class ApiExplorerData {