diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f4212b2c..0611f129 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,8 +24,8 @@ jobs: with: dotnet-version: '8.0.x' - # - name: 'WireMock.Net.TUnitTests' - # run: dotnet test './test/WireMock.Net.TUnitTests/WireMock.Net.TUnitTests.csproj' -c Release + - name: 'WireMock.Net.TUnitTests' + run: dotnet test './test/WireMock.Net.TUnitTests/WireMock.Net.TUnitTests.csproj' -c Release - name: 'WireMock.Net.Tests' run: dotnet test --project './test/WireMock.Net.Tests/WireMock.Net.Tests.csproj' -c Release --framework net8.0 @@ -63,8 +63,5 @@ jobs: - name: 'WireMock.Net.Middleware.Tests' run: dotnet test --project './test/WireMock.Net.Middleware.Tests/WireMock.Net.Middleware.Tests.csproj' -c Release - - name: Install .NET Aspire workload - run: dotnet workload install aspire - - name: 'WireMock.Net.Aspire.Tests' run: dotnet test --project './test/WireMock.Net.Aspire.Tests/WireMock.Net.Aspire.Tests.csproj' -c Release \ No newline at end of file diff --git a/src/WireMock.Net.Minimal/Owin/AspNetCoreSelfHost.cs b/src/WireMock.Net.Minimal/Owin/AspNetCoreSelfHost.cs index 0f52079f..47c3bfae 100644 --- a/src/WireMock.Net.Minimal/Owin/AspNetCoreSelfHost.cs +++ b/src/WireMock.Net.Minimal/Owin/AspNetCoreSelfHost.cs @@ -64,6 +64,7 @@ internal partial class AspNetCoreSelfHost services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); diff --git a/src/WireMock.Net.Minimal/Owin/WireMockMiddleware.cs b/src/WireMock.Net.Minimal/Owin/WireMockMiddleware.cs index 5905ae7d..69ff7a33 100644 --- a/src/WireMock.Net.Minimal/Owin/WireMockMiddleware.cs +++ b/src/WireMock.Net.Minimal/Owin/WireMockMiddleware.cs @@ -23,7 +23,8 @@ internal class WireMockMiddleware( IOwinResponseMapper responseMapper, IMappingMatcher mappingMatcher, IWireMockMiddlewareLogger logger, - IGuidUtils guidUtils + IGuidUtils guidUtils, + IDateTimeUtils dateTimeUtils ) { private readonly object _lock = new(); @@ -47,6 +48,7 @@ internal class WireMockMiddleware( ctx.Items[nameof(IWireMockMiddlewareOptions)] = options; ctx.Items[nameof(IWireMockMiddlewareLogger)] = logger; ctx.Items[nameof(IGuidUtils)] = guidUtils; + ctx.Items[nameof(IDateTimeUtils)] = dateTimeUtils; var request = await requestMapper.MapAsync(ctx, options).ConfigureAwait(false); diff --git a/src/WireMock.Net.Minimal/ResponseProviders/WebSocketHandledResponse.cs b/src/WireMock.Net.Minimal/ResponseProviders/WebSocketHandledResponse.cs index 6a7bcd0a..7052be46 100644 --- a/src/WireMock.Net.Minimal/ResponseProviders/WebSocketHandledResponse.cs +++ b/src/WireMock.Net.Minimal/ResponseProviders/WebSocketHandledResponse.cs @@ -9,9 +9,10 @@ namespace WireMock.ResponseProviders; /// internal class WebSocketHandledResponse : ResponseMessage { - public WebSocketHandledResponse() + public WebSocketHandledResponse(DateTime dateTime) { // 101 Switching Protocols StatusCode = (int)HttpStatusCode.SwitchingProtocols; + DateTime = dateTime; } } \ No newline at end of file diff --git a/src/WireMock.Net.Minimal/ResponseProviders/WebSocketResponseProvider.cs b/src/WireMock.Net.Minimal/ResponseProviders/WebSocketResponseProvider.cs index c3b5ce20..286ada00 100644 --- a/src/WireMock.Net.Minimal/ResponseProviders/WebSocketResponseProvider.cs +++ b/src/WireMock.Net.Minimal/ResponseProviders/WebSocketResponseProvider.cs @@ -16,7 +16,7 @@ using WireMock.WebSockets; namespace WireMock.ResponseProviders; -internal class WebSocketResponseProvider(WebSocketBuilder builder) : IResponseProvider +internal class WebSocketResponseProvider(WebSocketBuilder builder, IGuidUtils guidUtils, IDateTimeUtils dateTimeUtils) : IResponseProvider { public async Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync( IMapping mapping, @@ -30,6 +30,16 @@ internal class WebSocketResponseProvider(WebSocketBuilder builder) : IResponsePr return (ResponseMessageBuilder.Create(HttpStatusCode.BadRequest, "Bad Request: Not a WebSocket upgrade request"), null); } + if (!context.Items.TryGetValue(nameof(IWireMockMiddlewareOptions), out var options)) + { + throw new InvalidOperationException("IWireMockMiddlewareOptions not found in HttpContext.Items"); + } + + if (!context.Items.TryGetValue(nameof(IWireMockMiddlewareLogger), out var logger)) + { + throw new InvalidOperationException("IWireMockMiddlewareLogger not found in HttpContext.Items"); + } + try { // Accept the WebSocket connection @@ -45,21 +55,6 @@ internal class WebSocketResponseProvider(WebSocketBuilder builder) : IResponsePr var webSocket = await context.WebSockets.AcceptWebSocketAsync(builder.AcceptProtocol).ConfigureAwait(false); #endif - if (!context.Items.TryGetValue(nameof(IWireMockMiddlewareOptions), out var options)) - { - throw new InvalidOperationException("IWireMockMiddlewareOptions not found in HttpContext.Items"); - } - - if (!context.Items.TryGetValue(nameof(IWireMockMiddlewareLogger), out var logger)) - { - throw new InvalidOperationException("IWireMockMiddlewareLogger not found in HttpContext.Items"); - } - - if (!context.Items.TryGetValue(nameof(IGuidUtils), out var guidUtils)) - { - throw new InvalidOperationException("IGuidUtils not found in HttpContext.Items"); - } - // Get or create registry from options var registry = builder.IsBroadcast ? options.WebSocketRegistries.GetOrAdd(mapping.Guid, _ => new WebSocketConnectionRegistry()) @@ -109,7 +104,7 @@ internal class WebSocketResponseProvider(WebSocketBuilder builder) : IResponsePr } // Return special marker to indicate WebSocket was handled - return (new WebSocketHandledResponse(), null); + return (new WebSocketHandledResponse(dateTimeUtils.UtcNow), null); } catch (Exception ex) { @@ -122,7 +117,7 @@ internal class WebSocketResponseProvider(WebSocketBuilder builder) : IResponsePr } // Already upgraded - return marker - return (new WebSocketHandledResponse(), null); + return (new WebSocketHandledResponse(dateTimeUtils.UtcNow), null); } } diff --git a/src/WireMock.Net.Minimal/Server/RespondWithAProvider.cs b/src/WireMock.Net.Minimal/Server/RespondWithAProvider.cs index 58e86abc..65422f6c 100644 --- a/src/WireMock.Net.Minimal/Server/RespondWithAProvider.cs +++ b/src/WireMock.Net.Minimal/Server/RespondWithAProvider.cs @@ -2,8 +2,6 @@ // This source file is based on mock4net by Alexandre Victoor which is licensed under the Apache 2.0 License. // For more details see 'mock4net/LICENSE.txt' and 'mock4net/readme.md' in this project root. -using System; -using System.Collections.Generic; using System.Net; using Stef.Validation; using WireMock.Matchers.Request; @@ -25,6 +23,8 @@ internal class RespondWithAProvider : IRespondWithAProvider private readonly IRequestMatcher _requestMatcher; private readonly WireMockServerSettings _settings; private readonly IDateTimeUtils _dateTimeUtils; + private readonly IGuidUtils _guidUtils; + private readonly bool _saveToFile; private int _priority; @@ -49,16 +49,7 @@ internal class RespondWithAProvider : IRespondWithAProvider public IdOrTexts? ProtoDefinition { get; private set; } - /// - /// Initializes a new instance of the class. - /// - /// The registration callback. - /// The request matcher. - /// The WireMockServerSettings. - /// GuidUtils to make unit testing possible. - /// DateTimeUtils to make unit testing possible. - /// Optional boolean to indicate if this mapping should be saved as static mapping file. - public RespondWithAProvider( + internal RespondWithAProvider( RegistrationCallback registrationCallback, IRequestMatcher requestMatcher, WireMockServerSettings settings, @@ -71,6 +62,8 @@ internal class RespondWithAProvider : IRespondWithAProvider _requestMatcher = Guard.NotNull(requestMatcher); _settings = Guard.NotNull(settings); _dateTimeUtils = Guard.NotNull(dateTimeUtils); + _guidUtils = Guard.NotNull(guidUtils); + _saveToFile = saveToFile; Guid = guidUtils.NewGuid(); @@ -82,7 +75,11 @@ internal class RespondWithAProvider : IRespondWithAProvider if (provider is Response response && response.WebSocketBuilder != null) { // If the provider is a Response with a WebSocketBuilder, we need to use a WebSocketResponseProvider instead. - provider = new WebSocketResponseProvider(response.WebSocketBuilder); + provider = new WebSocketResponseProvider( + response.WebSocketBuilder, + _guidUtils, + _dateTimeUtils + ); } var mapping = new Mapping diff --git a/src/WireMock.Net.Minimal/Util/DateTimeUtils.cs b/src/WireMock.Net.Minimal/Util/DateTimeUtils.cs index 1d09e6c7..46bd652f 100644 --- a/src/WireMock.Net.Minimal/Util/DateTimeUtils.cs +++ b/src/WireMock.Net.Minimal/Util/DateTimeUtils.cs @@ -1,7 +1,5 @@ // Copyright © WireMock.Net -using System; - namespace WireMock.Util; internal interface IDateTimeUtils diff --git a/test/WireMock.Net.Tests/Owin/WireMockMiddlewareTests.cs b/test/WireMock.Net.Tests/Owin/WireMockMiddlewareTests.cs index 4cc961c4..57f245b7 100644 --- a/test/WireMock.Net.Tests/Owin/WireMockMiddlewareTests.cs +++ b/test/WireMock.Net.Tests/Owin/WireMockMiddlewareTests.cs @@ -26,6 +26,7 @@ namespace WireMock.Net.Tests.Owin; public class WireMockMiddlewareTests { private static readonly Guid NewGuid = new("98fae52e-76df-47d9-876f-2ee32e931d9b"); + private static readonly DateTime UtcNow = new(2026, 1, 1, 0, 0, 0, DateTimeKind.Utc); private static readonly DateTime UpdatedAt = new(2022, 12, 4); private readonly ConcurrentDictionary _mappings = new(); @@ -37,6 +38,7 @@ public class WireMockMiddlewareTests private readonly Mock _requestMatchResultMock; private readonly Mock _contextMock; private readonly Mock _guidUtilsMock; + private readonly Mock _dateTimeUtilsMock; private readonly WireMockMiddleware _sut; @@ -47,6 +49,9 @@ public class WireMockMiddlewareTests _guidUtilsMock = new Mock(); _guidUtilsMock.Setup(g => g.NewGuid()).Returns(NewGuid); + _dateTimeUtilsMock = new Mock(); + _dateTimeUtilsMock.Setup(d => d.UtcNow).Returns(UtcNow); + _optionsMock = new Mock(); _optionsMock.SetupAllProperties(); _optionsMock.Setup(o => o.Mappings).Returns(_mappings); @@ -85,7 +90,8 @@ public class WireMockMiddlewareTests _responseMapperMock.Object, _matcherMock.Object, wireMockMiddlewareLoggerMock.Object, - _guidUtilsMock.Object + _guidUtilsMock.Object, + _dateTimeUtilsMock.Object ); } diff --git a/test/WireMock.Net.Tests/WebSockets/WebSocketIntegrationTests.cs b/test/WireMock.Net.Tests/WebSockets/WebSocketIntegrationTests.cs index 8815e314..33a7778e 100644 --- a/test/WireMock.Net.Tests/WebSockets/WebSocketIntegrationTests.cs +++ b/test/WireMock.Net.Tests/WebSockets/WebSocketIntegrationTests.cs @@ -704,7 +704,7 @@ public class WebSocketIntegrationTests(ITestOutputHelper output, ITestContextAcc .WithWebSocketUpgrade() ) .RespondWith(Response.Create() - .WithWebSocketProxy(exampleEchoServer.Url!) + .WithWebSocketProxy($"{exampleEchoServer.Url}/ws/target") ); using var client = new ClientWebSocket(); @@ -759,7 +759,7 @@ public class WebSocketIntegrationTests(ITestOutputHelper output, ITestContextAcc .WithWebSocketUpgrade() ) .RespondWith(Response.Create() - .WithWebSocketProxy(exampleEchoServer.Url!) + .WithWebSocketProxy($"{exampleEchoServer.Url}/ws/target") ); using var client = new ClientWebSocket();