From 2b12eadd3d7636088306b74273121439bdfbc43a Mon Sep 17 00:00:00 2001 From: Mole Date: Mon, 7 Oct 2024 11:11:22 +0200 Subject: [PATCH] V15: Refresh IPublishedContentTypeFactory when data types change (#17180) * Refresh IPublishedContentTypeFactory when data types change * Add tests --- .../Implement/ContentTypeCacheRefresher.cs | 7 +- .../Implement/DataTypeCacheRefresher.cs | 8 +- .../TestHelpers/ContentTypeUpdateHelper.cs | 6 +- ...mbracoIntegrationTestWithContentEditing.cs | 3 +- .../Cache/PublishedContentTypeCacheTests.cs | 3 +- .../PublishContentTypeFactoryTest.cs | 98 +++++++++++++++++++ 6 files changed, 116 insertions(+), 9 deletions(-) create mode 100644 tests/Umbraco.Tests.Integration/Umbraco.Core/PublishedContent/PublishContentTypeFactoryTest.cs diff --git a/src/Umbraco.Core/Cache/Refreshers/Implement/ContentTypeCacheRefresher.cs b/src/Umbraco.Core/Cache/Refreshers/Implement/ContentTypeCacheRefresher.cs index dba66ec1b0..f9936933cc 100644 --- a/src/Umbraco.Core/Cache/Refreshers/Implement/ContentTypeCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/Refreshers/Implement/ContentTypeCacheRefresher.cs @@ -14,6 +14,7 @@ public sealed class ContentTypeCacheRefresher : PayloadCacheRefresherBase { }); + _publishedContentTypeFactory.NotifyDataTypeChanges(); + // now we can trigger the event base.Refresh(payloads); } diff --git a/src/Umbraco.Core/Cache/Refreshers/Implement/DataTypeCacheRefresher.cs b/src/Umbraco.Core/Cache/Refreshers/Implement/DataTypeCacheRefresher.cs index f28dd89ea5..de25660fa0 100644 --- a/src/Umbraco.Core/Cache/Refreshers/Implement/DataTypeCacheRefresher.cs +++ b/src/Umbraco.Core/Cache/Refreshers/Implement/DataTypeCacheRefresher.cs @@ -13,6 +13,7 @@ public sealed class DataTypeCacheRefresher : PayloadCacheRefresherBase { }); + var changedIds = payloads.Select(x => x.Id).ToArray(); + _publishedContentTypeFactory.NotifyDataTypeChanges(changedIds); + base.Refresh(payloads); } diff --git a/tests/Umbraco.Tests.Common/TestHelpers/ContentTypeUpdateHelper.cs b/tests/Umbraco.Tests.Common/TestHelpers/ContentTypeUpdateHelper.cs index d2d083cde7..df62d92994 100644 --- a/tests/Umbraco.Tests.Common/TestHelpers/ContentTypeUpdateHelper.cs +++ b/tests/Umbraco.Tests.Common/TestHelpers/ContentTypeUpdateHelper.cs @@ -4,16 +4,16 @@ using Umbraco.Extensions; namespace Umbraco.Cms.Tests.Common.TestHelpers; -public class ContentTypeUpdateHelper +public static class ContentTypeUpdateHelper { - public ContentTypeUpdateModel CreateContentTypeUpdateModel(IContentType contentType) + public static ContentTypeUpdateModel CreateContentTypeUpdateModel(IContentType contentType) { var updateModel = new ContentTypeUpdateModel(); var model = MapBaseProperties(contentType, updateModel); return model; } - private T MapBaseProperties(IContentType contentType, T model) where T : ContentTypeModelBase + private static T MapBaseProperties(IContentType contentType, T model) where T : ContentTypeModelBase { model.Alias = contentType.Alias; model.Name = contentType.Name; diff --git a/tests/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTestWithContentEditing.cs b/tests/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTestWithContentEditing.cs index e1f047dd90..fba87a9893 100644 --- a/tests/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTestWithContentEditing.cs +++ b/tests/Umbraco.Tests.Integration/Testing/UmbracoIntegrationTestWithContentEditing.cs @@ -67,8 +67,7 @@ public abstract class UmbracoIntegrationTestWithContentEditing : UmbracoIntegrat Assert.IsTrue(contentTypeAttempt.Success); var contentTypeResult = contentTypeAttempt.Result; - ContentTypeUpdateHelper contentTypeUpdateHelper = new ContentTypeUpdateHelper(); - ContentTypeUpdateModel = contentTypeUpdateHelper.CreateContentTypeUpdateModel(contentTypeResult); ContentTypeUpdateModel.AllowedContentTypes = new[] + ContentTypeUpdateModel = ContentTypeUpdateHelper.CreateContentTypeUpdateModel(contentTypeResult); ContentTypeUpdateModel.AllowedContentTypes = new[] { new ContentTypeSort(contentTypeResult.Key, 0, ContentTypeCreateModel.Alias), }; diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Core/Cache/PublishedContentTypeCacheTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Core/Cache/PublishedContentTypeCacheTests.cs index d74439634a..71c450b54c 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Core/Cache/PublishedContentTypeCacheTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Core/Cache/PublishedContentTypeCacheTests.cs @@ -37,8 +37,7 @@ public class PublishedContentTypeCacheTests : UmbracoIntegrationTestWithContentE Assert.IsNotNull(contentType); Assert.AreEqual(1, ContentType.PropertyTypes.Count()); // Update the content type - ContentTypeUpdateHelper contentTypeUpdateHelper = new ContentTypeUpdateHelper(); - var updateModel = contentTypeUpdateHelper.CreateContentTypeUpdateModel(ContentType); + var updateModel = ContentTypeUpdateHelper.CreateContentTypeUpdateModel(ContentType); updateModel.Properties = new List(); await ContentTypeEditingService.UpdateAsync(ContentType, updateModel, Constants.Security.SuperUserKey); diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Core/PublishedContent/PublishContentTypeFactoryTest.cs b/tests/Umbraco.Tests.Integration/Umbraco.Core/PublishedContent/PublishContentTypeFactoryTest.cs new file mode 100644 index 0000000000..c8805492a9 --- /dev/null +++ b/tests/Umbraco.Tests.Integration/Umbraco.Core/PublishedContent/PublishContentTypeFactoryTest.cs @@ -0,0 +1,98 @@ +using NUnit.Framework; +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Cache; +using Umbraco.Cms.Core.Models.PublishedContent; +using Umbraco.Cms.Core.Notifications; +using Umbraco.Cms.Core.Services; +using Umbraco.Cms.Core.Services.ContentTypeEditing; +using Umbraco.Cms.Core.Sync; +using Umbraco.Cms.Tests.Common.Builders; +using Umbraco.Cms.Tests.Common.Builders.Extensions; +using Umbraco.Cms.Tests.Common.TestHelpers; +using Umbraco.Cms.Tests.Common.Testing; +using Umbraco.Cms.Tests.Integration.Testing; +using Umbraco.Cms.Tests.Integration.Umbraco.Infrastructure.Services; + +namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.PublishedContent; + +[TestFixture] +[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)] +public class PublishContentTypeFactoryTest : UmbracoIntegrationTest +{ + protected override void CustomTestSetup(IUmbracoBuilder builder) + { + builder.AddNotificationHandler(); + builder.AddNotificationHandler(); + builder.Services.AddUnique(); + base.CustomTestSetup(builder); + } + + private ITemplateService TemplateService => GetRequiredService(); + + private IContentTypeEditingService ContentTypeEditingService => GetRequiredService(); + + private IDataTypeService DataTypeService => GetRequiredService(); + + private IPublishedContentTypeFactory PublishedContentTypeFactory => GetRequiredService(); + + [Test] + public async Task Can_Update_Content_Type() + { + // Create a content type + var template = TemplateBuilder.CreateTextPageTemplate("defaultTemplate"); + await TemplateService.CreateAsync(template, Constants.Security.SuperUserKey); + var contentTypeCreateModel = ContentTypeEditingBuilder.CreateSimpleContentType("umbTextpage", "Textpage", defaultTemplateKey: template.Key); + var contentTypeAttempt = await ContentTypeEditingService.CreateAsync(contentTypeCreateModel, Constants.Security.SuperUserKey); + Assert.IsTrue(contentTypeAttempt.Success); + Assert.IsNotNull(contentTypeAttempt.Result); + + // Fetch the content type to cache data types + var contentType = contentTypeAttempt.Result; + PublishedContentTypeFactory.CreateContentType(contentType); + + var dataType = new DataTypeBuilder() + .WithId(0) + .Build(); + var dataTypeCreateResult = await DataTypeService.CreateAsync(dataType, Constants.Security.SuperUserKey); + Assert.IsTrue(dataTypeCreateResult.Success); + + contentType.AddPropertyGroup("group", "Group"); + var propertyTypeAlias = "test"; + var propertyType = new PropertyTypeBuilder() + .WithAlias(propertyTypeAlias) + .WithDataTypeId(dataTypeCreateResult.Result.Id) + .Build(); + propertyType.DataTypeKey = dataType.Key; + + contentType.AddPropertyType(propertyType, "group", "Group"); + + // Update the content type + var contentTypeUpdate = ContentTypeUpdateHelper.CreateContentTypeUpdateModel(contentType); + var updateResult = await ContentTypeEditingService.UpdateAsync(contentType, contentTypeUpdate, Constants.Security.SuperUserKey); + Assert.IsTrue(updateResult.Success); + + + var publishedContentType = PublishedContentTypeFactory.CreateContentType(updateResult.Result); + Assert.That(publishedContentType.PropertyTypes.Where(x => x.Alias == propertyTypeAlias), Is.Not.Empty); + } + + [Test] + public async Task Can_Get_Updated_Datatype() + { + var dataType = new DataTypeBuilder() + .WithId(0) + .Build(); + dataType.EditorUiAlias = "NotUpdated"; + var dataTypeCreateResult = await DataTypeService.CreateAsync(dataType, Constants.Security.SuperUserKey); + Assert.IsTrue(dataTypeCreateResult.Success); + var createdDataType = dataTypeCreateResult.Result; + PublishedDataType createdPublishedDataType = PublishedContentTypeFactory.GetDataType(createdDataType.Id); + Assert.That(createdPublishedDataType.EditorUiAlias, Is.EqualTo("NotUpdated")); + + createdDataType.EditorUiAlias = "Updated"; + var dataTypeUpdateResult = await DataTypeService.UpdateAsync(createdDataType, Constants.Security.SuperUserKey); + Assert.IsTrue(dataTypeUpdateResult.Success); + var updatedPublishedDataType = PublishedContentTypeFactory.GetDataType(createdDataType.Id); + Assert.That(updatedPublishedDataType.EditorUiAlias, Is.EqualTo("Updated")); + } +}