SeibroDerivQueryHandlerTests.cs 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using Domain.Entities.Stocks;
  2. using RiskHandler = Application.Features.Api.Stocks.GetElsRiskBoard.Handler;
  3. using RiskQuery = Application.Features.Api.Stocks.GetElsRiskBoard.Query;
  4. namespace Application.Tests;
  5. /// <summary>GetElsRiskBoard 핸들러 — 기초자산별 미상환잔액 시계열 그룹화 + 기초자산·종목구분·기간 필터 검증.</summary>
  6. [TestClass]
  7. public sealed class SeibroDerivQueryHandlerTests
  8. {
  9. [TestMethod]
  10. public async Task GetElsRiskBoard_GroupsByBasset_AndOrdersPointsByDate()
  11. {
  12. var bassetA = $"KSDA{Guid.NewGuid().ToString("N")[..8]}";
  13. var bassetB = $"KSDB{Guid.NewGuid().ToString("N")[..8]}";
  14. using var db = TestDb.Create();
  15. // bassetA(41): 두 기준일 시계열 (역순 삽입 → 응답은 오름차순이어야)
  16. await db.ElsUnredeemedScale.AddAsync(ElsUnredeemedScale.Create(new DateOnly(2018, 8, 31), bassetA, "41", "HSCEI", 150, 5_000_000_000m));
  17. await db.ElsUnredeemedScale.AddAsync(ElsUnredeemedScale.Create(new DateOnly(2018, 7, 31), bassetA, "41", "HSCEI", 120, 4_000_000_000m));
  18. // bassetB(43): 별 시계열
  19. await db.ElsUnredeemedScale.AddAsync(ElsUnredeemedScale.Create(new DateOnly(2018, 8, 31), bassetB, "43", "WTI", 30, 900_000_000m));
  20. await db.SaveChangesAsync(default);
  21. var handler = new RiskHandler(db);
  22. var result = await handler.Handle(new RiskQuery(null, null, new DateOnly(2018, 1, 1), new DateOnly(2018, 12, 31)), default);
  23. Assert.IsTrue(result.IsSuccess);
  24. var seriesA = result.Value.Assets.Single(c => c.BassetCd == bassetA && c.SecnTpcd == "41");
  25. Assert.AreEqual("HSCEI", seriesA.BassetContent);
  26. Assert.AreEqual(2, seriesA.Points.Count);
  27. Assert.AreEqual(new DateOnly(2018, 7, 31), seriesA.Points[0].StdDt, "시계열 오름차순 (앞이 과거)");
  28. Assert.AreEqual(new DateOnly(2018, 8, 31), seriesA.Points[1].StdDt);
  29. Assert.AreEqual(5_000_000_000m, seriesA.Points[1].UnredeemedRemaining);
  30. var seriesB = result.Value.Assets.Single(c => c.BassetCd == bassetB && c.SecnTpcd == "43");
  31. Assert.AreEqual(1, seriesB.Points.Count);
  32. }
  33. [TestMethod]
  34. public async Task GetElsRiskBoard_FiltersByBassetCd()
  35. {
  36. var target = $"KSDT{Guid.NewGuid().ToString("N")[..8]}";
  37. var other = $"KSDO{Guid.NewGuid().ToString("N")[..8]}";
  38. using var db = TestDb.Create();
  39. await db.ElsUnredeemedScale.AddAsync(ElsUnredeemedScale.Create(new DateOnly(2018, 8, 31), target, "41", "타깃", 10, 1_000m));
  40. await db.ElsUnredeemedScale.AddAsync(ElsUnredeemedScale.Create(new DateOnly(2018, 8, 31), other, "41", "기타", 20, 2_000m));
  41. await db.SaveChangesAsync(default);
  42. var handler = new RiskHandler(db);
  43. var result = await handler.Handle(new RiskQuery(target, null, null, null), default);
  44. Assert.IsTrue(result.IsSuccess);
  45. Assert.AreEqual(1, result.Value.Assets.Count, "지정 기초자산만");
  46. Assert.AreEqual(target, result.Value.Assets[0].BassetCd);
  47. }
  48. [TestMethod]
  49. public async Task GetElsRiskBoard_NoData_ReturnsEmpty()
  50. {
  51. using var db = TestDb.Create();
  52. var handler = new RiskHandler(db);
  53. var result = await handler.Handle(new RiskQuery($"KSDZ{Guid.NewGuid().ToString("N")[..8]}", null, null, null), default);
  54. Assert.IsTrue(result.IsSuccess, "데이터 없어도 성공 (빈 목록)");
  55. Assert.AreEqual(0, result.Value.Assets.Count);
  56. }
  57. }