Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#318 Add config option for default rendition preset to be applied (KCL-8387) #320

Merged
merged 2 commits into from
Feb 24, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,12 @@ public class DeliveryOptions
/// </summary>
public bool IncludeTotalCount { get; set; }

/// <summary>
/// Gets or sets a value of codename for the rendition preset to be applied by default to the base asset URL path.
/// If no value is specified, asset URLs will always point to non-customized variant of the image.
/// </summary>
public string DefaultRenditionPreset { get; set; }

/// <summary>
/// The name of the service configuration this options object is related to.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using System.Collections.Generic;

namespace Kentico.Kontent.Delivery.Abstractions
{
/// <summary>
/// An object representing a asset element value.
/// </summary>
public interface IAssetElementValue : IContentElementValue<IEnumerable<IAsset>>
{
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public static void Configure(this DeliveryOptions o, DeliveryOptions options)
o.DefaultRetryPolicyOptions = options.DefaultRetryPolicyOptions;
o.IncludeTotalCount = options.IncludeTotalCount;
o.Name = options.Name;
o.DefaultRenditionPreset = options.DefaultRenditionPreset;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ private IDeliveryClient GetDeliveryClient(Action mockAction)
var contentPropertyMapper = new PropertyMapper();
var contentTypeProvider = new CustomTypeProvider();
var serializer = new DeliveryJsonSerializer();
var modelProvider = new ModelProvider(contentLinkUrlResolver, contentItemsProcessor, contentTypeProvider, contentPropertyMapper, serializer, new HtmlParser());
var modelProvider = new ModelProvider(contentLinkUrlResolver, contentItemsProcessor, contentTypeProvider, contentPropertyMapper, serializer, new HtmlParser(), deliveryOptions);
var retryPolicy = A.Fake<IRetryPolicy>();
var retryPolicyProvider = A.Fake<IRetryPolicyProvider>();
A.CallTo(() => retryPolicyProvider.GetRetryPolicy()).Returns(retryPolicy);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public void BuildWithProjectIdAndUseProductionApi()
.UseProductionApi()
.Build();

Assert.Equal(deliveryOptions.ProjectId, ProjectId);
Assert.Equal(ProjectId, deliveryOptions.ProjectId);
Assert.False(deliveryOptions.UsePreviewApi);
Assert.False(deliveryOptions.UseSecureAccess);
}
Expand Down Expand Up @@ -71,7 +71,7 @@ public void BuildWithRetryPolicyOptions()
.WithDefaultRetryPolicyOptions(retryOptions)
.Build();

Assert.Equal(deliveryOptions.DefaultRetryPolicyOptions, retryOptions);
Assert.Equal(retryOptions, deliveryOptions.DefaultRetryPolicyOptions);
}

[Fact]
Expand Down Expand Up @@ -136,7 +136,7 @@ public void BuildWithCustomEndpointForPreviewApi()
.WithCustomEndpoint(customEndpoint)
.Build();

Assert.Equal(deliveryOptions.PreviewEndpoint, customEndpoint);
Assert.Equal(customEndpoint, deliveryOptions.PreviewEndpoint);
}

[Fact]
Expand All @@ -151,7 +151,7 @@ public void BuildWithCustomEndpointForProductionApi()
.WithCustomEndpoint(customEndpoint)
.Build();

Assert.Equal(deliveryOptions.ProductionEndpoint, customEndpoint);
Assert.Equal(customEndpoint, deliveryOptions.ProductionEndpoint);
}

[Fact]
Expand All @@ -167,7 +167,7 @@ public void BuildWithCustomEndpointAsUriForPreviewApi()
.WithCustomEndpoint(uri)
.Build();

Assert.Equal(deliveryOptions.PreviewEndpoint, customEndpoint);
Assert.Equal(customEndpoint, deliveryOptions.PreviewEndpoint);
}

[Fact]
Expand All @@ -183,7 +183,22 @@ public void BuildWithCustomEndpointAsUriForProductionApi()
.WithCustomEndpoint(uri)
.Build();

Assert.Equal(deliveryOptions.ProductionEndpoint, customEndpoint);
Assert.Equal(customEndpoint, deliveryOptions.ProductionEndpoint);
}

[Fact]
public void BuildWithDefaultRenditionPreset()
{
const string renditionPreset = "mobile";

var deliveryOptions = DeliveryOptionsBuilder
.CreateInstance()
.WithProjectId(ProjectId)
.UseProductionApi()
.WithDefaultRenditionPreset(renditionPreset)
.Build();

Assert.Equal(renditionPreset, deliveryOptions.DefaultRenditionPreset);
}
}
}
2 changes: 1 addition & 1 deletion Kentico.Kontent.Delivery.Tests/ContentLinkResolverTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ public async void ResolveLinksInStronglyTypedModel()
var resiliencePolicyProvider = new DefaultRetryPolicyProvider(options);
var contentLinkUrlResolver = new CustomContentLinkUrlResolver();
var contentItemsProcessor = InlineContentItemsProcessorFactory.Create();
var modelProvider = new ModelProvider(contentLinkUrlResolver, contentItemsProcessor, new CustomTypeProvider(), new PropertyMapper(), new DeliveryJsonSerializer(), new HtmlParser());
var modelProvider = new ModelProvider(contentLinkUrlResolver, contentItemsProcessor, new CustomTypeProvider(), new PropertyMapper(), new DeliveryJsonSerializer(), new HtmlParser(), deliveryOptions);
var client = new DeliveryClient(
deliveryOptions,
modelProvider,
Expand Down
41 changes: 23 additions & 18 deletions Kentico.Kontent.Delivery.Tests/DeliveryClientTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ public async Task GetPagination()
}

[Fact]
public async Task AssetPropertiesNotEmpty()
public async Task GetItemAsync_AssetElement_PropertiesHaveCorrectValues()
{
_mockHttp
.When($"{_baseUrl}/items/coffee_beverages_explained")
Expand All @@ -135,21 +135,24 @@ public async Task AssetPropertiesNotEmpty()

var response = await client.GetItemAsync<Article>("coffee_beverages_explained");

var model = response.Item;

Assert.NotNull(model.TeaserImage.FirstOrDefault()?.Description);
Assert.NotNull(model.TeaserImage.FirstOrDefault()?.Name);
Assert.NotNull(model.TeaserImage.FirstOrDefault()?.Type);
Assert.NotNull(model.TeaserImage.FirstOrDefault()?.Url);
Assert.NotEqual(0, model.TeaserImage.FirstOrDefault()?.Width);
Assert.NotEqual(0, model.TeaserImage.FirstOrDefault()?.Height);
Assert.NotNull(model.TeaserImage.FirstOrDefault()?.Renditions);
Assert.NotEmpty(model.TeaserImage.First().Renditions);
Assert.NotNull(model.TeaserImage.First().Renditions["default"].RenditionId);
Assert.NotNull(model.TeaserImage.First().Renditions["default"].PresetId);
Assert.NotEqual(0, model.TeaserImage.First().Renditions["default"].Width);
Assert.NotEqual(0, model.TeaserImage.First().Renditions["default"].Height);
Assert.NotNull(model.TeaserImage.First().Renditions["default"].Query);
var teaserImage = response.Item.TeaserImage.FirstOrDefault();
Assert.NotNull(teaserImage);
Assert.Equal("Professional Espresso Machine", teaserImage.Description);
Assert.Equal("coffee-beverages-explained-1080px.jpg", teaserImage.Name);
Assert.Equal("image/jpeg", teaserImage.Type);
Assert.Equal("https://assets.kenticocloud.com:443/975bf280-fd91-488c-994c-2f04416e5ee3/e700596b-03b0-4cee-ac5c-9212762c027a/coffee-beverages-explained-1080px.jpg", teaserImage.Url);
Assert.Equal(800, teaserImage.Width);
Assert.Equal(600, teaserImage.Height);
Assert.NotNull(teaserImage.Renditions);
Assert.NotEmpty(teaserImage.Renditions);

var defaultRendition = response.Item.TeaserImage.First().Renditions["default"];
Assert.NotNull(defaultRendition);
Assert.Equal("d44a2887-74cc-4ab0-8376-ae96f3f534e5", defaultRendition.RenditionId);
Assert.Equal("a6d98cd5-8b2c-4e50-99c9-15192bce2490", defaultRendition.PresetId);
Assert.Equal(200, defaultRendition.Width);
Assert.Equal(150, defaultRendition.Height);
Assert.Equal("w=200&h=150&fit=clip&rect=7,23,300,200", defaultRendition.Query);
Assert.NotNull(response.ApiResponse.RequestUrl);
}

Expand Down Expand Up @@ -1604,7 +1607,9 @@ private DeliveryClient InitializeDeliveryClientWithACustomTypeProvider(MockHttpM
null,
customTypeProvider,
new PropertyMapper(),
new DeliveryJsonSerializer(), new HtmlParser());
new DeliveryJsonSerializer(),
new HtmlParser(),
DeliveryOptionsFactory.CreateMonitor(_guid));
var client = Factories.DeliveryClientFactory.GetMockedDeliveryClientWithProjectId(
_guid,
handler,
Expand All @@ -1625,7 +1630,7 @@ private DeliveryClient InitializeDeliveryClientWithCustomModelProvider(MockHttpM
var typer = typeProvider ?? _mockTypeProvider;
var mapper = propertyMapper ?? A.Fake<IPropertyMapper>();
var serializer = new DeliveryJsonSerializer();
var modelProvider = new ModelProvider(null, null, typer, mapper, serializer, new HtmlParser());
var modelProvider = new ModelProvider(null, null, typer, mapper, serializer, new HtmlParser(), DeliveryOptionsFactory.CreateMonitor(_guid));
var client = Factories.DeliveryClientFactory.GetMockedDeliveryClientWithProjectId(_guid, handler, modelProvider);

var retryPolicy = A.Fake<IRetryPolicy>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ internal static class DeliveryClientFactory
var httpClient = GetHttpClient(httpMessageHandler);

var client = new DeliveryClient(
DeliveryOptionsFactory.CreateMonitor(new DeliveryOptions { ProjectId = projectId.ToString() }),
DeliveryOptionsFactory.CreateMonitor(projectId),
modelProvider ?? A.Fake<IModelProvider>(),
resiliencePolicyProvider ?? A.Fake<IRetryPolicyProvider>(),
typeProvider ?? A.Fake<ITypeProvider>(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using FakeItEasy;
using System;
using FakeItEasy;
using Kentico.Kontent.Delivery.Abstractions;
using Microsoft.Extensions.Options;

Expand All @@ -12,6 +13,11 @@ public static IOptionsMonitor<DeliveryOptions> CreateMonitor(DeliveryOptions opt
A.CallTo(() => mock.CurrentValue).Returns(options);
return mock;
}

public static IOptionsMonitor<DeliveryOptions> CreateMonitor(Guid projectId)
{
return CreateMonitor(new DeliveryOptions { ProjectId = projectId.ToString() });
}

public static IOptions<DeliveryOptions> Create(DeliveryOptions options)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@
"size": 90895,
"description": "Professional Espresso Machine",
"url": "https://assets.kenticocloud.com:443/975bf280-fd91-488c-994c-2f04416e5ee3/e700596b-03b0-4cee-ac5c-9212762c027a/coffee-beverages-explained-1080px.jpg",
"width": 60,
"height": 60,
"width": 800,
"height": 600,
"renditions": {
"default": {
"rendition_id": "d44a2887-74cc-4ab0-8376-ae96f3f534e5",
Expand Down
12 changes: 8 additions & 4 deletions Kentico.Kontent.Delivery.Tests/ModelProviderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public class ModelProviderTests
[Fact]
public async Task RetrievingContentModelWithCircularDependencyDoesNotCycle()
{
var deliveryOptions = DeliveryOptionsFactory.CreateMonitor(Guid.NewGuid());
var typeProvider = A.Fake<ITypeProvider>();
var contentLinkUrlResolver = A.Fake<IContentLinkUrlResolver>();
var propertyMapper = A.Fake<IPropertyMapper>();
Expand All @@ -28,7 +29,7 @@ public async Task RetrievingContentModelWithCircularDependencyDoesNotCycle()
var processor = InlineContentItemsProcessorFactory
.WithResolver(ResolveItemWithSingleRte)
.Build();
var retriever = new ModelProvider(contentLinkUrlResolver, processor, typeProvider, propertyMapper, new DeliveryJsonSerializer(), new HtmlParser());
var retriever = new ModelProvider(contentLinkUrlResolver, processor, typeProvider, propertyMapper, new DeliveryJsonSerializer(), new HtmlParser(), deliveryOptions);

var item = JToken.FromObject(Rt1);
var linkedItems = JToken.FromObject(LinkedItemsForItemWithTwoReferencedContentItems);
Expand All @@ -42,6 +43,7 @@ public async Task RetrievingContentModelWithCircularDependencyDoesNotCycle()
[Fact]
public async Task RetrievingNonExistentContentModelCreatesWarningInRichtext()
{
var deliveryOptions = DeliveryOptionsFactory.CreateMonitor(Guid.NewGuid());
var typeProvider = A.Fake<ITypeProvider>();
var contentLinkUrlResolver = A.Fake<IContentLinkUrlResolver>();
var propertyMapper = A.Fake<IPropertyMapper>();
Expand All @@ -51,7 +53,7 @@ public async Task RetrievingNonExistentContentModelCreatesWarningInRichtext()
var processor = InlineContentItemsProcessorFactory
.WithResolver(factory => factory.ResolveTo<UnknownContentItem>(unknownItem => $"Content type '{unknownItem.Type}' has no corresponding model."))
.Build();
var retriever = new ModelProvider(contentLinkUrlResolver, processor, typeProvider, propertyMapper, new DeliveryJsonSerializer(), new HtmlParser());
var retriever = new ModelProvider(contentLinkUrlResolver, processor, typeProvider, propertyMapper, new DeliveryJsonSerializer(), new HtmlParser(), deliveryOptions);

var item = JToken.FromObject(Rt5);
var linkedItems = JToken.FromObject(LinkedItemWithNoModel);
Expand All @@ -71,6 +73,7 @@ public async Task RetrievingNonExistentContentModelCreatesWarningInRichtext()
[Fact]
public async Task RetrievingContentModelWithItemInlineReferencingItselfDoesNotCycle()
{
var deliveryOptions = DeliveryOptionsFactory.CreateMonitor(Guid.NewGuid());
var typeProvider = A.Fake<ITypeProvider>();
var contentLinkUrlResolver = A.Fake<IContentLinkUrlResolver>();
var propertyMapper = A.Fake<IPropertyMapper>();
Expand All @@ -80,7 +83,7 @@ public async Task RetrievingContentModelWithItemInlineReferencingItselfDoesNotCy
var processor = InlineContentItemsProcessorFactory
.WithResolver(ResolveItemWithSingleRte)
.Build();
var retriever = new ModelProvider(contentLinkUrlResolver, processor, typeProvider, propertyMapper, new DeliveryJsonSerializer(), new HtmlParser());
var retriever = new ModelProvider(contentLinkUrlResolver, processor, typeProvider, propertyMapper, new DeliveryJsonSerializer(), new HtmlParser(), deliveryOptions);

var item = JToken.FromObject(Rt3);
var linkedItems = JToken.FromObject(LinkedItemsForItemReferencingItself);
Expand All @@ -98,12 +101,13 @@ public async Task GetContentItemModelRetrievingContentModelWithUnknownTypeReturn
var item = JToken.FromObject(Rt4);
var linkedItems = JToken.FromObject(LinkedItemsForItemWithTwoReferencedContentItems);

var deliveryOptions = DeliveryOptionsFactory.CreateMonitor(Guid.NewGuid());
var contentLinkUrlResolver = A.Fake<IContentLinkUrlResolver>();
var inlineContentItemsProcessor = A.Fake<IInlineContentItemsProcessor>();
var typeProvider = A.Fake<ITypeProvider>();
var propertyMapper = A.Fake<IPropertyMapper>();
A.CallTo(() => typeProvider.GetType("newType")).Returns(null);
var modelProvider = new ModelProvider(contentLinkUrlResolver, inlineContentItemsProcessor, typeProvider, propertyMapper, new DeliveryJsonSerializer(), new HtmlParser());
var modelProvider = new ModelProvider(contentLinkUrlResolver, inlineContentItemsProcessor, typeProvider, propertyMapper, new DeliveryJsonSerializer(), new HtmlParser(), deliveryOptions);

Assert.Null(await modelProvider.GetContentItemModelAsync<object>(item, linkedItems));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public ContentTypeExtractorTests()
A.CallTo(() => contentTypeProvider.GetCodename(typeof(TypeWithoutContentTypeCodename))).Returns(null);

var deliveryOptions = DeliveryOptionsFactory.CreateMonitor(new DeliveryOptions { ProjectId = FAKE_PROJECT_ID });
var modelProvider = new ModelProvider(null, null, contentTypeProvider, null, new DeliveryJsonSerializer(), new HtmlParser());
var modelProvider = new ModelProvider(null, null, contentTypeProvider, null, new DeliveryJsonSerializer(), new HtmlParser(), deliveryOptions);
_client = new DeliveryClient(
deliveryOptions,
modelProvider,
Expand Down