using Infrastructure.StockData;
namespace Application.Tests;
[TestClass]
public sealed class SeibroXrcStkOptionXrcParserTests
{
[TestMethod]
public void Parse_EmptySampleXml_ReturnsZeroRows_NoThrow()
{
// ⚠️ getXrcStkOptionXrcInfo 실샘플이 result="0"(0행) — 라이브 필드 검증 불가. 빈 결과 → 0행·무예외만 검증.
var envelope = SeibroXml.Parse(SeibroFixtures.Read("getXrcStkOptionXrcInfo.xml"));
Assert.AreEqual(0, envelope.ResultCount, "fixture 는 result=0");
var rows = SeibroXrcStkOptionXrcParser.Parse(envelope);
Assert.AreEqual(0, rows.Count);
}
[TestMethod]
public void Parse_SyntheticSpecXml_MapsFields()
{
// 빈 fixture 대응 — 주식.md 스펙 기준 합성 XML 로 필드 매핑 로직만 검증 (운영 첫 수집 시 실 필드명 로그 확인 필요).
const string xml = """
""";
var rows = SeibroXrcStkOptionXrcParser.Parse(SeibroXml.Parse(xml));
Assert.AreEqual(1, rows.Count);
var r = rows[0];
Assert.AreEqual("KR6019591561", r.BondIsin);
Assert.AreEqual("CB", r.BondKindNm);
Assert.AreEqual("KR7019590007", r.XrcStkIsin);
Assert.AreEqual(new DateOnly(2018, 3, 21), r.RgtStdDt, "권리행사일");
Assert.AreEqual(new DateOnly(2016, 6, 9), r.XrcPossBeginDt);
Assert.AreEqual(20000m, r.XrcQty);
Assert.AreEqual(5000m, r.XrcPrice);
Assert.AreEqual(new DateOnly(2018, 4, 5), r.ListDt);
}
[TestMethod]
public void Parse_SkipsRow_WhenBondIsinOrDateMissing()
{
// BOND_ISIN 또는 RGT_STD_DT 없으면 건너뛴다
const string xml = """
""";
var rows = SeibroXrcStkOptionXrcParser.Parse(SeibroXml.Parse(xml));
Assert.AreEqual(0, rows.Count);
}
}