From 9d54994747c457c764c9b7067fd41616679f47f3 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Mon, 18 Apr 2022 20:55:23 +0200 Subject: [PATCH] Allow Timeout.InfiniteTimeSpan for WithDelay (#746) * Update WithDelay * Allow Timeout.InfiniteTimeSpan for WithDelay --- .../ResponseBuilders/IDelayResponseBuilder.cs | 6 ++-- src/WireMock.Net/ResponseBuilders/Response.cs | 16 +++++----- .../Serialization/MappingConverter.cs | 4 ++- .../Serialization/MappingConverterTests.cs | 31 +++++++++++++++++-- 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/src/WireMock.Net/ResponseBuilders/IDelayResponseBuilder.cs b/src/WireMock.Net/ResponseBuilders/IDelayResponseBuilder.cs index 3682f90e..4e03014f 100644 --- a/src/WireMock.Net/ResponseBuilders/IDelayResponseBuilder.cs +++ b/src/WireMock.Net/ResponseBuilders/IDelayResponseBuilder.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace WireMock.ResponseBuilders { @@ -8,14 +8,14 @@ namespace WireMock.ResponseBuilders public interface IDelayResponseBuilder : ICallbackResponseBuilder { /// - /// The with delay. + /// The delay defined as a . /// /// The TimeSpan to delay. /// The . IResponseBuilder WithDelay(TimeSpan delay); /// - /// The with delay. + /// The delay defined as milliseconds. /// /// The milliseconds to delay. /// The . diff --git a/src/WireMock.Net/ResponseBuilders/Response.cs b/src/WireMock.Net/ResponseBuilders/Response.cs index b213dc23..f9665dc1 100644 --- a/src/WireMock.Net/ResponseBuilders/Response.cs +++ b/src/WireMock.Net/ResponseBuilders/Response.cs @@ -346,9 +346,7 @@ namespace WireMock.ResponseBuilders return WithTransformer(TransformerType.Handlebars, false, options); } -#pragma warning disable CS1574 - /// -#pragma warning restore CS1574 + /// public IResponseBuilder WithTransformer(TransformerType transformerType, bool transformContentFromBodyAsFile = false, ReplaceNodeOptions options = ReplaceNodeOptions.None) { UseTransformer = true; @@ -358,26 +356,26 @@ namespace WireMock.ResponseBuilders return this; } - /// + /// public IResponseBuilder WithDelay(TimeSpan delay) { - Guard.Condition(delay, d => d > TimeSpan.Zero, nameof(delay)); + Guard.Condition(delay, d => d == Timeout.InfiniteTimeSpan || d > TimeSpan.Zero); Delay = delay; return this; } - /// + /// public IResponseBuilder WithDelay(int milliseconds) { return WithDelay(TimeSpan.FromMilliseconds(milliseconds)); } - /// + /// public IResponseBuilder WithRandomDelay(int minimumMilliseconds = 0, int maximumMilliseconds = 60_000) { - Guard.Condition(minimumMilliseconds, min => min >= 0, nameof(minimumMilliseconds)); - Guard.Condition(maximumMilliseconds, max => max > minimumMilliseconds, nameof(maximumMilliseconds)); + Guard.Condition(minimumMilliseconds, min => min >= 0); + Guard.Condition(maximumMilliseconds, max => max > minimumMilliseconds); MinimumDelayMilliseconds = minimumMilliseconds; MaximumDelayMilliseconds = maximumMilliseconds; diff --git a/src/WireMock.Net/Serialization/MappingConverter.cs b/src/WireMock.Net/Serialization/MappingConverter.cs index d8698ce2..a33bfc05 100644 --- a/src/WireMock.Net/Serialization/MappingConverter.cs +++ b/src/WireMock.Net/Serialization/MappingConverter.cs @@ -1,5 +1,7 @@ +using System; using System.Collections.Generic; using System.Linq; +using System.Threading; using Stef.Validation; using WireMock.Admin.Mappings; using WireMock.Matchers.Request; @@ -90,7 +92,7 @@ namespace WireMock.Serialization } else { - mappingModel.Response.Delay = (int?)response.Delay?.TotalMilliseconds; + mappingModel.Response.Delay = (int?)(response.Delay == Timeout.InfiniteTimeSpan ? TimeSpan.MaxValue.TotalMilliseconds : response.Delay?.TotalMilliseconds); } if (mapping.Webhooks?.Length == 1) diff --git a/test/WireMock.Net.Tests/Serialization/MappingConverterTests.cs b/test/WireMock.Net.Tests/Serialization/MappingConverterTests.cs index 40c31e91..ff7ea484 100644 --- a/test/WireMock.Net.Tests/Serialization/MappingConverterTests.cs +++ b/test/WireMock.Net.Tests/Serialization/MappingConverterTests.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading; using FluentAssertions; using WireMock.Models; using WireMock.RequestBuilders; @@ -192,10 +193,36 @@ namespace WireMock.Net.Tests.Serialization } [Fact] - public void ToMappingModel_WithDelay_ReturnsCorrectModel() + public void ToMappingModel_WithDelayAsTimeSpan_ReturnsCorrectModel() + { + // Arrange + var tests = new[] + { + new { Delay = Timeout.InfiniteTimeSpan, Expected = (int) TimeSpan.MaxValue.TotalMilliseconds }, + new { Delay = TimeSpan.FromSeconds(1), Expected = 1000}, + new { Delay = TimeSpan.MaxValue, Expected = (int) TimeSpan.MaxValue.TotalMilliseconds } + }; + + foreach (var test in tests) + { + var request = Request.Create(); + var response = Response.Create().WithDelay(test.Delay); + var mapping = new Mapping(Guid.NewGuid(), "", null, _settings, request, response, 42, null, null, null, null, null, null); + + // Act + var model = _sut.ToMappingModel(mapping); + + // Assert + model.Should().NotBeNull(); + model.Response.Delay.Should().Be(test.Expected); + } + } + + [Fact] + public void ToMappingModel_WithDelayAsMilleSeconds_ReturnsCorrectModel() { // Assign - int delay = 1000; + var delay = 1000; var request = Request.Create(); var response = Response.Create().WithDelay(delay); var mapping = new Mapping(Guid.NewGuid(), "", null, _settings, request, response, 42, null, null, null, null, null, null);