KosisParserTests.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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_EmploymentFixture_MapsUnemploymentSeries()
  25. {
  26. // 라이브 캡처 실업률(경제활동인구조사 DT_1DA7004S, itmId=T80) 트림본(3행): 전국(00) 2행 + 서울(11) 1행. 전부 유효 DT.
  27. var json = File.ReadAllText(Path.Combine(FixtureRoot, "employment.json"));
  28. var rows = KosisParser.Parse(json);
  29. Assert.AreEqual(3, rows.Count);
  30. var apr = rows[0];
  31. Assert.AreEqual("202504", apr.Period);
  32. Assert.AreEqual(2.9m, apr.Value);
  33. Assert.AreEqual("%", apr.Unit);
  34. Assert.AreEqual("00", apr.ClassCode, "전국 C1=00");
  35. Assert.AreEqual("계", apr.ClassName);
  36. Assert.AreEqual("실업률", apr.ItemName);
  37. Assert.AreEqual("11", rows[2].ClassCode, "서울 C1=11");
  38. }
  39. [TestMethod]
  40. public void Parse_ErrorObjectResponse_ReturnsEmpty()
  41. {
  42. // KOSIS 오류 응답은 배열이 아닌 객체 { err, errMsg } → 예외 없이 0건
  43. Assert.AreEqual(0, KosisParser.Parse("{\"err\":\"21\",\"errMsg\":\"해당 통계표가 존재하지 않습니다.\"}").Count);
  44. }
  45. [TestMethod]
  46. public void Parse_EmptyOrBlankOrNonArray_ReturnsEmpty()
  47. {
  48. Assert.AreEqual(0, KosisParser.Parse("[]").Count);
  49. Assert.AreEqual(0, KosisParser.Parse("").Count);
  50. Assert.AreEqual(0, KosisParser.Parse("{\"err\":\"30\"}").Count);
  51. }
  52. [TestMethod]
  53. public void Parse_MissingPeriodOrNonNumericValue_RowsSkipped()
  54. {
  55. // PRD_DE 없음 / DT "-" / DT "" 는 전부 skip, 정상 1행만 남는다
  56. const string json = """
  57. [
  58. {"DT":"100.0","UNIT_NM":"%","ITM_NM":"a","C1":"00","C1_NM":"계"},
  59. {"PRD_DE":"202402","DT":"-","UNIT_NM":"%","ITM_NM":"a","C1":"00","C1_NM":"계"},
  60. {"PRD_DE":"202403","DT":"","UNIT_NM":"%","ITM_NM":"a","C1":"00","C1_NM":"계"},
  61. {"PRD_DE":"202404","DT":"3,456.78","UNIT_NM":"천명","ITM_NM":"b","C1":"00","C1_NM":"계"}
  62. ]
  63. """;
  64. var rows = KosisParser.Parse(json);
  65. Assert.AreEqual(1, rows.Count);
  66. Assert.AreEqual("202404", rows[0].Period);
  67. Assert.AreEqual(3456.78m, rows[0].Value, "천단위 콤마 제거");
  68. Assert.AreEqual("천명", rows[0].Unit);
  69. }
  70. }