using Infrastructure.StockData; namespace Application.Tests; [TestClass] public sealed class SeibroLockupParserTests { [TestMethod] public void Parse_FromSampleXml_MapsFields_AndEmptyReturnNull() { // SEIBro getSafeDpDutyDepoStatus 실응답 fixture — 1행(예수). RETURN_DT/RETURN_QTY 빈값 → null. var rows = SeibroLockupParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getSafeDpDutyDepoStatus.xml"))); Assert.AreEqual(1, rows.Count); var row = rows[0]; Assert.AreEqual(162, row.IssucoCustno); Assert.AreEqual("케이비아이동국실업", row.KorSecnNm); Assert.AreEqual("보통주", row.SecnKacd, "실응답 SECN_KACD 는 코드가 아닌 명칭 문자열"); Assert.AreEqual("001620", row.ShotnIsin); Assert.AreEqual("11", row.MartTpcd); Assert.AreEqual("1", row.OccrSeq, "1=예수"); Assert.AreEqual(new DateOnly(2019, 2, 25), row.SafedpDt); Assert.AreEqual(12730000L, row.SafedpQty); Assert.AreEqual("02", row.DutySafedpRacd, "보호예수사유코드 원문"); Assert.IsNull(row.ReturnDt, "RETURN_DT value=\"\" → null"); Assert.IsNull(row.ReturnQty, "RETURN_QTY value=\"\" → null"); Assert.AreEqual(22258606L, row.TotalStkCnt); } [TestMethod] public void Parse_SkipsRow_WhenNaturalKeyMissing() { // 기대 행위: 자연키(회사번호/단축코드/예수일/업무구분/사유코드) 중 하나라도 없으면 건너뛴다 const string xml = """ """; var rows = SeibroLockupParser.Parse(SeibroXml.Parse(xml)); Assert.AreEqual(1, rows.Count, "사유코드 없는 행 skip"); Assert.AreEqual(501, rows[0].IssucoCustno); Assert.AreEqual(new DateOnly(2020, 2, 10), rows[0].ReturnDt); Assert.AreEqual(1000L, rows[0].ReturnQty); } }