using Domain.Entities.Stocks; using CustodyHandler = Application.Features.Api.Stocks.GetForeignCustody.Handler; using CustodyQuery = Application.Features.Api.Stocks.GetForeignCustody.Query; namespace Application.Tests; /// GetForeignCustody 핸들러 — 국가별 외화증권 보관금액 시계열 + 종목구분 합산/개별 + 국가·기간 필터 검증. [TestClass] public sealed class SeibroForeignQueryHandlerTests { [TestMethod] public async Task GetForeignCustody_NoSecnTpcd_SumsAcrossSecnTpcd_OrdersByDate() { var nation = $"N{Guid.NewGuid().ToString("N")[..1]}"; using var db = TestDb.Create(); // 같은 (국가,기준일) 에 종목구분 2종 → 합산되어야. 역순 삽입 → 응답은 오름차순. await db.ForeignCustodyNation.AddAsync(ForeignCustodyNation.Create(new DateOnly(2018, 8, 31), nation, "71", 100m)); await db.ForeignCustodyNation.AddAsync(ForeignCustodyNation.Create(new DateOnly(2018, 8, 31), nation, "75", 50m)); await db.ForeignCustodyNation.AddAsync(ForeignCustodyNation.Create(new DateOnly(2018, 7, 31), nation, "71", 40m)); await db.SaveChangesAsync(default); var handler = new CustodyHandler(db); var result = await handler.Handle(new CustodyQuery(nation, null, new DateOnly(2018, 1, 1), new DateOnly(2018, 12, 31)), default); Assert.IsTrue(result.IsSuccess); var series = result.Value.Nations.Single(c => c.NationCd == nation); Assert.IsNull(series.SecnTpcd, "종목구분 미지정 = 합산"); Assert.AreEqual(2, series.Points.Count); Assert.AreEqual(new DateOnly(2018, 7, 31), series.Points[0].StdDt, "시계열 오름차순"); Assert.AreEqual(40m, series.Points[0].CustodyAmount); Assert.AreEqual(150m, series.Points[1].CustodyAmount, "71+75 합산"); } [TestMethod] public async Task GetForeignCustody_WithSecnTpcd_KeepsSeparateSeries() { var nation = $"M{Guid.NewGuid().ToString("N")[..1]}"; using var db = TestDb.Create(); await db.ForeignCustodyNation.AddAsync(ForeignCustodyNation.Create(new DateOnly(2018, 8, 31), nation, "71", 100m)); await db.ForeignCustodyNation.AddAsync(ForeignCustodyNation.Create(new DateOnly(2018, 8, 31), nation, "75", 50m)); await db.SaveChangesAsync(default); var handler = new CustodyHandler(db); var result = await handler.Handle(new CustodyQuery(nation, "71", null, null), default); Assert.IsTrue(result.IsSuccess); var series = result.Value.Nations.Single(c => c.NationCd == nation); Assert.AreEqual("71", series.SecnTpcd, "지정 종목구분"); Assert.AreEqual(1, series.Points.Count); Assert.AreEqual(100m, series.Points[0].CustodyAmount, "75 는 제외"); } [TestMethod] public async Task GetForeignCustody_NoData_ReturnsEmpty() { using var db = TestDb.Create(); var handler = new CustodyHandler(db); var result = await handler.Handle(new CustodyQuery($"Z{Guid.NewGuid().ToString("N")[..1]}", null, null, null), default); Assert.IsTrue(result.IsSuccess, "데이터 없어도 성공 (빈 목록)"); Assert.AreEqual(0, result.Value.Nations.Count); } }