KosisParserTests.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. using Infrastructure.StockData;
  2. namespace Application.Tests;
  3. [TestClass]
  4. public sealed class KosisParserTests
  5. {
  6. private static string FixtureRoot => Path.Combine(AppContext.BaseDirectory, "Fixtures", "Kosis");
  7. [TestMethod]
  8. public void Parse_CpiFixture_MapsPeriodValueUnitAndClass()
  9. {
  10. // 라이브 캡처 CPI 트림본(4행): 전국(T10) 2행 + 서울(11) 1행 + 전국 DT 빈값 1행. 빈 DT 행은 제외되어 3행.
  11. var json = File.ReadAllText(Path.Combine(FixtureRoot, "cpi.json"));
  12. var rows = KosisParser.Parse(json);
  13. Assert.AreEqual(3, rows.Count, "DT 빈값(202403 전국) 행은 skip");
  14. var jan = rows[0];
  15. Assert.AreEqual("202401", jan.Period);
  16. Assert.AreEqual(113.17m, jan.Value);
  17. Assert.AreEqual("2020=100", jan.Unit);
  18. Assert.AreEqual("T10", jan.ClassCode, "전국 C1=T10");
  19. Assert.AreEqual("전국", jan.ClassName);
  20. Assert.AreEqual("소비자물가지수(총지수)", jan.ItemName);
  21. Assert.AreEqual("11", rows[2].ClassCode, "서울 C1=11");
  22. }
  23. [TestMethod]
  24. public void Parse_ErrorObjectResponse_ReturnsEmpty()
  25. {
  26. // KOSIS 오류 응답은 배열이 아닌 객체 { err, errMsg } → 예외 없이 0건
  27. Assert.AreEqual(0, KosisParser.Parse("{\"err\":\"21\",\"errMsg\":\"해당 통계표가 존재하지 않습니다.\"}").Count);
  28. }
  29. [TestMethod]
  30. public void Parse_EmptyOrBlankOrNonArray_ReturnsEmpty()
  31. {
  32. Assert.AreEqual(0, KosisParser.Parse("[]").Count);
  33. Assert.AreEqual(0, KosisParser.Parse("").Count);
  34. Assert.AreEqual(0, KosisParser.Parse("{\"err\":\"30\"}").Count);
  35. }
  36. [TestMethod]
  37. public void Parse_MissingPeriodOrNonNumericValue_RowsSkipped()
  38. {
  39. // PRD_DE 없음 / DT "-" / DT "" 는 전부 skip, 정상 1행만 남는다
  40. const string json = """
  41. [
  42. {"DT":"100.0","UNIT_NM":"%","ITM_NM":"a","C1":"00","C1_NM":"계"},
  43. {"PRD_DE":"202402","DT":"-","UNIT_NM":"%","ITM_NM":"a","C1":"00","C1_NM":"계"},
  44. {"PRD_DE":"202403","DT":"","UNIT_NM":"%","ITM_NM":"a","C1":"00","C1_NM":"계"},
  45. {"PRD_DE":"202404","DT":"3,456.78","UNIT_NM":"천명","ITM_NM":"b","C1":"00","C1_NM":"계"}
  46. ]
  47. """;
  48. var rows = KosisParser.Parse(json);
  49. Assert.AreEqual(1, rows.Count);
  50. Assert.AreEqual("202404", rows[0].Period);
  51. Assert.AreEqual(3456.78m, rows[0].Value, "천단위 콤마 제거");
  52. Assert.AreEqual("천명", rows[0].Unit);
  53. }
  54. }