using Admin.NET.Plugin.AiDOP.Dto.S0.Supply; using Admin.NET.Plugin.AiDOP.Entity.S0.Supply; using Admin.NET.Plugin.AiDOP.Infrastructure; using Xunit; namespace Admin.NET.Plugin.AiDOP.Tests.S0.Supply; /// /// S0 货源清单 srm_purchase.is_active 字符串列 ↔ bool? 口径统一转换与输出 DTO 映射单元测试。 /// 覆盖:读取多编码兼容、写入“是/否”、未知非空值不静默判停用、查询用等值集合(非 Contains)、DTO 归一。 /// public class AdoS0SrmPurchaseIsActiveTests { [Theory] [InlineData("是", true)] [InlineData("Y", true)] [InlineData("y", true)] [InlineData("1", true)] [InlineData("true", true)] [InlineData("True", true)] [InlineData(" 是 ", true)] // 前后空格:Trim 后命中 [InlineData("否", false)] [InlineData("N", false)] [InlineData("n", false)] [InlineData("0", false)] [InlineData("false", false)] [InlineData("False", false)] public void Parse_KnownTokens_ReturnsExpected(string input, bool expected) { Assert.Equal(expected, AdoS0SrmPurchaseIsActive.Parse(input)); } [Theory] [InlineData(null)] [InlineData("")] [InlineData(" ")] [InlineData("未知")] [InlineData("启用中")] public void Parse_NullEmptyOrUnknown_ReturnsNull(string? input) { // 未知非空值必须返回 null,不得静默判成停用(false),以免把脏数据当停用处理。 Assert.Null(AdoS0SrmPurchaseIsActive.Parse(input)); } [Theory] [InlineData(true, "是")] [InlineData(false, "否")] public void Encode_Bool_ReturnsPersistedString(bool input, string expected) { Assert.Equal(expected, AdoS0SrmPurchaseIsActive.Encode(input)); } [Fact] public void Encode_Null_ReturnsNull() { Assert.Null(AdoS0SrmPurchaseIsActive.Encode(null)); } [Fact] public void RoundTrip_EncodeThenParse_Preserves() { Assert.True(AdoS0SrmPurchaseIsActive.Parse(AdoS0SrmPurchaseIsActive.EnabledValue)); Assert.False(AdoS0SrmPurchaseIsActive.Parse(AdoS0SrmPurchaseIsActive.DisabledValue)); } [Fact] public void EnabledSql_UsesEqualitySetNotContains() { var sql = AdoS0SrmPurchaseIsActive.EnabledSql("sp.is_active"); Assert.Contains("IN ('是','y','1','true')", sql); Assert.Contains("TRIM(LOWER(sp.is_active))", sql); Assert.DoesNotContain("LIKE", sql); Assert.DoesNotContain("Contains", sql); } [Fact] public void DisabledSql_UsesDisabledSet() { var sql = AdoS0SrmPurchaseIsActive.DisabledSql("sp.is_active"); Assert.Contains("IN ('否','n','0','false')", sql); Assert.Contains("TRIM(LOWER(sp.is_active))", sql); } [Theory] [InlineData("是", true)] [InlineData("否", false)] [InlineData(null, null)] [InlineData("未知", null)] public void FromEntity_MapsIsActiveToBool(string? dbValue, bool? expected) { var entity = new AdoS0SrmPurchase { Id = 1, IcitemId = 2, SupplierId = 3, IsActive = dbValue }; var dto = AdoS0SrmPurchaseDto.FromEntity(entity); Assert.Equal(expected, dto.IsActive); } [Fact] public void FromEntity_PassesCurrencyAndSupplierTypeThrough() { var entity = new AdoS0SrmPurchase { Id = 10, IcitemId = 20, SupplierId = 30, IsActive = "是", CurrencyType = 1, SupplierType = "标准", }; var dto = AdoS0SrmPurchaseDto.FromEntity(entity); Assert.Equal(1, dto.CurrencyType); // long? 数值原样透传(1=CNY) Assert.Equal("标准", dto.SupplierType); // 供应类别中文原文透传 Assert.True(dto.IsActive); } }