using Infrastructure.StockData; namespace Application.Tests; [TestClass] public sealed class KosisParserTests { private static string FixtureRoot => Path.Combine(AppContext.BaseDirectory, "Fixtures", "Kosis"); [TestMethod] public void Parse_CpiFixture_MapsPeriodValueUnitAndClass() { // 라이브 캡처 CPI 트림본(4행): 전국(T10) 2행 + 서울(11) 1행 + 전국 DT 빈값 1행. 빈 DT 행은 제외되어 3행. var json = File.ReadAllText(Path.Combine(FixtureRoot, "cpi.json")); var rows = KosisParser.Parse(json); Assert.AreEqual(3, rows.Count, "DT 빈값(202403 전국) 행은 skip"); var jan = rows[0]; Assert.AreEqual("202401", jan.Period); Assert.AreEqual(113.17m, jan.Value); Assert.AreEqual("2020=100", jan.Unit); Assert.AreEqual("T10", jan.ClassCode, "전국 C1=T10"); Assert.AreEqual("전국", jan.ClassName); Assert.AreEqual("소비자물가지수(총지수)", jan.ItemName); Assert.AreEqual("11", rows[2].ClassCode, "서울 C1=11"); } [TestMethod] public void Parse_EmploymentFixture_MapsUnemploymentSeries() { // 라이브 캡처 실업률(경제활동인구조사 DT_1DA7004S, itmId=T80) 트림본(3행): 전국(00) 2행 + 서울(11) 1행. 전부 유효 DT. var json = File.ReadAllText(Path.Combine(FixtureRoot, "employment.json")); var rows = KosisParser.Parse(json); Assert.AreEqual(3, rows.Count); var apr = rows[0]; Assert.AreEqual("202504", apr.Period); Assert.AreEqual(2.9m, apr.Value); Assert.AreEqual("%", apr.Unit); Assert.AreEqual("00", apr.ClassCode, "전국 C1=00"); Assert.AreEqual("계", apr.ClassName); Assert.AreEqual("실업률", apr.ItemName); Assert.AreEqual("11", rows[2].ClassCode, "서울 C1=11"); } [TestMethod] public void Parse_ErrorObjectResponse_ReturnsEmpty() { // KOSIS 오류 응답은 배열이 아닌 객체 { err, errMsg } → 예외 없이 0건 Assert.AreEqual(0, KosisParser.Parse("{\"err\":\"21\",\"errMsg\":\"해당 통계표가 존재하지 않습니다.\"}").Count); } [TestMethod] public void Parse_EmptyOrBlankOrNonArray_ReturnsEmpty() { Assert.AreEqual(0, KosisParser.Parse("[]").Count); Assert.AreEqual(0, KosisParser.Parse("").Count); Assert.AreEqual(0, KosisParser.Parse("{\"err\":\"30\"}").Count); } [TestMethod] public void Parse_MissingPeriodOrNonNumericValue_RowsSkipped() { // PRD_DE 없음 / DT "-" / DT "" 는 전부 skip, 정상 1행만 남는다 const string json = """ [ {"DT":"100.0","UNIT_NM":"%","ITM_NM":"a","C1":"00","C1_NM":"계"}, {"PRD_DE":"202402","DT":"-","UNIT_NM":"%","ITM_NM":"a","C1":"00","C1_NM":"계"}, {"PRD_DE":"202403","DT":"","UNIT_NM":"%","ITM_NM":"a","C1":"00","C1_NM":"계"}, {"PRD_DE":"202404","DT":"3,456.78","UNIT_NM":"천명","ITM_NM":"b","C1":"00","C1_NM":"계"} ] """; var rows = KosisParser.Parse(json); Assert.AreEqual(1, rows.Count); Assert.AreEqual("202404", rows[0].Period); Assert.AreEqual(3456.78m, rows[0].Value, "천단위 콤마 제거"); Assert.AreEqual("천명", rows[0].Unit); } }