GridAndInboundGuardTests.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using Admin.NET.Plugin.AiDOP.DataPlatform;
  2. using SqlSugar;
  3. using Xunit;
  4. namespace Admin.NET.Plugin.AiDOP.Tests.DataPlatform;
  5. /// <summary>
  6. /// 九宫格取数与入站诊断日志的守卫。锚在实现正文,避免匹配到接口声明。
  7. /// </summary>
  8. public class GridAndInboundGuardTests
  9. {
  10. private static string Read(string relative)
  11. {
  12. var path = Path.Combine(FindRepoRoot(), relative);
  13. return File.ReadAllText(path);
  14. }
  15. [Fact]
  16. public void Seed_Defines_S5_L1_004()
  17. {
  18. var source = Read(@"server\Plugins\Admin.NET.Plugin.AiDOP\Infrastructure\AidopKpiMasterSeed.cs");
  19. Assert.Contains("\"S5_L1_004\"", source);
  20. Assert.Contains("品类物料库存周转", source);
  21. }
  22. [Fact]
  23. public void HomeGrid_ItemBizDate_DoesNotFallBackToModuleDate()
  24. {
  25. var source = Read(@"server\Plugins\Admin.NET.Plugin.AiDOP\Controllers\AidopKanbanController.Generic.cs");
  26. Assert.Contains("v.biz_date AS BizDate", source);
  27. Assert.Contains("filteredBundle == null ? v?.BizDate : null", source);
  28. var items = source.IndexOf("items.Add(new", StringComparison.Ordinal);
  29. Assert.True(items > 0);
  30. var slice = source[items..source.IndexOf("return Ok", items, StringComparison.Ordinal)];
  31. Assert.Contains("bizDate = itemBizDate", slice);
  32. Assert.DoesNotContain("bizDate = bizDate", slice);
  33. }
  34. [Fact]
  35. public void GateLog_SamplesBeforeConcat_AndDoesNotKillThePipeline()
  36. {
  37. var inventory = SliceMethod(Read(@"server\Plugins\Admin.NET.Plugin.AiDOP\MaterialWarehouse\InventoryMdpSyncService.cs"),
  38. "private async Task LogWorkOrderNotFoundAsync");
  39. Assert.Contains("LIMIT 20", inventory);
  40. Assert.Contains("try", inventory);
  41. Assert.DoesNotContain("GROUP_CONCAT(DISTINCT t.work_ord)", inventory);
  42. Assert.Contains("LogWarning", inventory);
  43. var shipFile = Read(@"server\Plugins\Admin.NET.Plugin.AiDOP\DataPlatform\Wms\ShipTransNeutralProjection.cs");
  44. var mark = shipFile.IndexOf("写失败不得中断发运投影", StringComparison.Ordinal);
  45. Assert.True(mark > 0);
  46. var around = shipFile.Substring(Math.Max(0, mark - 120), 500);
  47. Assert.Contains("try", around);
  48. Assert.Contains("LIMIT 12", shipFile);
  49. Assert.DoesNotContain("GROUP_CONCAT(DISTINCT CONCAT", shipFile);
  50. Assert.Contains("LogWarning", shipFile);
  51. }
  52. [Fact]
  53. public void ExtraParams_DropsConfigId_AndKeepsForeignKeys()
  54. {
  55. var dropped = new List<string>();
  56. var sqlServer = MdpSourceScopeFactory.SanitizeExtraParams(
  57. "ConfigId=t8_v5;TrustServerCertificate=true;Application Name=aidop",
  58. DbType.SqlServer, out dropped);
  59. Assert.Contains("ConfigId", dropped, StringComparer.OrdinalIgnoreCase);
  60. Assert.Contains("TrustServerCertificate", dropped, StringComparer.OrdinalIgnoreCase);
  61. Assert.DoesNotContain("ConfigId", sqlServer ?? "", StringComparison.OrdinalIgnoreCase);
  62. Assert.Contains("Application Name", sqlServer ?? "", StringComparison.OrdinalIgnoreCase);
  63. var mysql = MdpSourceScopeFactory.SanitizeExtraParams(
  64. "SslMode=Required;Connection Timeout=15",
  65. DbType.MySql, out dropped);
  66. Assert.Empty(dropped);
  67. Assert.Contains("SslMode", mysql ?? "", StringComparison.OrdinalIgnoreCase);
  68. var pg = MdpSourceScopeFactory.SanitizeExtraParams(
  69. "SslMode=Require;Timeout=15",
  70. DbType.PostgreSQL, out dropped);
  71. Assert.Empty(dropped);
  72. Assert.Contains("SslMode", pg ?? "", StringComparison.OrdinalIgnoreCase);
  73. }
  74. private static string SliceMethod(string source, string anchor)
  75. {
  76. var start = source.IndexOf(anchor, StringComparison.Ordinal);
  77. Assert.True(start >= 0, anchor);
  78. var end = source.IndexOf("\n private ", start + anchor.Length, StringComparison.Ordinal);
  79. if (end < 0) end = source.IndexOf("\n public ", start + anchor.Length, StringComparison.Ordinal);
  80. if (end < 0) end = source.Length;
  81. return source[start..end];
  82. }
  83. private static string FindRepoRoot()
  84. {
  85. var dir = new DirectoryInfo(AppContext.BaseDirectory);
  86. while (dir != null)
  87. {
  88. if (File.Exists(Path.Combine(dir.FullName, "AGENTS.md")))
  89. return dir.FullName;
  90. dir = dir.Parent;
  91. }
  92. throw new InvalidOperationException("找不到仓库根目录");
  93. }
  94. }