diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ConflictObjectResult.cs b/src/Microsoft.AspNetCore.Mvc.Core/ConflictObjectResult.cs new file mode 100644 index 0000000000..02a2ca85d0 --- /dev/null +++ b/src/Microsoft.AspNetCore.Mvc.Core/ConflictObjectResult.cs @@ -0,0 +1,40 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc.ModelBinding; + +namespace Microsoft.AspNetCore.Mvc +{ + /// + /// A that when executed will produce a Conflict (409) response. + /// + public class ConflictObjectResult : ObjectResult + { + /// + /// Creates a new instance. + /// + /// Contains the errors to be returned to the client. + public ConflictObjectResult(object error) + : base(error) + { + StatusCode = StatusCodes.Status409Conflict; + } + + /// + /// Creates a new instance. + /// + /// containing the validation errors. + public ConflictObjectResult(ModelStateDictionary modelState) + : base(new SerializableError(modelState)) + { + if (modelState == null) + { + throw new ArgumentNullException(nameof(modelState)); + } + + StatusCode = StatusCodes.Status409Conflict; + } + } +} diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ConflictResult.cs b/src/Microsoft.AspNetCore.Mvc.Core/ConflictResult.cs new file mode 100644 index 0000000000..92eb10385a --- /dev/null +++ b/src/Microsoft.AspNetCore.Mvc.Core/ConflictResult.cs @@ -0,0 +1,21 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.Mvc +{ + /// + /// A that when executed will produce a Conflict (409) response. + /// + public class ConflictResult : StatusCodeResult + { + /// + /// Creates a new instance. + /// + public ConflictResult() + : base(StatusCodes.Status409Conflict) + { + } + } +} diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs b/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs index faac451c28..38328689a7 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs @@ -1790,6 +1790,32 @@ namespace Microsoft.AspNetCore.Mvc return new UnprocessableEntityObjectResult(modelState); } + /// + /// Creates an that produces a response. + /// + /// The created for the response. + [NonAction] + public virtual ConflictResult Conflict() + => new ConflictResult(); + + /// + /// Creates an that produces a response. + /// + /// Contains errors to be returned to the client. + /// The created for the response. + [NonAction] + public virtual ConflictObjectResult Conflict(object error) + => new ConflictObjectResult(error); + + /// + /// Creates an that produces a response. + /// + /// The model state dictionary containing errors to be returned to the client. + /// The created for the response. + [NonAction] + public virtual ConflictObjectResult Conflict(ModelStateDictionary modelState) + => new ConflictObjectResult(modelState); + /// /// Creates an that produces a response. /// diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/BadRequestObjectResultTests.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/BadRequestObjectResultTests.cs index 453575e5bf..b7b9330231 100644 --- a/test/Microsoft.AspNetCore.Mvc.Core.Test/BadRequestObjectResultTests.cs +++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/BadRequestObjectResultTests.cs @@ -14,23 +14,23 @@ namespace Microsoft.AspNetCore.Mvc { // Arrange & Act var obj = new object(); - var badRequestObjecResult = new BadRequestObjectResult(obj); + var badRequestObjectResult = new BadRequestObjectResult(obj); // Assert - Assert.Equal(StatusCodes.Status400BadRequest, badRequestObjecResult.StatusCode); - Assert.Equal(obj, badRequestObjecResult.Value); + Assert.Equal(StatusCodes.Status400BadRequest, badRequestObjectResult.StatusCode); + Assert.Equal(obj, badRequestObjectResult.Value); } [Fact] public void BadRequestObjectResult_ModelState_SetsStatusCodeAndValue() { // Arrange & Act - var badRequestObjecResult = new BadRequestObjectResult(new ModelStateDictionary()); + var badRequestObjectResult = new BadRequestObjectResult(new ModelStateDictionary()); // Assert - Assert.Equal(StatusCodes.Status400BadRequest, badRequestObjecResult.StatusCode); - var errors = Assert.IsType(badRequestObjecResult.Value); + Assert.Equal(StatusCodes.Status400BadRequest, badRequestObjectResult.StatusCode); + var errors = Assert.IsType(badRequestObjectResult.Value); Assert.Empty(errors); } } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/ConflictObjectResultTest.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/ConflictObjectResultTest.cs new file mode 100644 index 0000000000..6efabdbe34 --- /dev/null +++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/ConflictObjectResultTest.cs @@ -0,0 +1,36 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc.ModelBinding; +using Xunit; + +namespace Microsoft.AspNetCore.Mvc +{ + public class ConflictObjectResultTest + { + [Fact] + public void ConflictObjectResult_SetsStatusCodeAndValue() + { + // Arrange & Act + var obj = new object(); + var conflictObjectResult = new ConflictObjectResult(obj); + + // Assert + Assert.Equal(StatusCodes.Status409Conflict, conflictObjectResult.StatusCode); + Assert.Equal(obj, conflictObjectResult.Value); + } + + [Fact] + public void ConflictObjectResult_ModelState_SetsStatusCodeAndValue() + { + // Arrange & Act + var conflictObjectResult = new ConflictObjectResult(new ModelStateDictionary()); + + // Assert + Assert.Equal(StatusCodes.Status409Conflict, conflictObjectResult.StatusCode); + var errors = Assert.IsType(conflictObjectResult.Value); + Assert.Empty(errors); + } + } +} diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/ConflictResultTest.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/ConflictResultTest.cs new file mode 100644 index 0000000000..16835c55ef --- /dev/null +++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/ConflictResultTest.cs @@ -0,0 +1,21 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Http; +using Xunit; + +namespace Microsoft.AspNetCore.Mvc +{ + public class ConflictResultTest + { + [Fact] + public void ConflictResult_InitializesStatusCode() + { + // Arrange & act + var conflictResult = new ConflictResult(); + + // Assert + Assert.Equal(StatusCodes.Status409Conflict, conflictResult.StatusCode); + } + } +} diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/ControllerBaseTest.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/ControllerBaseTest.cs index 48afdc739f..19664bba03 100644 --- a/test/Microsoft.AspNetCore.Mvc.Core.Test/ControllerBaseTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/ControllerBaseTest.cs @@ -2066,6 +2066,53 @@ namespace Microsoft.AspNetCore.Mvc.Core.Test Assert.Empty(errors); } + [Fact] + public void Conflict_SetsStatusCode() + { + // Arrange + var controller = new TestableController(); + var obj = new object(); + + // Act + var result = controller.Conflict(); + + // Assert + Assert.IsType(result); + Assert.Equal(StatusCodes.Status409Conflict, result.StatusCode); + } + + [Fact] + public void Conflict_SetsStatusCodeAndValue_Object() + { + // Arrange + var controller = new TestableController(); + var obj = new object(); + + // Act + var result = controller.Conflict(obj); + + // Assert + Assert.IsType(result); + Assert.Equal(StatusCodes.Status409Conflict, result.StatusCode); + Assert.Equal(obj, result.Value); + } + + [Fact] + public void Conflict_SetsStatusCodeAndValue_ModelState() + { + // Arrange + var controller = new TestableController(); + + // Act + var result = controller.Conflict(new ModelStateDictionary()); + + // Assert + Assert.IsType(result); + Assert.Equal(StatusCodes.Status409Conflict, result.StatusCode); + var errors = Assert.IsType(result.Value); + Assert.Empty(errors); + } + [Theory] [MemberData(nameof(PublicNormalMethodsFromControllerBase))] public void NonActionAttribute_IsOnEveryPublicNormalMethodFromControllerBase(MethodInfo method)