using Infrastructure.StockData;
namespace Application.Tests;
///
/// SEIBro getAssetInfo 파서 — 대문자 <RESULT> 래퍼. 다수 기초자산(AssetSeq) + 행사기준가·평가일 매핑.
/// ⚠️ 기초자산코드 2체계: 반환 STND_BASSET_CD 가 입력 KSD02* 와 다른 KSD31*/KR7* 체계로 와도 **원문 그대로 보존**하는지 확인.
///
[TestClass]
public sealed class SeibroAssetParserTests
{
[TestMethod]
public void Parse_SampleXml_MapsAssets_PreservesRawBassetCode()
{
var rows = SeibroAssetParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getAssetInfo.xml")));
Assert.AreEqual(3, rows.Count, "기초자산 3종");
var hscei = rows.Single(c => c.AssetSeq == 1);
// 반환 코드 KSD310000306 (입력 HSCEI 는 KSD020000201) — 매핑 흡수 없이 원문 보존
Assert.AreEqual("KSD310000306", hscei.Fields.StndBassetCd, "반환 코드체계(KSD31*) 원문 보존");
Assert.AreEqual("Hang Seng China Enterprises Index", hscei.Fields.StndBassetNm);
Assert.AreEqual(11073m, hscei.Fields.XrcStdprc);
Assert.AreEqual(55m, hscei.Fields.XrcStopLolmtRatio);
Assert.AreEqual(6090.15m, hscei.Fields.XrcStopLolmtPrice);
Assert.AreEqual("1", hscei.Fields.BassetFirstValatTpcd, "종가");
Assert.AreEqual(new DateOnly(2018, 6, 29), hscei.Fields.FirstStdprcDecsnBeginDt);
Assert.AreEqual(new DateOnly(2021, 6, 29), hscei.Fields.LastStdprcDecsnExpryDt);
Assert.AreEqual("2", hscei.Fields.RvltSeverTpcd, "버림");
// S&P 500 (XML 엔티티 & 디코딩 확인)
var snp = rows.Single(c => c.AssetSeq == 2);
Assert.AreEqual("KSD310000568", snp.Fields.StndBassetCd);
Assert.AreEqual("S&P 500 Index", snp.Fields.StndBassetNm, "& 디코딩");
// 단일종목(삼성전자) 기초자산 — KR7* 체계도 원문 보존
var samsung = rows.Single(c => c.AssetSeq == 3);
Assert.AreEqual("KR7005930003", samsung.Fields.StndBassetCd);
Assert.AreEqual("삼성전자", samsung.Fields.StndBassetNm);
}
[TestMethod]
public void Parse_MissingAssetSeq_SkipsRow()
{
const string xml = """
""";
var rows = SeibroAssetParser.Parse(SeibroXml.Parse(xml));
Assert.AreEqual(0, rows.Count, "ASSET_SEQ 없으면 스킵");
}
}