| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- using Domain.Entities.Stocks;
- using Domain.Entities.Stocks.ValueObject;
- using DetailHandler = Application.Features.Api.Stocks.GetBondDetail.Handler;
- using DetailQuery = Application.Features.Api.Stocks.GetBondDetail.Query;
- namespace Application.Tests;
- /// <summary>GetBondDetail 핸들러 — BondMaster + BondInterestPayment + KRX BondDailyTrade(최신) join 검증.</summary>
- [TestClass]
- public sealed class SeibroBondQueryHandlerTests
- {
- [TestMethod]
- public async Task GetBondDetail_JoinsMasterInterestAndLatestKrxTrade()
- {
- var isin = $"KRG{Guid.NewGuid().ToString("N")[..9]}";
- using var db = TestDb.Create();
- var fields = new BondMasterFields(
- 29998, "테스트채권 1", "1108", new DateOnly(2018, 8, 3), new DateOnly(2020, 2, 3), "KRW",
- 126000000000m, 0m, null, 4.485m, null, "11", "2", "9", "0000", false, "1", "01", "2", "2", "1",
- "1", "1", "1", null, "99", "11", null, null, "133", null, null, "133", false, "1", "1");
- await db.BondMaster.AddAsync(BondMaster.Create(isin, fields));
- 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)));
- // KRX 일별매매 2행 — 최신(더 최근 거래일) 이 선택돼야 함
- 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));
- 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));
- await db.SaveChangesAsync(default);
- var handler = new DetailHandler(db);
- var result = await handler.Handle(new DetailQuery(isin), default);
- Assert.IsTrue(result.IsSuccess);
- var r = result.Value;
- Assert.AreEqual(isin, r.Isin);
- Assert.IsNotNull(r.Master);
- Assert.AreEqual(new DateOnly(2020, 2, 3), r.Master.MaturityDate);
- Assert.AreEqual(4.485m, r.Master.CouponRate);
- Assert.AreEqual("133", r.Master.KisGrade);
- Assert.AreEqual("133", r.Master.KrGrade);
- Assert.AreEqual("2", r.Master.GuaranteeTpcd);
- Assert.IsNotNull(r.Interest);
- Assert.AreEqual("23", r.Interest.CycleTpcd);
- Assert.AreEqual(new DateOnly(2018, 11, 3), r.Interest.AfterCouponDate);
- Assert.IsNotNull(r.Market, "KRX 일별시세 join");
- Assert.AreEqual(new DateOnly(2019, 2, 1), r.Market.TradeDate, "최신 거래일");
- Assert.AreEqual(10050m, r.Market.Close);
- Assert.AreEqual(3.3m, r.Market.YieldToMaturity);
- }
- [TestMethod]
- public async Task GetBondDetail_UnknownIsin_ReturnsNotFound()
- {
- using var db = TestDb.Create();
- var handler = new DetailHandler(db);
- var result = await handler.Handle(new DetailQuery($"KRZ{Guid.NewGuid().ToString("N")[..9]}"), default);
- Assert.IsTrue(result.IsFailure);
- }
- [TestMethod]
- public async Task GetBondDetail_EmptyIsin_ReturnsProblem()
- {
- using var db = TestDb.Create();
- var handler = new DetailHandler(db);
- var result = await handler.Handle(new DetailQuery(" "), default);
- Assert.IsTrue(result.IsFailure);
- }
- }
|