feat(inventory): GrantAsync handles Card + cosmetic cascade
Card grants produce a post-state-total entry and run the CardCosmeticReward cascade (foil twin → id-1 lookup). Cascade additions are skipped when the viewer already owns the cosmetic; missing-master-row failures are logged and dropped without failing the parent grant. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -427,6 +427,23 @@ internal sealed class SVSimTestFactory : WebApplicationFactory<Program>
|
||||
await db.SaveChangesAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Seeds a bare <see cref="ShadowverseCardEntry"/> (no viewer ownership) and returns its id.
|
||||
/// Used by InventoryGrantCardTests to get a valid card id without also seeding owned state.
|
||||
/// Ids start at 800_000_000 (non-foil) or 800_000_001 (foil) and increment by 2 per call to
|
||||
/// keep foil twins aligned.
|
||||
/// </summary>
|
||||
public async Task<long> SeedCardAsync(bool isFoil = false)
|
||||
{
|
||||
using var scope = Services.CreateScope();
|
||||
var ctx = scope.ServiceProvider.GetRequiredService<SVSimDbContext>();
|
||||
long id = isFoil ? 800_000_001L : 800_000_000L;
|
||||
while (await ctx.Cards.AnyAsync(c => c.Id == id)) id += 2;
|
||||
ctx.Cards.Add(new ShadowverseCardEntry { Id = id, IsFoil = isFoil, Name = $"SeedCard{id}" });
|
||||
await ctx.SaveChangesAsync();
|
||||
return id;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the viewer's RedEther balance to <paramref name="amount"/>. Call this AFTER
|
||||
/// <see cref="SeedOwnedCardAsync"/>, which resets RedEther to 0. Create tests use this
|
||||
|
||||
Reference in New Issue
Block a user