From 334b3f6096d2a339e343e5cdd5671a2fd9ec9260 Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Tue, 19 Sep 2017 09:43:05 +0200 Subject: [PATCH 1/4] Added UnprocessableEntityResult --- .../UnprocessableEntityResult.cs | 22 +++++++++++++++++++ .../UnprocessableEntityResultTests.cs | 21 ++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 src/Microsoft.AspNetCore.Mvc.Core/UnprocessableEntityResult.cs create mode 100644 test/Microsoft.AspNetCore.Mvc.Core.Test/UnprocessableEntityResultTests.cs diff --git a/src/Microsoft.AspNetCore.Mvc.Core/UnprocessableEntityResult.cs b/src/Microsoft.AspNetCore.Mvc.Core/UnprocessableEntityResult.cs new file mode 100644 index 0000000000..0851057499 --- /dev/null +++ b/src/Microsoft.AspNetCore.Mvc.Core/UnprocessableEntityResult.cs @@ -0,0 +1,22 @@ +// 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 Unprocessable Entity (422) response. + /// + public class UnprocessableEntityResult : StatusCodeResult + { + /// + /// Creates a new instance. + /// + public UnprocessableEntityResult() + : base(StatusCodes.Status422UnprocessableEntity) + { + } + } +} diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/UnprocessableEntityResultTests.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/UnprocessableEntityResultTests.cs new file mode 100644 index 0000000000..b54f474154 --- /dev/null +++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/UnprocessableEntityResultTests.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 UnprocessableEntityResultTests + { + [Fact] + public void UnprocessableEntityResult_InitializesStatusCode() + { + // Arrange & act + var result = new UnprocessableEntityResult(); + + // Assert + Assert.Equal(StatusCodes.Status422UnprocessableEntity, result.StatusCode); + } + } +} From 6402d29a87a19762b58502f08f758962c32f42db Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Tue, 19 Sep 2017 09:43:46 +0200 Subject: [PATCH 2/4] Added UnprocessableEntityObjectResult --- .../UnprocessableEntityObjectResult.cs | 33 +++++++++++++++++ .../UnprocessableEntityObjectResultTests.cs | 36 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/Microsoft.AspNetCore.Mvc.Core/UnprocessableEntityObjectResult.cs create mode 100644 test/Microsoft.AspNetCore.Mvc.Core.Test/UnprocessableEntityObjectResultTests.cs diff --git a/src/Microsoft.AspNetCore.Mvc.Core/UnprocessableEntityObjectResult.cs b/src/Microsoft.AspNetCore.Mvc.Core/UnprocessableEntityObjectResult.cs new file mode 100644 index 0000000000..877a19dde0 --- /dev/null +++ b/src/Microsoft.AspNetCore.Mvc.Core/UnprocessableEntityObjectResult.cs @@ -0,0 +1,33 @@ +// 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; + +namespace Microsoft.AspNetCore.Mvc +{ + /// + /// An that when executed will produce a Unprocessable Entity (422) response. + /// + public class UnprocessableEntityObjectResult : ObjectResult + { + /// + /// Creates a new instance. + /// + /// containing the validation errors. + public UnprocessableEntityObjectResult(ModelStateDictionary modelState) + : this(new SerializableError(modelState)) + { + } + + /// + /// Creates a new instance. + /// + /// Contains the errors to be returned to the client. + public UnprocessableEntityObjectResult(object error) + : base(error) + { + StatusCode = StatusCodes.Status422UnprocessableEntity; + } + } +} diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/UnprocessableEntityObjectResultTests.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/UnprocessableEntityObjectResultTests.cs new file mode 100644 index 0000000000..7ab3fcfd9f --- /dev/null +++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/UnprocessableEntityObjectResultTests.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 UnprocessableEntityObjectResultTests + { + [Fact] + public void UnprocessableEntityObjectResult_SetsStatusCodeAndValue() + { + // Arrange & Act + var obj = new object(); + var result = new UnprocessableEntityObjectResult(obj); + + // Assert + Assert.Equal(StatusCodes.Status422UnprocessableEntity, result.StatusCode); + Assert.Equal(obj, result.Value); + } + + [Fact] + public void UnprocessableEntityObjectResult_ModelState_SetsStatusCodeAndValue() + { + // Arrange & Act + var result = new UnprocessableEntityObjectResult(new ModelStateDictionary()); + + // Assert + Assert.Equal(StatusCodes.Status422UnprocessableEntity, result.StatusCode); + var errors = Assert.IsType(result.Value); + Assert.Empty(errors); + } + } +} From c05952784b233a9bdc5cb78a0c47df0f72363ada Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Tue, 19 Sep 2017 09:46:57 +0200 Subject: [PATCH 3/4] Added UnprocessableEntity overloads to ControllerBase --- .../ControllerBase.cs | 35 ++++++++++++++ .../ControllerBaseTest.cs | 46 +++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs b/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs index 692627c6e8..3effadf5d9 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs @@ -1498,6 +1498,41 @@ public virtual BadRequestObjectResult BadRequest(ModelStateDictionary modelState return new BadRequestObjectResult(modelState); } + /// + /// Creates an that produces a response. + /// + /// The created for the response. + [NonAction] + public virtual UnprocessableEntityResult UnprocessableEntity() + { + return new UnprocessableEntityResult(); + } + + /// + /// Creates an that produces a response. + /// + /// The created for the response. + [NonAction] + public virtual UnprocessableEntityObjectResult UnprocessableEntity(object error) + { + return new UnprocessableEntityObjectResult(error); + } + + /// + /// Creates an that produces a response. + /// + /// The created for the response. + [NonAction] + public virtual UnprocessableEntityObjectResult UnprocessableEntity(ModelStateDictionary modelState) + { + if (modelState == null) + { + throw new ArgumentNullException(nameof(modelState)); + } + + return new UnprocessableEntityObjectResult(modelState); + } + /// /// Creates an that produces a response. /// diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/ControllerBaseTest.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/ControllerBaseTest.cs index b2b9e5c339..c2f10b2fc0 100644 --- a/test/Microsoft.AspNetCore.Mvc.Core.Test/ControllerBaseTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/ControllerBaseTest.cs @@ -1990,6 +1990,52 @@ public void BadRequest_SetsStatusCodeAndValue_ModelState() Assert.Empty(errors); } + [Fact] + public void UnprocessableEntity_SetsStatusCode() + { + // Arrange + var controller = new TestableController(); + + // Act + var result = controller.UnprocessableEntity(); + + // Assert + Assert.IsType(result); + Assert.Equal(StatusCodes.Status422UnprocessableEntity, result.StatusCode); + } + + [Fact] + public void UnprocessableEntity_SetsStatusCodeAndValue_Object() + { + // Arrange + var controller = new TestableController(); + var obj = new object(); + + // Act + var result = controller.UnprocessableEntity(obj); + + // Assert + Assert.IsType(result); + Assert.Equal(StatusCodes.Status422UnprocessableEntity, result.StatusCode); + Assert.Equal(obj, result.Value); + } + + [Fact] + public void UnprocessableEntity_SetsStatusCodeAndValue_ModelState() + { + // Arrange + var controller = new TestableController(); + + // Act + var result = controller.UnprocessableEntity(new ModelStateDictionary()); + + // Assert + Assert.IsType(result); + Assert.Equal(StatusCodes.Status422UnprocessableEntity, result.StatusCode); + var errors = Assert.IsType(result.Value); + Assert.Empty(errors); + } + [Theory] [MemberData(nameof(PublicNormalMethodsFromControllerBase))] public void NonActionAttribute_IsOnEveryPublicNormalMethodFromControllerBase(MethodInfo method) From 6274d7117e55ebca819ed19ce4ff15855ee86da8 Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Thu, 21 Sep 2017 10:19:16 +0200 Subject: [PATCH 4/4] Review Feedback --- src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs | 4 ++++ .../UnprocessableEntityObjectResult.cs | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs b/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs index 3effadf5d9..d686324c1b 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/ControllerBase.cs @@ -1476,6 +1476,7 @@ public virtual BadRequestResult BadRequest() /// /// Creates an that produces a response. /// + /// An error object to be returned to the client. /// The created for the response. [NonAction] public virtual BadRequestObjectResult BadRequest(object error) @@ -1486,6 +1487,7 @@ public virtual BadRequestObjectResult BadRequest(object 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 BadRequestObjectResult BadRequest(ModelStateDictionary modelState) @@ -1511,6 +1513,7 @@ public virtual UnprocessableEntityResult UnprocessableEntity() /// /// Creates an that produces a response. /// + /// An error object to be returned to the client. /// The created for the response. [NonAction] public virtual UnprocessableEntityObjectResult UnprocessableEntity(object error) @@ -1521,6 +1524,7 @@ public virtual UnprocessableEntityObjectResult UnprocessableEntity(object 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 UnprocessableEntityObjectResult UnprocessableEntity(ModelStateDictionary modelState) diff --git a/src/Microsoft.AspNetCore.Mvc.Core/UnprocessableEntityObjectResult.cs b/src/Microsoft.AspNetCore.Mvc.Core/UnprocessableEntityObjectResult.cs index 877a19dde0..002d9d97af 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/UnprocessableEntityObjectResult.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/UnprocessableEntityObjectResult.cs @@ -23,7 +23,7 @@ public UnprocessableEntityObjectResult(ModelStateDictionary modelState) /// /// Creates a new instance. /// - /// Contains the errors to be returned to the client. + /// Contains errors to be returned to the client. public UnprocessableEntityObjectResult(object error) : base(error) {