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);
+ }
+}