KpiResultStatusResolverTests.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System.Text.RegularExpressions;
  2. using Admin.NET.Plugin.AiDOP.SmartOps;
  3. using Xunit;
  4. namespace Admin.NET.Plugin.AiDOP.Tests.SmartOps;
  5. public class KpiResultStatusResolverTests
  6. {
  7. [Fact]
  8. public void SeedMetrics_AllHaveADependencyRow()
  9. {
  10. var root = RepoRoot();
  11. var seed = File.ReadAllText(Path.Combine(
  12. root, "server", "Plugins", "Admin.NET.Plugin.AiDOP", "Infrastructure", "AidopKpiMasterSeed.cs"));
  13. var codes = Regex.Matches(seed, "\"(S[5679]_L\\d+_\\d+)\"")
  14. .Select(m => m.Groups[1].Value)
  15. .Distinct(StringComparer.Ordinal)
  16. .ToList();
  17. var missing = codes.Where(c => !KpiSemanticDependency.Contains(c)).OrderBy(c => c).ToList();
  18. Assert.True(missing.Count == 0, "附录 F 缺行: " + string.Join(", ", missing));
  19. Assert.Contains("S5_L1_004", KpiSemanticDependency.Codes);
  20. }
  21. [Fact]
  22. public void UnsupportedSemantic_NullsTheValue()
  23. {
  24. var decision = KpiResultStatusResolver.Resolve(
  25. "S7_L2_013",
  26. 3m,
  27. new Dictionary<string, string> { ["FG_RECEIPT_TIME"] = "源系统没有客户签收时间" },
  28. new HashSet<string>());
  29. Assert.Equal("SOURCE_UNSUPPORTED", decision.Status);
  30. Assert.Null(decision.Value);
  31. Assert.Contains("客户签收", decision.Reason);
  32. }
  33. [Fact]
  34. public void MissingObject_IsFailed()
  35. {
  36. var decision = KpiResultStatusResolver.Resolve(
  37. "S7_L1_001",
  38. 1m,
  39. new Dictionary<string, string>(),
  40. new HashSet<string>());
  41. Assert.Equal("FAILED", decision.Status);
  42. Assert.Null(decision.Value);
  43. }
  44. [Fact]
  45. public void StarredLocation_DoesNotFailReceiptEfficiency()
  46. {
  47. var decision = KpiResultStatusResolver.Resolve(
  48. "S5_L3_002",
  49. 2m,
  50. new Dictionary<string, string> { ["INV_LOCATION"] = "无库位" },
  51. new HashSet<string>());
  52. Assert.Equal("OK", decision.Status);
  53. Assert.Equal(2m, decision.Value);
  54. }
  55. [Fact]
  56. public void NullValue_IsNoData()
  57. {
  58. var decision = KpiResultStatusResolver.Resolve(
  59. "S5_L1_001",
  60. null,
  61. new Dictionary<string, string>(),
  62. new HashSet<string>());
  63. Assert.Equal("NO_DATA", decision.Status);
  64. Assert.Null(decision.Value);
  65. }
  66. private static string RepoRoot()
  67. {
  68. var dir = new DirectoryInfo(AppContext.BaseDirectory);
  69. while (dir != null)
  70. {
  71. if (Directory.Exists(Path.Combine(dir.FullName, "server", "Plugins", "Admin.NET.Plugin.AiDOP")))
  72. return dir.FullName;
  73. dir = dir.Parent;
  74. }
  75. throw new DirectoryNotFoundException("repo root");
  76. }
  77. }