using Microsoft.VisualStudio.TestTools.UnitTesting; using YLErp.DBModels; namespace YLErp.Modules.EodModule { /// /// FR007 错行根因的校正决策单测(GLMS-20260701)。 /// 对应最近提交的 bugfix:eod_commodity_future_price 入库前以 UnderlyingCode(=FutureContractId) 为准 /// 重派生 UnderlyingId,防止 UnderlyingId 与 FutureContractId 失同步导致"网页能查到、EOD 结算查不到"。 /// 这里只测纯函数 ResolveUnderlyingIdForCode,不依赖数据库。 /// /// 生产事故还原:FR007 价格行的 FutureContractId='FR007',但 UnderlyingId 被错写成 /// 511160.SH 的 2173889 / 159111.SZ 的 2173890,正确应为 FR007 的 2170838。 /// 网页端按 UnderlyingId(int) JOIN underlying_manager 把 FR007 行误挂到 511160.SH; /// 而 EOD 结算按 UnderlyingCode(string) JOIN 查不到,报"结算价格缺失"。 /// [TestClass] public class EodPriceUnderlyingIdGuardTest { private const int Fr007CorrectId = 2170838; private const int Id511160 = 2173889; // 511160.SH 的 id(被错写) private const int Id159111 = 2173890; // 159111.SZ 的 id(被错写) [TestMethod] public void 空UnderlyingCode_维持原值() { Assert.AreEqual(123, EodPriceService.ResolveUnderlyingIdForCode("", 123, null)); Assert.AreEqual(123, EodPriceService.ResolveUnderlyingIdForCode(null, 123, 999)); Assert.AreEqual(123, EodPriceService.ResolveUnderlyingIdForCode(" ", 123, 999)); } [TestMethod] public void 标的不存在_维持原值() { // resolvedId=null 表示 underlying_manager 无此代码,无法校正 Assert.AreEqual(Id511160, EodPriceService.ResolveUnderlyingIdForCode("FR007", Id511160, null)); } [TestMethod] public void 已一致_维持原值() { Assert.AreEqual(Fr007CorrectId, EodPriceService.ResolveUnderlyingIdForCode("FR007", Fr007CorrectId, Fr007CorrectId)); } [TestMethod] public void 不一致_校正为正确id_FR007生产错行_511160() { // 生产事故:FR007 行 UnderlyingId=2173889(511160.SH) → 应校正为 2170838 Assert.AreEqual(Fr007CorrectId, EodPriceService.ResolveUnderlyingIdForCode("FR007", Id511160, Fr007CorrectId)); } [TestMethod] public void 不一致_校正为正确id_FR007生产错行_159111() { // 生产事故:另两条错行 UnderlyingId=2173890(159111.SZ) → 应校正为 2170838 Assert.AreEqual(Fr007CorrectId, EodPriceService.ResolveUnderlyingIdForCode("FR007", Id159111, Fr007CorrectId)); } [TestMethod] public void 行对象_端到端校正_FR007() { var row = new eod_commodity_future_price { UnderlyingCode = "FR007", UnderlyingId = Id511160 }; // 模拟 db.underlying_manager 解析到的正确 id int resolved = Fr007CorrectId; int? before = row.UnderlyingId; row.UnderlyingId = EodPriceService.ResolveUnderlyingIdForCode(row.UnderlyingCode, row.UnderlyingId ?? 0, resolved); Assert.AreNotEqual(before, row.UnderlyingId); Assert.AreEqual((int?)Fr007CorrectId, row.UnderlyingId); } [TestMethod] public void 典型非错配_不同标的_各自正确不互相覆盖() { // 511160.SH 自己的行(FutureContractId='511160.SH'),UnderlyingId 已是 2173889 → 不动 Assert.AreEqual(Id511160, EodPriceService.ResolveUnderlyingIdForCode("511160.SH", Id511160, Id511160)); } } }