* V2 output expansion + field limiting incl. deprecation of V1 APIs * Performance optimizations for Content and Block based property editors * A little formatting * Support API versioning in Delivery API endpoint matcher policy * Add V2 "expand" and "fields" to Swagger docs * Renamed route for "multiple items by ID" * Review changes * Update src/Umbraco.Cms.Api.Delivery/Controllers/Media/ByIdMediaApiController.cs Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com> * Update src/Umbraco.Cms.Api.Delivery/Filters/SwaggerDocumentationFilterBase.cs Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com> * Update src/Umbraco.Cms.Api.Delivery/Filters/SwaggerDocumentationFilterBase.cs Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com> * Revert "Performance optimizations for Content and Block based property editors" This reverts commit 0d5a57956b36e94ce951f1dad7a7f3f43eb1f60b. * Introduce explicit API cache levels for property expansion * Friendly handling of bad expand/fields parameters --------- Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com>
77 lines
3.7 KiB
C#
77 lines
3.7 KiB
C#
using Moq;
|
|
using NUnit.Framework;
|
|
using Umbraco.Cms.Core.Cache;
|
|
using Umbraco.Cms.Core.Models.PublishedContent;
|
|
using Umbraco.Cms.Core.PropertyEditors;
|
|
using Umbraco.Cms.Core.PublishedCache;
|
|
using Umbraco.Cms.Infrastructure.PublishedCache;
|
|
using Umbraco.Cms.Infrastructure.PublishedCache.DataSource;
|
|
|
|
namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.DeliveryApi;
|
|
|
|
[TestFixture]
|
|
public class CacheTests
|
|
{
|
|
[TestCase(PropertyCacheLevel.Snapshot, false, 1)]
|
|
[TestCase(PropertyCacheLevel.Snapshot, true, 1)]
|
|
[TestCase(PropertyCacheLevel.Elements, false, 1)]
|
|
[TestCase(PropertyCacheLevel.Elements, true, 1)]
|
|
[TestCase(PropertyCacheLevel.Element, false, 1)]
|
|
[TestCase(PropertyCacheLevel.Element, true, 1)]
|
|
[TestCase(PropertyCacheLevel.None, false, 4)]
|
|
[TestCase(PropertyCacheLevel.None, true, 4)]
|
|
public void PublishedElementProperty_CachesDeliveryApiValueConversion(PropertyCacheLevel cacheLevel, bool expanding, int expectedConverterHits)
|
|
{
|
|
var contentType = new Mock<IPublishedContentType>();
|
|
contentType.SetupGet(c => c.PropertyTypes).Returns(Array.Empty<IPublishedPropertyType>());
|
|
|
|
var contentNode = new ContentNode(123, Guid.NewGuid(), contentType.Object, 1, string.Empty, 1, 1, DateTime.Now, 1);
|
|
var contentData = new ContentData("bla", "bla", 1, DateTime.Now, 1, 1, true, new Dictionary<string, PropertyData[]>(), null);
|
|
|
|
var elementCache = new FastDictionaryAppCache();
|
|
var snapshotCache = new FastDictionaryAppCache();
|
|
var publishedSnapshotMock = new Mock<IPublishedSnapshot>();
|
|
publishedSnapshotMock.SetupGet(p => p.ElementsCache).Returns(elementCache);
|
|
publishedSnapshotMock.SetupGet(p => p.SnapshotCache).Returns(snapshotCache);
|
|
|
|
var publishedSnapshot = publishedSnapshotMock.Object;
|
|
var publishedSnapshotAccessor = new Mock<IPublishedSnapshotAccessor>();
|
|
publishedSnapshotAccessor.Setup(p => p.TryGetPublishedSnapshot(out publishedSnapshot)).Returns(true);
|
|
|
|
var content = new PublishedContent(
|
|
contentNode,
|
|
contentData,
|
|
publishedSnapshotAccessor.Object,
|
|
Mock.Of<IVariationContextAccessor>(),
|
|
Mock.Of<IPublishedModelFactory>());
|
|
|
|
var propertyType = new Mock<IPublishedPropertyType>();
|
|
var invocationCount = 0;
|
|
propertyType.SetupGet(p => p.CacheLevel).Returns(cacheLevel);
|
|
propertyType.SetupGet(p => p.DeliveryApiCacheLevel).Returns(cacheLevel);
|
|
propertyType.SetupGet(p => p.DeliveryApiCacheLevelForExpansion).Returns(cacheLevel);
|
|
propertyType
|
|
.Setup(p => p.ConvertInterToDeliveryApiObject(It.IsAny<IPublishedElement>(), It.IsAny<PropertyCacheLevel>(), It.IsAny<object?>(), It.IsAny<bool>(), It.IsAny<bool>()))
|
|
.Returns(() => $"Delivery API value: {++invocationCount}");
|
|
|
|
var prop1 = new Property(propertyType.Object, content, publishedSnapshotAccessor.Object);
|
|
var results = new List<string>();
|
|
results.Add(prop1.GetDeliveryApiValue(expanding)!.ToString());
|
|
results.Add(prop1.GetDeliveryApiValue(expanding)!.ToString());
|
|
results.Add(prop1.GetDeliveryApiValue(expanding)!.ToString());
|
|
results.Add(prop1.GetDeliveryApiValue(expanding)!.ToString());
|
|
|
|
Assert.AreEqual("Delivery API value: 1", results.First());
|
|
Assert.AreEqual(expectedConverterHits, results.Distinct().Count());
|
|
|
|
propertyType.Verify(
|
|
p => p.ConvertInterToDeliveryApiObject(
|
|
It.IsAny<IPublishedElement>(),
|
|
It.IsAny<PropertyCacheLevel>(),
|
|
It.IsAny<object?>(),
|
|
It.IsAny<bool>(),
|
|
It.IsAny<bool>()),
|
|
Times.Exactly(expectedConverterHits));
|
|
}
|
|
}
|