using Infrastructure.StockData; namespace Application.Tests; [TestClass] public sealed class SeibroGmeetMeasureParserTests { [TestMethod] public void Parse_FromSampleXml_MapsAgendas() { // SEIBro getGmeetMeasureInfo 실응답 fixture (삼성전자 2017 총회 안건 11건) — AGENDA_SEQ·결과·투표방식 매핑. var rows = SeibroGmeetMeasureParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getGmeetMeasureInfo.xml"))); Assert.AreEqual(11, rows.Count); var first = rows.Single(c => c.AgendaSeq == 1); Assert.AreEqual(593, first.IssucoCustno); Assert.AreEqual(new DateOnly(2017, 12, 31), first.RgtStdDt); Assert.AreEqual(new DateOnly(2018, 3, 23), first.GmetDt); Assert.AreEqual("001", first.GmetKacd); Assert.AreEqual("재무제표승인", first.AgendaNm); Assert.AreEqual("APPROVAL OF FINANCIAL STATEMENTS", first.EngAgendaNm); Assert.AreEqual("9", first.VoteMannTpcd, "해당없음"); Assert.AreEqual("1", first.GmetResultTpcd, "승인"); Assert.AreEqual("1", first.AgendaSchSeqo, "CHAR(6) 우측공백 Trim"); // 세부안건(사외이사 선임) — DTAIL_AGENDA_NM 채워짐 var director = rows.Single(c => c.AgendaSeq == 2); Assert.AreEqual("사외이사 선임", director.AgendaNm); Assert.AreEqual("김종훈", director.DtailAgendaNm); } [TestMethod] public void Parse_SkipsRow_WhenAgendaSeqOrNameMissing() { // 기대 행위: AGENDA_SEQ 또는 AGENDA_NM 없으면 건너뛴다 const string xml = """ """; var rows = SeibroGmeetMeasureParser.Parse(SeibroXml.Parse(xml)); Assert.AreEqual(1, rows.Count); Assert.AreEqual(1, rows[0].AgendaSeq); Assert.AreEqual("정상안건", rows[0].AgendaNm); } }