Files
mika kuns ec42e8e4bd Initial
2026-04-24 18:26:11 +02:00

41 lines
1.3 KiB
C#

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());
}
}