Skip to content

Commit

Permalink
KA-389 Replace TryGetContentTypeCodename method
Browse files Browse the repository at this point in the history
  • Loading branch information
Juraj Bielik committed Aug 31, 2018
1 parent 5ab6d31 commit 593c875
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 70 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using KenticoCloud.Delivery.QueryParameters.Utilities;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using FakeItEasy;
using Xunit;

namespace KenticoCloud.Delivery.Tests.QueryParameters
Expand All @@ -8,40 +10,29 @@ public class ContentTypeExtractorTests
{
private const string CONTENT_TYPE_CODENAME = "SomeContentType";

private ContentTypeExtractor _extractor;
private readonly ContentTypeExtractor _extractor;
private readonly ICodeFirstTypeProvider _contentTypeProvider;

public ContentTypeExtractorTests()
{
_extractor = new ContentTypeExtractor();
_contentTypeProvider = A.Fake<ICodeFirstTypeProvider>();

A.CallTo(() => _contentTypeProvider.GetCodename(typeof(TypeWithContentTypeCodename))).Returns(TypeWithContentTypeCodename.Codename);
A.CallTo(() => _contentTypeProvider.GetCodename(typeof(TypeWithoutContentTypeCodename))).Returns(null);

_extractor = new ContentTypeExtractor(_contentTypeProvider);
}

private class TypeWithContentTypeCodename
{
public const string Codename = CONTENT_TYPE_CODENAME;
}

[Fact]
public void TryGetContentTypeCodename_WhenGivenTypeWithCodename_ReturnsTrueAndCodename()
{
var success = _extractor.TryGetContentTypeCodename(typeof(TypeWithContentTypeCodename), out string resultCodename);

Assert.True(success);
Assert.Equal("SomeContentType", resultCodename);
}

private class TypeWithoutContentTypeCodename
{
public const int Answer = 42;
}

[Fact]
public void TryGetContentTypeCodename_WhenGivenTypeWithoutCodename_ReturnsFalse()
{
var success = _extractor.TryGetContentTypeCodename(typeof(TypeWithoutContentTypeCodename), out string resultCodename);

Assert.False(success);
}

private class TypeWithContentTypeCodenameAsProperty
{
public string Codename
Expand All @@ -53,41 +44,11 @@ public string Codename
}
}

[Fact]
public void TryGetContentTypeCodename_WhenGivenTypeWithCodenameAsProperty_ReturnsFalse()
{

var success = _extractor.TryGetContentTypeCodename(typeof(TypeWithContentTypeCodenameAsProperty), out string resultCodename);

Assert.False(success);
}

private class TypeWithContentTypeCodenameAsVariable
{
public string Codename = "42";
}

[Fact]
public void TryGetContentTypeCodename_WhenGivenTypeWithCodenameAsVariable_ReturnsFalse()
{
var success = _extractor.TryGetContentTypeCodename(typeof(TypeWithContentTypeCodenameAsVariable), out string resultCodename);

Assert.False(success);
}

private class TypeWithContentTypeCodenameAsPrivateField
{
private const string Codename = "MyPrivateCodename";
}

[Fact]
public void TryGetContentTypeCodename_WhenGivenTypeWithCodenameAsPrivateField_ReturnsFalse()
{
var success = _extractor.TryGetContentTypeCodename(typeof(TypeWithContentTypeCodenameAsPrivateField), out string resultCodename);

Assert.False(success);
}

[Fact]
public void ExtractParameters_WhenGivenTypeWithCodenameAndExistingParams_AddsCodenameToParams()
{
Expand Down
2 changes: 1 addition & 1 deletion KenticoCloud.Delivery/DeliveryClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ public DeliveryClient(DeliveryOptions deliveryOptions)
}

_deliveryOptions.ProjectId = projectIdGuid.ToString("D");
_extractor = new QueryParameters.Utilities.ContentTypeExtractor();
_extractor = new QueryParameters.Utilities.ContentTypeExtractor(_codeFirstModelProvider.TypeProvider);
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,24 @@ namespace KenticoCloud.Delivery.QueryParameters.Utilities
{
internal class ContentTypeExtractor
{
private readonly ICodeFirstTypeProvider _provider;

public ContentTypeExtractor(ICodeFirstTypeProvider provider)
{
_provider = provider;
}

internal IEnumerable<IQueryParameter> ExtractParameters<T>(IEnumerable<IQueryParameter> parameters = null)
{
var enhancedParameters = parameters != null ? new List<IQueryParameter>(parameters) : new List<IQueryParameter>();

if (!IsAlreadyInParameters(parameters) && TryGetContentTypeCodename(typeof(T), out string contentTypeCodename))
var enhancedParameters = parameters != null
? new List<IQueryParameter>(parameters)
: new List<IQueryParameter>();

var codename = _provider.GetCodename(typeof(T));

if (!IsAlreadyInParameters(parameters) && codename != null)
{
enhancedParameters.Add(new EqualsFilter("system.type", contentTypeCodename));
enhancedParameters.Add(new EqualsFilter("system.type", codename));
}
return enhancedParameters;
}
Expand All @@ -27,21 +38,5 @@ private bool IsAlreadyInParameters(IEnumerable<IQueryParameter> parameters)
.Equals("system.type", StringComparison.Ordinal));
return typeFilterExists ?? false;
}

internal bool TryGetContentTypeCodename(Type contentType, out string codename)
{
var fields = contentType.GetFields(BindingFlags.Static | BindingFlags.Public);
string codenameField = "Codename";

if (fields.Any(field => field.Name == codenameField))
{
codename = (string)contentType.GetField(codenameField)?.GetValue(null);
return codename != null;
}

codename = null;

return false;
}
}
}

0 comments on commit 593c875

Please sign in to comment.