using Infrastructure.StockData; namespace Application.Tests; [TestClass] public sealed class SeibroOddLotParserTests { [TestMethod] public void Parse_FromSampleXml_MapsOddLot() { // SEIBro getOddLotInfo 실응답 fixture (무상증자 단주대금) — 1행. 산정기준·권리락일 매핑. // ⚠️ 응답엔 ISSUCO_CUSTNO·지급일(요청 파라미터)이 없어 파서는 담지 않는다(배치가 스탬핑). var rows = SeibroOddLotParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getOddLotInfo.xml"))); Assert.AreEqual(1, rows.Count); var r = rows[0]; Assert.AreEqual(new DateOnly(2018, 6, 11), r.RgtStdDt); Assert.AreEqual("102", r.RgtRacd); Assert.AreEqual("무상증자", r.RgtRacdNm); Assert.AreEqual("99", r.RgtRsnDetailSortCd); Assert.AreEqual("04", r.EstmStdTpcd, "상장일종가"); Assert.AreEqual(new DateOnly(2018, 7, 2), r.EstmStdDt); Assert.AreEqual(3175m, r.EstmStdprc); Assert.AreEqual(new DateOnly(2018, 6, 8), r.XrgtDt, "권리락일"); // ROST_CLOSE_* value="" → null Assert.IsNull(r.RostCloseBeginDt, "빈 명부폐쇄일 → null"); } [TestMethod] public void Parse_SkipsRow_WhenRgtStdDtMissing() { // 기대 행위: RGT_STD_DT(자연키 일부) 없으면 건너뛴다 const string xml = """ """; var rows = SeibroOddLotParser.Parse(SeibroXml.Parse(xml)); Assert.AreEqual(0, rows.Count); } }