SeibroBondQueryHandlerTests.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using Domain.Entities.Stocks;
  2. using Domain.Entities.Stocks.ValueObject;
  3. using DetailHandler = Application.Features.Api.Stocks.GetBondDetail.Handler;
  4. using DetailQuery = Application.Features.Api.Stocks.GetBondDetail.Query;
  5. namespace Application.Tests;
  6. /// <summary>GetBondDetail 핸들러 — BondMaster + BondInterestPayment + KRX BondDailyTrade(최신) join 검증.</summary>
  7. [TestClass]
  8. public sealed class SeibroBondQueryHandlerTests
  9. {
  10. [TestMethod]
  11. public async Task GetBondDetail_JoinsMasterInterestAndLatestKrxTrade()
  12. {
  13. var isin = $"KRG{Guid.NewGuid().ToString("N")[..9]}";
  14. using var db = TestDb.Create();
  15. var fields = new BondMasterFields(
  16. 29998, "테스트채권 1", "1108", new DateOnly(2018, 8, 3), new DateOnly(2020, 2, 3), "KRW",
  17. 126000000000m, 0m, null, 4.485m, null, "11", "2", "9", "0000", false, "1", "01", "2", "2", "1",
  18. "1", "1", "1", null, "99", "11", null, null, "133", null, null, "133", false, "1", "1");
  19. await db.BondMaster.AddAsync(BondMaster.Create(isin, fields));
  20. await db.BondInterestPayment.AddAsync(BondInterestPayment.Create(isin, 4.485m, "1", 3, "23", "2", true, "2", "01", new DateOnly(2018, 8, 3), new DateOnly(2018, 11, 3)));
  21. // KRX 일별매매 2행 — 최신(더 최근 거래일) 이 선택돼야 함
  22. await db.BondDailyTrade.AddAsync(BondDailyTrade.Create(BondMarket.General, isin, "테스트채권 1", new DateOnly(2019, 1, 2), 10000m, 10000m, 10010m, 9990m, 5m, 3.5m, null, null, null, 100, 1000000));
  23. await db.BondDailyTrade.AddAsync(BondDailyTrade.Create(BondMarket.General, isin, "테스트채권 1", new DateOnly(2019, 2, 1), 10050m, 10040m, 10060m, 10030m, 50m, 3.3m, null, null, null, 200, 2000000));
  24. await db.SaveChangesAsync(default);
  25. var handler = new DetailHandler(db);
  26. var result = await handler.Handle(new DetailQuery(isin), default);
  27. Assert.IsTrue(result.IsSuccess);
  28. var r = result.Value;
  29. Assert.AreEqual(isin, r.Isin);
  30. Assert.IsNotNull(r.Master);
  31. Assert.AreEqual(new DateOnly(2020, 2, 3), r.Master.MaturityDate);
  32. Assert.AreEqual(4.485m, r.Master.CouponRate);
  33. Assert.AreEqual("133", r.Master.KisGrade);
  34. Assert.AreEqual("133", r.Master.KrGrade);
  35. Assert.AreEqual("2", r.Master.GuaranteeTpcd);
  36. Assert.IsNotNull(r.Interest);
  37. Assert.AreEqual("23", r.Interest.CycleTpcd);
  38. Assert.AreEqual(new DateOnly(2018, 11, 3), r.Interest.AfterCouponDate);
  39. Assert.IsNotNull(r.Market, "KRX 일별시세 join");
  40. Assert.AreEqual(new DateOnly(2019, 2, 1), r.Market.TradeDate, "최신 거래일");
  41. Assert.AreEqual(10050m, r.Market.Close);
  42. Assert.AreEqual(3.3m, r.Market.YieldToMaturity);
  43. }
  44. [TestMethod]
  45. public async Task GetBondDetail_UnknownIsin_ReturnsNotFound()
  46. {
  47. using var db = TestDb.Create();
  48. var handler = new DetailHandler(db);
  49. var result = await handler.Handle(new DetailQuery($"KRZ{Guid.NewGuid().ToString("N")[..9]}"), default);
  50. Assert.IsTrue(result.IsFailure);
  51. }
  52. [TestMethod]
  53. public async Task GetBondDetail_EmptyIsin_ReturnsProblem()
  54. {
  55. using var db = TestDb.Create();
  56. var handler = new DetailHandler(db);
  57. var result = await handler.Handle(new DetailQuery(" "), default);
  58. Assert.IsTrue(result.IsFailure);
  59. }
  60. }