using Infrastructure.StockData; namespace Application.Tests; [TestClass] public sealed class SeibroGmeetParserTests { [TestMethod] public void Parse_FromSampleXml_MapsMeetingFields() { // SEIBro getGmeetInfo 실응답 fixture (삼성전자 2017 정기총회) — 1행. 날짜·Y/N·시각 매핑. var rows = SeibroGmeetParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getGmeetInfo.xml"))); Assert.AreEqual(1, rows.Count); var m = rows[0]; Assert.AreEqual(593, m.IssucoCustno); Assert.AreEqual("00593", m.IssuinNo); Assert.AreEqual("001", m.GmetKacd, "정기총회"); Assert.AreEqual(new DateOnly(2017, 12, 31), m.RgtStdDt); Assert.AreEqual(new DateOnly(2018, 3, 23), m.GmetDt); Assert.AreEqual("0900", m.GmetTtm); Assert.AreEqual(new DateOnly(2018, 1, 1), m.RostCloseBeginDt); Assert.IsTrue(m.GmetOmeetYn, "총회개최여부 Y"); Assert.IsFalse(m.EvoteYn, "전자투표 N"); Assert.IsFalse(m.DferYn, "연기 N"); Assert.IsFalse(m.IsElectronicSecurity, "전자증권 N (ELTSC_YN)"); Assert.IsFalse(m.StkBuyreqRlYn); Assert.AreEqual("1", m.GmetPlaceTpcd, "서울"); Assert.IsTrue(m.GmetPlace!.Contains("삼성전자빌딩")); // COUNCL_DTERMIN_PUBN_DT value="" → null (빈값 방어) Assert.IsNull(m.CouncilDterminPubnDt, "빈 공시일자 → null"); } [TestMethod] public void Parse_SkipsRow_WhenNaturalKeyMissing() { // 기대 행위: ISSUCO_CUSTNO/GMET_KACD/RGT_STD_DT 중 하나라도 없으면 건너뛴다 const string xml = """ """; var rows = SeibroGmeetParser.Parse(SeibroXml.Parse(xml)); Assert.AreEqual(1, rows.Count, "GMET_KACD 없는 첫 행 스킵"); Assert.AreEqual(20, rows[0].IssucoCustno); Assert.AreEqual("002", rows[0].GmetKacd); } }