using Moq; using NUnit.Framework; using Umbraco.Cms.Core; using Umbraco.Cms.Core.DeliveryApi; using Umbraco.Cms.Core.Models.DeliveryApi; using Umbraco.Cms.Core.Models.PublishedContent; using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Core.PropertyEditors.ValueConverters; using Umbraco.Cms.Core.PublishedCache; namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.DeliveryApi; [TestFixture] public class ContentPickerValueConverterTests : PropertyValueConverterTests { private ContentPickerValueConverter CreateValueConverter(IApiContentNameProvider? nameProvider = null) => new ContentPickerValueConverter( PublishedSnapshotAccessor, new ApiContentBuilder( nameProvider ?? new ApiContentNameProvider(), CreateContentRouteBuilder(PublishedUrlProvider, CreateGlobalSettings()), CreateOutputExpansionStrategyAccessor())); [Test] public void ContentPickerValueConverter_BuildsDeliveryApiOutput() { var publishedPropertyType = new Mock(); publishedPropertyType.SetupGet(p => p.Alias).Returns("test"); var valueConverter = CreateValueConverter(); Assert.AreEqual(typeof(IApiContent), valueConverter.GetDeliveryApiPropertyValueType(publishedPropertyType.Object)); var result = valueConverter.ConvertIntermediateToDeliveryApiObject( Mock.Of(), publishedPropertyType.Object, PropertyCacheLevel.Element, new GuidUdi(Constants.UdiEntityType.Document, PublishedContent.Key), false, false) as IApiContent; Assert.NotNull(result); Assert.AreEqual("The page", result.Name); Assert.AreEqual(PublishedContent.Key, result.Id); Assert.AreEqual("/the-page-url", result.Route.Path); Assert.AreEqual("TheContentType", result.ContentType); Assert.IsEmpty(result.Properties); } [Test] public void ContentPickerValueConverter_CanCustomizeContentNameInDeliveryApiOutput() { var publishedPropertyType = new Mock(); publishedPropertyType.SetupGet(p => p.Alias).Returns("test"); var customNameProvider = new Mock(); customNameProvider.Setup(n => n.GetName(PublishedContent)).Returns($"Custom name for: {PublishedContent.Name}"); var valueConverter = CreateValueConverter(customNameProvider.Object); var result = valueConverter.ConvertIntermediateToDeliveryApiObject( Mock.Of(), publishedPropertyType.Object, PropertyCacheLevel.Element, new GuidUdi(Constants.UdiEntityType.Document, PublishedContent.Key), false, false) as IApiContent; Assert.NotNull(result); Assert.AreEqual("Custom name for: The page", result.Name); } [Test] public void ContentPickerValueConverter_RendersContentProperties() { var content = new Mock(); var prop1 = new PublishedElementPropertyBase(DeliveryApiPropertyType, content.Object, false, PropertyCacheLevel.None); var prop2 = new PublishedElementPropertyBase(DefaultPropertyType, content.Object, false, PropertyCacheLevel.None); var publishedPropertyType = new Mock(); publishedPropertyType.SetupGet(p => p.Alias).Returns("test"); var key = Guid.NewGuid(); var urlSegment = "page-url-segment"; var name = "The page"; ConfigurePublishedContentMock(content, key, name, urlSegment, PublishedContentType, new[] { prop1, prop2 }); PublishedUrlProviderMock .Setup(p => p.GetUrl(content.Object, It.IsAny(), It.IsAny(), It.IsAny())) .Returns(content.Object.UrlSegment); PublishedContentCacheMock .Setup(pcc => pcc.GetById(key)) .Returns(content.Object); var valueConverter = CreateValueConverter(); Assert.AreEqual(typeof(IApiContent), valueConverter.GetDeliveryApiPropertyValueType(publishedPropertyType.Object)); var result = valueConverter.ConvertIntermediateToDeliveryApiObject( Mock.Of(), publishedPropertyType.Object, PropertyCacheLevel.Element, new GuidUdi(Constants.UdiEntityType.Document, key), false, false) as IApiContent; Assert.NotNull(result); Assert.AreEqual("The page", result.Name); Assert.AreEqual(content.Object.Key, result.Id); Assert.AreEqual("/page-url-segment", result.Route.Path); Assert.AreEqual("TheContentType", result.ContentType); Assert.AreEqual(2, result.Properties.Count); Assert.AreEqual("Delivery API value", result.Properties[DeliveryApiPropertyType.Alias]); Assert.AreEqual("Default value", result.Properties[DefaultPropertyType.Alias]); } }