KrxEsgIndexParserTests.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. using Infrastructure.StockData;
  2. namespace Application.Tests;
  3. [TestClass]
  4. public sealed class KrxEsgIndexParserTests
  5. {
  6. [TestMethod]
  7. public void ParseDaily_MapsFields_AndRateToBp()
  8. {
  9. // KRX OpenAPI(esg/esg_index_info) 실검증 샘플 — OHLC/시총 없음, 구성종목수(TRD_ISU_CNT) 제공, UPDN_RATE 는 Bp(%×100)로 저장
  10. const string json = """
  11. {"OutBlock_1":[
  12. {"BAS_DD":"20250102","IDX_NM":"KRX 300 기후변화지수","CLSPRC_IDX":"1400.3","PRV_DD_CMPR":"-5.54","UPDN_RATE":"-.39","TRD_ISU_CNT":"274","ACC_TRDVOL":"109729","ACC_TRDVAL":"6686714"},
  13. {"BAS_DD":"20250102","IDX_NM":"KRX ESG Leaders 150","CLSPRC_IDX":"1604.4","PRV_DD_CMPR":"2.64","UPDN_RATE":".16","TRD_ISU_CNT":"150","ACC_TRDVOL":"62003","ACC_TRDVAL":"3854748"}
  14. ]}
  15. """;
  16. var rows = KrxEsgIndexParser.ParseDaily(json);
  17. Assert.AreEqual(2, rows.Count);
  18. var a = rows[0];
  19. Assert.AreEqual("KRX 300 기후변화지수", a.IndexName);
  20. Assert.AreEqual(new DateOnly(2025, 1, 2), a.TradeDate);
  21. Assert.AreEqual(1400.3m, a.Close, "CLSPRC_IDX 소수 파싱");
  22. Assert.AreEqual(-5.54m, a.ChangeVal, "PRV_DD_CMPR");
  23. Assert.AreEqual(-39, a.FlucRateBp, "UPDN_RATE '-.39'% → -39 Bp (%×100)");
  24. Assert.AreEqual(274, a.ConstituentCount, "TRD_ISU_CNT 구성종목수");
  25. Assert.AreEqual(109729L, a.Volume);
  26. Assert.AreEqual(6686714L, a.Value);
  27. var b = rows[1];
  28. Assert.AreEqual("KRX ESG Leaders 150", b.IndexName);
  29. Assert.AreEqual(16, b.FlucRateBp, "UPDN_RATE '.16'% → 16 Bp");
  30. Assert.AreEqual(150, b.ConstituentCount);
  31. }
  32. [TestMethod]
  33. public void ParseDaily_EmptyOrMissingBlock_ReturnsEmpty()
  34. {
  35. Assert.AreEqual(0, KrxEsgIndexParser.ParseDaily("""{"OutBlock_1":[]}""").Count);
  36. Assert.AreEqual(0, KrxEsgIndexParser.ParseDaily("""{"respMsg":"Unauthorized API Call","respCode":"401"}""").Count);
  37. }
  38. }