SeibroDivInfoParserTests.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using Infrastructure.StockData;
  2. namespace Application.Tests;
  3. [TestClass]
  4. public sealed class SeibroDivInfoParserTests
  5. {
  6. [TestMethod]
  7. public void Parse_FromSampleXml_MapsFields_AndNoIssucoCustno()
  8. {
  9. // SEIBro getDivInfo 실응답 fixture (삼성전자/삼성전자1우) — 18행. ISSUCO_CUSTNO 는 응답에 없어 Isin 으로만 조인.
  10. var rows = SeibroDivInfoParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getDivInfo.xml")));
  11. Assert.AreEqual(18, rows.Count);
  12. var first = rows.Single(c => c.Isin == "KR7005930003" && c.RgtStdDt == new DateOnly(2016, 12, 31));
  13. Assert.AreEqual("삼성전자", first.KorSecnNm);
  14. Assert.AreEqual("보통주", first.SecnKacdNm);
  15. Assert.AreEqual(100m, first.Pval, "액면가 PVAL");
  16. Assert.AreEqual(0m, first.StkAllocRatio, "주식배정비율 0 (현금배당)");
  17. Assert.AreEqual(550m, first.CashAllocRatio);
  18. Assert.AreEqual(27500m, first.CashAllocAmt, "1주당 현금배당금");
  19. Assert.AreEqual(1.53m, first.MartpDivRate, "시가배당율");
  20. Assert.AreEqual(new DateOnly(2017, 4, 24), first.Th1PayTermBeginDt, "배당지급일 — 스펙·샘플 모두 존재");
  21. Assert.IsNull(first.DeliDt, "DELI_DT value=\"\" → null");
  22. Assert.IsFalse(first.MajshrEtcDiffAllocYn!.Value, "MAJSHR_ETC_DIFF_ALOC_YN=N");
  23. Assert.IsTrue(first.TstkNoagnYn!.Value, "TSTK_NOAGN_YN=Y");
  24. }
  25. [TestMethod]
  26. public void Parse_DifferentialDividendFields_Null_WhenEmpty()
  27. {
  28. // 기대 행위: 차등배당 4필드(CASH_DIFF_*, STK_DIFF_*, MARTP_DIFF_*)는 무차등 종목에서 빈값 → null
  29. var rows = SeibroDivInfoParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getDivInfo.xml")));
  30. var row = rows[0];
  31. Assert.IsNull(row.CashDiffDiviAmt);
  32. Assert.IsNull(row.CashDiffDiviRate);
  33. Assert.IsNull(row.StkDiffDiviRate);
  34. Assert.IsNull(row.MartpDiffDiviRate);
  35. }
  36. [TestMethod]
  37. public void Parse_FractionalRate_WithLeadingDot()
  38. {
  39. // 기대 행위: ".34" 같은 소수점 선행 표기도 decimal 파싱 (0.34)
  40. const string xml = """
  41. <vector result="1">
  42. <data vectorkey="0" type="Document"><result>
  43. <ISIN value="KR7005930003"/>
  44. <KOR_SECN_NM value="삼성전자"/>
  45. <RGT_STD_DT value="20170331"/>
  46. <MARTP_DIV_RATE value=".34"/>
  47. <CASH_DIFF_DIVI_RATE value="1.5"/>
  48. </result></data>
  49. </vector>
  50. """;
  51. var rows = SeibroDivInfoParser.Parse(SeibroXml.Parse(xml));
  52. Assert.AreEqual(0.34m, rows[0].MartpDivRate);
  53. Assert.AreEqual(1.5m, rows[0].CashDiffDiviRate, "차등배당 있는 종목은 값 파싱");
  54. }
  55. }