using System.ComponentModel.DataAnnotations; using Admin.NET.Plugin.AiDOP.Dto.S0.Quality; using Xunit; namespace Admin.NET.Plugin.AiDOP.Tests.S0.Quality; public class AdoS0QualityDtosValidationTests { private static IReadOnlyList Validate(object model) { var context = new ValidationContext(model); var results = new List(); Validator.TryValidateObject(model, context, results, validateAllProperties: true); return results; } [Fact] public void RawWhitelist_WhenSupplierFieldsMissing_ReturnsRequiredErrors() { var dto = new AdoS0QmsRawWhitelistUpsertDto { SupplierCode = "", SupplierName = "" }; var results = Validate(dto); Assert.Contains(results, r => r.ErrorMessage == "供应商编码不能为空"); Assert.Contains(results, r => r.ErrorMessage == "供应商名称不能为空"); } [Theory] [InlineData(typeof(AdoS0QmsSamplingSchemeUpsertDto))] [InlineData(typeof(AdoS0QmsInspectionInstrumentUpsertDto))] [InlineData(typeof(AdoS0QmsInspectionMethodUpsertDto))] [InlineData(typeof(AdoS0QmsInspectionItemUpsertDto))] [InlineData(typeof(AdoS0QmsInspectionFrequencyUpsertDto))] [InlineData(typeof(AdoS0QmsInspectionBasisUpsertDto))] [InlineData(typeof(AdoS0QmsInspectionStandardUpsertDto))] [InlineData(typeof(AdoS0QmsInspectionPlanUpsertDto))] public void NumberNameDtos_WhenDefaultsUsed_ReturnRequiredErrors(Type dtoType) { var dto = Activator.CreateInstance(dtoType)!; var results = Validate(dto); Assert.Contains(results, r => r.ErrorMessage == "编号不能为空"); Assert.Contains(results, r => r.ErrorMessage == "名称不能为空"); } /// /// 四张检规表的 UpsertDto 上不得残留任何 [Required]。 /// Create 与 Update 共用同一 DTO,任何 [Required] 都会在模型绑定阶段先于 /// AdoS0QmsSpecAggregateGuard 触发、把 Update 挡成 400,从而破坏「历史兼容」—— /// 实测 qms_gcjygf 有 3 行 wjbh 为空,正是被遗留的 FileNumber[Required] 锁死。 /// 必填一律由守卫按新增/编辑分别判定,见 AdoS0QmsSpecAggregateGuardTests。 /// [Theory] [InlineData(typeof(AdoS0QmsRawInspectionSpecUpsertDto))] [InlineData(typeof(AdoS0QmsProcessInspectionSpecUpsertDto))] [InlineData(typeof(AdoS0QmsFqcInspectionSpecUpsertDto))] [InlineData(typeof(AdoS0QmsOqcInspectionSpecUpsertDto))] public void SpecUpsertDtos_CarryNoRequiredAttribute_SoUpdateReachesTheGuard(Type dtoType) { var dto = Activator.CreateInstance(dtoType)!; var results = Validate(dto); Assert.Empty(results); } }