SeibroForeignQueryHandlerTests.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using Domain.Entities.Stocks;
  2. using CustodyHandler = Application.Features.Api.Stocks.GetForeignCustody.Handler;
  3. using CustodyQuery = Application.Features.Api.Stocks.GetForeignCustody.Query;
  4. namespace Application.Tests;
  5. /// <summary>GetForeignCustody 핸들러 — 국가별 외화증권 보관금액 시계열 + 종목구분 합산/개별 + 국가·기간 필터 검증.</summary>
  6. [TestClass]
  7. public sealed class SeibroForeignQueryHandlerTests
  8. {
  9. [TestMethod]
  10. public async Task GetForeignCustody_NoSecnTpcd_SumsAcrossSecnTpcd_OrdersByDate()
  11. {
  12. var nation = $"N{Guid.NewGuid().ToString("N")[..1]}";
  13. using var db = TestDb.Create();
  14. // 같은 (국가,기준일) 에 종목구분 2종 → 합산되어야. 역순 삽입 → 응답은 오름차순.
  15. await db.ForeignCustodyNation.AddAsync(ForeignCustodyNation.Create(new DateOnly(2018, 8, 31), nation, "71", 100m));
  16. await db.ForeignCustodyNation.AddAsync(ForeignCustodyNation.Create(new DateOnly(2018, 8, 31), nation, "75", 50m));
  17. await db.ForeignCustodyNation.AddAsync(ForeignCustodyNation.Create(new DateOnly(2018, 7, 31), nation, "71", 40m));
  18. await db.SaveChangesAsync(default);
  19. var handler = new CustodyHandler(db);
  20. var result = await handler.Handle(new CustodyQuery(nation, null, new DateOnly(2018, 1, 1), new DateOnly(2018, 12, 31)), default);
  21. Assert.IsTrue(result.IsSuccess);
  22. var series = result.Value.Nations.Single(c => c.NationCd == nation);
  23. Assert.IsNull(series.SecnTpcd, "종목구분 미지정 = 합산");
  24. Assert.AreEqual(2, series.Points.Count);
  25. Assert.AreEqual(new DateOnly(2018, 7, 31), series.Points[0].StdDt, "시계열 오름차순");
  26. Assert.AreEqual(40m, series.Points[0].CustodyAmount);
  27. Assert.AreEqual(150m, series.Points[1].CustodyAmount, "71+75 합산");
  28. }
  29. [TestMethod]
  30. public async Task GetForeignCustody_WithSecnTpcd_KeepsSeparateSeries()
  31. {
  32. var nation = $"M{Guid.NewGuid().ToString("N")[..1]}";
  33. using var db = TestDb.Create();
  34. await db.ForeignCustodyNation.AddAsync(ForeignCustodyNation.Create(new DateOnly(2018, 8, 31), nation, "71", 100m));
  35. await db.ForeignCustodyNation.AddAsync(ForeignCustodyNation.Create(new DateOnly(2018, 8, 31), nation, "75", 50m));
  36. await db.SaveChangesAsync(default);
  37. var handler = new CustodyHandler(db);
  38. var result = await handler.Handle(new CustodyQuery(nation, "71", null, null), default);
  39. Assert.IsTrue(result.IsSuccess);
  40. var series = result.Value.Nations.Single(c => c.NationCd == nation);
  41. Assert.AreEqual("71", series.SecnTpcd, "지정 종목구분");
  42. Assert.AreEqual(1, series.Points.Count);
  43. Assert.AreEqual(100m, series.Points[0].CustodyAmount, "75 는 제외");
  44. }
  45. [TestMethod]
  46. public async Task GetForeignCustody_NoData_ReturnsEmpty()
  47. {
  48. using var db = TestDb.Create();
  49. var handler = new CustodyHandler(db);
  50. var result = await handler.Handle(new CustodyQuery($"Z{Guid.NewGuid().ToString("N")[..1]}", null, null, null), default);
  51. Assert.IsTrue(result.IsSuccess, "데이터 없어도 성공 (빈 목록)");
  52. Assert.AreEqual(0, result.Value.Nations.Count);
  53. }
  54. }