feat(ranking): stub /ranking/* (6 endpoints)
Rankings menu opens. Period picker shows deterministic monthly schedule.
Every leaderboard returns { period, ranking: [] }.
Endpoints:
- /ranking/get_viewable_ranking_period_list
- /ranking/master_point_{rotation,unlimited}_info
- /ranking/rank_match_class_win_{rotation,unlimited}_info
- /ranking/two_pick_win_info
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
146
SVSim.UnitTests/Controllers/RankingControllerTests.cs
Normal file
146
SVSim.UnitTests/Controllers/RankingControllerTests.cs
Normal file
@@ -0,0 +1,146 @@
|
||||
using System.Net;
|
||||
using System.Net.Http.Json;
|
||||
using System.Text;
|
||||
using System.Text.Json;
|
||||
using SVSim.UnitTests.Infrastructure;
|
||||
|
||||
namespace SVSim.UnitTests.Controllers;
|
||||
|
||||
public class RankingControllerTests
|
||||
{
|
||||
private static StringContent JsonBody(string json) => new(json, Encoding.UTF8, "application/json");
|
||||
|
||||
private const string EmptyBody = """{"viewer_id":"0","steam_id":0,"steam_session_ticket":""}""";
|
||||
|
||||
[Test]
|
||||
public async Task GetViewablePeriodList_returns_six_family_arrays()
|
||||
{
|
||||
using var factory = new SVSimTestFactory();
|
||||
long viewerId = await factory.SeedViewerAsync(steamId: 76_561_198_000_030_001UL);
|
||||
using var client = factory.CreateAuthenticatedClient(viewerId);
|
||||
|
||||
var resp = await client.PostAsync("/ranking/get_viewable_ranking_period_list", JsonBody(EmptyBody));
|
||||
Assert.That(resp.StatusCode, Is.EqualTo(HttpStatusCode.OK));
|
||||
|
||||
var raw = await resp.Content.ReadAsStringAsync();
|
||||
using var doc = JsonDocument.Parse(raw);
|
||||
var data = doc.RootElement;
|
||||
|
||||
foreach (var key in new[] { "rank_match", "master_point", "two_pick", "sealed",
|
||||
"crossover_rank_match", "crossover_master_point" })
|
||||
{
|
||||
Assert.That(data.TryGetProperty(key, out _), Is.True, $"missing key {key}");
|
||||
}
|
||||
Assert.That(data.GetProperty("rank_match").GetArrayLength(), Is.GreaterThan(0));
|
||||
Assert.That(data.GetProperty("crossover_rank_match").GetArrayLength(), Is.EqualTo(0));
|
||||
Assert.That(data.GetProperty("crossover_master_point").GetArrayLength(), Is.EqualTo(0));
|
||||
|
||||
// Master-point entries carry the extra "necessary_score" field per capture.
|
||||
var mp0 = data.GetProperty("master_point")[0];
|
||||
Assert.That(mp0.GetProperty("necessary_score").GetString(), Is.EqualTo("0"));
|
||||
|
||||
// Two-pick entries carry "type" and "over_460".
|
||||
var tp0 = data.GetProperty("two_pick")[0];
|
||||
Assert.That(tp0.GetProperty("type").GetString(), Is.EqualTo("2"));
|
||||
Assert.That(tp0.GetProperty("over_460").GetString(), Is.EqualTo("1"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task MasterPointRotationInfo_returns_empty_ranking_with_period_echoed()
|
||||
{
|
||||
using var factory = new SVSimTestFactory();
|
||||
long viewerId = await factory.SeedViewerAsync(steamId: 76_561_198_000_030_001UL);
|
||||
using var client = factory.CreateAuthenticatedClient(viewerId);
|
||||
|
||||
var resp = await client.PostAsync("/ranking/master_point_rotation_info",
|
||||
JsonBody("""{"viewer_id":"0","steam_id":0,"steam_session_ticket":"","period_id":1}"""));
|
||||
Assert.That(resp.StatusCode, Is.EqualTo(HttpStatusCode.OK));
|
||||
|
||||
var raw = await resp.Content.ReadAsStringAsync();
|
||||
using var doc = JsonDocument.Parse(raw);
|
||||
Assert.That(doc.RootElement.GetProperty("ranking").GetArrayLength(), Is.EqualTo(0));
|
||||
Assert.That(doc.RootElement.GetProperty("period").GetProperty("id").GetString(), Is.EqualTo("1"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task MasterPointUnlimitedInfo_returns_empty_ranking()
|
||||
{
|
||||
using var factory = new SVSimTestFactory();
|
||||
long viewerId = await factory.SeedViewerAsync(steamId: 76_561_198_000_030_001UL);
|
||||
using var client = factory.CreateAuthenticatedClient(viewerId);
|
||||
|
||||
var resp = await client.PostAsync("/ranking/master_point_unlimited_info",
|
||||
JsonBody("""{"viewer_id":"0","steam_id":0,"steam_session_ticket":"","period_id":1}"""));
|
||||
Assert.That(resp.StatusCode, Is.EqualTo(HttpStatusCode.OK));
|
||||
var raw = await resp.Content.ReadAsStringAsync();
|
||||
using var doc = JsonDocument.Parse(raw);
|
||||
Assert.That(doc.RootElement.GetProperty("ranking").GetArrayLength(), Is.EqualTo(0));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task RankMatchClassWinRotationInfo_accepts_class_id_and_returns_empty()
|
||||
{
|
||||
using var factory = new SVSimTestFactory();
|
||||
long viewerId = await factory.SeedViewerAsync(steamId: 76_561_198_000_030_001UL);
|
||||
using var client = factory.CreateAuthenticatedClient(viewerId);
|
||||
|
||||
var resp = await client.PostAsync("/ranking/rank_match_class_win_rotation_info",
|
||||
JsonBody("""{"viewer_id":"0","steam_id":0,"steam_session_ticket":"","period_id":1,"class_id":3}"""));
|
||||
Assert.That(resp.StatusCode, Is.EqualTo(HttpStatusCode.OK));
|
||||
var raw = await resp.Content.ReadAsStringAsync();
|
||||
using var doc = JsonDocument.Parse(raw);
|
||||
Assert.That(doc.RootElement.GetProperty("ranking").GetArrayLength(), Is.EqualTo(0));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task RankMatchClassWinUnlimitedInfo_returns_empty()
|
||||
{
|
||||
using var factory = new SVSimTestFactory();
|
||||
long viewerId = await factory.SeedViewerAsync(steamId: 76_561_198_000_030_001UL);
|
||||
using var client = factory.CreateAuthenticatedClient(viewerId);
|
||||
|
||||
var resp = await client.PostAsync("/ranking/rank_match_class_win_unlimited_info",
|
||||
JsonBody("""{"viewer_id":"0","steam_id":0,"steam_session_ticket":"","period_id":1,"class_id":1}"""));
|
||||
Assert.That(resp.StatusCode, Is.EqualTo(HttpStatusCode.OK));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task TwoPickWinInfo_returns_empty_ranking()
|
||||
{
|
||||
using var factory = new SVSimTestFactory();
|
||||
long viewerId = await factory.SeedViewerAsync(steamId: 76_561_198_000_030_001UL);
|
||||
using var client = factory.CreateAuthenticatedClient(viewerId);
|
||||
|
||||
var resp = await client.PostAsync("/ranking/two_pick_win_info",
|
||||
JsonBody("""{"viewer_id":"0","steam_id":0,"steam_session_ticket":"","period_id":1}"""));
|
||||
Assert.That(resp.StatusCode, Is.EqualTo(HttpStatusCode.OK));
|
||||
var raw = await resp.Content.ReadAsStringAsync();
|
||||
using var doc = JsonDocument.Parse(raw);
|
||||
Assert.That(doc.RootElement.GetProperty("ranking").GetArrayLength(), Is.EqualTo(0));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task MasterPointRotationInfo_unknown_period_returns_empty_period()
|
||||
{
|
||||
using var factory = new SVSimTestFactory();
|
||||
long viewerId = await factory.SeedViewerAsync(steamId: 76_561_198_000_030_001UL);
|
||||
using var client = factory.CreateAuthenticatedClient(viewerId);
|
||||
|
||||
var resp = await client.PostAsync("/ranking/master_point_rotation_info",
|
||||
JsonBody("""{"viewer_id":"0","steam_id":0,"steam_session_ticket":"","period_id":99999}"""));
|
||||
Assert.That(resp.StatusCode, Is.EqualTo(HttpStatusCode.OK));
|
||||
var raw = await resp.Content.ReadAsStringAsync();
|
||||
using var doc = JsonDocument.Parse(raw);
|
||||
Assert.That(doc.RootElement.GetProperty("ranking").GetArrayLength(), Is.EqualTo(0));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Unauthenticated_get_viewable_period_list_returns_401()
|
||||
{
|
||||
using var factory = new SVSimTestFactory();
|
||||
var client = factory.CreateClient();
|
||||
|
||||
var resp = await client.PostAsync("/ranking/get_viewable_ranking_period_list", JsonBody(EmptyBody));
|
||||
Assert.That(resp.StatusCode, Is.EqualTo(HttpStatusCode.Unauthorized));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user