Initial
This commit is contained in:
40
tests/ClaudeMailbox.Tests/RaceTests.cs
Normal file
40
tests/ClaudeMailbox.Tests/RaceTests.cs
Normal file
@@ -0,0 +1,40 @@
|
||||
using System.Net.Http.Json;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace ClaudeMailbox.Tests;
|
||||
|
||||
public sealed class RaceTests
|
||||
{
|
||||
[Fact]
|
||||
public async Task Parallel_CheckInbox_Delivers_Each_Message_Exactly_Once()
|
||||
{
|
||||
await using var host = await TestHost.StartAsync();
|
||||
using var sender = host.NewClientFor("sender");
|
||||
using var recipient = host.NewClientFor("recipient");
|
||||
|
||||
const int messageCount = 50;
|
||||
for (var i = 0; i < messageCount; i++)
|
||||
{
|
||||
var res = await sender.PostAsJsonAsync("/v1/send", new { to = "recipient", body = $"msg-{i}" });
|
||||
res.EnsureSuccessStatusCode();
|
||||
}
|
||||
|
||||
// Fire multiple concurrent checks. Each message must appear in exactly one result set.
|
||||
var tasks = Enumerable.Range(0, 8).Select(async _ =>
|
||||
{
|
||||
var res = await recipient.PostAsync("/v1/check-inbox?name=recipient", null);
|
||||
res.EnsureSuccessStatusCode();
|
||||
return await res.Content.ReadFromJsonAsync<JsonElement>();
|
||||
});
|
||||
|
||||
var results = await Task.WhenAll(tasks);
|
||||
|
||||
var ids = new List<long>();
|
||||
foreach (var arr in results)
|
||||
foreach (var m in arr.EnumerateArray())
|
||||
ids.Add(m.GetProperty("id").GetInt64());
|
||||
|
||||
Assert.Equal(messageCount, ids.Count);
|
||||
Assert.Equal(messageCount, ids.Distinct().Count());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user