using Infrastructure.StockData; namespace Application.Tests; [TestClass] public sealed class SeibroDivSchedulParserTests { [TestMethod] public void Parse_FromSampleXml_MapsFields_Samsung() { // SEIBro getDivSchedulInfo 실응답 fixture (삼성전자) — 9행, 전부 현금배당(02) · 권리락일/명부폐쇄/전자증권 매핑 var rows = SeibroDivSchedulParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getDivSchedulInfo.xml"))); Assert.AreEqual(9, rows.Count); var first = rows.Single(c => c.RgtStdDt == new DateOnly(2018, 3, 31)); Assert.AreEqual(593, first.IssucoCustno); Assert.AreEqual("삼성전자", first.RepSecnNm); Assert.AreEqual("103", first.RgtRacd, "배당/분배"); Assert.AreEqual("02", first.RgtRsnDetailSortCd, "현금배당"); Assert.AreEqual("2", first.AllocWhcd); Assert.AreEqual("3", first.SetaccTpcd, "분기"); Assert.AreEqual("1", first.FixTpcd, "확정"); Assert.AreEqual(new DateOnly(2018, 4, 1), first.RostCloseBeginDt); Assert.AreEqual(new DateOnly(2018, 4, 14), first.RostCloseExpryDt); Assert.AreEqual(new DateOnly(2018, 3, 29), first.XrgtDt, "권리락일 YYYYMMDD 파싱"); Assert.IsFalse(first.IsElectronicSecurity!.Value, "ELTSC_YN=N → false"); } [TestMethod] public void Parse_EmptyDate_Null_AndSkipsIncompleteKey() { // 기대 행위: XRGT_DT 빈값 → null, 자연키(회사번호/기준일/세부유형) 미충족 행은 건너뛴다 const string xml = """ """; var rows = SeibroDivSchedulParser.Parse(SeibroXml.Parse(xml)); Assert.AreEqual(1, rows.Count, "회사번호 없는 행은 skip"); Assert.IsNull(rows[0].XrgtDt, "value=\"\" → null"); Assert.AreEqual("04", rows[0].RgtRsnDetailSortCd, "무배당"); Assert.IsTrue(rows[0].IsElectronicSecurity!.Value, "ELTSC_YN=Y → true"); } }