using Infrastructure.StockData; namespace Application.Tests; [TestClass] public sealed class SeibroXrcStkOptionXrcParserTests { [TestMethod] public void Parse_EmptySampleXml_ReturnsZeroRows_NoThrow() { // ⚠️ getXrcStkOptionXrcInfo 실샘플이 result="0"(0행) — 라이브 필드 검증 불가. 빈 결과 → 0행·무예외만 검증. var envelope = SeibroXml.Parse(SeibroFixtures.Read("getXrcStkOptionXrcInfo.xml")); Assert.AreEqual(0, envelope.ResultCount, "fixture 는 result=0"); var rows = SeibroXrcStkOptionXrcParser.Parse(envelope); Assert.AreEqual(0, rows.Count); } [TestMethod] public void Parse_SyntheticSpecXml_MapsFields() { // 빈 fixture 대응 — 주식.md 스펙 기준 합성 XML 로 필드 매핑 로직만 검증 (운영 첫 수집 시 실 필드명 로그 확인 필요). const string xml = """ """; var rows = SeibroXrcStkOptionXrcParser.Parse(SeibroXml.Parse(xml)); Assert.AreEqual(1, rows.Count); var r = rows[0]; Assert.AreEqual("KR6019591561", r.BondIsin); Assert.AreEqual("CB", r.BondKindNm); Assert.AreEqual("KR7019590007", r.XrcStkIsin); Assert.AreEqual(new DateOnly(2018, 3, 21), r.RgtStdDt, "권리행사일"); Assert.AreEqual(new DateOnly(2016, 6, 9), r.XrcPossBeginDt); Assert.AreEqual(20000m, r.XrcQty); Assert.AreEqual(5000m, r.XrcPrice); Assert.AreEqual(new DateOnly(2018, 4, 5), r.ListDt); } [TestMethod] public void Parse_SkipsRow_WhenBondIsinOrDateMissing() { // BOND_ISIN 또는 RGT_STD_DT 없으면 건너뛴다 const string xml = """ """; var rows = SeibroXrcStkOptionXrcParser.Parse(SeibroXml.Parse(xml)); Assert.AreEqual(0, rows.Count); } }