MdpSchemaDefinitionTests.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System.Text.RegularExpressions;
  2. using Admin.NET.Plugin.AiDOP.DataPlatform.Schema;
  3. using Xunit;
  4. namespace Admin.NET.Plugin.AiDOP.Tests.DataPlatform;
  5. public class MdpSchemaDefinitionTests
  6. {
  7. private static readonly Regex NeutralCreate = new(
  8. @"CREATE\s+TABLE\s+IF\s+NOT\s+EXISTS\s+`?(mdp_std_|mdp_stg_|dwd_)",
  9. RegexOptions.IgnoreCase | RegexOptions.Compiled);
  10. private static string PluginRoot()
  11. {
  12. var dir = new DirectoryInfo(AppContext.BaseDirectory);
  13. while (dir != null)
  14. {
  15. var candidate = Path.Combine(dir.FullName, "Plugins", "Admin.NET.Plugin.AiDOP");
  16. if (Directory.Exists(candidate))
  17. return candidate;
  18. // tests may run from server/Plugins/Admin.NET.Plugin.AiDOP.Tests/bin/...
  19. candidate = Path.Combine(dir.FullName, "Admin.NET.Plugin.AiDOP");
  20. if (Directory.Exists(candidate) && File.Exists(Path.Combine(candidate, "Admin.NET.Plugin.AiDOP.csproj")))
  21. return candidate;
  22. dir = dir.Parent;
  23. }
  24. throw new DirectoryNotFoundException("找不到 Admin.NET.Plugin.AiDOP 插件目录");
  25. }
  26. [Fact]
  27. public void MdpSyncSources_MustNotEmbedNeutralCreates()
  28. {
  29. var root = PluginRoot();
  30. var offenders = new List<string>();
  31. foreach (var file in Directory.EnumerateFiles(root, "*MdpSync*.cs", SearchOption.AllDirectories))
  32. {
  33. var text = File.ReadAllText(file);
  34. if (!NeutralCreate.IsMatch(text))
  35. continue;
  36. offenders.Add(Path.GetRelativePath(root, file));
  37. }
  38. Assert.True(
  39. offenders.Count == 0,
  40. "中立层 CREATE 不得留在 *MdpSync* 服务内,应使用 MdpSchemaDefinition.Ddl:\n"
  41. + string.Join("\n", offenders));
  42. }
  43. [Fact]
  44. public void Definition_ContainsRequiredTablesFromMovedCreates()
  45. {
  46. Assert.Contains("mdp_std_work_order_schedule", MdpSchemaDefinition.TableNames, StringComparer.OrdinalIgnoreCase);
  47. Assert.Contains("mdp_std_s6_report", MdpSchemaDefinition.TableNames, StringComparer.OrdinalIgnoreCase);
  48. // mdp_std_inv_trans 的 CREATE 原本不在本次搬迁的 *MdpSync* 文件中,故不登记、不断言。
  49. var wo = MdpSchemaDefinition.Ddl("mdp_std_work_order_schedule");
  50. Assert.Contains("approved_flag", wo, StringComparison.OrdinalIgnoreCase);
  51. Assert.Contains("void_flag", wo, StringComparison.OrdinalIgnoreCase);
  52. var report = MdpSchemaDefinition.Ddl("mdp_std_s6_report");
  53. Assert.Contains("start_work_date", report, StringComparison.OrdinalIgnoreCase);
  54. Assert.Contains("task_no", report, StringComparison.OrdinalIgnoreCase);
  55. Assert.Contains("domain", report, StringComparison.OrdinalIgnoreCase);
  56. }
  57. [Fact]
  58. public void Ddl_UnknownTable_Throws()
  59. {
  60. Assert.Throws<InvalidOperationException>(() => MdpSchemaDefinition.Ddl("mdp_std_not_registered_xyz"));
  61. }
  62. }