41 lines
1.3 KiB
C#
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());
|
|
}
|
|
}
|