This commit is contained in:
Stef Heyenrath
2026-02-14 10:48:33 +01:00
parent 0a612b17df
commit 99f42fb255
10 changed files with 89 additions and 34 deletions

View File

@@ -16,7 +16,7 @@ internal class WebSocketMessageConditionBuilder : IWebSocketMessageConditionBuil
_matcher = Guard.NotNull(matcher); _matcher = Guard.NotNull(matcher);
} }
public IWebSocketBuilder SendMessage(Action<IWebSocketMessageBuilder> configure) public IWebSocketBuilder ThenSendMessage(Action<IWebSocketMessageBuilder> configure)
{ {
Guard.NotNull(configure); Guard.NotNull(configure);
var messageBuilder = new WebSocketMessageBuilder(); var messageBuilder = new WebSocketMessageBuilder();

View File

@@ -14,7 +14,7 @@ public interface IWebSocketMessageConditionBuilder
/// </summary> /// </summary>
/// <param name="configure">Action to configure the message</param> /// <param name="configure">Action to configure the message</param>
[PublicAPI] [PublicAPI]
IWebSocketBuilder SendMessage(Action<IWebSocketMessageBuilder> configure); IWebSocketBuilder ThenSendMessage(Action<IWebSocketMessageBuilder> configure);
/// <summary> /// <summary>
/// Configure and send multiple messages when the condition matches /// Configure and send multiple messages when the condition matches

View File

@@ -28,7 +28,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="Stef.Validation" Version="0.2.0" /> <PackageReference Include="Stef.Validation" Version="0.2.0" />
<PackageReference Include="TUnit.Core" Version="0.57.1" /> <PackageReference Include="TUnit.Core" Version="1.13.60" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -19,7 +19,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Aspire.Hosting.AppHost" Version="13.1.0" /> <PackageReference Include="Aspire.Hosting.AppHost" Version="13.1.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -13,9 +13,9 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Aspire.Hosting.Testing" Version="13.1.0" /> <PackageReference Include="Aspire.Hosting.Testing" Version="13.1.1" />
<PackageReference Include="Codecov" Version="1.13.0" /> <PackageReference Include="Codecov" Version="1.13.0" />
<PackageReference Include="coverlet.msbuild" Version="6.0.2"> <PackageReference Include="coverlet.msbuild" Version="6.0.4">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
@@ -23,11 +23,11 @@
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="AwesomeAssertions" Version="9.1.0" /> <PackageReference Include="AwesomeAssertions" Version="9.3.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageReference Include="Moq" Version="4.20.72" /> <PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="xunit" Version="2.9.3" /> <PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.4"> <PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>

View File

@@ -14,14 +14,14 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="AwesomeAssertions" Version="9.1.0" /> <PackageReference Include="AwesomeAssertions" Version="9.3.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageReference Include="coverlet.collector" Version="6.0.4"> <PackageReference Include="coverlet.collector" Version="6.0.4">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="xunit" Version="2.9.3" /> <PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.4"> <PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>

View File

@@ -13,7 +13,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Codecov" Version="1.13.0" /> <PackageReference Include="Codecov" Version="1.13.0" />
<PackageReference Include="coverlet.msbuild" Version="6.0.2"> <PackageReference Include="coverlet.msbuild" Version="6.0.4">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
@@ -21,12 +21,12 @@
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="AwesomeAssertions" Version="9.1.0" /> <PackageReference Include="AwesomeAssertions" Version="9.3.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.8" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.8" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageReference Include="Moq" Version="4.20.72" /> <PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="xunit" Version="2.9.3" /> <PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.4"> <PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>

View File

@@ -9,7 +9,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="TUnit" Version="0.57.1" /> <PackageReference Include="TUnit" Version="1.13.60" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -474,11 +474,11 @@ public class WebSocketIntegrationTests(ITestOutputHelper output)
.RespondWith(Response.Create() .RespondWith(Response.Create()
.WithWebSocket(ws => ws .WithWebSocket(ws => ws
.WithCloseTimeout(TimeSpan.FromSeconds(3)) .WithCloseTimeout(TimeSpan.FromSeconds(3))
.WhenMessage("/help").SendMessage(m => m.WithText("Available commands")) .WhenMessage("/help").ThenSendMessage(m => m.WithText("Available commands"))
.WhenMessage("/time").SendMessage(m => m.WithText($"Server time: {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} UTC")) .WhenMessage("/time").ThenSendMessage(m => m.WithText($"Server time: {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} UTC"))
.WhenMessage("/echo *").SendMessage(m => m.WithText("echo response")) .WhenMessage("/echo *").ThenSendMessage(m => m.WithText("echo response"))
.WhenMessage(new ExactMatcher("/exact")).SendMessage(m => m.WithText("is exact")) .WhenMessage(new ExactMatcher("/exact")).ThenSendMessage(m => m.WithText("is exact"))
.WhenMessage(new FuncMatcher(s => s == "/func")).SendMessage(m => m.WithText("is func")) .WhenMessage(new FuncMatcher(s => s == "/func")).ThenSendMessage(m => m.WithText("is func"))
) )
); );
@@ -508,6 +508,60 @@ public class WebSocketIntegrationTests(ITestOutputHelper output)
await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "Test complete", CancellationToken.None); await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "Test complete", CancellationToken.None);
} }
[Fact]
public async Task WhenMessage_NoMatch_Should_Return404()
{
// Arrange
using var server = WireMockServer.Start(new WireMockServerSettings
{
Logger = new TestOutputHelperWireMockLogger(output),
Urls = ["ws://localhost:0"]
});
server
.Given(Request.Create()
.WithPath("/ws/test")
.WithWebSocketUpgrade()
)
.RespondWith(Response.Create()
.WithWebSocket(ws => ws
.WhenMessage("/close")
.ThenSendMessage(m => m.WithText("Closing connection")
.AndClose()
))
);
using var client = new ClientWebSocket();
var uri = new Uri($"{server.Url}/ws/test");
await client.ConnectAsync(uri, CancellationToken.None);
// Act
await client.SendAsync("/close");
var received = await client.ReceiveAsTextAsync();
// Assert
received.Should().Contain("Closing connection");
// Try to receive again - this will complete the close handshake
// and update the client state to Closed
try
{
var receiveBuffer = new byte[1024];
var result = await client.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None);
// If we get here, the message type should be Close
result.MessageType.Should().Be(WebSocketMessageType.Close);
}
catch (WebSocketException)
{
// Connection was closed, which is expected
}
// Verify the connection is CloseReceived
client.State.Should().Be(WebSocketState.CloseReceived);
}
[Fact] [Fact]
public async Task WhenMessage_Should_Close_Connection_When_AndClose_Is_Used() public async Task WhenMessage_Should_Close_Connection_When_AndClose_Is_Used()
{ {
@@ -525,8 +579,10 @@ public class WebSocketIntegrationTests(ITestOutputHelper output)
) )
.RespondWith(Response.Create() .RespondWith(Response.Create()
.WithWebSocket(ws => ws .WithWebSocket(ws => ws
.WhenMessage("/close").SendMessage(m => m.WithText("Closing connection").AndClose()) .WhenMessage("/close")
) .ThenSendMessage(m => m.WithText("Closing connection")
.AndClose()
))
); );
using var client = new ClientWebSocket(); using var client = new ClientWebSocket();

View File

@@ -56,18 +56,20 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Codecov" Version="1.13.0" /> <PackageReference Include="Codecov" Version="1.13.0" />
<PackageReference Include="coverlet.msbuild" Version="6.0.2"> <PackageReference Include="coverlet.msbuild" Version="6.0.4">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Meziantou.Extensions.Logging.Xunit" Version="1.0.23" />
<PackageReference Include="Verify.Xunit" Version="19.6.0" />
<PackageReference Include="xunit" Version="2.9.3" /> <PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.core" Version="2.9.3" /> <PackageReference Include="xunit.core" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.4"> <PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="CultureAwareTesting.xUnit" Version="0.0.1.1" /> <PackageReference Include="CultureAwareTesting.xUnit" Version="0.0.1.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageReference Include="coverlet.collector" Version="6.0.4"> <PackageReference Include="coverlet.collector" Version="6.0.4">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
@@ -75,12 +77,10 @@
<PackageReference Include="Moq" Version="4.20.72" /> <PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="NFluent" Version="3.1.0" /> <PackageReference Include="NFluent" Version="3.1.0" />
<PackageReference Include="SimMetrics.Net" Version="1.0.5" /> <PackageReference Include="SimMetrics.Net" Version="1.0.5" />
<PackageReference Include="JsonConverter.System.Text.Json" Version="0.8.0" />
<PackageReference Include="Verify.Xunit" Version="19.6.0" /> <PackageReference Include="Google.Protobuf" Version="3.33.5" />
<PackageReference Include="JsonConverter.System.Text.Json" Version="0.7.2" /> <PackageReference Include="Grpc.Net.Client" Version="2.76.0" />
<PackageReference Include="Google.Protobuf" Version="3.25.1" /> <PackageReference Include="Grpc.Tools" Version="2.78.0">
<PackageReference Include="Grpc.Net.Client" Version="2.60.0" />
<PackageReference Include="Grpc.Tools" Version="2.60.0">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
@@ -91,7 +91,6 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\WireMock.Net.Testcontainers\WireMock.Net.Testcontainers.csproj" /> <ProjectReference Include="..\..\src\WireMock.Net.Testcontainers\WireMock.Net.Testcontainers.csproj" />
<PackageReference Include="Meziantou.Extensions.Logging.Xunit" Version="1.0.21" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>