using Domain.Entities.Stocks; using RiskHandler = Application.Features.Api.Stocks.GetElsRiskBoard.Handler; using RiskQuery = Application.Features.Api.Stocks.GetElsRiskBoard.Query; namespace Application.Tests; /// GetElsRiskBoard 핸들러 — 기초자산별 미상환잔액 시계열 그룹화 + 기초자산·종목구분·기간 필터 검증. [TestClass] public sealed class SeibroDerivQueryHandlerTests { [TestMethod] public async Task GetElsRiskBoard_GroupsByBasset_AndOrdersPointsByDate() { var bassetA = $"KSDA{Guid.NewGuid().ToString("N")[..8]}"; var bassetB = $"KSDB{Guid.NewGuid().ToString("N")[..8]}"; using var db = TestDb.Create(); // bassetA(41): 두 기준일 시계열 (역순 삽입 → 응답은 오름차순이어야) await db.ElsUnredeemedScale.AddAsync(ElsUnredeemedScale.Create(new DateOnly(2018, 8, 31), bassetA, "41", "HSCEI", 150, 5_000_000_000m)); await db.ElsUnredeemedScale.AddAsync(ElsUnredeemedScale.Create(new DateOnly(2018, 7, 31), bassetA, "41", "HSCEI", 120, 4_000_000_000m)); // bassetB(43): 별 시계열 await db.ElsUnredeemedScale.AddAsync(ElsUnredeemedScale.Create(new DateOnly(2018, 8, 31), bassetB, "43", "WTI", 30, 900_000_000m)); await db.SaveChangesAsync(default); var handler = new RiskHandler(db); var result = await handler.Handle(new RiskQuery(null, null, new DateOnly(2018, 1, 1), new DateOnly(2018, 12, 31)), default); Assert.IsTrue(result.IsSuccess); var seriesA = result.Value.Assets.Single(c => c.BassetCd == bassetA && c.SecnTpcd == "41"); Assert.AreEqual("HSCEI", seriesA.BassetContent); Assert.AreEqual(2, seriesA.Points.Count); Assert.AreEqual(new DateOnly(2018, 7, 31), seriesA.Points[0].StdDt, "시계열 오름차순 (앞이 과거)"); Assert.AreEqual(new DateOnly(2018, 8, 31), seriesA.Points[1].StdDt); Assert.AreEqual(5_000_000_000m, seriesA.Points[1].UnredeemedRemaining); var seriesB = result.Value.Assets.Single(c => c.BassetCd == bassetB && c.SecnTpcd == "43"); Assert.AreEqual(1, seriesB.Points.Count); } [TestMethod] public async Task GetElsRiskBoard_FiltersByBassetCd() { var target = $"KSDT{Guid.NewGuid().ToString("N")[..8]}"; var other = $"KSDO{Guid.NewGuid().ToString("N")[..8]}"; using var db = TestDb.Create(); await db.ElsUnredeemedScale.AddAsync(ElsUnredeemedScale.Create(new DateOnly(2018, 8, 31), target, "41", "타깃", 10, 1_000m)); await db.ElsUnredeemedScale.AddAsync(ElsUnredeemedScale.Create(new DateOnly(2018, 8, 31), other, "41", "기타", 20, 2_000m)); await db.SaveChangesAsync(default); var handler = new RiskHandler(db); var result = await handler.Handle(new RiskQuery(target, null, null, null), default); Assert.IsTrue(result.IsSuccess); Assert.AreEqual(1, result.Value.Assets.Count, "지정 기초자산만"); Assert.AreEqual(target, result.Value.Assets[0].BassetCd); } [TestMethod] public async Task GetElsRiskBoard_NoData_ReturnsEmpty() { using var db = TestDb.Create(); var handler = new RiskHandler(db); var result = await handler.Handle(new RiskQuery($"KSDZ{Guid.NewGuid().ToString("N")[..8]}", null, null, null), default); Assert.IsTrue(result.IsSuccess, "데이터 없어도 성공 (빈 목록)"); Assert.AreEqual(0, result.Value.Assets.Count); } }