From 668f4e15e357068b08d00d48ff65c1a967284699 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Wed, 2 Oct 2024 09:10:18 +0200 Subject: [PATCH] Fixed issues with publishing in cache and reintroduced tests (#17168) * Fixed issues with publishing in cache and reintroduced tests * Fixed issue with republishing and templates --- .../Factories/CacheNodeFactory.cs | 5 +- .../DocumentHybridCacheTemplateTests.cs | 85 +- .../DocumentHybridCacheTests.cs | 988 +++++++++--------- 3 files changed, 539 insertions(+), 539 deletions(-) diff --git a/src/Umbraco.PublishedCache.HybridCache/Factories/CacheNodeFactory.cs b/src/Umbraco.PublishedCache.HybridCache/Factories/CacheNodeFactory.cs index e263485cf47f..7fa38dd62637 100644 --- a/src/Umbraco.PublishedCache.HybridCache/Factories/CacheNodeFactory.cs +++ b/src/Umbraco.PublishedCache.HybridCache/Factories/CacheNodeFactory.cs @@ -45,7 +45,7 @@ private bool GetPublishedValue(IContent content, bool preview) switch (content.PublishedState) { case PublishedState.Published: - return preview; + return preview is false; case PublishedState.Publishing: return preview is false || content.Published; // The type changes after this operation case PublishedState.Unpublished: @@ -62,9 +62,10 @@ private bool GetPublishedValue(IContent content, bool preview) case PublishedState.Published: return preview ? content.TemplateId : content.PublishTemplateId; case PublishedState.Publishing: - return content.TemplateId;// The type changes after this operation is we need to read the draft values case PublishedState.Unpublished: case PublishedState.Unpublishing: + return content.TemplateId; + default: return null; } diff --git a/tests/Umbraco.Tests.Integration/Umbraco.PublishedCache.HybridCache/DocumentHybridCacheTemplateTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.PublishedCache.HybridCache/DocumentHybridCacheTemplateTests.cs index 06828253b887..eb352ff6c8e8 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.PublishedCache.HybridCache/DocumentHybridCacheTemplateTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.PublishedCache.HybridCache/DocumentHybridCacheTemplateTests.cs @@ -1,43 +1,42 @@ -// using NUnit.Framework; -// using Umbraco.Cms.Core; -// using Umbraco.Cms.Core.Models.ContentEditing; -// using Umbraco.Cms.Core.PublishedCache; -// using Umbraco.Cms.Core.Services; -// using Umbraco.Cms.Core.Services.OperationStatus; -// using Umbraco.Cms.Tests.Common.Testing; -// using Umbraco.Cms.Tests.Integration.Testing; -// FIXME -// namespace Umbraco.Cms.Tests.Integration.Umbraco.PublishedCache.HybridCache; -// -// [TestFixture] -// [UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)] -// public class DocumentHybridCacheTemplateTests : UmbracoIntegrationTestWithContentEditing -// { -// protected override void CustomTestSetup(IUmbracoBuilder builder) => builder.AddUmbracoHybridCache(); -// -// private IPublishedContentCache PublishedContentHybridCache => GetRequiredService(); -// -// private IContentEditingService ContentEditingService => GetRequiredService(); -// -// [Test] -// public async Task Can_Get_Document_After_Removing_Template() -// { -// // Arrange -// var textPageBefore = await PublishedContentHybridCache.GetByIdAsync(TextpageId, true); -// Assert.AreEqual(textPageBefore.TemplateId, TemplateId); -// var updateModel = new ContentUpdateModel(); -// { -// updateModel.TemplateKey = null; -// updateModel.InvariantName = textPageBefore.Name; -// } -// -// // Act -// var updateContentResult = await ContentEditingService.UpdateAsync(textPageBefore.Key, updateModel, Constants.Security.SuperUserKey); -// -// // Assert -// Assert.AreEqual(updateContentResult.Status, ContentEditingOperationStatus.Success); -// var textPageAfter = await PublishedContentHybridCache.GetByIdAsync(TextpageId, true); -// // Should this not be null? -// Assert.AreEqual(textPageAfter.TemplateId, null); -// } -// } +using NUnit.Framework; +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Models.ContentEditing; +using Umbraco.Cms.Core.PublishedCache; +using Umbraco.Cms.Core.Services; +using Umbraco.Cms.Core.Services.OperationStatus; +using Umbraco.Cms.Tests.Common.Testing; +using Umbraco.Cms.Tests.Integration.Testing; +namespace Umbraco.Cms.Tests.Integration.Umbraco.PublishedCache.HybridCache; + +[TestFixture] +[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)] +public class DocumentHybridCacheTemplateTests : UmbracoIntegrationTestWithContentEditing +{ + protected override void CustomTestSetup(IUmbracoBuilder builder) => builder.AddUmbracoHybridCache(); + + private IPublishedContentCache PublishedContentHybridCache => GetRequiredService(); + + private IContentEditingService ContentEditingService => GetRequiredService(); + + [Test] + public async Task Can_Get_Document_After_Removing_Template() + { + // Arrange + var textPageBefore = await PublishedContentHybridCache.GetByIdAsync(TextpageId, true); + Assert.AreEqual(textPageBefore.TemplateId, TemplateId); + var updateModel = new ContentUpdateModel(); + { + updateModel.TemplateKey = null; + updateModel.InvariantName = textPageBefore.Name; + } + + // Act + var updateContentResult = await ContentEditingService.UpdateAsync(textPageBefore.Key, updateModel, Constants.Security.SuperUserKey); + + // Assert + Assert.AreEqual(updateContentResult.Status, ContentEditingOperationStatus.Success); + var textPageAfter = await PublishedContentHybridCache.GetByIdAsync(TextpageId, true); + // Should this not be null? + Assert.AreEqual(textPageAfter.TemplateId, null); + } +} diff --git a/tests/Umbraco.Tests.Integration/Umbraco.PublishedCache.HybridCache/DocumentHybridCacheTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.PublishedCache.HybridCache/DocumentHybridCacheTests.cs index 69efb9a3e5be..787fecaddfb4 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.PublishedCache.HybridCache/DocumentHybridCacheTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.PublishedCache.HybridCache/DocumentHybridCacheTests.cs @@ -1,494 +1,494 @@ -// using NUnit.Framework; -// using Umbraco.Cms.Core; -// using Umbraco.Cms.Core.Models.ContentEditing; -// using Umbraco.Cms.Core.Models.PublishedContent; -// using Umbraco.Cms.Core.PublishedCache; -// using Umbraco.Cms.Core.Services; -// using Umbraco.Cms.Tests.Common.Testing; -// using Umbraco.Cms.Tests.Integration.Testing; -// FIXME -// namespace Umbraco.Cms.Tests.Integration.Umbraco.PublishedCache.HybridCache; -// -// [TestFixture] -// [UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)] -// public class DocumentHybridCacheTests : UmbracoIntegrationTestWithContentEditing -// { -// protected override void CustomTestSetup(IUmbracoBuilder builder) => builder.AddUmbracoHybridCache(); -// -// private IPublishedContentCache PublishedContentHybridCache => GetRequiredService(); -// -// private IContentEditingService ContentEditingService => GetRequiredService(); -// -// private IContentPublishingService ContentPublishingService => GetRequiredService(); -// -// private const string NewName = "New Name"; -// private const string NewTitle = "New Title"; -// -// [Test] -// public async Task Can_Get_Draft_Content_By_Id() -// { -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(TextpageId, true); -// -// // Assert -// AssertTextPage(textPage); -// } -// -// [Test] -// public async Task Can_Get_Draft_Content_By_Key() -// { -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(Textpage.Key.Value, true); -// -// // Assert -// AssertTextPage(textPage); -// } -// -// [Test] -// public async Task Can_Get_Published_Content_By_Id() -// { -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPageId); -// -// // Assert -// AssertPublishedTextPage(textPage); -// } -// -// [Test] -// public async Task Can_Get_Published_Content_By_Key() -// { -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPage.Key.Value); -// -// // Assert -// AssertPublishedTextPage(textPage); -// } -// -// [Test] -// public async Task Can_Get_Draft_Of_Published_Content_By_Id() -// { -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPageId, true); -// -// // Assert -// AssertPublishedTextPage(textPage); -// Assert.IsFalse(textPage.IsPublished()); -// } -// -// [Test] -// public async Task Can_Get_Draft_Of_Published_Content_By_Key() -// { -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPage.Key.Value, true); -// -// // Assert -// AssertPublishedTextPage(textPage); -// Assert.IsFalse(textPage.IsPublished()); -// } -// -// [Test] -// public async Task Can_Get_Updated_Draft_Content_By_Id() -// { -// // Arrange -// Textpage.InvariantName = NewName; -// ContentUpdateModel updateModel = new ContentUpdateModel -// { -// InvariantName = NewName, -// InvariantProperties = Textpage.InvariantProperties, -// Variants = Textpage.Variants, -// TemplateKey = Textpage.TemplateKey, -// }; -// await ContentEditingService.UpdateAsync(Textpage.Key.Value, updateModel, Constants.Security.SuperUserKey); -// -// // Act -// var updatedPage = await PublishedContentHybridCache.GetByIdAsync(TextpageId, true); -// -// // Assert -// Assert.AreEqual(NewName, updatedPage.Name); -// } -// -// [Test] -// public async Task Can_Get_Updated_Draft_Content_By_Key() -// { -// // Arrange -// Textpage.InvariantName = NewName; -// ContentUpdateModel updateModel = new ContentUpdateModel -// { -// InvariantName = NewName, -// InvariantProperties = Textpage.InvariantProperties, -// Variants = Textpage.Variants, -// TemplateKey = Textpage.TemplateKey, -// }; -// await ContentEditingService.UpdateAsync(Textpage.Key.Value, updateModel, Constants.Security.SuperUserKey); -// -// // Act -// var updatedPage = await PublishedContentHybridCache.GetByIdAsync(Textpage.Key.Value, true); -// -// // Assert -// Assert.AreEqual(NewName, updatedPage.Name); -// } -// -// [Test] -// [TestCase(true, true)] -// [TestCase(false, false)] -// // BETTER NAMING, CURRENTLY THIS IS TESTING BOTH THE PUBLISHED AND THE DRAFT OF THE PUBLISHED. -// public async Task Can_Get_Updated_Draft_Published_Content_By_Id(bool preview, bool result) -// { -// // Arrange -// PublishedTextPage.InvariantName = NewName; -// ContentUpdateModel updateModel = new ContentUpdateModel -// { -// InvariantName = NewName, -// InvariantProperties = PublishedTextPage.InvariantProperties, -// Variants = PublishedTextPage.Variants, -// TemplateKey = PublishedTextPage.TemplateKey, -// }; -// await ContentEditingService.UpdateAsync(PublishedTextPage.Key.Value, updateModel, Constants.Security.SuperUserKey); -// -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPageId, preview); -// -// // Assert -// Assert.AreEqual(result, NewName.Equals(textPage.Name)); -// } -// -// [Test] -// [TestCase(true, true)] -// [TestCase(false, false)] -// // BETTER NAMING, CURRENTLY THIS IS TESTING BOTH THE PUBLISHED AND THE DRAFT OF THE PUBLISHED. -// public async Task Can_Get_Updated_Draft_Published_Content_By_Key(bool preview, bool result) -// { -// // Arrange -// PublishedTextPage.InvariantName = NewName; -// ContentUpdateModel updateModel = new ContentUpdateModel -// { -// InvariantName = NewName, -// InvariantProperties = PublishedTextPage.InvariantProperties, -// Variants = PublishedTextPage.Variants, -// TemplateKey = PublishedTextPage.TemplateKey, -// }; -// await ContentEditingService.UpdateAsync(PublishedTextPage.Key.Value, updateModel, Constants.Security.SuperUserKey); -// -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPage.Key.Value, preview); -// -// // Assert -// Assert.AreEqual(result, NewName.Equals(textPage.Name)); -// } -// -// [Test] -// public async Task Can_Get_Draft_Content_Property_By_Id() -// { -// // Arrange -// var titleValue = Textpage.InvariantProperties.First(x => x.Alias == "title").Value; -// -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(TextpageId, true); -// -// // Assert -// Assert.AreEqual(titleValue, textPage.Value("title")); -// } -// -// [Test] -// public async Task Can_Get_Draft_Content_Property_By_Key() -// { -// // Arrange -// var titleValue = Textpage.InvariantProperties.First(x => x.Alias == "title").Value; -// -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(Textpage.Key.Value, true); -// -// // Assert -// Assert.AreEqual(titleValue, textPage.Value("title")); -// } -// -// [Test] -// public async Task Can_Get_Published_Content_Property_By_Id() -// { -// // Arrange -// var titleValue = PublishedTextPage.InvariantProperties.First(x => x.Alias == "title").Value; -// -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPageId, true); -// -// // Assert -// Assert.AreEqual(titleValue, textPage.Value("title")); -// } -// -// [Test] -// public async Task Can_Get_Published_Content_Property_By_Key() -// { -// // Arrange -// var titleValue = PublishedTextPage.InvariantProperties.First(x => x.Alias == "title").Value; -// -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPage.Key.Value, true); -// -// // Assert -// Assert.AreEqual(titleValue, textPage.Value("title")); -// } -// -// [Test] -// public async Task Can_Get_Draft_Of_Published_Content_Property_By_Id() -// { -// // Arrange -// var titleValue = PublishedTextPage.InvariantProperties.First(x => x.Alias == "title").Value; -// -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPageId, true); -// -// // Assert -// Assert.AreEqual(titleValue, textPage.Value("title")); -// } -// -// [Test] -// public async Task Can_Get_Draft_Of_Published_Content_Property_By_Key() -// { -// // Arrange -// var titleValue = PublishedTextPage.InvariantProperties.First(x => x.Alias == "title").Value; -// -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPage.Key.Value, true); -// -// // Assert -// Assert.AreEqual(titleValue, textPage.Value("title")); -// } -// -// [Test] -// public async Task Can_Get_Updated_Draft_Content_Property_By_Id() -// { -// // Arrange -// Textpage.InvariantProperties.First(x => x.Alias == "title").Value = NewTitle; -// ContentUpdateModel updateModel = new ContentUpdateModel -// { -// InvariantName = Textpage.InvariantName, -// InvariantProperties = Textpage.InvariantProperties, -// Variants = Textpage.Variants, -// TemplateKey = Textpage.TemplateKey, -// }; -// await ContentEditingService.UpdateAsync(Textpage.Key.Value, updateModel, Constants.Security.SuperUserKey); -// -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(TextpageId, true); -// -// // Assert -// Assert.AreEqual(NewTitle, textPage.Value("title")); -// } -// -// [Test] -// public async Task Can_Get_Updated_Draft_Content_Property_By_Key() -// { -// // Arrange -// Textpage.InvariantProperties.First(x => x.Alias == "title").Value = NewTitle; -// ContentUpdateModel updateModel = new ContentUpdateModel -// { -// InvariantName = Textpage.InvariantName, -// InvariantProperties = Textpage.InvariantProperties, -// Variants = Textpage.Variants, -// TemplateKey = Textpage.TemplateKey, -// }; -// await ContentEditingService.UpdateAsync(Textpage.Key.Value, updateModel, Constants.Security.SuperUserKey); -// -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(Textpage.Key.Value, true); -// -// // Assert -// Assert.AreEqual(NewTitle, textPage.Value("title")); -// } -// -// [Test] -// public async Task Can_Get_Updated_Published_Content_Property_By_Id() -// { -// // Arrange -// PublishedTextPage.InvariantProperties.First(x => x.Alias == "title").Value = NewTitle; -// ContentUpdateModel updateModel = new ContentUpdateModel -// { -// InvariantName = PublishedTextPage.InvariantName, -// InvariantProperties = PublishedTextPage.InvariantProperties, -// Variants = PublishedTextPage.Variants, -// TemplateKey = PublishedTextPage.TemplateKey, -// }; -// await ContentEditingService.UpdateAsync(PublishedTextPage.Key.Value, updateModel, Constants.Security.SuperUserKey); -// await ContentPublishingService.PublishAsync(PublishedTextPage.Key.Value, CultureAndSchedule, Constants.Security.SuperUserKey); -// -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPage.Key.Value, true); -// -// // Assert -// Assert.AreEqual(NewTitle, textPage.Value("title")); -// } -// -// [Test] -// public async Task Can_Get_Updated_Published_Content_Property_By_Key() -// { -// // Arrange -// PublishedTextPage.InvariantProperties.First(x => x.Alias == "title").Value = NewTitle; -// ContentUpdateModel updateModel = new ContentUpdateModel -// { -// InvariantName = PublishedTextPage.InvariantName, -// InvariantProperties = PublishedTextPage.InvariantProperties, -// Variants = PublishedTextPage.Variants, -// TemplateKey = PublishedTextPage.TemplateKey, -// }; -// await ContentEditingService.UpdateAsync(PublishedTextPage.Key.Value, updateModel, Constants.Security.SuperUserKey); -// await ContentPublishingService.PublishAsync(PublishedTextPage.Key.Value, CultureAndSchedule, Constants.Security.SuperUserKey); -// -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPage.Key.Value); -// -// // Assert -// Assert.AreEqual(NewTitle, textPage.Value("title")); -// } -// -// [Test] -// [TestCase(true, "New Title")] -// [TestCase(false, "Welcome to our Home page")] -// public async Task Can_Get_Updated_Draft_Of_Published_Content_Property_By_Id(bool preview, string titleName) -// { -// // Arrange -// PublishedTextPage.InvariantProperties.First(x => x.Alias == "title").Value = NewTitle; -// ContentUpdateModel updateModel = new ContentUpdateModel -// { -// InvariantName = PublishedTextPage.InvariantName, -// InvariantProperties = PublishedTextPage.InvariantProperties, -// Variants = PublishedTextPage.Variants, -// TemplateKey = PublishedTextPage.TemplateKey, -// }; -// await ContentEditingService.UpdateAsync(PublishedTextPage.Key.Value, updateModel, Constants.Security.SuperUserKey); -// -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPageId, preview); -// -// // Assert -// Assert.AreEqual(titleName, textPage.Value("title")); -// } -// -// [Test] -// [TestCase(true, "New Name")] -// [TestCase(false, "Welcome to our Home page")] -// public async Task Can_Get_Updated_Draft_Of_Published_Content_Property_By_Key(bool preview, string titleName) -// { -// // Arrange -// PublishedTextPage.InvariantProperties.First(x => x.Alias == "title").Value = titleName; -// ContentUpdateModel updateModel = new ContentUpdateModel -// { -// InvariantName = PublishedTextPage.InvariantName, -// InvariantProperties = PublishedTextPage.InvariantProperties, -// Variants = PublishedTextPage.Variants, -// TemplateKey = PublishedTextPage.TemplateKey, -// }; -// await ContentEditingService.UpdateAsync(PublishedTextPage.Key.Value, updateModel, Constants.Security.SuperUserKey); -// -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPage.Key.Value, true); -// -// // Assert -// Assert.AreEqual(titleName, textPage.Value("title")); -// } -// -// [Test] -// public async Task Can_Not_Get_Deleted_Content_By_Id() -// { -// // Arrange -// var content = await PublishedContentHybridCache.GetByIdAsync(Subpage1Id, true); -// Assert.IsNotNull(content); -// await ContentEditingService.DeleteAsync(Subpage1.Key.Value, Constants.Security.SuperUserKey); -// -// // Act -// var textPagePublishedContent = await PublishedContentHybridCache.GetByIdAsync(Subpage1Id, false); -// -// var textPage = await PublishedContentHybridCache.GetByIdAsync(Subpage1Id, true); -// -// // Assert -// Assert.IsNull(textPage); -// } -// -// [Test] -// public async Task Can_Not_Get_Deleted_Content_By_Key() -// { -// // Arrange -// await PublishedContentHybridCache.GetByIdAsync(Subpage1.Key.Value, true); -// var hasContent = await PublishedContentHybridCache.GetByIdAsync(Subpage1Id, true); -// Assert.IsNotNull(hasContent); -// await ContentEditingService.DeleteAsync(Subpage1.Key.Value, Constants.Security.SuperUserKey); -// -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(Subpage1.Key.Value, true); -// -// // Assert -// Assert.IsNull(textPage); -// } -// -// [Test] -// [TestCase(true)] -// [TestCase(false)] -// public async Task Can_Not_Get_Deleted_Published_Content_By_Id(bool preview) -// { -// // Arrange -// await ContentEditingService.DeleteAsync(PublishedTextPage.Key.Value, Constants.Security.SuperUserKey); -// -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPageId, preview); -// -// // Assert -// Assert.IsNull(textPage); -// } -// -// [Test] -// [TestCase(true)] -// [TestCase(false)] -// public async Task Can_Not_Get_Deleted_Published_Content_By_Key(bool preview) -// { -// // Arrange -// await ContentEditingService.DeleteAsync(PublishedTextPage.Key.Value, Constants.Security.SuperUserKey); -// -// // Act -// var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPage.Key.Value, preview); -// -// // Assert -// Assert.IsNull(textPage); -// } -// -// private void AssertTextPage(IPublishedContent textPage) -// { -// Assert.Multiple(() => -// { -// Assert.IsNotNull(textPage); -// Assert.AreEqual(Textpage.Key, textPage.Key); -// Assert.AreEqual(Textpage.ContentTypeKey, textPage.ContentType.Key); -// Assert.AreEqual(Textpage.InvariantName, textPage.Name); -// }); -// -// AssertProperties(Textpage.InvariantProperties, textPage.Properties); -// } -// -// private void AssertPublishedTextPage(IPublishedContent textPage) -// { -// Assert.Multiple(() => -// { -// Assert.IsNotNull(textPage); -// Assert.AreEqual(PublishedTextPage.Key, textPage.Key); -// Assert.AreEqual(PublishedTextPage.ContentTypeKey, textPage.ContentType.Key); -// Assert.AreEqual(PublishedTextPage.InvariantName, textPage.Name); -// }); -// -// AssertProperties(PublishedTextPage.InvariantProperties, textPage.Properties); -// } -// -// private void AssertProperties(IEnumerable propertyCollection, IEnumerable publishedProperties) -// { -// foreach (var prop in propertyCollection) -// { -// AssertProperty(prop, publishedProperties.First(x => x.Alias == prop.Alias)); -// } -// } -// -// private void AssertProperty(PropertyValueModel property, IPublishedProperty publishedProperty) -// { -// Assert.Multiple(() => -// { -// Assert.AreEqual(property.Alias, publishedProperty.Alias); -// Assert.AreEqual(property.Value, publishedProperty.GetSourceValue()); -// }); -// } -// } +using NUnit.Framework; +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Models.ContentEditing; +using Umbraco.Cms.Core.Models.PublishedContent; +using Umbraco.Cms.Core.PublishedCache; +using Umbraco.Cms.Core.Services; +using Umbraco.Cms.Tests.Common.Testing; +using Umbraco.Cms.Tests.Integration.Testing; + +namespace Umbraco.Cms.Tests.Integration.Umbraco.PublishedCache.HybridCache; + +[TestFixture] +[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)] +public class DocumentHybridCacheTests : UmbracoIntegrationTestWithContentEditing +{ + protected override void CustomTestSetup(IUmbracoBuilder builder) => builder.AddUmbracoHybridCache(); + + private IPublishedContentCache PublishedContentHybridCache => GetRequiredService(); + + private IContentEditingService ContentEditingService => GetRequiredService(); + + private IContentPublishingService ContentPublishingService => GetRequiredService(); + + private const string NewName = "New Name"; + private const string NewTitle = "New Title"; + + [Test] + public async Task Can_Get_Draft_Content_By_Id() + { + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(TextpageId, true); + + // Assert + AssertTextPage(textPage); + } + + [Test] + public async Task Can_Get_Draft_Content_By_Key() + { + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(Textpage.Key.Value, true); + + // Assert + AssertTextPage(textPage); + } + + [Test] + public async Task Can_Get_Published_Content_By_Id() + { + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPageId); + + // Assert + AssertPublishedTextPage(textPage); + } + + [Test] + public async Task Can_Get_Published_Content_By_Key() + { + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPage.Key.Value); + + // Assert + AssertPublishedTextPage(textPage); + } + + [Test] + public async Task Can_Get_Draft_Of_Published_Content_By_Id() + { + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPageId, true); + + // Assert + AssertPublishedTextPage(textPage); + Assert.IsFalse(textPage.IsPublished()); + } + + [Test] + public async Task Can_Get_Draft_Of_Published_Content_By_Key() + { + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPage.Key.Value, true); + + // Assert + AssertPublishedTextPage(textPage); + Assert.IsFalse(textPage.IsPublished()); + } + + [Test] + public async Task Can_Get_Updated_Draft_Content_By_Id() + { + // Arrange + Textpage.InvariantName = NewName; + ContentUpdateModel updateModel = new ContentUpdateModel + { + InvariantName = NewName, + InvariantProperties = Textpage.InvariantProperties, + Variants = Textpage.Variants, + TemplateKey = Textpage.TemplateKey, + }; + await ContentEditingService.UpdateAsync(Textpage.Key.Value, updateModel, Constants.Security.SuperUserKey); + + // Act + var updatedPage = await PublishedContentHybridCache.GetByIdAsync(TextpageId, true); + + // Assert + Assert.AreEqual(NewName, updatedPage.Name); + } + + [Test] + public async Task Can_Get_Updated_Draft_Content_By_Key() + { + // Arrange + Textpage.InvariantName = NewName; + ContentUpdateModel updateModel = new ContentUpdateModel + { + InvariantName = NewName, + InvariantProperties = Textpage.InvariantProperties, + Variants = Textpage.Variants, + TemplateKey = Textpage.TemplateKey, + }; + await ContentEditingService.UpdateAsync(Textpage.Key.Value, updateModel, Constants.Security.SuperUserKey); + + // Act + var updatedPage = await PublishedContentHybridCache.GetByIdAsync(Textpage.Key.Value, true); + + // Assert + Assert.AreEqual(NewName, updatedPage.Name); + } + + [Test] + [TestCase(true, true)] + [TestCase(false, false)] + // BETTER NAMING, CURRENTLY THIS IS TESTING BOTH THE PUBLISHED AND THE DRAFT OF THE PUBLISHED. + public async Task Can_Get_Updated_Draft_Published_Content_By_Id(bool preview, bool result) + { + // Arrange + PublishedTextPage.InvariantName = NewName; + ContentUpdateModel updateModel = new ContentUpdateModel + { + InvariantName = NewName, + InvariantProperties = PublishedTextPage.InvariantProperties, + Variants = PublishedTextPage.Variants, + TemplateKey = PublishedTextPage.TemplateKey, + }; + await ContentEditingService.UpdateAsync(PublishedTextPage.Key.Value, updateModel, Constants.Security.SuperUserKey); + + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPageId, preview); + + // Assert + Assert.AreEqual(result, NewName.Equals(textPage.Name)); + } + + [Test] + [TestCase(true, true)] + [TestCase(false, false)] + // BETTER NAMING, CURRENTLY THIS IS TESTING BOTH THE PUBLISHED AND THE DRAFT OF THE PUBLISHED. + public async Task Can_Get_Updated_Draft_Published_Content_By_Key(bool preview, bool result) + { + // Arrange + PublishedTextPage.InvariantName = NewName; + ContentUpdateModel updateModel = new ContentUpdateModel + { + InvariantName = NewName, + InvariantProperties = PublishedTextPage.InvariantProperties, + Variants = PublishedTextPage.Variants, + TemplateKey = PublishedTextPage.TemplateKey, + }; + await ContentEditingService.UpdateAsync(PublishedTextPage.Key.Value, updateModel, Constants.Security.SuperUserKey); + + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPage.Key.Value, preview); + + // Assert + Assert.AreEqual(result, NewName.Equals(textPage.Name)); + } + + [Test] + public async Task Can_Get_Draft_Content_Property_By_Id() + { + // Arrange + var titleValue = Textpage.InvariantProperties.First(x => x.Alias == "title").Value; + + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(TextpageId, true); + + // Assert + Assert.AreEqual(titleValue, textPage.Value("title")); + } + + [Test] + public async Task Can_Get_Draft_Content_Property_By_Key() + { + // Arrange + var titleValue = Textpage.InvariantProperties.First(x => x.Alias == "title").Value; + + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(Textpage.Key.Value, true); + + // Assert + Assert.AreEqual(titleValue, textPage.Value("title")); + } + + [Test] + public async Task Can_Get_Published_Content_Property_By_Id() + { + // Arrange + var titleValue = PublishedTextPage.InvariantProperties.First(x => x.Alias == "title").Value; + + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPageId, true); + + // Assert + Assert.AreEqual(titleValue, textPage.Value("title")); + } + + [Test] + public async Task Can_Get_Published_Content_Property_By_Key() + { + // Arrange + var titleValue = PublishedTextPage.InvariantProperties.First(x => x.Alias == "title").Value; + + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPage.Key.Value, true); + + // Assert + Assert.AreEqual(titleValue, textPage.Value("title")); + } + + [Test] + public async Task Can_Get_Draft_Of_Published_Content_Property_By_Id() + { + // Arrange + var titleValue = PublishedTextPage.InvariantProperties.First(x => x.Alias == "title").Value; + + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPageId, true); + + // Assert + Assert.AreEqual(titleValue, textPage.Value("title")); + } + + [Test] + public async Task Can_Get_Draft_Of_Published_Content_Property_By_Key() + { + // Arrange + var titleValue = PublishedTextPage.InvariantProperties.First(x => x.Alias == "title").Value; + + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPage.Key.Value, true); + + // Assert + Assert.AreEqual(titleValue, textPage.Value("title")); + } + + [Test] + public async Task Can_Get_Updated_Draft_Content_Property_By_Id() + { + // Arrange + Textpage.InvariantProperties.First(x => x.Alias == "title").Value = NewTitle; + ContentUpdateModel updateModel = new ContentUpdateModel + { + InvariantName = Textpage.InvariantName, + InvariantProperties = Textpage.InvariantProperties, + Variants = Textpage.Variants, + TemplateKey = Textpage.TemplateKey, + }; + await ContentEditingService.UpdateAsync(Textpage.Key.Value, updateModel, Constants.Security.SuperUserKey); + + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(TextpageId, true); + + // Assert + Assert.AreEqual(NewTitle, textPage.Value("title")); + } + + [Test] + public async Task Can_Get_Updated_Draft_Content_Property_By_Key() + { + // Arrange + Textpage.InvariantProperties.First(x => x.Alias == "title").Value = NewTitle; + ContentUpdateModel updateModel = new ContentUpdateModel + { + InvariantName = Textpage.InvariantName, + InvariantProperties = Textpage.InvariantProperties, + Variants = Textpage.Variants, + TemplateKey = Textpage.TemplateKey, + }; + await ContentEditingService.UpdateAsync(Textpage.Key.Value, updateModel, Constants.Security.SuperUserKey); + + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(Textpage.Key.Value, true); + + // Assert + Assert.AreEqual(NewTitle, textPage.Value("title")); + } + + [Test] + public async Task Can_Get_Updated_Published_Content_Property_By_Id() + { + // Arrange + PublishedTextPage.InvariantProperties.First(x => x.Alias == "title").Value = NewTitle; + ContentUpdateModel updateModel = new ContentUpdateModel + { + InvariantName = PublishedTextPage.InvariantName, + InvariantProperties = PublishedTextPage.InvariantProperties, + Variants = PublishedTextPage.Variants, + TemplateKey = PublishedTextPage.TemplateKey, + }; + await ContentEditingService.UpdateAsync(PublishedTextPage.Key.Value, updateModel, Constants.Security.SuperUserKey); + await ContentPublishingService.PublishAsync(PublishedTextPage.Key.Value, CultureAndSchedule, Constants.Security.SuperUserKey); + + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPage.Key.Value, true); + + // Assert + Assert.AreEqual(NewTitle, textPage.Value("title")); + } + + [Test] + public async Task Can_Get_Updated_Published_Content_Property_By_Key() + { + // Arrange + PublishedTextPage.InvariantProperties.First(x => x.Alias == "title").Value = NewTitle; + ContentUpdateModel updateModel = new ContentUpdateModel + { + InvariantName = PublishedTextPage.InvariantName, + InvariantProperties = PublishedTextPage.InvariantProperties, + Variants = PublishedTextPage.Variants, + TemplateKey = PublishedTextPage.TemplateKey, + }; + await ContentEditingService.UpdateAsync(PublishedTextPage.Key.Value, updateModel, Constants.Security.SuperUserKey); + await ContentPublishingService.PublishAsync(PublishedTextPage.Key.Value, CultureAndSchedule, Constants.Security.SuperUserKey); + + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPage.Key.Value); + + // Assert + Assert.AreEqual(NewTitle, textPage.Value("title")); + } + + [Test] + [TestCase(true, "New Title")] + [TestCase(false, "Welcome to our Home page")] + public async Task Can_Get_Updated_Draft_Of_Published_Content_Property_By_Id(bool preview, string titleName) + { + // Arrange + PublishedTextPage.InvariantProperties.First(x => x.Alias == "title").Value = NewTitle; + ContentUpdateModel updateModel = new ContentUpdateModel + { + InvariantName = PublishedTextPage.InvariantName, + InvariantProperties = PublishedTextPage.InvariantProperties, + Variants = PublishedTextPage.Variants, + TemplateKey = PublishedTextPage.TemplateKey, + }; + await ContentEditingService.UpdateAsync(PublishedTextPage.Key.Value, updateModel, Constants.Security.SuperUserKey); + + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPageId, preview); + + // Assert + Assert.AreEqual(titleName, textPage.Value("title")); + } + + [Test] + [TestCase(true, "New Name")] + [TestCase(false, "Welcome to our Home page")] + public async Task Can_Get_Updated_Draft_Of_Published_Content_Property_By_Key(bool preview, string titleName) + { + // Arrange + PublishedTextPage.InvariantProperties.First(x => x.Alias == "title").Value = titleName; + ContentUpdateModel updateModel = new ContentUpdateModel + { + InvariantName = PublishedTextPage.InvariantName, + InvariantProperties = PublishedTextPage.InvariantProperties, + Variants = PublishedTextPage.Variants, + TemplateKey = PublishedTextPage.TemplateKey, + }; + await ContentEditingService.UpdateAsync(PublishedTextPage.Key.Value, updateModel, Constants.Security.SuperUserKey); + + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPage.Key.Value, true); + + // Assert + Assert.AreEqual(titleName, textPage.Value("title")); + } + + [Test] + public async Task Can_Not_Get_Deleted_Content_By_Id() + { + // Arrange + var content = await PublishedContentHybridCache.GetByIdAsync(Subpage1Id, true); + Assert.IsNotNull(content); + await ContentEditingService.DeleteAsync(Subpage1.Key.Value, Constants.Security.SuperUserKey); + + // Act + var textPagePublishedContent = await PublishedContentHybridCache.GetByIdAsync(Subpage1Id, false); + + var textPage = await PublishedContentHybridCache.GetByIdAsync(Subpage1Id, true); + + // Assert + Assert.IsNull(textPage); + } + + [Test] + public async Task Can_Not_Get_Deleted_Content_By_Key() + { + // Arrange + await PublishedContentHybridCache.GetByIdAsync(Subpage1.Key.Value, true); + var hasContent = await PublishedContentHybridCache.GetByIdAsync(Subpage1Id, true); + Assert.IsNotNull(hasContent); + await ContentEditingService.DeleteAsync(Subpage1.Key.Value, Constants.Security.SuperUserKey); + + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(Subpage1.Key.Value, true); + + // Assert + Assert.IsNull(textPage); + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public async Task Can_Not_Get_Deleted_Published_Content_By_Id(bool preview) + { + // Arrange + await ContentEditingService.DeleteAsync(PublishedTextPage.Key.Value, Constants.Security.SuperUserKey); + + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPageId, preview); + + // Assert + Assert.IsNull(textPage); + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public async Task Can_Not_Get_Deleted_Published_Content_By_Key(bool preview) + { + // Arrange + await ContentEditingService.DeleteAsync(PublishedTextPage.Key.Value, Constants.Security.SuperUserKey); + + // Act + var textPage = await PublishedContentHybridCache.GetByIdAsync(PublishedTextPage.Key.Value, preview); + + // Assert + Assert.IsNull(textPage); + } + + private void AssertTextPage(IPublishedContent textPage) + { + Assert.Multiple(() => + { + Assert.IsNotNull(textPage); + Assert.AreEqual(Textpage.Key, textPage.Key); + Assert.AreEqual(Textpage.ContentTypeKey, textPage.ContentType.Key); + Assert.AreEqual(Textpage.InvariantName, textPage.Name); + }); + + AssertProperties(Textpage.InvariantProperties, textPage.Properties); + } + + private void AssertPublishedTextPage(IPublishedContent textPage) + { + Assert.Multiple(() => + { + Assert.IsNotNull(textPage); + Assert.AreEqual(PublishedTextPage.Key, textPage.Key); + Assert.AreEqual(PublishedTextPage.ContentTypeKey, textPage.ContentType.Key); + Assert.AreEqual(PublishedTextPage.InvariantName, textPage.Name); + }); + + AssertProperties(PublishedTextPage.InvariantProperties, textPage.Properties); + } + + private void AssertProperties(IEnumerable propertyCollection, IEnumerable publishedProperties) + { + foreach (var prop in propertyCollection) + { + AssertProperty(prop, publishedProperties.First(x => x.Alias == prop.Alias)); + } + } + + private void AssertProperty(PropertyValueModel property, IPublishedProperty publishedProperty) + { + Assert.Multiple(() => + { + Assert.AreEqual(property.Alias, publishedProperty.Alias); + Assert.AreEqual(property.Value, publishedProperty.GetSourceValue()); + }); + } +}