MdpSchemaAlignerTests.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. using Admin.NET.Plugin.AiDOP.DataPlatform.Schema;
  2. using Xunit;
  3. namespace Admin.NET.Plugin.AiDOP.Tests.DataPlatform;
  4. public class MdpSchemaAlignerTests
  5. {
  6. private const string Create = """
  7. CREATE TABLE IF NOT EXISTS mdp_std_demo (
  8. id BIGINT AUTO_INCREMENT PRIMARY KEY,
  9. tenant_id BIGINT NOT NULL,
  10. approved_flag TINYINT NOT NULL DEFAULT 1,
  11. UNIQUE KEY uk_demo (tenant_id),
  12. KEY idx_demo (approved_flag)
  13. ) ENGINE=InnoDB
  14. """;
  15. [Fact]
  16. public void MissingTable_PlansCreateOnly()
  17. {
  18. var planned = MdpSchemaAligner.Plan(Create, SchemaSnapshot.Missing);
  19. Assert.Single(planned);
  20. Assert.StartsWith("CREATE TABLE", planned[0], StringComparison.OrdinalIgnoreCase);
  21. Assert.DoesNotContain("DROP", planned[0], StringComparison.OrdinalIgnoreCase);
  22. }
  23. [Fact]
  24. public void MissingColumnAndIndex_PlansAdditiveAlterOnly()
  25. {
  26. var snapshot = new SchemaSnapshot(true, ["id", "tenant_id"], ["PRIMARY"]);
  27. var planned = MdpSchemaAligner.Plan(Create, snapshot);
  28. Assert.Equal(3, planned.Count);
  29. Assert.Contains(planned, x => x.Contains("ADD COLUMN approved_flag", StringComparison.OrdinalIgnoreCase));
  30. Assert.Contains(planned, x => x.Contains("ADD UNIQUE KEY `uk_demo`", StringComparison.OrdinalIgnoreCase));
  31. Assert.Contains(planned, x => x.Contains("ADD KEY `idx_demo`", StringComparison.OrdinalIgnoreCase));
  32. Assert.DoesNotContain(planned, x => x.Contains("DROP", StringComparison.OrdinalIgnoreCase));
  33. }
  34. [Fact]
  35. public void ReadyTable_PlansNothing()
  36. {
  37. var snapshot = new SchemaSnapshot(
  38. true,
  39. ["id", "tenant_id", "approved_flag"],
  40. ["PRIMARY", "uk_demo", "idx_demo"]);
  41. Assert.Empty(MdpSchemaAligner.Plan(Create, snapshot));
  42. }
  43. [Fact]
  44. public void LikeTable_SkippedWhenPresent()
  45. {
  46. const string like = "CREATE TABLE IF NOT EXISTS mdp_stg_s4_shipment LIKE mdp_stg_s4_iqc";
  47. Assert.Empty(MdpSchemaAligner.Plan(like, new SchemaSnapshot(true, [], [])));
  48. var created = MdpSchemaAligner.Plan(like, SchemaSnapshot.Missing);
  49. Assert.Single(created);
  50. Assert.Contains("LIKE", created[0], StringComparison.OrdinalIgnoreCase);
  51. }
  52. [Fact]
  53. public void NonNeutralTable_IsLeftUntouched()
  54. {
  55. const string sql = "CREATE TABLE IF NOT EXISTS qms_demo (id BIGINT)";
  56. var planned = MdpSchemaAligner.Plan(sql, SchemaSnapshot.Missing);
  57. Assert.Equal([sql], planned);
  58. }
  59. }