SeibroDividendQueryHandlerTests.cs 4.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using Domain.Entities.Stocks;
  2. using Domain.Entities.Stocks.ValueObject;
  3. using Infrastructure.Persistence;
  4. using CalendarHandler = Application.Features.Api.Stocks.GetDividendCalendar.Handler;
  5. using CalendarQuery = Application.Features.Api.Stocks.GetDividendCalendar.Query;
  6. using StockDivHandler = Application.Features.Api.Stocks.GetStockDividends.Handler;
  7. using StockDivQuery = Application.Features.Api.Stocks.GetStockDividends.Query;
  8. namespace Application.Tests;
  9. [TestClass]
  10. public sealed class SeibroDividendQueryHandlerTests
  11. {
  12. [TestMethod]
  13. public async Task GetDividendCalendar_FiltersByPeriod_OrdersByRgtStdDtDesc()
  14. {
  15. // 기대 행위: from~to(RgtStdDt) 범위 필터 + 최신순 정렬. 범위 밖 일정은 제외.
  16. var custno = 700100 + Random.Shared.Next(1, 800);
  17. using var db = TestDb.Create();
  18. await db.DividendSchedule.AddAsync(DividendSchedule.Create(custno, "칼렌더종목", "103", "02", new DateOnly(2025, 3, 31), "2", "1", "1", null, null, new DateOnly(2025, 3, 27), false));
  19. await db.DividendSchedule.AddAsync(DividendSchedule.Create(custno, "칼렌더종목", "103", "02", new DateOnly(2025, 6, 30), "2", "3", "2", null, null, new DateOnly(2025, 6, 26), false));
  20. await db.DividendSchedule.AddAsync(DividendSchedule.Create(custno, "칼렌더종목", "103", "02", new DateOnly(2024, 12, 31), "2", "1", "1", null, null, new DateOnly(2024, 12, 27), false));
  21. await db.SaveChangesAsync(default);
  22. var handler = new CalendarHandler(db);
  23. var result = await handler.Handle(new CalendarQuery(new DateOnly(2025, 1, 1), new DateOnly(2025, 12, 31), 1, 20), default);
  24. Assert.IsTrue(result.IsSuccess);
  25. var mine = result.Value.List.Where(c => c.IssucoCustno == custno).ToList();
  26. Assert.AreEqual(2, mine.Count, "2024-12-31 은 범위 밖 → 제외");
  27. Assert.AreEqual(new DateOnly(2025, 6, 30), mine[0].RgtStdDt, "최신순");
  28. Assert.AreEqual(new DateOnly(2025, 6, 26), mine[0].XrgtDt);
  29. Assert.AreEqual("2", mine[0].FixType);
  30. }
  31. [TestMethod]
  32. public async Task GetStockDividends_ByShortCode_JoinsScheduleForXrgtDt()
  33. {
  34. // 기대 행위: 단축코드 → Stock.ISIN·IssucoCustno 로 Dividend(Isin) + DividendSchedule(권리락일/확정구분) 결합
  35. var custno = 700900 + Random.Shared.Next(1, 800);
  36. var code = $"71{Random.Shared.Next(1000, 9999)}";
  37. var isin = $"KR7{code}003"; // 12자 표준 ISIN (KR7 + 단축코드6 + 003)
  38. using var db = TestDb.Create();
  39. var stock = Stock.Create(code, "배당탭종목", StockMarket.KOSPI, new DateOnly(2020, 1, 2), isin: isin);
  40. stock.SetIssucoCustno(custno);
  41. await db.Stock.AddAsync(stock);
  42. await db.Dividend.AddAsync(Dividend.Create(isin, "배당탭종목", "보통주", new DateOnly(2024, 12, 31), 100m, 0m, 400m, 20000m, 1.8m, new DateOnly(2025, 4, 20), null, false, false, null, null, null, null));
  43. await db.DividendSchedule.AddAsync(DividendSchedule.Create(custno, "배당탭종목", "103", "02", new DateOnly(2024, 12, 31), "2", "1", "1", null, null, new DateOnly(2024, 12, 27), false));
  44. await db.SaveChangesAsync(default);
  45. var handler = new StockDivHandler(db);
  46. var result = await handler.Handle(new StockDivQuery(code, 1, 20), default);
  47. Assert.IsTrue(result.IsSuccess);
  48. Assert.AreEqual(isin, result.Value.Isin);
  49. Assert.AreEqual(1, result.Value.Total);
  50. var row = result.Value.List[0];
  51. Assert.AreEqual(20000m, row.CashPerShare);
  52. Assert.AreEqual(1.8m, row.MarketDividendRate);
  53. Assert.AreEqual(new DateOnly(2025, 4, 20), row.CashPayDate);
  54. Assert.AreEqual(new DateOnly(2024, 12, 27), row.XrgtDt, "DividendSchedule 권리락일 결합");
  55. Assert.AreEqual("1", row.FixType, "확정구분 결합");
  56. }
  57. [TestMethod]
  58. public async Task GetStockDividends_ByIsin_WhenNoStockRow()
  59. {
  60. // 기대 행위: 단축코드가 Stock 에 없으면 입력을 ISIN 으로 간주해 Dividend 조회 (권리락일은 회사번호 미상이라 null)
  61. var isin = $"US{Random.Shared.Next(100000, 999999)}0009";
  62. using var db = TestDb.Create();
  63. await db.Dividend.AddAsync(Dividend.Create(isin, "ISIN직접조회", "보통주", new DateOnly(2023, 12, 31), null, 0m, 300m, 15000m, 2.1m, null, null, null, null, null, null, null, null));
  64. await db.SaveChangesAsync(default);
  65. var handler = new StockDivHandler(db);
  66. var result = await handler.Handle(new StockDivQuery(isin, 1, 20), default);
  67. Assert.IsTrue(result.IsSuccess);
  68. Assert.AreEqual(isin, result.Value.Isin);
  69. Assert.AreEqual(1, result.Value.Total);
  70. Assert.IsNull(result.Value.List[0].XrgtDt, "Stock·회사번호 미상 → 권리락일 결합 불가");
  71. }
  72. }