ControllerBase.Problem should also set the StatusCode of the response (#14672)

* ControllerBase.Problem should also set the StatusCode of the response

Fixes https://github.com/aspnet/AspNetCore/issues/14663
This commit is contained in:
huysentruitw 2019-10-09 18:29:16 +02:00 committed by Pranav K
parent c3ccf5ba7f
commit d0de73684d
2 changed files with 54 additions and 2 deletions

View File

@ -1870,7 +1870,10 @@ namespace Microsoft.AspNetCore.Mvc
detail: detail,
instance: instance);
return new ObjectResult(problemDetails);
return new ObjectResult(problemDetails)
{
StatusCode = problemDetails.Status
};
}
/// <summary>
@ -1946,7 +1949,10 @@ namespace Microsoft.AspNetCore.Mvc
return new BadRequestObjectResult(validationProblem);
}
return new ObjectResult(validationProblem);
return new ObjectResult(validationProblem)
{
StatusCode = validationProblem.Status
};
}
/// <summary>

View File

@ -2316,6 +2316,7 @@ namespace Microsoft.AspNetCore.Mvc.Core.Test
// Assert
var badRequestResult = Assert.IsType<BadRequestObjectResult>(actionResult);
var problemDetails = Assert.IsType<ValidationProblemDetails>(badRequestResult.Value);
Assert.Equal(400, badRequestResult.StatusCode);
Assert.Equal(400, problemDetails.Status);
Assert.Equal("One or more validation errors occurred.", problemDetails.Title);
Assert.Equal("https://tools.ietf.org/html/rfc7231#section-6.5.1", problemDetails.Type);
@ -2348,6 +2349,48 @@ namespace Microsoft.AspNetCore.Mvc.Core.Test
Assert.Equal(detail, problemDetails.Detail);
}
[Fact]
public void ValidationProblemDetails_UsesSpecifiedStatusCode()
{
// Arrange
var options = GetApiBehaviorOptions();
var controller = new TestableController
{
ProblemDetailsFactory = new DefaultProblemDetailsFactory(Options.Create(options)),
};
// Act
var actionResult = controller.ValidationProblem(statusCode: 405);
// Assert
var objectResult = Assert.IsType<ObjectResult>(actionResult);
var problemDetails = Assert.IsType<ValidationProblemDetails>(objectResult.Value);
Assert.Equal(405, objectResult.StatusCode);
Assert.Equal(405, problemDetails.Status);
}
[Fact]
public void ValidationProblemDetails_StatusCode400_ReturnsBadRequestObjectResultFor2xCompatibility()
{
// Arrange
var options = GetApiBehaviorOptions();
var controller = new TestableController
{
ProblemDetailsFactory = new DefaultProblemDetailsFactory(Options.Create(options)),
};
// Act
var actionResult = controller.ValidationProblem(statusCode: 400);
// Assert
var badRequestResult = Assert.IsType<BadRequestObjectResult>(actionResult);
var problemDetails = Assert.IsType<ValidationProblemDetails>(badRequestResult.Value);
Assert.Equal(400, badRequestResult.StatusCode);
Assert.Equal(400, problemDetails.Status);
}
[Fact]
public void ProblemDetails_Works()
{
@ -2371,6 +2414,7 @@ namespace Microsoft.AspNetCore.Mvc.Core.Test
// Assert
var badRequestResult = Assert.IsType<ObjectResult>(actionResult);
var problemDetails = Assert.IsType<ProblemDetails>(badRequestResult.Value);
Assert.Equal(500, actionResult.StatusCode);
Assert.Equal(500, problemDetails.Status);
Assert.Equal("An error occured while processing your request.", problemDetails.Title);
Assert.Equal("https://tools.ietf.org/html/rfc7231#section-6.6.1", problemDetails.Type);
@ -2396,6 +2440,7 @@ namespace Microsoft.AspNetCore.Mvc.Core.Test
// Assert
var badRequestResult = Assert.IsType<ObjectResult>(actionResult);
var problemDetails = Assert.IsType<ProblemDetails>(badRequestResult.Value);
Assert.Equal(500, actionResult.StatusCode);
Assert.Equal(500, problemDetails.Status);
Assert.Equal(title, problemDetails.Title);
Assert.Equal("https://tools.ietf.org/html/rfc7231#section-6.6.1", problemDetails.Type);
@ -2419,6 +2464,7 @@ namespace Microsoft.AspNetCore.Mvc.Core.Test
// Assert
var badRequestResult = Assert.IsType<ObjectResult>(actionResult);
var problemDetails = Assert.IsType<ProblemDetails>(badRequestResult.Value);
Assert.Equal(422, actionResult.StatusCode);
Assert.Equal(422, problemDetails.Status);
Assert.Equal("Unprocessable entity.", problemDetails.Title);
Assert.Equal("https://tools.ietf.org/html/rfc4918#section-11.2", problemDetails.Type);