using Infrastructure.StockData; namespace Application.Tests; [TestClass] public sealed class SeibroStkIncdecParserTests { [TestMethod] public void Parse_FromSampleXml_MapsFields_AndNegativeQty() { // SEIBro getStkIncdecDetails 실응답 fixture (삼성전자) — 3행. 이익소각(음수)·액면분할. var rows = SeibroStkIncdecParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getStkIncdecDetails.xml"))); Assert.AreEqual(3, rows.Count); var split = rows.Single(c => c.SecnIssuNm == "액면분할"); Assert.AreEqual(593, split.IssucoCustno); Assert.AreEqual("KR7005930003", split.Isin); Assert.AreEqual("0101", split.SecnKacd, "보통주"); Assert.AreEqual(75, split.SecnIssuNtimes); Assert.AreEqual(new DateOnly(2018, 5, 3), split.IssuDt); Assert.AreEqual(100m, split.Issuprc); Assert.AreEqual(6419324700L, split.IssuQty); Assert.AreEqual("201", split.SecnIssuRacd); Assert.AreEqual(new DateOnly(2018, 5, 4), split.ListDt); var cancel = rows.Single(c => c.IssuDt == new DateOnly(2018, 1, 30)); Assert.AreEqual(-712000L, cancel.IssuQty, "이익소각 감소 = 음수 부호 보존"); Assert.AreEqual(0m, cancel.Issuprc, "ISSUPRC 0 은 유효값"); } [TestMethod] public void Parse_SameNtimes_DifferentDate_BothKept() { // 기대 행위: 동일 발행횟수(75)가 발행일/사유 다르면 각각 별개 행 — (Isin,Ntimes) 단독 자연키로는 충돌하므로 IssuDt·Racd 포함 var rows = SeibroStkIncdecParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getStkIncdecDetails.xml"))); var ntimes75 = rows.Where(c => c.SecnIssuNtimes == 75).ToList(); Assert.AreEqual(2, ntimes75.Count, "발행횟수 75 가 2행 (액면분할 + 이익소각)"); } }