AdoS0SrmPurchaseIsActiveTests.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using Admin.NET.Plugin.AiDOP.Dto.S0.Supply;
  2. using Admin.NET.Plugin.AiDOP.Entity.S0.Supply;
  3. using Admin.NET.Plugin.AiDOP.Infrastructure;
  4. using Xunit;
  5. namespace Admin.NET.Plugin.AiDOP.Tests.S0.Supply;
  6. /// <summary>
  7. /// S0 货源清单 srm_purchase.is_active 字符串列 ↔ bool? 口径统一转换与输出 DTO 映射单元测试。
  8. /// 覆盖:读取多编码兼容、写入“是/否”、未知非空值不静默判停用、查询用等值集合(非 Contains)、DTO 归一。
  9. /// </summary>
  10. public class AdoS0SrmPurchaseIsActiveTests
  11. {
  12. [Theory]
  13. [InlineData("是", true)]
  14. [InlineData("Y", true)]
  15. [InlineData("y", true)]
  16. [InlineData("1", true)]
  17. [InlineData("true", true)]
  18. [InlineData("True", true)]
  19. [InlineData(" 是 ", true)] // 前后空格:Trim 后命中
  20. [InlineData("否", false)]
  21. [InlineData("N", false)]
  22. [InlineData("n", false)]
  23. [InlineData("0", false)]
  24. [InlineData("false", false)]
  25. [InlineData("False", false)]
  26. public void Parse_KnownTokens_ReturnsExpected(string input, bool expected)
  27. {
  28. Assert.Equal(expected, AdoS0SrmPurchaseIsActive.Parse(input));
  29. }
  30. [Theory]
  31. [InlineData(null)]
  32. [InlineData("")]
  33. [InlineData(" ")]
  34. [InlineData("未知")]
  35. [InlineData("启用中")]
  36. public void Parse_NullEmptyOrUnknown_ReturnsNull(string? input)
  37. {
  38. // 未知非空值必须返回 null,不得静默判成停用(false),以免把脏数据当停用处理。
  39. Assert.Null(AdoS0SrmPurchaseIsActive.Parse(input));
  40. }
  41. [Theory]
  42. [InlineData(true, "是")]
  43. [InlineData(false, "否")]
  44. public void Encode_Bool_ReturnsPersistedString(bool input, string expected)
  45. {
  46. Assert.Equal(expected, AdoS0SrmPurchaseIsActive.Encode(input));
  47. }
  48. [Fact]
  49. public void Encode_Null_ReturnsNull()
  50. {
  51. Assert.Null(AdoS0SrmPurchaseIsActive.Encode(null));
  52. }
  53. [Fact]
  54. public void RoundTrip_EncodeThenParse_Preserves()
  55. {
  56. Assert.True(AdoS0SrmPurchaseIsActive.Parse(AdoS0SrmPurchaseIsActive.EnabledValue));
  57. Assert.False(AdoS0SrmPurchaseIsActive.Parse(AdoS0SrmPurchaseIsActive.DisabledValue));
  58. }
  59. [Fact]
  60. public void EnabledSql_UsesEqualitySetNotContains()
  61. {
  62. var sql = AdoS0SrmPurchaseIsActive.EnabledSql("sp.is_active");
  63. Assert.Contains("IN ('是','y','1','true')", sql);
  64. Assert.Contains("TRIM(LOWER(sp.is_active))", sql);
  65. Assert.DoesNotContain("LIKE", sql);
  66. Assert.DoesNotContain("Contains", sql);
  67. }
  68. [Fact]
  69. public void DisabledSql_UsesDisabledSet()
  70. {
  71. var sql = AdoS0SrmPurchaseIsActive.DisabledSql("sp.is_active");
  72. Assert.Contains("IN ('否','n','0','false')", sql);
  73. Assert.Contains("TRIM(LOWER(sp.is_active))", sql);
  74. }
  75. [Theory]
  76. [InlineData("是", true)]
  77. [InlineData("否", false)]
  78. [InlineData(null, null)]
  79. [InlineData("未知", null)]
  80. public void FromEntity_MapsIsActiveToBool(string? dbValue, bool? expected)
  81. {
  82. var entity = new AdoS0SrmPurchase { Id = 1, IcitemId = 2, SupplierId = 3, IsActive = dbValue };
  83. var dto = AdoS0SrmPurchaseDto.FromEntity(entity);
  84. Assert.Equal(expected, dto.IsActive);
  85. }
  86. [Fact]
  87. public void FromEntity_PassesCurrencyAndSupplierTypeThrough()
  88. {
  89. var entity = new AdoS0SrmPurchase
  90. {
  91. Id = 10,
  92. IcitemId = 20,
  93. SupplierId = 30,
  94. IsActive = "是",
  95. CurrencyType = 1,
  96. SupplierType = "标准",
  97. };
  98. var dto = AdoS0SrmPurchaseDto.FromEntity(entity);
  99. Assert.Equal(1, dto.CurrencyType); // long? 数值原样透传(1=CNY)
  100. Assert.Equal("标准", dto.SupplierType); // 供应类别中文原文透传
  101. Assert.True(dto.IsActive);
  102. }
  103. }