using System.Text.RegularExpressions; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Moq; using NUnit.Framework; using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Web; using Umbraco.Cms.Web.Website.Cache.PartialViewCacheInvalidators; using Umbraco.Extensions; namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Website.Routing; [TestFixture] public class MemberPartialViewCacheInvalidatorTests { [Test] public void ClearPartialViewCacheItems_Clears_ExpectedItems() { var runTimeCacheMock = new Mock(); runTimeCacheMock .Setup(x => x.ClearByRegex(It.IsAny())) .Verifiable(); var appCaches = new AppCaches( runTimeCacheMock.Object, NoAppCache.Instance, new IsolatedCaches(type => new ObjectCacheAppCache())); var memberPartialViewCacheInvalidator = new MemberPartialViewCacheInvalidator(appCaches); var memberIds = new[] { 1, 2, 3 }; memberPartialViewCacheInvalidator.ClearPartialViewCacheItems(memberIds); foreach (var memberId in memberIds) { var regex = $"Umbraco.Web.PartialViewCacheKey.*-m{memberId}-*"; runTimeCacheMock .Verify(x => x.ClearByRegex(It.Is(x => x == regex)), Times.Once); } } [Test] public async Task ClearPartialViewCacheItems_Regex_Matches_CachedKeys() { const int MemberId = 1234; var memberManagerMock = new Mock(); memberManagerMock .Setup(x => x.GetCurrentMemberAsync()) .ReturnsAsync(new MemberIdentityUser { Id = MemberId.ToString() }); var cacheKey = await HtmlHelperRenderExtensions.GenerateCacheKeyForCachedPartialViewAsync( "TestPartial.cshtml", true, Mock.Of(), true, memberManagerMock.Object, new TestViewModel(), new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary()), null); cacheKey = CoreCacheHelperExtensions.PartialViewCacheKey + cacheKey; Assert.AreEqual("Umbraco.Web.PartialViewCacheKeyTestPartial.cshtml-en-US-0-m1234-", cacheKey); var regexForMember = $"Umbraco.Web.PartialViewCacheKey.*-m{MemberId}-*"; var regexMatch = Regex.IsMatch(cacheKey, regexForMember); Assert.IsTrue(regexMatch); var regexForAnotherMember = $"Umbraco.Web.PartialViewCacheKey.*-m{4321}-*"; regexMatch = Regex.IsMatch(cacheKey, regexForAnotherMember); Assert.IsFalse(regexMatch); } private class TestViewModel { } }