using Domain.Entities.Stocks; using MacroHandler = Application.Features.Api.Stocks.GetMacroIndicators.Handler; using MacroQuery = Application.Features.Api.Stocks.GetMacroIndicators.Query; namespace Application.Tests; [TestClass] public sealed class MacroIndicatorQueryHandlerTests { [TestMethod] public async Task GetMacroIndicators_ByCode_ReturnsSeriesAscending_WithLatest() { // 기대 행위: 지정 Code 필터 + 시점 오름차순 Points + 최신값(마지막 시점) var code = $"CPI-{Guid.NewGuid():N}"; using var db = TestDb.Create(); await db.MacroIndicator.AddAsync(MacroIndicator.Create(code, "소비자물가지수", "202402", 113.78m, "2020=100")); await db.MacroIndicator.AddAsync(MacroIndicator.Create(code, "소비자물가지수", "202401", 113.17m, "2020=100")); await db.MacroIndicator.AddAsync(MacroIndicator.Create(code, "소비자물가지수", "202403", 114.30m, "2020=100")); await db.SaveChangesAsync(default); var handler = new MacroHandler(db); var result = await handler.Handle(new MacroQuery([code], 0), default); var indicator = result.List.Single(c => c.Code == code); Assert.AreEqual("소비자물가지수", indicator.Name); Assert.AreEqual(3, indicator.Points.Count); Assert.AreEqual("202401", indicator.Points[0].Period, "시점 오름차순"); Assert.AreEqual("202403", indicator.Points[^1].Period); Assert.AreEqual("202403", indicator.LatestPeriod); Assert.AreEqual(114.30m, indicator.LatestValue); Assert.AreEqual("2020=100", indicator.Unit); } [TestMethod] public async Task GetMacroIndicators_Limit_TakesMostRecentPeriods() { var code = $"UNEMP-{Guid.NewGuid():N}"; using var db = TestDb.Create(); for (var m = 1; m <= 6; m++) { await db.MacroIndicator.AddAsync(MacroIndicator.Create(code, "실업률", $"20240{m}", 3.0m + m, "%")); } await db.SaveChangesAsync(default); var handler = new MacroHandler(db); var result = await handler.Handle(new MacroQuery([code], 2), default); var indicator = result.List.Single(c => c.Code == code); Assert.AreEqual(2, indicator.Points.Count, "Limit=2 → 최근 2시점"); Assert.AreEqual("202405", indicator.Points[0].Period, "최근 2개를 오름차순으로"); Assert.AreEqual("202406", indicator.Points[^1].Period); Assert.AreEqual("202406", indicator.LatestPeriod); } [TestMethod] public async Task GetMacroIndicators_EmptyCodes_ReturnsAllSeededCodes() { var codeA = $"A-{Guid.NewGuid():N}"; var codeB = $"B-{Guid.NewGuid():N}"; using var db = TestDb.Create(); await db.MacroIndicator.AddAsync(MacroIndicator.Create(codeA, "가", "202401", 1m, null)); await db.MacroIndicator.AddAsync(MacroIndicator.Create(codeB, "나", "202401", 2m, null)); await db.SaveChangesAsync(default); var handler = new MacroHandler(db); var result = await handler.Handle(new MacroQuery([], 0), default); Assert.IsTrue(result.List.Any(c => c.Code == codeA)); Assert.IsTrue(result.List.Any(c => c.Code == codeB)); } }