feat(guild): /guild/create + populated /guild/info

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
gamer147
2026-06-27 12:17:22 -04:00
parent 99019963ca
commit f7f68d03a7
8 changed files with 430 additions and 11 deletions

View File

@@ -0,0 +1,87 @@
using System.Net.Http.Json;
using System.Text.Json;
using SVSim.UnitTests.Infrastructure;
namespace SVSim.UnitTests.Integration.Guild;
public class GuildCreateInfoFlowTests
{
[Test]
public async Task PostingCreate_then_Info_returns_populated_guild()
{
using var factory = new SVSimTestFactory();
long viewerId = await factory.SeedViewerAsync(
steamId: 76_561_198_200_000_001UL,
displayName: "AlphaIntPlayer");
using var client = factory.CreateAuthenticatedClient(viewerId);
// POST /guild/create — mirror the arena integration test style: include the base-request fields
const string Vid = "0"; const int Sid = 0; const string Stk = "";
var create = await client.PostAsync("/guild/create",
System.Net.Http.Json.JsonContent.Create(new { guild_name = "AlphaInt", activity = 1, join_condition = 1,
viewer_id = Vid, steam_id = Sid, steam_session_ticket = Stk }));
Assert.That(create.IsSuccessStatusCode, Is.True, $"create failed ({create.StatusCode}): {await create.Content.ReadAsStringAsync()}");
// POST /guild/info — expect JOINING state with guild populated
var info = await client.PostAsync("/guild/info",
System.Net.Http.Json.JsonContent.Create(new { viewer_id = Vid, steam_id = Sid, steam_session_ticket = Stk }));
var json = await info.Content.ReadAsStringAsync();
Assert.That(info.IsSuccessStatusCode, Is.True, $"info failed: {json}");
// In test mode (no UnityPlayer user-agent) the translation middleware is a no-op;
// the controller's raw DTO is returned directly (no {data_headers, data} envelope).
using var doc = JsonDocument.Parse(json);
var root = doc.RootElement;
Assert.That(root.GetProperty("guild_status").GetString(), Is.EqualTo("2"),
"guild_status should be JOINING (2)");
Assert.That(root.GetProperty("guild").GetProperty("detail").GetProperty("guild_name").GetString(),
Is.EqualTo("AlphaInt"));
Assert.That(root.GetProperty("guild").GetProperty("members").GetArrayLength(),
Is.EqualTo(1));
}
[Test]
public async Task PostingCreate_twice_returns_error_second_time()
{
using var factory = new SVSimTestFactory();
long viewerId = await factory.SeedViewerAsync(
steamId: 76_561_198_200_000_002UL,
displayName: "DoubleCreatePlayer");
using var client = factory.CreateAuthenticatedClient(viewerId);
const string Vid = "0"; const int Sid = 0; const string Stk = "";
var createBody = new { guild_name = "OnlyOnce", activity = 1, join_condition = 1,
viewer_id = Vid, steam_id = Sid, steam_session_ticket = Stk };
// First create should succeed
var first = await client.PostAsync("/guild/create",
System.Net.Http.Json.JsonContent.Create(createBody));
Assert.That(first.IsSuccessStatusCode, Is.True, $"First create failed: {await first.Content.ReadAsStringAsync()}");
var firstJson = await first.Content.ReadAsStringAsync();
using var firstDoc = JsonDocument.Parse(firstJson);
// In test mode (no envelope), result_code may be present (failure) or absent (success EmptyResponse).
// Success path returns EmptyResponse ({}), so result_code will not be present.
var firstRoot = firstDoc.RootElement;
if (firstRoot.TryGetProperty("result_code", out var rc1))
{
// If present it must not be 2 (error code).
Assert.That(rc1.GetInt32(), Is.Not.EqualTo(2), "First create must not error");
}
// Second create for the same viewer should return an error envelope (result_code = 2).
var secondBody = new { guild_name = "OnlyOnceAgain", activity = 1, join_condition = 1,
viewer_id = Vid, steam_id = Sid, steam_session_ticket = Stk };
var second = await client.PostAsync("/guild/create",
System.Net.Http.Json.JsonContent.Create(secondBody));
Assert.That(second.IsSuccessStatusCode, Is.True, "HTTP level should still be 200");
var secondJson = await second.Content.ReadAsStringAsync();
using var secondDoc = JsonDocument.Parse(secondJson);
// Error path: the MapErrorToWire helper returns { result_code = 2 }
Assert.That(secondDoc.RootElement.TryGetProperty("result_code", out var rc2), Is.True,
$"Second create should return result_code field, got: {secondJson}");
Assert.That(rc2.GetInt32(), Is.EqualTo(2), "Second create should fail with result_code=2");
}
}