using Infrastructure.StockData; namespace Application.Tests; [TestClass] public sealed class SeibroStkStatParserTests { [TestMethod] public void Parse_FromSampleXml_MapsFields_Samsung() { // SEIBro getStkStatInfo 실응답 fixture (삼성전자) — PVAL/VOTRNO/TOTAL_STK_CNT/ELTSC_YN/ISSUCO_CUSTNO 매핑 var rows = SeibroStkStatParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getStkStatInfo.xml"))); Assert.AreEqual(1, rows.Count); var row = rows[0]; Assert.AreEqual(593, row.IssucoCustno); Assert.AreEqual("KR7005930003", row.Isin); Assert.AreEqual("005930", row.ShortCode); Assert.AreEqual(100m, row.FaceValue, "PVAL 액면가"); Assert.AreEqual(1m, row.VotingRights, "VOTRNO 1주당 의결권수"); Assert.AreEqual(6419324700L, row.TotalIssuedShares, "TOTAL_STK_CNT 총발행주식수"); Assert.IsFalse(row.IsElectronicSecurity!.Value, "ELTSC_YN=N → false (예탁증권)"); } [TestMethod] public void Parse_EltscYn_Y_True_AndMissingNumerics_Null() { const string xml = """ """; var rows = SeibroStkStatParser.Parse(SeibroXml.Parse(xml)); var row = rows[0]; Assert.AreEqual(500.5m, row.FaceValue, "소수 액면가 파싱"); Assert.IsNull(row.VotingRights, "value=\"\" → null (0 과 구분)"); Assert.IsNull(row.TotalIssuedShares, "element 생략 → null"); Assert.IsNull(row.Isin); Assert.IsTrue(row.IsElectronicSecurity!.Value, "ELTSC_YN=Y → true (전자증권)"); } }