SmartOpsImprovementApprovalTests.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using Admin.NET.Plugin.AiDOP.Entity;
  2. using Admin.NET.Plugin.AiDOP.Infrastructure;
  3. using Admin.NET.Plugin.ApprovalFlow;
  4. using Xunit;
  5. namespace Admin.NET.Plugin.AiDOP.Tests.SmartOps;
  6. public class SmartOpsImprovementApprovalTests
  7. {
  8. [Theory]
  9. [InlineData("S1", "yellow", false, null, "yellow")]
  10. [InlineData("S1", "red", false, null, "red")]
  11. [InlineData("S1", "green", false, null, "yellow")]
  12. [InlineData("S9", "yellow", false, null, "global")]
  13. [InlineData("S2", "yellow", true, null, "global")]
  14. [InlineData("S3", "red", false, "计划部/采购部跨部门", "global")]
  15. public void Route_FollowsSeverityAndCrossDept(string module, string severity, bool cross, string? dept, string expected)
  16. {
  17. Assert.Equal(expected, SmartOpsImprovementApprovalRules.ResolveRoute(module, severity, cross, dept));
  18. }
  19. [Theory]
  20. [InlineData("yellow", new[] { "SMART_OPS_DEPT_HEAD" })]
  21. [InlineData("red", new[] { "SMART_OPS_DEPT_HEAD", "SMART_OPS_OPS_OWNER" })]
  22. [InlineData("global", new[] { "SMART_OPS_DEPT_HEAD", "SMART_OPS_MODULE_OWNER", "SMART_OPS_OPS_OWNER" })]
  23. public void RequiredRoles_MatchFormalBaseline(string route, string[] expected)
  24. {
  25. Assert.Equal(expected, SmartOpsImprovementApprovalRules.RequiredRoleCodes(route));
  26. }
  27. [Fact]
  28. public void CompletedStatus_ApprovedThenExecute_RejectReturnsDraft()
  29. {
  30. Assert.Equal("approved", SmartOpsImprovementApprovalRules.MapCompletedStatus(FlowInstanceStatusEnum.Approved));
  31. Assert.Equal("draft", SmartOpsImprovementApprovalRules.MapCompletedStatus(FlowInstanceStatusEnum.Rejected));
  32. Assert.Equal("draft", SmartOpsImprovementApprovalRules.MapCompletedStatus(FlowInstanceStatusEnum.Cancelled));
  33. }
  34. [Fact]
  35. public void FormalFlow_UsesRoleCodes_NotUserIdsOrInitiator()
  36. {
  37. var json = AidopImprovementApprovalSeed.BuildFormalFlowJson();
  38. Assert.Contains("bpmn:exclusiveGateway", json);
  39. Assert.Contains("SMART_OPS_DEPT_HEAD", json);
  40. Assert.Contains("SMART_OPS_MODULE_OWNER", json);
  41. Assert.Contains("SMART_OPS_OPS_OWNER", json);
  42. Assert.Contains("route == yellow", json);
  43. Assert.Contains("route == red", json);
  44. Assert.DoesNotContain("Initiator", json);
  45. Assert.False(SmartOpsImprovementApprovalRules.IsLegacyInitiatorFallback(json));
  46. Assert.True(SmartOpsImprovementApprovalRules.IsLegacyInitiatorFallback(
  47. """{"nodes":[{"properties":{"approverType":"Initiator"}}]}"""));
  48. }
  49. [Fact]
  50. public void PlanRoute_UsesPersistedSeverity()
  51. {
  52. var plan = new AdoSmartOpsImprovementPlan
  53. {
  54. ModuleCode = "S1",
  55. ProblemSeverity = "red",
  56. IsCrossDept = false,
  57. ProblemDept = "计划部",
  58. };
  59. Assert.Equal("red", SmartOpsImprovementApprovalRules.ResolveRoute(plan));
  60. }
  61. }