| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- using Infrastructure.StockData;
- namespace Application.Tests;
- [TestClass]
- public sealed class KrxEsgIndexParserTests
- {
- [TestMethod]
- public void ParseDaily_MapsFields_AndRateToBp()
- {
- // KRX OpenAPI(esg/esg_index_info) 실검증 샘플 — OHLC/시총 없음, 구성종목수(TRD_ISU_CNT) 제공, UPDN_RATE 는 Bp(%×100)로 저장
- const string json = """
- {"OutBlock_1":[
- {"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"},
- {"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"}
- ]}
- """;
- var rows = KrxEsgIndexParser.ParseDaily(json);
- Assert.AreEqual(2, rows.Count);
- var a = rows[0];
- Assert.AreEqual("KRX 300 기후변화지수", a.IndexName);
- Assert.AreEqual(new DateOnly(2025, 1, 2), a.TradeDate);
- Assert.AreEqual(1400.3m, a.Close, "CLSPRC_IDX 소수 파싱");
- Assert.AreEqual(-5.54m, a.ChangeVal, "PRV_DD_CMPR");
- Assert.AreEqual(-39, a.FlucRateBp, "UPDN_RATE '-.39'% → -39 Bp (%×100)");
- Assert.AreEqual(274, a.ConstituentCount, "TRD_ISU_CNT 구성종목수");
- Assert.AreEqual(109729L, a.Volume);
- Assert.AreEqual(6686714L, a.Value);
- var b = rows[1];
- Assert.AreEqual("KRX ESG Leaders 150", b.IndexName);
- Assert.AreEqual(16, b.FlucRateBp, "UPDN_RATE '.16'% → 16 Bp");
- Assert.AreEqual(150, b.ConstituentCount);
- }
- [TestMethod]
- public void ParseDaily_EmptyOrMissingBlock_ReturnsEmpty()
- {
- Assert.AreEqual(0, KrxEsgIndexParser.ParseDaily("""{"OutBlock_1":[]}""").Count);
- Assert.AreEqual(0, KrxEsgIndexParser.ParseDaily("""{"respMsg":"Unauthorized API Call","respCode":"401"}""").Count);
- }
- }
|