using Admin.NET.Plugin.AiDOP.SmartOps; using Xunit; namespace Admin.NET.Plugin.AiDOP.Tests.SmartOps; public class SmartDiagnosisEvidenceTests { [Theory] [InlineData("S1", "order_schedule")] [InlineData("S3", "supplier_delivery")] [InlineData("S3", "material_readiness")] [InlineData("S4", "supplier_delivery")] [InlineData("S5", "iqc_bill")] [InlineData("S6", "s6_report")] [InlineData("S7", "fqc_result")] [InlineData("S8", "s8_exception")] public void Module_ResolvesRegisteredSource(string module, string sourceKey) { Assert.Contains(SmartDiagnosisEvidenceRegistry.Resolve(module), x => x.Key == sourceKey); } [Fact] public void S9_ReusesModuleSources_NotAThirdFactChain() { var s9 = SmartDiagnosisEvidenceRegistry.Resolve("S9"); Assert.DoesNotContain(s9, x => x.Key == "s8_exception"); Assert.Equal(SmartDiagnosisEvidenceRegistry.All.Count(x => x.Key != "s8_exception"), s9.Count); Assert.Contains(s9, x => x.Domain == SmartDiagnosisEvidenceDomain.Delivery || x.Domain == SmartDiagnosisEvidenceDomain.Manufacturing); Assert.Contains(s9, x => x.Domain == SmartDiagnosisEvidenceDomain.Supply); Assert.Contains(s9, x => x.Domain == SmartDiagnosisEvidenceDomain.Quality); } [Fact] public void UnknownModule_IsUnsupported() { Assert.Contains(SmartDiagnosisEvidenceRegistry.Resolve("S8"), x => x.Key == "s8_exception"); Assert.Empty(SmartDiagnosisEvidenceRegistry.Resolve("XX")); } [Fact] public void EverySource_RequiresTenantParameter_AndForbidsClientSql() { foreach (var source in SmartDiagnosisEvidenceRegistry.All) { Assert.Contains("@tenantId", source.CountSql, StringComparison.Ordinal); Assert.Contains("@tenantId", source.ItemSql, StringComparison.Ordinal); if (source.CountSql.Contains("factory_id", StringComparison.OrdinalIgnoreCase)) { Assert.Contains("factory_id=1", source.CountSql, StringComparison.Ordinal); Assert.Contains("factory_id<>@tenantId", source.CountSql, StringComparison.Ordinal); Assert.Contains("factory_id=1", source.ItemSql, StringComparison.Ordinal); } Assert.DoesNotContain("{", source.ItemSql); Assert.DoesNotContain("+", source.CountSql); foreach (var filter in source.Filters) { Assert.DoesNotContain(" ", filter.SqlColumn); Assert.DoesNotContain(";", filter.SqlColumn); Assert.Matches("^[a-z0-9_]+$", filter.SqlColumn); } } } [Fact] public void ClientCannotRegisterArbitraryTable() { Assert.Null(SmartDiagnosisEvidenceRegistry.Get("sys_user")); Assert.Null(SmartDiagnosisEvidenceRegistry.Get("ado_smart_ops_improvement_plan;drop table")); } }