Files
Umbraco-CMS/tests/Umbraco.Tests.Integration/Umbraco.PublishedCache.HybridCache/MemberPropertyCacheLevelTests.cs
Kenn Jacobsen 4ee1d7b13e Performance: Cache published content instances at cache service level (#20681)
Cache published content instances at cache service level
2025-11-03 10:55:23 +01:00

97 lines
4.0 KiB
C#

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<IMemberCacheService>();
private IMemberEditingService MemberEditingService => GetRequiredService<IMemberEditingService>();
private IMemberTypeService MemberTypeService => GetRequiredService<IMemberTypeService>();
[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<string>("title");
Assert.AreEqual("The title", titleValue1);
var titleValue2 = publishedMember2.Value<string>("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<string>("title");
titleValue1 = publishedMember1.Value<string>("title");
titleValue1 = publishedMember1.Value<string>("title");
titleValue1 = publishedMember1.Value<string>("title");
titleValue2 = publishedMember2.Value<string>("title");
titleValue2 = publishedMember2.Value<string>("title");
titleValue2 = publishedMember2.Value<string>("title");
titleValue2 = publishedMember2.Value<string>("title");
Assert.AreEqual(expectedSourceConverts, PropertyValueLevelDetectionTestsConverter.SourceConverts);
Assert.AreEqual(expectedInterConverts, PropertyValueLevelDetectionTestsConverter.InterConverts);
}
private IUser SuperUser() => GetRequiredService<IUserService>().GetAsync(Constants.Security.SuperUserKey).GetAwaiter().GetResult();
private async Task<IMember> 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;
}
}