diff --git a/SVSim.UnitTests/Controllers/FreeBattleControllerTests.cs b/SVSim.UnitTests/Controllers/FreeBattleControllerTests.cs index 9603d539..7dd8e46d 100644 --- a/SVSim.UnitTests/Controllers/FreeBattleControllerTests.cs +++ b/SVSim.UnitTests/Controllers/FreeBattleControllerTests.cs @@ -62,4 +62,35 @@ public class FreeBattleControllerTests Assert.That(data.GetProperty("node_server_url").GetString(), Is.EqualTo(""), "Empty string, not absent — Phase 2 fix pattern."); } + + [Test] + public async Task DoMatching_unlimited_two_viewers_pair_PvP() + { + await using var factory = new SVSimTestFactory(); + var v1 = await factory.SeedViewerAsync(steamId: 76_561_198_000_000_011UL, displayName: "Alice"); + var v2 = await factory.SeedViewerAsync(steamId: 76_561_198_000_000_012UL, displayName: "Bob"); + await factory.SeedGlobalsAsync(); + await factory.SeedDeckAsync(v1, Format.Unlimited, 1); + await factory.SeedDeckAsync(v2, Format.Unlimited, 1); + + // Alice polls first → parks. + var c1 = factory.CreateAuthenticatedClient(v1); + var r1 = await c1.PostAsJsonAsync("/unlimited_free_battle/do_matching", DoMatchingBody); + var j1 = JsonDocument.Parse(await r1.Content.ReadAsStringAsync()).RootElement; + Assert.That(j1.GetProperty("matching_state").GetInt32(), Is.EqualTo(3002)); + + // Bob polls — pairs, returns joiner (3004). + var c2 = factory.CreateAuthenticatedClient(v2); + var r2 = await c2.PostAsJsonAsync("/unlimited_free_battle/do_matching", DoMatchingBody); + var j2 = JsonDocument.Parse(await r2.Content.ReadAsStringAsync()).RootElement; + Assert.That(j2.GetProperty("matching_state").GetInt32(), Is.EqualTo(3004), "Joiner = 3004."); + Assert.That(j2.GetProperty("battle_id").GetString(), Is.Not.Null.And.Not.Empty); + Assert.That(j2.GetProperty("node_server_url").GetString(), Is.Not.Empty); + + // Alice polls again — gets cached match, owner role (3007). + var r3 = await c1.PostAsJsonAsync("/unlimited_free_battle/do_matching", DoMatchingBody); + var j3 = JsonDocument.Parse(await r3.Content.ReadAsStringAsync()).RootElement; + Assert.That(j3.GetProperty("matching_state").GetInt32(), Is.EqualTo(3007), "Owner = 3007."); + Assert.That(j3.GetProperty("battle_id").GetString(), Is.EqualTo(j2.GetProperty("battle_id").GetString())); + } }