Skip to content

Commit

Permalink
AllowOnlyDefinedHttpStatusCodeInResponse (#422)
Browse files Browse the repository at this point in the history
  • Loading branch information
StefH committed Mar 14, 2020
1 parent 68ffcda commit 10dbff2
Show file tree
Hide file tree
Showing 13 changed files with 63 additions and 37 deletions.
2 changes: 1 addition & 1 deletion Directory.Build.props
Expand Up @@ -4,7 +4,7 @@
</PropertyGroup>

<PropertyGroup>
<VersionPrefix>1.1.10</VersionPrefix>
<VersionPrefix>1.2.0</VersionPrefix>
</PropertyGroup>

<Choose>
Expand Down
2 changes: 0 additions & 2 deletions examples/WireMock.Net.Console.Net452.Classic/MainApp.cs
Expand Up @@ -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()
});
Expand Down
2 changes: 1 addition & 1 deletion src/WireMock.Net/Owin/IWireMockMiddlewareOptions.cs
Expand Up @@ -40,7 +40,7 @@ internal interface IWireMockMiddlewareOptions

bool? AllowBodyForAllHttpMethods { get; set; }

bool? AllowAnyHttpStatusCodeInResponse { get; set; }
bool? AllowOnlyDefinedHttpStatusCodeInResponse { get; set; }

bool? DisableJsonBodyParsing { get; set; }
}
Expand Down
6 changes: 3 additions & 3 deletions src/WireMock.Net/Owin/Mappers/OwinResponseMapper.cs
Expand Up @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions src/WireMock.Net/Owin/WireMockMiddlewareOptions.cs
Expand Up @@ -43,8 +43,8 @@ internal class WireMockMiddlewareOptions : IWireMockMiddlewareOptions
/// <inheritdoc cref="IWireMockMiddlewareOptions.AllowBodyForAllHttpMethods"/>
public bool? AllowBodyForAllHttpMethods { get; set; }

/// <inheritdoc cref="IWireMockMiddlewareOptions.AllowAnyHttpStatusCodeInResponse"/>
public bool? AllowAnyHttpStatusCodeInResponse { get; set; }
/// <inheritdoc cref="IWireMockMiddlewareOptions.AllowOnlyDefinedHttpStatusCodeInResponse"/>
public bool? AllowOnlyDefinedHttpStatusCodeInResponse { get; set; }

/// <inheritdoc cref="IWireMockMiddlewareOptions.DisableResponseBodyParsing"/>
public bool? DisableJsonBodyParsing { get; set; }
Expand Down
@@ -1,4 +1,5 @@
using System.Net;
using WireMock.Settings;

namespace WireMock.ResponseBuilders
{
Expand All @@ -9,20 +10,23 @@ public interface IStatusCodeResponseBuilder : IHeadersResponseBuilder
{
/// <summary>
/// The with status code.
/// By default all status codes are allowed, to change this behaviour, see <inheritdoc cref="IWireMockServerSettings.AllowOnlyDefinedHttpStatusCodeInResponse"/>.
/// </summary>
/// <param name="code">The code.</param>
/// <returns>The <see cref="IResponseBuilder"/>.</returns>
IResponseBuilder WithStatusCode(int code);

/// <summary>
/// The with status code.
/// By default all status codes are allowed, to change this behaviour, see <inheritdoc cref="IWireMockServerSettings.AllowOnlyDefinedHttpStatusCodeInResponse"/>.
/// </summary>
/// <param name="code">The code.</param>
/// <returns>The <see cref="IResponseBuilder"/>.</returns>
IResponseBuilder WithStatusCode(string code);

/// <summary>
/// The with status code.
/// By default all status codes are allowed, to change this behaviour, see <inheritdoc cref="IWireMockServerSettings.AllowOnlyDefinedHttpStatusCodeInResponse"/>.
/// </summary>
/// <param name="code">The code.</param>
/// <returns>The <see cref="IResponseBuilder"/>.</returns>
Expand Down
6 changes: 3 additions & 3 deletions src/WireMock.Net/Server/WireMockServer.cs
Expand Up @@ -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)
Expand Down
6 changes: 4 additions & 2 deletions src/WireMock.Net/Settings/IWireMockServerSettings.cs
Expand Up @@ -139,10 +139,12 @@ public interface IWireMockServerSettings
bool? AllowBodyForAllHttpMethods { get; set; }

/// <summary>
/// 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 <see cref="System.Net.HttpStatusCode"/> are allowed.
/// </summary>
/// [PublicAPI]
bool? AllowAnyHttpStatusCodeInResponse { get; set; }
bool? AllowOnlyDefinedHttpStatusCodeInResponse { get; set; }

/// <summary>
/// Set to true to disable Json deserialization when processing requests. (default set to false).
Expand Down
4 changes: 2 additions & 2 deletions src/WireMock.Net/Settings/WireMockServerSettings.cs
Expand Up @@ -102,8 +102,8 @@ public class WireMockServerSettings : IWireMockServerSettings
[PublicAPI]
public bool? AllowBodyForAllHttpMethods { get; set; }

/// <inheritdoc cref="IWireMockServerSettings.AllowAnyHttpStatusCodeInResponse"/>
public bool? AllowAnyHttpStatusCodeInResponse { get; set; }
/// <inheritdoc cref="IWireMockServerSettings.AllowOnlyDefinedHttpStatusCodeInResponse"/>
public bool? AllowOnlyDefinedHttpStatusCodeInResponse { get; set; }

/// <inheritdoc cref="IWireMockServerSettings.DisableJsonBodyParsing"/>
[PublicAPI]
Expand Down
2 changes: 1 addition & 1 deletion src/WireMock.Net/Settings/WireMockServerSettingsParser.cs
Expand Up @@ -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")
};

Expand Down
50 changes: 34 additions & 16 deletions test/WireMock.Net.Tests/Owin/Mappers/OwinResponseMapperTests.cs
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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]
Expand Down
4 changes: 4 additions & 0 deletions test/WireMock.Net.Tests/WireMock.Net.Tests.csproj
Expand Up @@ -19,6 +19,10 @@
<AssemblyOriginatorKeyFile>../../src/WireMock.Net/WireMock.Net.snk</AssemblyOriginatorKeyFile>
<!--<DelaySign>true</DelaySign>-->
<PublicSign Condition=" '$(OS)' != 'Windows_NT' ">true</PublicSign>

<!--https://developercommunity.visualstudio.com/content/problem/26347/unit-tests-fail-with-fileloadexception-newtonsoftj-1.html-->
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)' == 'Release'">
Expand Down
8 changes: 4 additions & 4 deletions test/WireMock.Net.Tests/WireMockServer.Settings.cs
Expand Up @@ -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<IWireMockMiddlewareOptions>("_options");
Check.That(options.AllowAnyHttpStatusCodeInResponse).Equals(true);
Check.That(options.AllowOnlyDefinedHttpStatusCodeInResponse).Equals(true);

// Verify
_loggerMock.Verify(l => l.Info(It.Is<string>(s => s.Contains("AllowAnyHttpStatusCodeInResponse") && s.Contains("True"))));
_loggerMock.Verify(l => l.Info(It.Is<string>(s => s.Contains("AllowOnlyDefinedHttpStatusCodeInResponse") && s.Contains("True"))));
}

[Fact]
Expand Down

0 comments on commit 10dbff2

Please sign in to comment.