using Admin.NET.Plugin.AiDOP.Entity; using Admin.NET.Plugin.AiDOP.Infrastructure; using Admin.NET.Plugin.ApprovalFlow; using Xunit; namespace Admin.NET.Plugin.AiDOP.Tests.SmartOps; public class SmartOpsImprovementApprovalTests { [Theory] [InlineData("S1", "yellow", false, null, "yellow")] [InlineData("S1", "red", false, null, "red")] [InlineData("S1", "green", false, null, "yellow")] [InlineData("S9", "yellow", false, null, "global")] [InlineData("S2", "yellow", true, null, "global")] [InlineData("S3", "red", false, "计划部/采购部跨部门", "global")] public void Route_FollowsSeverityAndCrossDept(string module, string severity, bool cross, string? dept, string expected) { Assert.Equal(expected, SmartOpsImprovementApprovalRules.ResolveRoute(module, severity, cross, dept)); } [Theory] [InlineData("yellow", new[] { "SMART_OPS_DEPT_HEAD" })] [InlineData("red", new[] { "SMART_OPS_DEPT_HEAD", "SMART_OPS_OPS_OWNER" })] [InlineData("global", new[] { "SMART_OPS_DEPT_HEAD", "SMART_OPS_MODULE_OWNER", "SMART_OPS_OPS_OWNER" })] public void RequiredRoles_MatchFormalBaseline(string route, string[] expected) { Assert.Equal(expected, SmartOpsImprovementApprovalRules.RequiredRoleCodes(route)); } [Fact] public void CompletedStatus_ApprovedThenExecute_RejectReturnsDraft() { Assert.Equal("approved", SmartOpsImprovementApprovalRules.MapCompletedStatus(FlowInstanceStatusEnum.Approved)); Assert.Equal("draft", SmartOpsImprovementApprovalRules.MapCompletedStatus(FlowInstanceStatusEnum.Rejected)); Assert.Equal("draft", SmartOpsImprovementApprovalRules.MapCompletedStatus(FlowInstanceStatusEnum.Cancelled)); } [Fact] public void FormalFlow_UsesRoleCodes_NotUserIdsOrInitiator() { var json = AidopImprovementApprovalSeed.BuildFormalFlowJson(); Assert.Contains("bpmn:exclusiveGateway", json); Assert.Contains("SMART_OPS_DEPT_HEAD", json); Assert.Contains("SMART_OPS_MODULE_OWNER", json); Assert.Contains("SMART_OPS_OPS_OWNER", json); Assert.Contains("route == yellow", json); Assert.Contains("route == red", json); Assert.DoesNotContain("Initiator", json); Assert.False(SmartOpsImprovementApprovalRules.IsLegacyInitiatorFallback(json)); Assert.True(SmartOpsImprovementApprovalRules.IsLegacyInitiatorFallback( """{"nodes":[{"properties":{"approverType":"Initiator"}}]}""")); } [Fact] public void PlanRoute_UsesPersistedSeverity() { var plan = new AdoSmartOpsImprovementPlan { ModuleCode = "S1", ProblemSeverity = "red", IsCrossDept = false, ProblemDept = "计划部", }; Assert.Equal("red", SmartOpsImprovementApprovalRules.ResolveRoute(plan)); } }