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);
}
public IWebSocketBuilder SendMessage(Action<IWebSocketMessageBuilder> configure)
public IWebSocketBuilder ThenSendMessage(Action<IWebSocketMessageBuilder> configure)
{
Guard.NotNull(configure);
var messageBuilder = new WebSocketMessageBuilder();

View File

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

View File

@@ -28,7 +28,7 @@
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<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>

View File

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

View File

@@ -13,9 +13,9 @@
</PropertyGroup>
<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="coverlet.msbuild" Version="6.0.2">
<PackageReference Include="coverlet.msbuild" Version="6.0.4">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
@@ -23,11 +23,11 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="AwesomeAssertions" Version="9.1.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageReference Include="AwesomeAssertions" Version="9.3.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageReference Include="Moq" Version="4.20.72" />
<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>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

View File

@@ -14,14 +14,14 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AwesomeAssertions" Version="9.1.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageReference Include="AwesomeAssertions" Version="9.3.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageReference Include="coverlet.collector" Version="6.0.4">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<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>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

View File

@@ -13,7 +13,7 @@
<ItemGroup>
<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>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
@@ -21,12 +21,12 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</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.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="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>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

View File

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

View File

@@ -474,11 +474,11 @@ public class WebSocketIntegrationTests(ITestOutputHelper output)
.RespondWith(Response.Create()
.WithWebSocket(ws => ws
.WithCloseTimeout(TimeSpan.FromSeconds(3))
.WhenMessage("/help").SendMessage(m => m.WithText("Available commands"))
.WhenMessage("/time").SendMessage(m => m.WithText($"Server time: {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} UTC"))
.WhenMessage("/echo *").SendMessage(m => m.WithText("echo response"))
.WhenMessage(new ExactMatcher("/exact")).SendMessage(m => m.WithText("is exact"))
.WhenMessage(new FuncMatcher(s => s == "/func")).SendMessage(m => m.WithText("is func"))
.WhenMessage("/help").ThenSendMessage(m => m.WithText("Available commands"))
.WhenMessage("/time").ThenSendMessage(m => m.WithText($"Server time: {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} UTC"))
.WhenMessage("/echo *").ThenSendMessage(m => m.WithText("echo response"))
.WhenMessage(new ExactMatcher("/exact")).ThenSendMessage(m => m.WithText("is exact"))
.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);
}
[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]
public async Task WhenMessage_Should_Close_Connection_When_AndClose_Is_Used()
{
@@ -525,8 +579,10 @@ public class WebSocketIntegrationTests(ITestOutputHelper output)
)
.RespondWith(Response.Create()
.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();

View File

@@ -56,18 +56,20 @@
<ItemGroup>
<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>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</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.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>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<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">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
@@ -75,12 +77,10 @@
<PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="NFluent" Version="3.1.0" />
<PackageReference Include="SimMetrics.Net" Version="1.0.5" />
<PackageReference Include="Verify.Xunit" Version="19.6.0" />
<PackageReference Include="JsonConverter.System.Text.Json" Version="0.7.2" />
<PackageReference Include="Google.Protobuf" Version="3.25.1" />
<PackageReference Include="Grpc.Net.Client" Version="2.60.0" />
<PackageReference Include="Grpc.Tools" Version="2.60.0">
<PackageReference Include="JsonConverter.System.Text.Json" Version="0.8.0" />
<PackageReference Include="Google.Protobuf" Version="3.33.5" />
<PackageReference Include="Grpc.Net.Client" Version="2.76.0" />
<PackageReference Include="Grpc.Tools" Version="2.78.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
@@ -91,7 +91,6 @@
<ItemGroup>
<ProjectReference Include="..\..\src\WireMock.Net.Testcontainers\WireMock.Net.Testcontainers.csproj" />
<PackageReference Include="Meziantou.Extensions.Logging.Xunit" Version="1.0.21" />
</ItemGroup>
<ItemGroup>