diff --git a/SVSim.Database/Models/ViewerClassData.cs b/SVSim.Database/Models/ViewerClassData.cs index bc9ba71..3f9d151 100644 --- a/SVSim.Database/Models/ViewerClassData.cs +++ b/SVSim.Database/Models/ViewerClassData.cs @@ -7,7 +7,14 @@ public class ViewerClassData { public int Level { get; set; } public int Exp { get; set; } - + + /// + /// Per-class "use random leader skin from owned pool" preference. Defaults to false. + /// No client-side setter exists today (only per-deck random-leader-skin endpoints exist); + /// persisted now so when/if a class-level toggle is discovered, the write target exists. + /// + public bool IsRandomLeaderSkin { get; set; } + #region Navigation Properties public ClassEntry Class { get; set; } = new ClassEntry(); diff --git a/SVSim.UnitTests/Persistence/ViewerClassDataPersistenceTests.cs b/SVSim.UnitTests/Persistence/ViewerClassDataPersistenceTests.cs new file mode 100644 index 0000000..8061fe3 --- /dev/null +++ b/SVSim.UnitTests/Persistence/ViewerClassDataPersistenceTests.cs @@ -0,0 +1,54 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using SVSim.Database; +using SVSim.UnitTests.Infrastructure; + +namespace SVSim.UnitTests.Persistence; + +public class ViewerClassDataPersistenceTests +{ + [Test] + public async Task ViewerClassData_round_trips_is_random_leader_skin() + { + using var factory = new SVSimTestFactory(); + long viewerId = await factory.SeedViewerAsync(); + + using (var seedScope = factory.Services.CreateScope()) + { + var ctx = seedScope.ServiceProvider.GetRequiredService(); + var viewer = await ctx.Viewers + .Include(v => v.Classes) + .FirstAsync(v => v.Id == viewerId); + Assert.That(viewer.Classes, Is.Not.Empty, "fresh viewer should have seeded ViewerClassData rows"); + viewer.Classes[0].IsRandomLeaderSkin = true; + await ctx.SaveChangesAsync(); + } + + using var verifyScope = factory.Services.CreateScope(); + var ctx2 = verifyScope.ServiceProvider.GetRequiredService(); + var viewer2 = await ctx2.Viewers + .Include(v => v.Classes) + .AsNoTracking() + .FirstAsync(v => v.Id == viewerId); + Assert.That(viewer2.Classes[0].IsRandomLeaderSkin, Is.True, "flag should round-trip through SaveChanges"); + + // Other classes still default to false. + Assert.That(viewer2.Classes.Skip(1).All(c => !c.IsRandomLeaderSkin), Is.True); + } + + [Test] + public async Task ViewerClassData_defaults_is_random_leader_skin_to_false() + { + using var factory = new SVSimTestFactory(); + long viewerId = await factory.SeedViewerAsync(); + + using var scope = factory.Services.CreateScope(); + var ctx = scope.ServiceProvider.GetRequiredService(); + var viewer = await ctx.Viewers + .Include(v => v.Classes) + .AsNoTracking() + .FirstAsync(v => v.Id == viewerId); + + Assert.That(viewer.Classes.All(c => !c.IsRandomLeaderSkin), Is.True); + } +}