Route /load/index currency, owned-card list, and cosmetic id-lists through IViewerEntitlements so freeplay mode inflates all three without touching the viewer's DB state. Adds LoadControllerFreeplayTests (2 tests). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
64 lines
2.9 KiB
C#
64 lines
2.9 KiB
C#
using System.Net;
|
|
using System.Text;
|
|
using System.Text.Json;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using SVSim.Database;
|
|
using SVSim.UnitTests.Infrastructure;
|
|
|
|
namespace SVSim.UnitTests.Controllers;
|
|
|
|
public class LoadControllerFreeplayTests
|
|
{
|
|
private static StringContent Body() => new(
|
|
"""{"viewer_id":"0","steam_id":0,"steam_session_ticket":"","carrier":"steam","card_master_hash":""}""",
|
|
Encoding.UTF8, "application/json");
|
|
|
|
[Test]
|
|
public async Task LoadIndex_freeplay_on_inflates_currency_and_grants_all_cards()
|
|
{
|
|
using var factory = new SVSimTestFactory();
|
|
await factory.SeedGlobalsAsync();
|
|
long viewerId = await factory.SeedViewerAsync();
|
|
// Seed one collectible card so EffectiveOwnedCardsAsync has at least one entry
|
|
// (the minimal test set has no CollectionInfo rows — those cards are non-collectible).
|
|
await factory.SeedOwnedCardAsync(viewerId, 50001001L, count: 1);
|
|
await factory.EnableFreeplayAsync();
|
|
|
|
using var client = factory.CreateAuthenticatedClient(viewerId);
|
|
var resp = await client.PostAsync("/load/index", Body());
|
|
var json = await resp.Content.ReadAsStringAsync();
|
|
Assert.That(resp.StatusCode, Is.EqualTo(HttpStatusCode.OK), json);
|
|
|
|
using var doc = JsonDocument.Parse(json);
|
|
var root = doc.RootElement;
|
|
|
|
// Wire key for UserCurrency is "user_crystal_count" (IndexResponse.[JsonPropertyName("user_crystal_count")])
|
|
Assert.That(root.GetProperty("user_crystal_count").GetProperty("crystal").GetUInt64(), Is.EqualTo(99999UL));
|
|
Assert.That(root.GetProperty("user_crystal_count").GetProperty("rupy").GetUInt64(), Is.EqualTo(99999UL));
|
|
Assert.That(root.GetProperty("user_crystal_count").GetProperty("red_ether").GetUInt64(), Is.EqualTo(99999UL));
|
|
|
|
var cards = root.GetProperty("user_card_list");
|
|
Assert.That(cards.GetArrayLength(), Is.GreaterThan(0));
|
|
// Wire key for card count is "number" (UserCard.[JsonPropertyName("number")])
|
|
for (int i = 0; i < cards.GetArrayLength(); i++)
|
|
Assert.That(cards[i].GetProperty("number").GetInt32(), Is.EqualTo(3));
|
|
}
|
|
|
|
[Test]
|
|
public async Task LoadIndex_freeplay_off_unchanged_baseline()
|
|
{
|
|
using var factory = new SVSimTestFactory();
|
|
await factory.SeedGlobalsAsync();
|
|
long viewerId = await factory.SeedViewerAsync();
|
|
|
|
using var client = factory.CreateAuthenticatedClient(viewerId);
|
|
var resp = await client.PostAsync("/load/index", Body());
|
|
var json = await resp.Content.ReadAsStringAsync();
|
|
Assert.That(resp.StatusCode, Is.EqualTo(HttpStatusCode.OK), json);
|
|
|
|
using var doc = JsonDocument.Parse(json);
|
|
Assert.That(doc.RootElement.GetProperty("user_crystal_count").GetProperty("crystal").GetUInt64(),
|
|
Is.Not.EqualTo(99999UL), "freeplay off must not inflate currency");
|
|
}
|
|
}
|