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); } }