SeibroAssetParserTests.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using Infrastructure.StockData;
  2. namespace Application.Tests;
  3. /// <summary>
  4. /// SEIBro getAssetInfo 파서 — 대문자 &lt;RESULT&gt; 래퍼. 다수 기초자산(AssetSeq) + 행사기준가·평가일 매핑.
  5. /// ⚠️ 기초자산코드 2체계: 반환 STND_BASSET_CD 가 입력 KSD02* 와 다른 KSD31*/KR7* 체계로 와도 **원문 그대로 보존**하는지 확인.
  6. /// </summary>
  7. [TestClass]
  8. public sealed class SeibroAssetParserTests
  9. {
  10. [TestMethod]
  11. public void Parse_SampleXml_MapsAssets_PreservesRawBassetCode()
  12. {
  13. var rows = SeibroAssetParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getAssetInfo.xml")));
  14. Assert.AreEqual(3, rows.Count, "기초자산 3종");
  15. var hscei = rows.Single(c => c.AssetSeq == 1);
  16. // 반환 코드 KSD310000306 (입력 HSCEI 는 KSD020000201) — 매핑 흡수 없이 원문 보존
  17. Assert.AreEqual("KSD310000306", hscei.Fields.StndBassetCd, "반환 코드체계(KSD31*) 원문 보존");
  18. Assert.AreEqual("Hang Seng China Enterprises Index", hscei.Fields.StndBassetNm);
  19. Assert.AreEqual(11073m, hscei.Fields.XrcStdprc);
  20. Assert.AreEqual(55m, hscei.Fields.XrcStopLolmtRatio);
  21. Assert.AreEqual(6090.15m, hscei.Fields.XrcStopLolmtPrice);
  22. Assert.AreEqual("1", hscei.Fields.BassetFirstValatTpcd, "종가");
  23. Assert.AreEqual(new DateOnly(2018, 6, 29), hscei.Fields.FirstStdprcDecsnBeginDt);
  24. Assert.AreEqual(new DateOnly(2021, 6, 29), hscei.Fields.LastStdprcDecsnExpryDt);
  25. Assert.AreEqual("2", hscei.Fields.RvltSeverTpcd, "버림");
  26. // S&P 500 (XML 엔티티 & 디코딩 확인)
  27. var snp = rows.Single(c => c.AssetSeq == 2);
  28. Assert.AreEqual("KSD310000568", snp.Fields.StndBassetCd);
  29. Assert.AreEqual("S&P 500 Index", snp.Fields.StndBassetNm, "&amp; 디코딩");
  30. // 단일종목(삼성전자) 기초자산 — KR7* 체계도 원문 보존
  31. var samsung = rows.Single(c => c.AssetSeq == 3);
  32. Assert.AreEqual("KR7005930003", samsung.Fields.StndBassetCd);
  33. Assert.AreEqual("삼성전자", samsung.Fields.StndBassetNm);
  34. }
  35. [TestMethod]
  36. public void Parse_MissingAssetSeq_SkipsRow()
  37. {
  38. const string xml = """
  39. <vector result="1"><data vectorkey="0" type="Document"><RESULT>
  40. <ISIN value="KR6539335879"/><STND_BASSET_NM value="자산"/>
  41. </RESULT></data></vector>
  42. """;
  43. var rows = SeibroAssetParser.Parse(SeibroXml.Parse(xml));
  44. Assert.AreEqual(0, rows.Count, "ASSET_SEQ 없으면 스킵");
  45. }
  46. }