diff --git a/src/Umbraco.Core/Migrations/Upgrade/V_8_17_0/AddPropertyTypeGroupColumns.cs b/src/Umbraco.Core/Migrations/Upgrade/V_8_17_0/AddPropertyTypeGroupColumns.cs index 588f4f2d03..257cd22c7b 100644 --- a/src/Umbraco.Core/Migrations/Upgrade/V_8_17_0/AddPropertyTypeGroupColumns.cs +++ b/src/Umbraco.Core/Migrations/Upgrade/V_8_17_0/AddPropertyTypeGroupColumns.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using Umbraco.Core.Logging; using Umbraco.Core.Persistence.Dtos; @@ -14,9 +15,21 @@ namespace Umbraco.Core.Migrations.Upgrade.V_8_17_0 { AddColumn("type"); + // Add column without constraints AddColumn("alias", out var sqls); + // Populate non-null alias column var dtos = Database.Fetch(); + foreach (var dto in PopulateAliases(dtos)) + Database.Update(dto, x => new { x.Alias }); + + // Finally add the constraints + foreach (var sql in sqls) + Database.Execute(sql); + } + + internal IEnumerable PopulateAliases(IEnumerable dtos) + { foreach (var dtosPerAlias in dtos.GroupBy(x => x.Text.ToSafeAlias(true))) { var dtosPerAliasAndText = dtosPerAlias.GroupBy(x => x.Text); @@ -33,7 +46,7 @@ namespace Umbraco.Core.Migrations.Upgrade.V_8_17_0 dto.Alias += numberSuffix; } - Database.Update(dto, x => new { x.Alias }); + yield return dto; } numberSuffix++; @@ -44,9 +57,6 @@ namespace Umbraco.Core.Migrations.Upgrade.V_8_17_0 Logger.Error("Detected the same alias {Alias} for different property group names {Names}, the migration added suffixes, but this might break backwards compatibility.", dtosPerAlias.Key, dtosPerAliasAndText.Select(x => x.Key)); } } - - foreach (var sql in sqls) - Database.Execute(sql); } } } diff --git a/src/Umbraco.Tests/Migrations/Upgrade/V_8_17_0/AddPropertyTypeGroupColumnsTests.cs b/src/Umbraco.Tests/Migrations/Upgrade/V_8_17_0/AddPropertyTypeGroupColumnsTests.cs new file mode 100644 index 0000000000..0ef06cc990 --- /dev/null +++ b/src/Umbraco.Tests/Migrations/Upgrade/V_8_17_0/AddPropertyTypeGroupColumnsTests.cs @@ -0,0 +1,54 @@ +using System.Linq; +using NUnit.Framework; +using Umbraco.Core.Migrations; +using Umbraco.Core.Migrations.Upgrade.V_8_17_0; +using Umbraco.Core.Persistence.Dtos; +using Umbraco.Core.Strings; +using Umbraco.Tests.TestHelpers; +using Umbraco.Tests.Testing; + +namespace Umbraco.Tests.Migrations.Upgrade.V_8_17_0 +{ + [TestFixture] + public class AddPropertyTypeGroupColumnsTests : UmbracoTestBase + { + protected override void Compose() + { + base.Compose(); + Composition.RegisterUnique(_ => new DefaultShortStringHelper(SettingsForTests.GenerateMockUmbracoSettings())); + } + + [Test] + public void CreateColumn() + { + var database = new TestDatabase(); + var context = new MigrationContext(database, Logger); + var migration = new AddPropertyTypeGroupColumns(context); + + var dtos = new[] + { + new PropertyTypeGroupDto() { Id = 0, Text = "Content" }, + new PropertyTypeGroupDto() { Id = 1, Text = "Content" }, + new PropertyTypeGroupDto() { Id = 2, Text = "Settings" }, + new PropertyTypeGroupDto() { Id = 3, Text = "Content " }, // The trailing space is intentional + new PropertyTypeGroupDto() { Id = 4, Text = "SEO/OpenGraph" }, + new PropertyTypeGroupDto() { Id = 5, Text = "Site defaults" } + }; + + var populatedDtos = migration.PopulateAliases(dtos) + .OrderBy(x => x.Id) // The populated DTOs can be returned in a different order + .ToArray(); + + // All DTOs should be returned and Id and Text should be unaltered + Assert.That(dtos.Select(x => (x.Id, x.Text)), Is.EquivalentTo(populatedDtos.Select(x => (x.Id, x.Text)))); + + // Check populated aliases + Assert.That(populatedDtos[0].Alias, Is.EqualTo("content")); + Assert.That(populatedDtos[1].Alias, Is.EqualTo("content")); + Assert.That(populatedDtos[2].Alias, Is.EqualTo("settings")); + Assert.That(populatedDtos[3].Alias, Is.EqualTo("content2")); + Assert.That(populatedDtos[4].Alias, Is.EqualTo("sEOOpenGraph")); + Assert.That(populatedDtos[5].Alias, Is.EqualTo("siteDefaults")); + } + } +} diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 815db985ce..7bb90e9f93 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -132,6 +132,7 @@ + @@ -610,7 +611,6 @@ Always - @@ -648,4 +648,4 @@ - + \ No newline at end of file