feat(pack): /pack/info filters spent free-pack children and emits campaign metadata
This commit is contained in:
@@ -210,4 +210,93 @@ public class PackControllerInfoTests
|
||||
"ticket-only pack must not emit a gacha_point block");
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Info_includes_free_pack_child_when_no_claim_today()
|
||||
{
|
||||
using var factory = new SVSimTestFactory();
|
||||
long viewerId = await factory.SeedViewerAsync();
|
||||
|
||||
using (var scope = factory.Services.CreateScope())
|
||||
{
|
||||
var db = scope.ServiceProvider.GetRequiredService<SVSimDbContext>();
|
||||
db.Packs.Add(new PackConfigEntry
|
||||
{
|
||||
Id = 80032, BasePackId = 80001, PackCategory = PackCategory.LegendCardPack,
|
||||
CommenceDate = DateTime.UtcNow.AddDays(-1), CompleteDate = DateTime.UtcNow.AddDays(30),
|
||||
GachaType = 1, GachaDetail = "throwback test", SleeveId = 5090001,
|
||||
ChildGachas =
|
||||
{
|
||||
new PackChildGachaEntry { GachaId = 800032, TypeDetail = 5, Cost = 1, CardCount = 8, ItemId = 80001 },
|
||||
new PackChildGachaEntry
|
||||
{
|
||||
GachaId = 780032, TypeDetail = 10, Cost = 1, CardCount = 8,
|
||||
PurchaseLimitCount = 1, DailyFreeGachaCount = 1,
|
||||
FreeGachaCampaignId = 49, CampaignName = "Test Campaign",
|
||||
},
|
||||
},
|
||||
});
|
||||
await db.SaveChangesAsync();
|
||||
}
|
||||
|
||||
using var client = factory.CreateAuthenticatedClient(viewerId);
|
||||
var response = await client.PostAsync("/pack/info", JsonBody(EmptyEnvelope));
|
||||
var body = await response.Content.ReadAsStringAsync();
|
||||
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK), body);
|
||||
|
||||
using var doc = JsonDocument.Parse(body);
|
||||
var pack = doc.RootElement.GetProperty("pack_config_list").EnumerateArray()
|
||||
.Single(p => p.GetProperty("parent_gacha_id").GetInt32() == 80032);
|
||||
var children = pack.GetProperty("child_gacha_info").EnumerateArray().ToList();
|
||||
Assert.That(children.Count, Is.EqualTo(2), "free + ticket children both visible pre-claim");
|
||||
var free = children.Single(c => c.GetProperty("type_detail").GetInt32() == 10);
|
||||
Assert.That(free.GetProperty("free_gacha_campaign_id").GetInt32(), Is.EqualTo(49));
|
||||
Assert.That(free.GetProperty("campaign_name").GetString(), Is.EqualTo("Test Campaign"));
|
||||
Assert.That(free.GetProperty("daily_free_gacha_count").GetString(), Is.EqualTo("1"));
|
||||
Assert.That(free.GetProperty("purchase_limit_count").GetString(), Is.EqualTo("1"));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Info_drops_free_pack_child_when_claimed_today()
|
||||
{
|
||||
using var factory = new SVSimTestFactory();
|
||||
long viewerId = await factory.SeedViewerAsync();
|
||||
|
||||
using (var scope = factory.Services.CreateScope())
|
||||
{
|
||||
var db = scope.ServiceProvider.GetRequiredService<SVSimDbContext>();
|
||||
db.Packs.Add(new PackConfigEntry
|
||||
{
|
||||
Id = 80033, BasePackId = 80001, PackCategory = PackCategory.LegendCardPack,
|
||||
CommenceDate = DateTime.UtcNow.AddDays(-1), CompleteDate = DateTime.UtcNow.AddDays(30),
|
||||
GachaType = 1, GachaDetail = "throwback test", SleeveId = 5090001,
|
||||
ChildGachas =
|
||||
{
|
||||
new PackChildGachaEntry { GachaId = 800033, TypeDetail = 5, Cost = 1, CardCount = 8, ItemId = 80001 },
|
||||
new PackChildGachaEntry
|
||||
{
|
||||
GachaId = 780033, TypeDetail = 10, Cost = 1, CardCount = 8,
|
||||
DailyFreeGachaCount = 1, FreeGachaCampaignId = 50, CampaignName = "X",
|
||||
},
|
||||
},
|
||||
});
|
||||
var v = await db.Viewers.FirstAsync(x => x.Id == viewerId);
|
||||
v.FreePackClaims.Add(new ViewerFreePackClaim
|
||||
{
|
||||
FreeGachaCampaignId = 50, ClaimCount = 1, LastClaimedAt = DateTime.UtcNow,
|
||||
});
|
||||
await db.SaveChangesAsync();
|
||||
}
|
||||
|
||||
using var client = factory.CreateAuthenticatedClient(viewerId);
|
||||
var response = await client.PostAsync("/pack/info", JsonBody(EmptyEnvelope));
|
||||
var body = await response.Content.ReadAsStringAsync();
|
||||
|
||||
using var doc = JsonDocument.Parse(body);
|
||||
var pack = doc.RootElement.GetProperty("pack_config_list").EnumerateArray()
|
||||
.Single(p => p.GetProperty("parent_gacha_id").GetInt32() == 80033);
|
||||
var children = pack.GetProperty("child_gacha_info").EnumerateArray().ToList();
|
||||
Assert.That(children.Count, Is.EqualTo(1), "Only the ticket child should remain after today's free claim");
|
||||
Assert.That(children[0].GetProperty("type_detail").GetInt32(), Is.EqualTo(5));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user