private static ApiResponseTypeProvider GetProvider()
    {
        var mvcOptions = new MvcOptions
        {
            OutputFormatters = { new TestOutputFormatter() },
        };
        var provider = new ApiResponseTypeProvider(new EmptyModelMetadataProvider(), new ActionResultTypeMapper(), mvcOptions);

        return(provider);
    }
    public void GetApiResponseTypes_ReturnNoResponseTypes_IfActionWithIResultReturnType()
    {
        // Arrange
        var actionDescriptor = GetControllerActionDescriptor(typeof(TestController), nameof(TestController.GetIResult));
        var provider         = new ApiResponseTypeProvider(new EmptyModelMetadataProvider(), new ActionResultTypeMapper(), new MvcOptions());

        // Act
        var result = provider.GetApiResponseTypes(actionDescriptor);

        // Assert
        Assert.False(result.Any());
    }
 /// <summary>
 /// Creates a new instance of <see cref="DefaultApiDescriptionProvider"/>.
 /// </summary>
 /// <param name="optionsAccessor">The accessor for <see cref="MvcOptions"/>.</param>
 /// <param name="constraintResolver">The <see cref="IInlineConstraintResolver"/> used for resolving inline
 /// constraints.</param>
 /// <param name="modelMetadataProvider">The <see cref="IModelMetadataProvider"/>.</param>
 /// <param name="mapper">The <see cref="IActionResultTypeMapper"/>.</param>
 /// <param name="routeOptions">The accessor for <see cref="RouteOptions"/>.</param>
 /// <remarks>The <paramref name="mapper"/> parameter is currently ignored.</remarks>
 public DefaultApiDescriptionProvider(
     IOptions <MvcOptions> optionsAccessor,
     IInlineConstraintResolver constraintResolver,
     IModelMetadataProvider modelMetadataProvider,
     IActionResultTypeMapper mapper,
     IOptions <RouteOptions> routeOptions)
 {
     _mvcOptions            = optionsAccessor.Value;
     _constraintResolver    = constraintResolver;
     _modelMetadataProvider = modelMetadataProvider;
     _responseTypeProvider  = new ApiResponseTypeProvider(modelMetadataProvider, mapper, _mvcOptions);
     _routeOptions          = routeOptions.Value;
 }
    public void GetApiResponseTypes_HandlesActionWithMultipleContentTypesAndProduces()
    {
        // Arrange
        var actionDescriptor = GetControllerActionDescriptor(typeof(TestController), nameof(TestController.GetUser));

        actionDescriptor.FilterDescriptors.Add(new FilterDescriptor(new ProducesAttribute("text/xml")
        {
            Type = typeof(BaseModel)
        }, FilterScope.Action));
        actionDescriptor.FilterDescriptors.Add(new FilterDescriptor(new ProducesResponseTypeAttribute(typeof(ValidationProblemDetails), 400, "application/problem+json"), FilterScope.Action));
        actionDescriptor.FilterDescriptors.Add(new FilterDescriptor(new ProducesResponseTypeAttribute(typeof(ProblemDetails), 404, "application/problem+json"), FilterScope.Action));
        actionDescriptor.FilterDescriptors.Add(new FilterDescriptor(new ProducesResponseTypeAttribute(409), FilterScope.Action));

        var provider = new ApiResponseTypeProvider(new EmptyModelMetadataProvider(), new ActionResultTypeMapper(), new MvcOptions());

        // Act
        var result = provider.GetApiResponseTypes(actionDescriptor);

        // Assert
        Assert.Collection(
            result.OrderBy(r => r.StatusCode),
            responseType =>
        {
            Assert.Equal(typeof(BaseModel), responseType.Type);
            Assert.Equal(200, responseType.StatusCode);
            Assert.Equal(new[] { "text/xml" }, GetSortedMediaTypes(responseType));
        },
            responseType =>
        {
            Assert.Equal(typeof(ValidationProblemDetails), responseType.Type);
            Assert.Equal(400, responseType.StatusCode);
            Assert.Equal(new[] { "application/problem+json" }, GetSortedMediaTypes(responseType));
        },
            responseType =>
        {
            Assert.Equal(typeof(ProblemDetails), responseType.Type);
            Assert.Equal(404, responseType.StatusCode);
            Assert.Equal(new[] { "application/problem+json" }, GetSortedMediaTypes(responseType));
        },
            responseType =>
        {
            Assert.Equal(typeof(void), responseType.Type);
            Assert.Equal(409, responseType.StatusCode);
            Assert.Empty(GetSortedMediaTypes(responseType));
        });
    }