From 10dbff2c02fd981347887c29ea70ffaba08ee7a9 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Sat, 14 Mar 2020 09:13:14 +0100 Subject: [PATCH] AllowOnlyDefinedHttpStatusCodeInResponse (#422) --- Directory.Build.props | 2 +- .../MainApp.cs | 2 - .../Owin/IWireMockMiddlewareOptions.cs | 2 +- .../Owin/Mappers/OwinResponseMapper.cs | 6 +-- .../Owin/WireMockMiddlewareOptions.cs | 4 +- .../IStatusCodeResponseBuilder.cs | 4 ++ src/WireMock.Net/Server/WireMockServer.cs | 6 +-- .../Settings/IWireMockServerSettings.cs | 6 ++- .../Settings/WireMockServerSettings.cs | 4 +- .../Settings/WireMockServerSettingsParser.cs | 2 +- .../Owin/Mappers/OwinResponseMapperTests.cs | 50 +++++++++++++------ .../WireMock.Net.Tests.csproj | 4 ++ .../WireMockServer.Settings.cs | 8 +-- 13 files changed, 63 insertions(+), 37 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 8c1cd2321..c63453a76 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -4,7 +4,7 @@ - 1.1.10 + 1.2.0 diff --git a/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs b/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs index a18744224..1e2763d66 100644 --- a/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs +++ b/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs @@ -61,8 +61,6 @@ public static void Run() handlebarsContext.RegisterHelper(transformer.Name, transformer.Render); }, - AllowAnyHttpStatusCodeInResponse = true - // Uncomment below if you want to use the CustomFileSystemFileHandler // FileSystemHandler = new CustomFileSystemFileHandler() }); diff --git a/src/WireMock.Net/Owin/IWireMockMiddlewareOptions.cs b/src/WireMock.Net/Owin/IWireMockMiddlewareOptions.cs index 1a89533d5..65acc007c 100644 --- a/src/WireMock.Net/Owin/IWireMockMiddlewareOptions.cs +++ b/src/WireMock.Net/Owin/IWireMockMiddlewareOptions.cs @@ -40,7 +40,7 @@ internal interface IWireMockMiddlewareOptions bool? AllowBodyForAllHttpMethods { get; set; } - bool? AllowAnyHttpStatusCodeInResponse { get; set; } + bool? AllowOnlyDefinedHttpStatusCodeInResponse { get; set; } bool? DisableJsonBodyParsing { get; set; } } diff --git a/src/WireMock.Net/Owin/Mappers/OwinResponseMapper.cs b/src/WireMock.Net/Owin/Mappers/OwinResponseMapper.cs index e2a89d8b4..365d50bc0 100644 --- a/src/WireMock.Net/Owin/Mappers/OwinResponseMapper.cs +++ b/src/WireMock.Net/Owin/Mappers/OwinResponseMapper.cs @@ -104,12 +104,12 @@ public async Task MapAsync(ResponseMessage responseMessage, IResponse response) private int MapStatusCode(int code) { - if (_options.AllowAnyHttpStatusCodeInResponse == true || Enum.IsDefined(typeof(HttpStatusCode), code)) + if (_options.AllowOnlyDefinedHttpStatusCodeInResponse == true && !Enum.IsDefined(typeof(HttpStatusCode), code)) { - return code; + return (int)HttpStatusCode.OK; } - return (int)HttpStatusCode.OK; + return code; } private bool IsFault(ResponseMessage responseMessage) diff --git a/src/WireMock.Net/Owin/WireMockMiddlewareOptions.cs b/src/WireMock.Net/Owin/WireMockMiddlewareOptions.cs index 3599a249b..d0be329f8 100644 --- a/src/WireMock.Net/Owin/WireMockMiddlewareOptions.cs +++ b/src/WireMock.Net/Owin/WireMockMiddlewareOptions.cs @@ -43,8 +43,8 @@ internal class WireMockMiddlewareOptions : IWireMockMiddlewareOptions /// public bool? AllowBodyForAllHttpMethods { get; set; } - /// - public bool? AllowAnyHttpStatusCodeInResponse { get; set; } + /// + public bool? AllowOnlyDefinedHttpStatusCodeInResponse { get; set; } /// public bool? DisableJsonBodyParsing { get; set; } diff --git a/src/WireMock.Net/ResponseBuilders/IStatusCodeResponseBuilder.cs b/src/WireMock.Net/ResponseBuilders/IStatusCodeResponseBuilder.cs index 41777664b..5bcda2e1a 100644 --- a/src/WireMock.Net/ResponseBuilders/IStatusCodeResponseBuilder.cs +++ b/src/WireMock.Net/ResponseBuilders/IStatusCodeResponseBuilder.cs @@ -1,4 +1,5 @@ using System.Net; +using WireMock.Settings; namespace WireMock.ResponseBuilders { @@ -9,6 +10,7 @@ public interface IStatusCodeResponseBuilder : IHeadersResponseBuilder { /// /// The with status code. + /// By default all status codes are allowed, to change this behaviour, see . /// /// The code. /// The . @@ -16,6 +18,7 @@ public interface IStatusCodeResponseBuilder : IHeadersResponseBuilder /// /// The with status code. + /// By default all status codes are allowed, to change this behaviour, see . /// /// The code. /// The . @@ -23,6 +26,7 @@ public interface IStatusCodeResponseBuilder : IHeadersResponseBuilder /// /// The with status code. + /// By default all status codes are allowed, to change this behaviour, see . /// /// The code. /// The . diff --git a/src/WireMock.Net/Server/WireMockServer.cs b/src/WireMock.Net/Server/WireMockServer.cs index 9eaaad8fe..328aa14f3 100644 --- a/src/WireMock.Net/Server/WireMockServer.cs +++ b/src/WireMock.Net/Server/WireMockServer.cs @@ -269,10 +269,10 @@ protected WireMockServer(IWireMockServerSettings settings) _settings.Logger.Info("AllowBodyForAllHttpMethods is set to True"); } - if (settings.AllowAnyHttpStatusCodeInResponse == true) + if (settings.AllowOnlyDefinedHttpStatusCodeInResponse == true) { - _options.AllowAnyHttpStatusCodeInResponse = _settings.AllowAnyHttpStatusCodeInResponse; - _settings.Logger.Info("AllowAnyHttpStatusCodeInResponse is set to True"); + _options.AllowOnlyDefinedHttpStatusCodeInResponse = _settings.AllowOnlyDefinedHttpStatusCodeInResponse; + _settings.Logger.Info("AllowOnlyDefinedHttpStatusCodeInResponse is set to True"); } if (settings.AllowPartialMapping == true) diff --git a/src/WireMock.Net/Settings/IWireMockServerSettings.cs b/src/WireMock.Net/Settings/IWireMockServerSettings.cs index d11490b81..fe0e2798f 100644 --- a/src/WireMock.Net/Settings/IWireMockServerSettings.cs +++ b/src/WireMock.Net/Settings/IWireMockServerSettings.cs @@ -139,10 +139,12 @@ public interface IWireMockServerSettings bool? AllowBodyForAllHttpMethods { get; set; } /// - /// Allow any HttpStatusCode in the response. Also null, 0, empty or invalid. (default set to false). + /// Allow only a HttpStatus Code in the response which is defined. (default set to false). + /// - false : also null, 0, empty or invalid HttpStatus codes are allowed. + /// - true : only codes defined in are allowed. /// /// [PublicAPI] - bool? AllowAnyHttpStatusCodeInResponse { get; set; } + bool? AllowOnlyDefinedHttpStatusCodeInResponse { get; set; } /// /// Set to true to disable Json deserialization when processing requests. (default set to false). diff --git a/src/WireMock.Net/Settings/WireMockServerSettings.cs b/src/WireMock.Net/Settings/WireMockServerSettings.cs index f05b993d6..5debcf652 100644 --- a/src/WireMock.Net/Settings/WireMockServerSettings.cs +++ b/src/WireMock.Net/Settings/WireMockServerSettings.cs @@ -102,8 +102,8 @@ public class WireMockServerSettings : IWireMockServerSettings [PublicAPI] public bool? AllowBodyForAllHttpMethods { get; set; } - /// - public bool? AllowAnyHttpStatusCodeInResponse { get; set; } + /// + public bool? AllowOnlyDefinedHttpStatusCodeInResponse { get; set; } /// [PublicAPI] diff --git a/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs b/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs index ed5c0ecf5..62aa48ce3 100644 --- a/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs +++ b/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs @@ -35,7 +35,7 @@ public static IWireMockServerSettings ParseArguments([NotNull] string[] args, [C RequestLogExpirationDuration = parser.GetIntValue("RequestLogExpirationDuration"), AllowCSharpCodeMatcher = parser.GetBoolValue("AllowCSharpCodeMatcher"), AllowBodyForAllHttpMethods = parser.GetBoolValue("AllowBodyForAllHttpMethods"), - AllowAnyHttpStatusCodeInResponse = parser.GetBoolValue("AllowAnyHttpStatusCodeInResponse"), + AllowOnlyDefinedHttpStatusCodeInResponse = parser.GetBoolValue("AllowOnlyDefinedHttpStatusCodeInResponse"), DisableJsonBodyParsing = parser.GetBoolValue("DisableJsonBodyParsing") }; diff --git a/test/WireMock.Net.Tests/Owin/Mappers/OwinResponseMapperTests.cs b/test/WireMock.Net.Tests/Owin/Mappers/OwinResponseMapperTests.cs index a542ca77b..caf662c96 100644 --- a/test/WireMock.Net.Tests/Owin/Mappers/OwinResponseMapperTests.cs +++ b/test/WireMock.Net.Tests/Owin/Mappers/OwinResponseMapperTests.cs @@ -69,14 +69,33 @@ public async Task OwinResponseMapper_MapAsync_Null() await _sut.MapAsync(null, _responseMock.Object); } + [Theory] + [InlineData(300, 300)] + [InlineData(500, 500)] + public async Task OwinResponseMapper_MapAsync_Valid_StatusCode(object code, int expected) + { + // Arrange + var responseMessage = new ResponseMessage + { + StatusCode = code + }; + + // Act + await _sut.MapAsync(responseMessage, _responseMock.Object); + + // Assert + _responseMock.VerifySet(r => r.StatusCode = expected, Times.Once); + } + [Theory] [InlineData(0, 200)] [InlineData(-1, 200)] [InlineData(10000, 200)] [InlineData(300, 300)] - public async Task OwinResponseMapper_MapAsync_StatusCode(object code, int expected) + public async Task OwinResponseMapper_MapAsync_Invalid_StatusCode_When_AllowOnlyDefinedHttpStatusCodeInResponseSet_Is_True(object code, int expected) { // Arrange + _optionsMock.SetupGet(o => o.AllowOnlyDefinedHttpStatusCodeInResponse).Returns(true); var responseMessage = new ResponseMessage { StatusCode = code @@ -90,9 +109,10 @@ public async Task OwinResponseMapper_MapAsync_StatusCode(object code, int expect } [Fact] - public async Task OwinResponseMapper_MapAsync_StatusCodeNull() + public async Task OwinResponseMapper_MapAsync_Null_StatusCode_When_AllowOnlyDefinedHttpStatusCodeInResponseSet_Is_True() { // Arrange + _optionsMock.SetupGet(o => o.AllowOnlyDefinedHttpStatusCodeInResponse).Returns(true); var responseMessage = new ResponseMessage { StatusCode = null @@ -105,42 +125,40 @@ public async Task OwinResponseMapper_MapAsync_StatusCodeNull() _responseMock.VerifyNoOtherCalls(); } - [Theory] - [InlineData(0, 0)] - [InlineData(-1, -1)] - [InlineData(10000, 10000)] - [InlineData(300, 300)] - public async Task OwinResponseMapper_MapAsync_StatusCode_WithAllowAll(object code, int expected) + [Fact] + public async Task OwinResponseMapper_MapAsync_StatusCode_Is_Null() { // Arrange - _optionsMock.SetupGet(o => o.AllowAnyHttpStatusCodeInResponse).Returns(true); var responseMessage = new ResponseMessage { - StatusCode = code + StatusCode = null }; // Act await _sut.MapAsync(responseMessage, _responseMock.Object); // Assert - _responseMock.VerifySet(r => r.StatusCode = expected, Times.Once); + _responseMock.VerifyNoOtherCalls(); } - [Fact] - public async Task OwinResponseMapper_MapAsync_StatusCode_WithAllowAll_Null() + [Theory] + [InlineData(0, 0)] + [InlineData(-1, -1)] + [InlineData(10000, 10000)] + [InlineData(300, 300)] + public async Task OwinResponseMapper_MapAsync_StatusCode_Is_NotInEnumRange(object code, int expected) { // Arrange - _optionsMock.SetupGet(o => o.AllowAnyHttpStatusCodeInResponse).Returns(true); var responseMessage = new ResponseMessage { - StatusCode = null + StatusCode = code }; // Act await _sut.MapAsync(responseMessage, _responseMock.Object); // Assert - _responseMock.VerifyNoOtherCalls(); + _responseMock.VerifySet(r => r.StatusCode = expected, Times.Once); } [Fact] diff --git a/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj b/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj index b0bade621..d788bc427 100644 --- a/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj +++ b/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj @@ -19,6 +19,10 @@ ../../src/WireMock.Net/WireMock.Net.snk true + + + true + true diff --git a/test/WireMock.Net.Tests/WireMockServer.Settings.cs b/test/WireMock.Net.Tests/WireMockServer.Settings.cs index ecb5c3d92..2a40d43c1 100644 --- a/test/WireMock.Net.Tests/WireMockServer.Settings.cs +++ b/test/WireMock.Net.Tests/WireMockServer.Settings.cs @@ -141,21 +141,21 @@ public void WireMockServer_WireMockServerSettings_AllowBodyForAllHttpMethods() } [Fact] - public void WireMockServer_WireMockServerSettings_AllowAnyHttpStatusCodeInResponse() + public void WireMockServer_WireMockServerSettings_AllowOnlyDefinedHttpStatusCodeInResponse() { // Assign and Act var server = WireMockServer.Start(new WireMockServerSettings { Logger = _loggerMock.Object, - AllowAnyHttpStatusCodeInResponse = true + AllowOnlyDefinedHttpStatusCodeInResponse = true }); // Assert var options = server.GetPrivateFieldValue("_options"); - Check.That(options.AllowAnyHttpStatusCodeInResponse).Equals(true); + Check.That(options.AllowOnlyDefinedHttpStatusCodeInResponse).Equals(true); // Verify - _loggerMock.Verify(l => l.Info(It.Is(s => s.Contains("AllowAnyHttpStatusCodeInResponse") && s.Contains("True")))); + _loggerMock.Verify(l => l.Info(It.Is(s => s.Contains("AllowOnlyDefinedHttpStatusCodeInResponse") && s.Contains("True")))); } [Fact]