From a05afe6caccee4f865a68ffedb45ffea12f75171 Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Wed, 26 Feb 2025 16:09:50 +0100 Subject: [PATCH 1/4] Handle multiline statements in migrations --- src/Umbraco.Infrastructure/Migrations/MigrationExpressionBase.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Infrastructure/Migrations/MigrationExpressionBase.cs b/src/Umbraco.Infrastructure/Migrations/MigrationExpressionBase.cs index a2029cbef81d..07192f371d54 100644 --- a/src/Umbraco.Infrastructure/Migrations/MigrationExpressionBase.cs +++ b/src/Umbraco.Infrastructure/Migrations/MigrationExpressionBase.cs @@ -71,6 +71,7 @@ public virtual void Execute() else { stmtBuilder.Append(line); + stmtBuilder.Append(Environment.NewLine); } } From c36524c7adc60aef377e3658832c7f2b79cc1310 Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Tue, 4 Mar 2025 11:45:41 +0100 Subject: [PATCH 2/4] Fixed failing unit tests and incorrect obsoletion. --- .../Migrations/MigrationPlanExecutor.cs | 1 - .../Migrations/AlterMigrationTests.cs | 6 +++--- .../Umbraco.Infrastructure/Migrations/MigrationPlanTests.cs | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Infrastructure/Migrations/MigrationPlanExecutor.cs b/src/Umbraco.Infrastructure/Migrations/MigrationPlanExecutor.cs index 77677b0bfc3a..441ff674f2ab 100644 --- a/src/Umbraco.Infrastructure/Migrations/MigrationPlanExecutor.cs +++ b/src/Umbraco.Infrastructure/Migrations/MigrationPlanExecutor.cs @@ -92,7 +92,6 @@ public MigrationPlanExecutor( /// Each migration in the plan, may or may not run in a scope depending on the type of plan. /// A plan can complete partially, the changes of each completed migration will be saved. /// - [Obsolete("This will return an ExecutedMigrationPlan in V13")] public ExecutedMigrationPlan ExecutePlan(MigrationPlan plan, string fromState) { plan.Validate(); diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/AlterMigrationTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/AlterMigrationTests.cs index 516e7f80c146..c6824ae6ce03 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/AlterMigrationTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/AlterMigrationTests.cs @@ -49,7 +49,7 @@ public void Drop_Foreign_Key() // Assert Assert.That(database.Operations.Count, Is.EqualTo(1)); Assert.That( - database.Operations[0].Sql, + database.Operations[0].Sql.Trim(), Is.EqualTo("ALTER TABLE [umbracoUser2app] DROP CONSTRAINT [FK_umbracoUser2app_umbracoUser_id]")); } @@ -68,7 +68,7 @@ public void CreateColumn() Assert.That(database.Operations.Count, Is.EqualTo(1)); Assert.That( - database.Operations[0].Sql, + database.Operations[0].Sql.Trim(), Is.EqualTo("ALTER TABLE [bar] ADD [foo] UniqueIdentifier NOT NULL")); } @@ -97,7 +97,7 @@ public void AlterColumn() Assert.That(database.Operations.Count, Is.EqualTo(1)); Assert.That( - database.Operations[0].Sql, + database.Operations[0].Sql.Trim(), Is.EqualTo("ALTER TABLE [bar] ALTER COLUMN [foo] UniqueIdentifier NOT NULL")); } diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/MigrationPlanTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/MigrationPlanTests.cs index 398aa263eba5..d61884f8582b 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/MigrationPlanTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/MigrationPlanTests.cs @@ -99,7 +99,7 @@ public void CanExecute() Assert.AreEqual("VERSION.33", state); Assert.AreEqual(1, database.Operations.Count); - Assert.AreEqual("DROP TABLE [umbracoRedirectUrl]", database.Operations[0].Sql); + Assert.AreEqual("DROP TABLE [umbracoRedirectUrl]", database.Operations[0].Sql.Trim()); } [Test] From 576dc4d32871ac34ff4dda08bbcfcb19650ecced Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Tue, 4 Mar 2025 11:49:59 +0100 Subject: [PATCH 3/4] Fixed failing integration tests. --- .../SyntaxProvider/SqlServerSyntaxProviderTests.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/SyntaxProvider/SqlServerSyntaxProviderTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/SyntaxProvider/SqlServerSyntaxProviderTests.cs index 7e1d1f163f8f..db1a2eaa2cd5 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/SyntaxProvider/SqlServerSyntaxProviderTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/SyntaxProvider/SqlServerSyntaxProviderTests.cs @@ -18,7 +18,6 @@ using Umbraco.Cms.Tests.Common.TestHelpers; using Umbraco.Cms.Tests.Common.Testing; using Umbraco.Cms.Tests.Integration.Testing; -using Umbraco.Extensions; namespace Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Persistence.SyntaxProvider; @@ -137,7 +136,7 @@ public void CreateIndexBuilder_SqlServer_NonClustered_CreatesNonClusteredIndex() .Do(); Assert.AreEqual(1, db.Operations.Count); - Assert.AreEqual("CREATE NONCLUSTERED INDEX [IX_A] ON [TheTable] ([A])", db.Operations[0].Sql); + Assert.AreEqual("CREATE NONCLUSTERED INDEX [IX_A] ON [TheTable] ([A])", db.Operations[0].Sql.Trim()); } [Test] @@ -152,7 +151,7 @@ public void CreateIndexBuilder_SqlServer_Unique_CreatesUniqueNonClusteredIndex() .Do(); Assert.AreEqual(1, db.Operations.Count); - Assert.AreEqual("CREATE UNIQUE NONCLUSTERED INDEX [IX_A] ON [TheTable] ([A])", db.Operations[0].Sql); + Assert.AreEqual("CREATE UNIQUE NONCLUSTERED INDEX [IX_A] ON [TheTable] ([A])", db.Operations[0].Sql.Trim()); } [Test] @@ -167,7 +166,7 @@ public void CreateIndexBuilder_SqlServer_Unique_CreatesUniqueNonClusteredIndex_M .Do(); Assert.AreEqual(1, db.Operations.Count); - Assert.AreEqual("CREATE UNIQUE NONCLUSTERED INDEX [IX_AB] ON [TheTable] ([A],[B])", db.Operations[0].Sql); + Assert.AreEqual("CREATE UNIQUE NONCLUSTERED INDEX [IX_AB] ON [TheTable] ([A],[B])", db.Operations[0].Sql.Trim()); } [Test] @@ -182,7 +181,7 @@ public void CreateIndexBuilder_SqlServer_Clustered_CreatesClusteredIndex() .Do(); Assert.AreEqual(1, db.Operations.Count); - Assert.AreEqual("CREATE CLUSTERED INDEX [IX_A] ON [TheTable] ([A])", db.Operations[0].Sql); + Assert.AreEqual("CREATE CLUSTERED INDEX [IX_A] ON [TheTable] ([A])", db.Operations[0].Sql.Trim()); } private static IndexDefinition CreateIndexDefinition() => From fdcf1c676fb5e03b026b0abfb7b54baa07ff2315 Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Tue, 4 Mar 2025 14:26:59 +0100 Subject: [PATCH 4/4] Applied suggestion from code review. --- .../Migrations/MigrationExpressionBase.cs | 6 +++++- .../SyntaxProvider/SqlServerSyntaxProviderTests.cs | 8 ++++---- .../Migrations/AlterMigrationTests.cs | 6 +++--- .../Migrations/MigrationPlanTests.cs | 2 +- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Infrastructure/Migrations/MigrationExpressionBase.cs b/src/Umbraco.Infrastructure/Migrations/MigrationExpressionBase.cs index 07192f371d54..117eb8fe7b56 100644 --- a/src/Umbraco.Infrastructure/Migrations/MigrationExpressionBase.cs +++ b/src/Umbraco.Infrastructure/Migrations/MigrationExpressionBase.cs @@ -70,8 +70,12 @@ public virtual void Execute() } else { + if (stmtBuilder.Length > 0) + { + stmtBuilder.Append(Environment.NewLine); + } + stmtBuilder.Append(line); - stmtBuilder.Append(Environment.NewLine); } } diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/SyntaxProvider/SqlServerSyntaxProviderTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/SyntaxProvider/SqlServerSyntaxProviderTests.cs index db1a2eaa2cd5..3d419ff95579 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/SyntaxProvider/SqlServerSyntaxProviderTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/SyntaxProvider/SqlServerSyntaxProviderTests.cs @@ -136,7 +136,7 @@ public void CreateIndexBuilder_SqlServer_NonClustered_CreatesNonClusteredIndex() .Do(); Assert.AreEqual(1, db.Operations.Count); - Assert.AreEqual("CREATE NONCLUSTERED INDEX [IX_A] ON [TheTable] ([A])", db.Operations[0].Sql.Trim()); + Assert.AreEqual("CREATE NONCLUSTERED INDEX [IX_A] ON [TheTable] ([A])", db.Operations[0].Sql); } [Test] @@ -151,7 +151,7 @@ public void CreateIndexBuilder_SqlServer_Unique_CreatesUniqueNonClusteredIndex() .Do(); Assert.AreEqual(1, db.Operations.Count); - Assert.AreEqual("CREATE UNIQUE NONCLUSTERED INDEX [IX_A] ON [TheTable] ([A])", db.Operations[0].Sql.Trim()); + Assert.AreEqual("CREATE UNIQUE NONCLUSTERED INDEX [IX_A] ON [TheTable] ([A])", db.Operations[0].Sql); } [Test] @@ -166,7 +166,7 @@ public void CreateIndexBuilder_SqlServer_Unique_CreatesUniqueNonClusteredIndex_M .Do(); Assert.AreEqual(1, db.Operations.Count); - Assert.AreEqual("CREATE UNIQUE NONCLUSTERED INDEX [IX_AB] ON [TheTable] ([A],[B])", db.Operations[0].Sql.Trim()); + Assert.AreEqual("CREATE UNIQUE NONCLUSTERED INDEX [IX_AB] ON [TheTable] ([A],[B])", db.Operations[0].Sql); } [Test] @@ -181,7 +181,7 @@ public void CreateIndexBuilder_SqlServer_Clustered_CreatesClusteredIndex() .Do(); Assert.AreEqual(1, db.Operations.Count); - Assert.AreEqual("CREATE CLUSTERED INDEX [IX_A] ON [TheTable] ([A])", db.Operations[0].Sql.Trim()); + Assert.AreEqual("CREATE CLUSTERED INDEX [IX_A] ON [TheTable] ([A])", db.Operations[0].Sql); } private static IndexDefinition CreateIndexDefinition() => diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/AlterMigrationTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/AlterMigrationTests.cs index c6824ae6ce03..516e7f80c146 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/AlterMigrationTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/AlterMigrationTests.cs @@ -49,7 +49,7 @@ public void Drop_Foreign_Key() // Assert Assert.That(database.Operations.Count, Is.EqualTo(1)); Assert.That( - database.Operations[0].Sql.Trim(), + database.Operations[0].Sql, Is.EqualTo("ALTER TABLE [umbracoUser2app] DROP CONSTRAINT [FK_umbracoUser2app_umbracoUser_id]")); } @@ -68,7 +68,7 @@ public void CreateColumn() Assert.That(database.Operations.Count, Is.EqualTo(1)); Assert.That( - database.Operations[0].Sql.Trim(), + database.Operations[0].Sql, Is.EqualTo("ALTER TABLE [bar] ADD [foo] UniqueIdentifier NOT NULL")); } @@ -97,7 +97,7 @@ public void AlterColumn() Assert.That(database.Operations.Count, Is.EqualTo(1)); Assert.That( - database.Operations[0].Sql.Trim(), + database.Operations[0].Sql, Is.EqualTo("ALTER TABLE [bar] ALTER COLUMN [foo] UniqueIdentifier NOT NULL")); } diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/MigrationPlanTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/MigrationPlanTests.cs index d61884f8582b..398aa263eba5 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/MigrationPlanTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Migrations/MigrationPlanTests.cs @@ -99,7 +99,7 @@ public void CanExecute() Assert.AreEqual("VERSION.33", state); Assert.AreEqual(1, database.Operations.Count); - Assert.AreEqual("DROP TABLE [umbracoRedirectUrl]", database.Operations[0].Sql.Trim()); + Assert.AreEqual("DROP TABLE [umbracoRedirectUrl]", database.Operations[0].Sql); } [Test]