From 721cd738d7e51d6be1b74ad614f6bad36abd15f5 Mon Sep 17 00:00:00 2001 From: gamer147 Date: Sun, 31 May 2026 10:34:12 -0400 Subject: [PATCH] feat(repo): IArenaTwoPickRewardRepository + tests Adds GetRewardsByWinCountAsync and GetMaxWinCountAsync (short-circuits to 0 on empty table). Registers as AddTransient in Program.cs alongside other global catalog repos. 3 NUnit tests pass. Co-Authored-By: Claude Sonnet 4.6 --- .../Globals/ArenaTwoPickRewardRepository.cs | 21 +++++++ .../Globals/IArenaTwoPickRewardRepository.cs | 9 +++ SVSim.EmulatedEntrypoint/Program.cs | 1 + .../ArenaTwoPickRewardRepositoryTests.cs | 56 +++++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 SVSim.Database/Repositories/Globals/ArenaTwoPickRewardRepository.cs create mode 100644 SVSim.Database/Repositories/Globals/IArenaTwoPickRewardRepository.cs create mode 100644 SVSim.UnitTests/Repositories/ArenaTwoPickRewardRepositoryTests.cs diff --git a/SVSim.Database/Repositories/Globals/ArenaTwoPickRewardRepository.cs b/SVSim.Database/Repositories/Globals/ArenaTwoPickRewardRepository.cs new file mode 100644 index 0000000..78ac976 --- /dev/null +++ b/SVSim.Database/Repositories/Globals/ArenaTwoPickRewardRepository.cs @@ -0,0 +1,21 @@ +using Microsoft.EntityFrameworkCore; +using SVSim.Database.Models; + +namespace SVSim.Database.Repositories.Globals; + +public class ArenaTwoPickRewardRepository : IArenaTwoPickRewardRepository +{ + private readonly SVSimDbContext _db; + public ArenaTwoPickRewardRepository(SVSimDbContext db) => _db = db; + + public async Task> GetRewardsByWinCountAsync(int winCount) => + await _db.ArenaTwoPickRewards + .Where(r => r.WinCount == winCount) + .ToListAsync(); + + public async Task GetMaxWinCountAsync() + { + if (!await _db.ArenaTwoPickRewards.AnyAsync()) return 0; + return await _db.ArenaTwoPickRewards.MaxAsync(r => r.WinCount); + } +} diff --git a/SVSim.Database/Repositories/Globals/IArenaTwoPickRewardRepository.cs b/SVSim.Database/Repositories/Globals/IArenaTwoPickRewardRepository.cs new file mode 100644 index 0000000..69d8790 --- /dev/null +++ b/SVSim.Database/Repositories/Globals/IArenaTwoPickRewardRepository.cs @@ -0,0 +1,9 @@ +using SVSim.Database.Models; + +namespace SVSim.Database.Repositories.Globals; + +public interface IArenaTwoPickRewardRepository +{ + Task> GetRewardsByWinCountAsync(int winCount); + Task GetMaxWinCountAsync(); +} diff --git a/SVSim.EmulatedEntrypoint/Program.cs b/SVSim.EmulatedEntrypoint/Program.cs index e4112cb..e1ecbd6 100644 --- a/SVSim.EmulatedEntrypoint/Program.cs +++ b/SVSim.EmulatedEntrypoint/Program.cs @@ -72,6 +72,7 @@ public class Program builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); + builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddScoped(); diff --git a/SVSim.UnitTests/Repositories/ArenaTwoPickRewardRepositoryTests.cs b/SVSim.UnitTests/Repositories/ArenaTwoPickRewardRepositoryTests.cs new file mode 100644 index 0000000..74d64c0 --- /dev/null +++ b/SVSim.UnitTests/Repositories/ArenaTwoPickRewardRepositoryTests.cs @@ -0,0 +1,56 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using SVSim.Bootstrap.Importers; +using SVSim.Database; +using SVSim.Database.Repositories.Globals; +using SVSim.UnitTests.Infrastructure; + +namespace SVSim.UnitTests.Repositories; + +public class ArenaTwoPickRewardRepositoryTests +{ + private static async Task SeededContextAsync() + { + var factory = new SVSimTestFactory(); + var scope = factory.Services.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + await db.Database.EnsureCreatedAsync(); + await new ArenaTwoPickRewardImporter() + .ImportAsync(db, Path.Combine(AppContext.BaseDirectory, "Data", "seeds")); + return db; + } + + [Test] + public async Task GetRewardsByWinCount_returns_two_rows_for_each_win_count() + { + await using var db = await SeededContextAsync(); + var repo = new ArenaTwoPickRewardRepository(db); + + for (int w = 0; w <= 7; w++) + { + var rows = await repo.GetRewardsByWinCountAsync(w); + Assert.That(rows.Count, Is.EqualTo(2), $"WinCount={w} should have 2 reward rows"); + } + } + + [Test] + public async Task GetMaxWinCount_returns_7() + { + await using var db = await SeededContextAsync(); + var repo = new ArenaTwoPickRewardRepository(db); + var max = await repo.GetMaxWinCountAsync(); + Assert.That(max, Is.EqualTo(7)); + } + + [Test] + public async Task GetMaxWinCount_returns_0_when_catalog_empty() + { + var factory = new SVSimTestFactory(); + using var scope = factory.Services.CreateScope(); + var db = scope.ServiceProvider.GetRequiredService(); + await db.Database.EnsureCreatedAsync(); + var repo = new ArenaTwoPickRewardRepository(db); + var max = await repo.GetMaxWinCountAsync(); + Assert.That(max, Is.EqualTo(0)); + } +}