using NUnit.Framework; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.ContentEditing; using Umbraco.Cms.Core.Models.Membership; using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Core.PublishedCache; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.ContentTypeEditing; using Umbraco.Cms.Infrastructure.HybridCache.Services; using Umbraco.Cms.Tests.Common.Builders; namespace Umbraco.Cms.Tests.Integration.Umbraco.PublishedCache.HybridCache; public class MemberPropertyCacheLevelTests : PropertyCacheLevelTestsBase { private static readonly Guid _memberKey = new("1ADC9048-E437-460B-95DC-3B8E19239CBD"); private IMemberCacheService MemberCacheService => GetRequiredService(); private IMemberEditingService MemberEditingService => GetRequiredService(); private IMemberTypeService MemberTypeService => GetRequiredService(); [SetUp] public void SetUpTest() => PropertyValueLevelDetectionTestsConverter.Reset(); [TestCase(PropertyCacheLevel.None, 2, 10)] [TestCase(PropertyCacheLevel.Element, 2, 2)] [TestCase(PropertyCacheLevel.Elements, 2, 10)] public async Task Property_Value_Conversion_Respects_Property_Cache_Level(PropertyCacheLevel cacheLevel, int expectedSourceConverts, int expectedInterConverts) { PropertyValueLevelDetectionTestsConverter.SetCacheLevel(cacheLevel); var member = await CreateMember(); var publishedMember1 = await MemberCacheService.Get(member); Assert.IsNotNull(publishedMember1); var publishedMember2 = await MemberCacheService.Get(member); Assert.IsNotNull(publishedMember2); Assert.AreNotSame(publishedMember1, publishedMember2); var titleValue1 = publishedMember1.Value("title"); Assert.AreEqual("The title", titleValue1); var titleValue2 = publishedMember2.Value("title"); Assert.IsNotNull(titleValue2); Assert.AreEqual("The title", titleValue2); // fetch title values 10 times in total, 5 times from each published member instance titleValue1 = publishedMember1.Value("title"); titleValue1 = publishedMember1.Value("title"); titleValue1 = publishedMember1.Value("title"); titleValue1 = publishedMember1.Value("title"); titleValue2 = publishedMember2.Value("title"); titleValue2 = publishedMember2.Value("title"); titleValue2 = publishedMember2.Value("title"); titleValue2 = publishedMember2.Value("title"); Assert.AreEqual(expectedSourceConverts, PropertyValueLevelDetectionTestsConverter.SourceConverts); Assert.AreEqual(expectedInterConverts, PropertyValueLevelDetectionTestsConverter.InterConverts); } private IUser SuperUser() => GetRequiredService().GetAsync(Constants.Security.SuperUserKey).GetAwaiter().GetResult(); private async Task CreateMember() { IMemberType memberType = MemberTypeBuilder.CreateSimpleMemberType(); var memberTypeCreateResult = await MemberTypeService.UpdateAsync(memberType, Constants.Security.SuperUserKey); Assert.IsTrue(memberTypeCreateResult.Success); var createModel = new MemberCreateModel { Key = _memberKey, Email = "test@test.com", Username = "test", Password = "SuperSecret123", IsApproved = true, ContentTypeKey = memberType.Key, Roles = [], Variants = [new() { Name = "T. Est" }], Properties = [new() { Alias = "title", Value = "The title" }], }; var memberCreateResult = await MemberEditingService.CreateAsync(createModel, SuperUser()); Assert.IsTrue(memberCreateResult.Success); Assert.IsNotNull(memberCreateResult.Result.Content); return memberCreateResult.Result.Content; } }