SeibroSupplyQueryHandlerTests.cs 4.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using Domain.Entities.Stocks;
  2. using Domain.Entities.Stocks.ValueObject;
  3. using LendingHandler = Application.Features.Api.Stocks.GetLendingHistory.Handler;
  4. using LendingQuery = Application.Features.Api.Stocks.GetLendingHistory.Query;
  5. using LockupHandler = Application.Features.Api.Stocks.GetLockupCalendar.Handler;
  6. using LockupQuery = Application.Features.Api.Stocks.GetLockupCalendar.Query;
  7. namespace Application.Tests;
  8. [TestClass]
  9. public sealed class SeibroSupplyQueryHandlerTests
  10. {
  11. [TestMethod]
  12. public async Task GetLendingHistory_ByShortCode_FiltersPeriod_OrdersDesc()
  13. {
  14. // 기대 행위: 단축코드 → Stock.ISIN 로 SecuritiesLending 조회 + from~to 필터 + 최신순
  15. var code = $"72{Random.Shared.Next(1000, 9999)}";
  16. var isin = $"KR7{code}003";
  17. using var db = TestDb.Create();
  18. var stock = Stock.Create(code, "대차종목", StockMarket.KOSPI, new DateOnly(2020, 1, 2), isin: isin);
  19. await db.Stock.AddAsync(stock);
  20. await db.SecuritiesLending.AddAsync(SecuritiesLending.Create(isin, new DateOnly(2025, 3, 3), 1000L, 100L, 50L, 10L, 500L, 300L, 1.5m, 100L, 0.3m, 400L, 1.2m, 90L, 0.2m));
  21. await db.SecuritiesLending.AddAsync(SecuritiesLending.Create(isin, new DateOnly(2025, 3, 4), 1000L, 120L, 60L, 20L, 540L, 320L, 1.6m, 110L, 0.35m, 410L, 1.25m, 95L, 0.22m));
  22. await db.SecuritiesLending.AddAsync(SecuritiesLending.Create(isin, new DateOnly(2025, 1, 2), 1000L, 80L, 40L, 5L, 480L, 280L, 1.4m, 90L, 0.28m, 380L, 1.1m, 85L, 0.18m));
  23. await db.SaveChangesAsync(default);
  24. var handler = new LendingHandler(db);
  25. var result = await handler.Handle(new LendingQuery(code, new DateOnly(2025, 3, 1), new DateOnly(2025, 3, 31), 1, 100), default);
  26. Assert.IsTrue(result.IsSuccess);
  27. Assert.AreEqual(isin, result.Value.Isin);
  28. Assert.AreEqual(2, result.Value.Total, "1월 행은 범위 밖 → 제외");
  29. Assert.AreEqual(new DateOnly(2025, 3, 4), result.Value.List[0].StdDt, "최신순");
  30. Assert.AreEqual(1.6m, result.Value.List[0].ForeignLendRatio);
  31. Assert.AreEqual(540L, result.Value.List[0].LendingBalanceQty);
  32. }
  33. [TestMethod]
  34. public async Task GetLendingHistory_ByIsin_WhenNoStockRow()
  35. {
  36. // 기대 행위: 6자리 단축코드가 Stock 에 없으면 입력을 ISIN 으로 간주
  37. var isin = $"KR7{Guid.NewGuid().ToString("N")[..9]}";
  38. using var db = TestDb.Create();
  39. await db.SecuritiesLending.AddAsync(SecuritiesLending.Create(isin, new DateOnly(2024, 6, 6), 2000L, 200L, 100L, 30L, 900L, 600L, 2.1m, 200L, 0.5m, 700L, 1.8m, 180L, 0.4m));
  40. await db.SaveChangesAsync(default);
  41. var handler = new LendingHandler(db);
  42. var result = await handler.Handle(new LendingQuery(isin, null, null, 1, 100), default);
  43. Assert.IsTrue(result.IsSuccess);
  44. Assert.AreEqual(isin, result.Value.Isin);
  45. Assert.AreEqual(1, result.Value.Total);
  46. Assert.AreEqual(2.1m, result.Value.List[0].ForeignLendRatio);
  47. }
  48. [TestMethod]
  49. public async Task GetLockupCalendar_FiltersByReturnOrSafedpDate()
  50. {
  51. // 기대 행위: ReturnDt 또는 SafedpDt 가 기간 안이면 포함. 범위 밖 예수 이벤트는 제외.
  52. var custno = 800100 + Random.Shared.Next(1, 800);
  53. var code = $"73{Random.Shared.Next(1000, 9999)}";
  54. using var db = TestDb.Create();
  55. // 반환일이 기간 안 (락업 해제)
  56. await db.LockupEvent.AddAsync(LockupEvent.Create(custno, "락업종목", "보통주", code, "11", "2", new DateOnly(2024, 3, 1), 100000L, "03", new DateOnly(2025, 3, 1), 100000L, 5000000L));
  57. // 예수일이 기간 안
  58. await db.LockupEvent.AddAsync(LockupEvent.Create(custno, "락업종목", "보통주", code, "11", "1", new DateOnly(2025, 5, 15), 50000L, "01", null, null, 5000000L));
  59. // 둘 다 기간 밖
  60. await db.LockupEvent.AddAsync(LockupEvent.Create(custno, "락업종목", "보통주", code, "11", "1", new DateOnly(2023, 1, 1), 30000L, "02", null, null, 5000000L));
  61. await db.SaveChangesAsync(default);
  62. var handler = new LockupHandler(db);
  63. var result = await handler.Handle(new LockupQuery(new DateOnly(2025, 1, 1), new DateOnly(2025, 12, 31), 1, 50), default);
  64. Assert.IsTrue(result.IsSuccess);
  65. var mine = result.Value.List.Where(c => c.IssucoCustno == custno).ToList();
  66. Assert.AreEqual(2, mine.Count, "반환일(2025-03) + 예수일(2025-05) 만. 2023 예수는 제외");
  67. Assert.IsTrue(mine.Any(c => c.ReturnDt == new DateOnly(2025, 3, 1) && c.OccrSeq == "2"));
  68. Assert.IsTrue(mine.Any(c => c.SafedpDt == new DateOnly(2025, 5, 15) && c.OccrSeq == "1"));
  69. }
  70. }