using Admin.NET.Plugin.AiDOP.DataPlatform.Schema; using Xunit; namespace Admin.NET.Plugin.AiDOP.Tests.DataPlatform; public class MdpSchemaAlignerTests { private const string Create = """ CREATE TABLE IF NOT EXISTS mdp_std_demo ( id BIGINT AUTO_INCREMENT PRIMARY KEY, tenant_id BIGINT NOT NULL, approved_flag TINYINT NOT NULL DEFAULT 1, UNIQUE KEY uk_demo (tenant_id), KEY idx_demo (approved_flag) ) ENGINE=InnoDB """; [Fact] public void MissingTable_PlansCreateOnly() { var planned = MdpSchemaAligner.Plan(Create, SchemaSnapshot.Missing); Assert.Single(planned); Assert.StartsWith("CREATE TABLE", planned[0], StringComparison.OrdinalIgnoreCase); Assert.DoesNotContain("DROP", planned[0], StringComparison.OrdinalIgnoreCase); } [Fact] public void MissingColumnAndIndex_PlansAdditiveAlterOnly() { var snapshot = new SchemaSnapshot(true, ["id", "tenant_id"], ["PRIMARY"]); var planned = MdpSchemaAligner.Plan(Create, snapshot); Assert.Equal(3, planned.Count); Assert.Contains(planned, x => x.Contains("ADD COLUMN approved_flag", StringComparison.OrdinalIgnoreCase)); Assert.Contains(planned, x => x.Contains("ADD UNIQUE KEY `uk_demo`", StringComparison.OrdinalIgnoreCase)); Assert.Contains(planned, x => x.Contains("ADD KEY `idx_demo`", StringComparison.OrdinalIgnoreCase)); Assert.DoesNotContain(planned, x => x.Contains("DROP", StringComparison.OrdinalIgnoreCase)); } [Fact] public void ReadyTable_PlansNothing() { var snapshot = new SchemaSnapshot( true, ["id", "tenant_id", "approved_flag"], ["PRIMARY", "uk_demo", "idx_demo"]); Assert.Empty(MdpSchemaAligner.Plan(Create, snapshot)); } [Fact] public void LikeTable_SkippedWhenPresent() { const string like = "CREATE TABLE IF NOT EXISTS mdp_stg_s4_shipment LIKE mdp_stg_s4_iqc"; Assert.Empty(MdpSchemaAligner.Plan(like, new SchemaSnapshot(true, [], []))); var created = MdpSchemaAligner.Plan(like, SchemaSnapshot.Missing); Assert.Single(created); Assert.Contains("LIKE", created[0], StringComparison.OrdinalIgnoreCase); } [Fact] public void NonNeutralTable_IsLeftUntouched() { const string sql = "CREATE TABLE IF NOT EXISTS qms_demo (id BIGINT)"; var planned = MdpSchemaAligner.Plan(sql, SchemaSnapshot.Missing); Assert.Equal([sql], planned); } }