SeibroShotnByMartParserTests.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. using Infrastructure.StockData;
  2. namespace Application.Tests;
  3. [TestClass]
  4. public sealed class SeibroShotnByMartParserTests
  5. {
  6. [TestMethod]
  7. public void Parse_FromSampleXml_MapsFields()
  8. {
  9. // SEIBro getShotnByMart 실응답 fixture — SHOTN_ISIN/KOR_SECN_NM/ISSUCO_CUSTNO 매핑
  10. var envelope = SeibroXml.Parse(SeibroFixtures.Read("getShotnByMart.xml"));
  11. var rows = SeibroShotnByMartParser.Parse(envelope);
  12. Assert.AreEqual(envelope.Rows.Count, rows.Count, "샘플 전 행이 세 필드를 갖춰 전부 매핑된다");
  13. var first = rows[0];
  14. Assert.AreEqual("000800", first.ShortCode);
  15. Assert.AreEqual("경남기업", first.Name);
  16. Assert.AreEqual(80, first.IssucoCustno);
  17. }
  18. [TestMethod]
  19. public void Parse_SkipsRows_MissingRequiredFields()
  20. {
  21. // 필수 3필드 중 하나라도 없거나 회사번호 비숫자인 행은 건너뛴다 (upsert 자연키 불성립)
  22. const string xml = """
  23. <vector result="4">
  24. <data vectorkey="0" type="Document"><result>
  25. <SHOTN_ISIN value="005930"/><KOR_SECN_NM value="삼성전자"/><ISSUCO_CUSTNO value="593"/>
  26. </result></data>
  27. <data vectorkey="1" type="Document"><result>
  28. <SHOTN_ISIN value=""/><KOR_SECN_NM value="코드없음"/><ISSUCO_CUSTNO value="1"/>
  29. </result></data>
  30. <data vectorkey="2" type="Document"><result>
  31. <SHOTN_ISIN value="000020"/><KOR_SECN_NM value="번호없음"/>
  32. </result></data>
  33. <data vectorkey="3" type="Document"><result>
  34. <SHOTN_ISIN value="000030"/><KOR_SECN_NM value="비숫자"/><ISSUCO_CUSTNO value="ABC"/>
  35. </result></data>
  36. </vector>
  37. """;
  38. var rows = SeibroShotnByMartParser.Parse(SeibroXml.Parse(xml));
  39. Assert.AreEqual(1, rows.Count);
  40. Assert.AreEqual("005930", rows[0].ShortCode);
  41. Assert.AreEqual(593, rows[0].IssucoCustno);
  42. }
  43. }