diff --git a/src/WireMock.Net/Owin/Mappers/OwinResponseMapper.cs b/src/WireMock.Net/Owin/Mappers/OwinResponseMapper.cs index 2d00a3895..a70cd51ee 100644 --- a/src/WireMock.Net/Owin/Mappers/OwinResponseMapper.cs +++ b/src/WireMock.Net/Owin/Mappers/OwinResponseMapper.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Net; +using System.Reflection; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; @@ -79,17 +80,22 @@ public async Task MapAsync(ResponseMessage responseMessage, IResponse response) break; } - switch (responseMessage.StatusCode) - { - case int statusCodeAsInteger: - response.StatusCode = MapStatusCode(statusCodeAsInteger); - break; + var statusCodeType = responseMessage.StatusCode?.GetType(); - case string statusCodeAsString: + switch (statusCodeType) + { + case Type typeAsIntOrEnum when typeAsIntOrEnum == typeof(int) || typeAsIntOrEnum == typeof(int?) || typeAsIntOrEnum.GetTypeInfo().IsEnum: + response.StatusCode = MapStatusCode((int)responseMessage.StatusCode); + break; + + case Type typeAsString when typeAsString == typeof(string): // Note: this case will also match on null - int.TryParse(statusCodeAsString, out int result); + int.TryParse(responseMessage.StatusCode as string, out int result); response.StatusCode = MapStatusCode(result); break; + + default: + break; } SetResponseHeaders(responseMessage, response); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs index 1fbe3f791..31d676211 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs @@ -1,24 +1,24 @@ -using System.Threading.Tasks; -using FluentAssertions; -using WireMock.Models; -using WireMock.ResponseBuilders; -using WireMock.Settings; -using WireMock.Types; -using WireMock.Util; -using Xunit; - -namespace WireMock.Net.Tests.ResponseBuilders -{ - public class ResponseWithCallbackTests - { - private readonly WireMockServerSettings _settings = new WireMockServerSettings(); - - [Fact] - public async Task Response_WithCallbackAsync() - { - // Assign - var requestMessage = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); - var response = Response.Create() +using System.Threading.Tasks; +using FluentAssertions; +using WireMock.Models; +using WireMock.ResponseBuilders; +using WireMock.Settings; +using WireMock.Types; +using WireMock.Util; +using Xunit; + +namespace WireMock.Net.Tests.ResponseBuilders +{ + public class ResponseWithCallbackTests + { + private readonly WireMockServerSettings _settings = new WireMockServerSettings(); + + [Fact] + public async Task Response_WithCallbackAsync() + { + // Assign + var requestMessage = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); + var response = Response.Create() .WithCallback(async request => { await Task.Delay(1); @@ -32,63 +32,63 @@ public async Task Response_WithCallbackAsync() }, StatusCode = 302 }; - }); - - // Act - var responseMessage = await response.ProvideResponseAsync(requestMessage, _settings); - - // Assert - responseMessage.BodyData.BodyAsString.Should().Be("/fooBar"); - responseMessage.StatusCode.Should().Be(302); - } - - [Fact] - public async Task Response_WithCallback() - { - // Assign - var requestMessage = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); - var response = Response.Create() - .WithCallback(request => new ResponseMessage - { - BodyData = new BodyData - { - DetectedBodyType = BodyType.String, - BodyAsString = request.Path + "Bar" - }, - StatusCode = 302 - }); - - // Act - var responseMessage = await response.ProvideResponseAsync(requestMessage, _settings); - - // Assert - responseMessage.BodyData.BodyAsString.Should().Be("/fooBar"); - responseMessage.StatusCode.Should().Be(302); - } - - [Fact] - public async Task Response_WithCallback_And_UseTransformer_Is_True() - { - // Assign - var requestMessage = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); - var response = Response.Create() - .WithCallback(request => new ResponseMessage - { - BodyData = new BodyData - { - DetectedBodyType = BodyType.String, - BodyAsString = "{{request.Path}}Bar" - }, - StatusCode = 302 - }) - .WithTransformer(); - - // Act - var responseMessage = await response.ProvideResponseAsync(requestMessage, _settings); - - // Assert - responseMessage.BodyData.BodyAsString.Should().Be("/fooBar"); - responseMessage.StatusCode.Should().Be(302); - } - } + }); + + // Act + var responseMessage = await response.ProvideResponseAsync(requestMessage, _settings); + + // Assert + responseMessage.BodyData.BodyAsString.Should().Be("/fooBar"); + responseMessage.StatusCode.Should().Be(302); + } + + [Fact] + public async Task Response_WithCallback() + { + // Assign + var requestMessage = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); + var response = Response.Create() + .WithCallback(request => new ResponseMessage + { + BodyData = new BodyData + { + DetectedBodyType = BodyType.String, + BodyAsString = request.Path + "Bar" + }, + StatusCode = 302 + }); + + // Act + var responseMessage = await response.ProvideResponseAsync(requestMessage, _settings); + + // Assert + responseMessage.BodyData.BodyAsString.Should().Be("/fooBar"); + responseMessage.StatusCode.Should().Be(302); + } + + [Fact] + public async Task Response_WithCallback_And_UseTransformer_Is_True() + { + // Assign + var requestMessage = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); + var response = Response.Create() + .WithCallback(request => new ResponseMessage + { + BodyData = new BodyData + { + DetectedBodyType = BodyType.String, + BodyAsString = "{{request.Path}}Bar" + }, + StatusCode = 302 + }) + .WithTransformer(); + + // Act + var responseMessage = await response.ProvideResponseAsync(requestMessage, _settings); + + // Assert + responseMessage.BodyData.BodyAsString.Should().Be("/fooBar"); + responseMessage.StatusCode.Should().Be(302); + } + } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj b/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj index e698cafc1..61251b07d 100644 --- a/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj +++ b/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj @@ -1,104 +1,104 @@ - - - - Stef Heyenrath - - netcoreapp3.1 - full - WireMock.Net.Tests - WireMock.Net.Tests - true - {31DC2EF8-C3FE-467D-84BE-FB5D956E612E} - - - true - True - True - - true - ../../src/WireMock.Net/WireMock.Net.snk - - true - - - true - true - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers - - - - - - - - - - - - - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - + + + + Stef Heyenrath + + netcoreapp3.1 + full + WireMock.Net.Tests + WireMock.Net.Tests + true + {31DC2EF8-C3FE-467D-84BE-FB5D956E612E} + + + true + True + True + + true + ../../src/WireMock.Net/WireMock.Net.snk + + true + + + true + true + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + + + + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - - - - - + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + + + + \ No newline at end of file diff --git a/test/WireMock.Net.Tests/WireMockServerTests.WithCallback.cs b/test/WireMock.Net.Tests/WireMockServerTests.WithCallback.cs new file mode 100644 index 000000000..4211d022b --- /dev/null +++ b/test/WireMock.Net.Tests/WireMockServerTests.WithCallback.cs @@ -0,0 +1,37 @@ +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; +using FluentAssertions; +using WireMock.RequestBuilders; +using WireMock.ResponseBuilders; +using WireMock.Server; +using Xunit; + +namespace WireMock.Net.Tests +{ + public partial class WireMockServerTests + { + [Theory] + [InlineData(HttpStatusCode.Conflict)] + [InlineData(409)] + [InlineData("409")] + public async Task WireMockServer_WithCallback_Should_Use_StatusCodeFromResponse(object statusCode) + { + // Arrange + var server = WireMockServer.Start(); + server.Given(Request.Create().UsingPost().WithPath("/foo")) + .RespondWith(Response.Create() + .WithCallback(request => new ResponseMessage + { + StatusCode = statusCode + })); + + // Act + using var httpClient = new HttpClient(); + var response = await httpClient.PostAsync("http://localhost:" + server.Ports[0] + "/foo", new StringContent("dummy")); + + // Assert + response.StatusCode.Should().Be(409); + } + } +} \ No newline at end of file diff --git a/test/WireMock.Net.Tests/WireMockServerTests.cs b/test/WireMock.Net.Tests/WireMockServerTests.cs index b0dce8780..48c537cdd 100644 --- a/test/WireMock.Net.Tests/WireMockServerTests.cs +++ b/test/WireMock.Net.Tests/WireMockServerTests.cs @@ -15,7 +15,7 @@ namespace WireMock.Net.Tests { - public class WireMockServerTests + public partial class WireMockServerTests { [Fact] public async Task WireMockServer_Should_reset_requestlogs()