diff --git a/src/WireMock.Net/Serialization/MappingConverter.cs b/src/WireMock.Net/Serialization/MappingConverter.cs index b88b0d849..cdc322246 100644 --- a/src/WireMock.Net/Serialization/MappingConverter.cs +++ b/src/WireMock.Net/Serialization/MappingConverter.cs @@ -5,9 +5,8 @@ using WireMock.RequestBuilders; using WireMock.ResponseBuilders; using WireMock.Settings; -using WireMock.Util; -using WireMock.Validation; using WireMock.Types; +using WireMock.Validation; namespace WireMock.Serialization { diff --git a/src/WireMock.Net/Server/WireMockServer.Admin.cs b/src/WireMock.Net/Server/WireMockServer.Admin.cs index 8ad49169c..d9fe06f5f 100644 --- a/src/WireMock.Net/Server/WireMockServer.Admin.cs +++ b/src/WireMock.Net/Server/WireMockServer.Admin.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; @@ -808,13 +809,17 @@ private IResponseBuilder InitResponseBuilder(ResponseModel responseModel) return responseBuilder.WithProxy(proxyAndRecordSettings); } - if (responseModel.StatusCode is string) + if (responseModel.StatusCode is string statusCodeAsString) { - responseBuilder = responseBuilder.WithStatusCode((string) responseModel.StatusCode); + responseBuilder = responseBuilder.WithStatusCode(statusCodeAsString); + } + else if (responseModel.StatusCode is int statusCodeAsInt && statusCodeAsInt > 0) + { + responseBuilder = responseBuilder.WithStatusCode(statusCodeAsInt); } else { - responseBuilder = responseBuilder.WithStatusCode(Convert.ToInt32(responseModel.StatusCode)); + responseBuilder = responseBuilder.WithStatusCode(HttpStatusCode.OK); } if (responseModel.Headers != null) diff --git a/test/WireMock.Net.Tests/RequestMatchers/RequestMessageBodyMatcherTests.cs b/test/WireMock.Net.Tests/RequestMatchers/RequestMessageBodyMatcherTests.cs index 6921847df..ab64189d0 100644 --- a/test/WireMock.Net.Tests/RequestMatchers/RequestMessageBodyMatcherTests.cs +++ b/test/WireMock.Net.Tests/RequestMatchers/RequestMessageBodyMatcherTests.cs @@ -4,9 +4,7 @@ using System.Text; using System.Threading.Tasks; using Moq; -using Newtonsoft.Json; using NFluent; -using System.Linq; using WireMock.Matchers; using WireMock.Matchers.Request; using WireMock.Models; diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsTests.cs index bca4e544a..698a6a96e 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsTests.cs @@ -105,6 +105,53 @@ public async Task Response_ProvideResponse_Handlebars_Query() Check.That(responseMessage.BodyData.BodyAsString).Equals("test keya=1 idx=1 idx=2 keyb=5"); } + [Fact] + public async Task Response_ProvideResponse_Handlebars_StatusCode() + { + // Assign + var body = new BodyData + { + BodyAsString = "abc", + DetectedBodyType = BodyType.String + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo?a=400"), "POST", ClientIp, body); + + var response = Response.Create() + .WithStatusCode("{{request.query.a}}") + .WithBody("test") + .WithTransformer(); + + // Act + var responseMessage = await response.ProvideResponseAsync(request, _settings); + + // Assert + Check.That(responseMessage.BodyData.BodyAsString).Equals("test"); + Check.That(responseMessage.StatusCode).Equals("400"); + } + + [Fact] + public async Task Response_ProvideResponse_Handlebars_StatusCodeIsNull() + { + // Assign + var body = new BodyData + { + BodyAsString = "abc", + DetectedBodyType = BodyType.String + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo?a=400"), "POST", ClientIp, body); + + var response = Response.Create() + .WithBody("test") + .WithTransformer(); + + // Act + var responseMessage = await response.ProvideResponseAsync(request, _settings); + + // Assert + Check.That(responseMessage.BodyData.BodyAsString).Equals("test"); + Check.That(responseMessage.StatusCode).Equals(200); + } + [Fact] public async Task Response_ProvideResponse_Handlebars_Header() { diff --git a/test/WireMock.Net.Tests/WireMockAdminApiTests.cs b/test/WireMock.Net.Tests/WireMockAdminApiTests.cs index e921dddf1..9711fd296 100644 --- a/test/WireMock.Net.Tests/WireMockAdminApiTests.cs +++ b/test/WireMock.Net.Tests/WireMockAdminApiTests.cs @@ -12,6 +12,8 @@ using WireMock.Client; using WireMock.Handlers; using WireMock.Logging; +using WireMock.Matchers; +using WireMock.Models; using WireMock.Server; using WireMock.Settings; using Xunit; @@ -88,8 +90,13 @@ public async Task IWireMockAdminApi_PutMappingAsync() server.Stop(); } - [Fact] - public async Task IWireMockAdminApi_PostMappingAsync() + [Theory] + [InlineData(null, 200)] + [InlineData(-1, 200)] + [InlineData(0, 200)] + [InlineData(200, 200)] + [InlineData("200", "200")] + public async Task IWireMockAdminApi_PostMappingAsync(object statusCode, object expectedStatusCode) { // Arrange var server = WireMockServer.StartWithAdminInterface(); @@ -99,7 +106,7 @@ public async Task IWireMockAdminApi_PostMappingAsync() var model = new MappingModel { Request = new RequestModel { Path = "/1" }, - Response = new ResponseModel { Body = "txt", StatusCode = 200 }, + Response = new ResponseModel { Body = "txt", StatusCode = statusCode }, Priority = 500, Title = "test" }; @@ -114,6 +121,9 @@ public async Task IWireMockAdminApi_PostMappingAsync() Check.That(mapping).IsNotNull(); Check.That(mapping.Title).Equals("test"); + var response = await mapping.ProvideResponseAsync(new RequestMessage(new UrlDetails("http://localhost/1"), "GET", "")); + Check.That(response.StatusCode).Equals(expectedStatusCode); + server.Stop(); }