From 8bbb7602f6a4d21225b2637ed166a0e58233c470 Mon Sep 17 00:00:00 2001 From: Juraj Bielik Date: Fri, 31 Aug 2018 17:02:05 +0200 Subject: [PATCH] KA-389 Get rid of ContentTypeExtractor class --- .../Models/ContentTypes/CustomTypeProvider.cs | 7 +- .../Models/ContentTypes/CustomTypeProvider.cs | 7 +- .../ContentTypeExtractorTests.cs | 90 ++++--------------- KenticoCloud.Delivery/DeliveryClient.cs | 30 ++++++- .../Utilities/ContentTypeExtractor.cs | 47 ---------- 5 files changed, 48 insertions(+), 133 deletions(-) delete mode 100644 KenticoCloud.Delivery/QueryParameters/Utilities/ContentTypeExtractor.cs diff --git a/KenticoCloud.Delivery.Rx.Tests/Models/ContentTypes/CustomTypeProvider.cs b/KenticoCloud.Delivery.Rx.Tests/Models/ContentTypes/CustomTypeProvider.cs index 8c81df38..2fa3917a 100644 --- a/KenticoCloud.Delivery.Rx.Tests/Models/ContentTypes/CustomTypeProvider.cs +++ b/KenticoCloud.Delivery.Rx.Tests/Models/ContentTypes/CustomTypeProvider.cs @@ -30,12 +30,7 @@ public Type GetType(string contentType) public string GetCodename(Type contentType) { - if (!TypesDictionary.TryGetValue(contentType, out var codename)) - { - return null; - } - - return codename; + return TypesDictionary.TryGetValue(contentType, out var codename) ? codename : null; } } } \ No newline at end of file diff --git a/KenticoCloud.Delivery.Tests/Models/ContentTypes/CustomTypeProvider.cs b/KenticoCloud.Delivery.Tests/Models/ContentTypes/CustomTypeProvider.cs index 90da4f93..fc7b2398 100644 --- a/KenticoCloud.Delivery.Tests/Models/ContentTypes/CustomTypeProvider.cs +++ b/KenticoCloud.Delivery.Tests/Models/ContentTypes/CustomTypeProvider.cs @@ -30,12 +30,7 @@ public Type GetType(string contentType) public string GetCodename(Type contentType) { - if (!TypesDictionary.TryGetValue(contentType, out var codename)) - { - return null; - } - - return codename; + return TypesDictionary.TryGetValue(contentType, out var codename) ? codename : null; } } } \ No newline at end of file diff --git a/KenticoCloud.Delivery.Tests/QueryParameters/ContentTypeExtractorTests.cs b/KenticoCloud.Delivery.Tests/QueryParameters/ContentTypeExtractorTests.cs index fa8713f9..3a72461f 100644 --- a/KenticoCloud.Delivery.Tests/QueryParameters/ContentTypeExtractorTests.cs +++ b/KenticoCloud.Delivery.Tests/QueryParameters/ContentTypeExtractorTests.cs @@ -1,5 +1,6 @@ -using KenticoCloud.Delivery.QueryParameters.Utilities; +using System; using System.Collections.Generic; +using FakeItEasy; using Xunit; namespace KenticoCloud.Delivery.Tests.QueryParameters @@ -7,12 +8,22 @@ namespace KenticoCloud.Delivery.Tests.QueryParameters public class ContentTypeExtractorTests { private const string CONTENT_TYPE_CODENAME = "SomeContentType"; + private const string FAKE_PROJECT_ID = "00000000-0000-0000-0000-000000000000"; - private ContentTypeExtractor _extractor; + private readonly DeliveryClient _client; + private readonly ICodeFirstTypeProvider _contentTypeProvider; public ContentTypeExtractorTests() { - _extractor = new ContentTypeExtractor(); + _contentTypeProvider = A.Fake(); + + A.CallTo(() => _contentTypeProvider.GetCodename(typeof(TypeWithContentTypeCodename))).Returns(TypeWithContentTypeCodename.Codename); + A.CallTo(() => _contentTypeProvider.GetCodename(typeof(TypeWithoutContentTypeCodename))).Returns(null); + + _client = new DeliveryClient(FAKE_PROJECT_ID) + { + CodeFirstModelProvider = {TypeProvider = _contentTypeProvider} + }; } private class TypeWithContentTypeCodename @@ -20,80 +31,17 @@ 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 - { - get - { - return CONTENT_TYPE_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() { var existingParams = new List() { new SkipParameter(15) }; - var enhancedParams = new List(_extractor.ExtractParameters(existingParams)); + var enhancedParams = new List(_client.ExtractParameters(existingParams)); Assert.Equal(2, enhancedParams.Count); Assert.True(enhancedParams.Find(x => x.GetQueryStringParameter() == $"system.type={CONTENT_TYPE_CODENAME}") != null); @@ -102,7 +50,7 @@ public void ExtractParameters_WhenGivenTypeWithCodenameAndExistingParams_AddsCod [Fact] public void ExtractParameters_WhenGivenTypeWithCodename_CreatesNewParams() { - var enhancedParams = new List(_extractor.ExtractParameters()); + var enhancedParams = new List(_client.ExtractParameters()); Assert.Single(enhancedParams); Assert.True(enhancedParams.Find(x => x.GetQueryStringParameter() == $"system.type={CONTENT_TYPE_CODENAME}") != null); @@ -111,7 +59,7 @@ public void ExtractParameters_WhenGivenTypeWithCodename_CreatesNewParams() [Fact] public void ExtractParameters_WhenGivenTypeWithoutCodenameNoParams_CreatesEmptyParams() { - var enhancedParams = new List(_extractor.ExtractParameters()); + var enhancedParams = new List(_client.ExtractParameters()); Assert.Empty(enhancedParams); } @@ -121,7 +69,7 @@ public void ExtractParameters_WhenGivenTypeWithoutCodenameAndParams_ReturnsParam { var existingParams = new List() { new SkipParameter(15) }; - var enhancedParams = new List(_extractor.ExtractParameters(existingParams)); + var enhancedParams = new List(_client.ExtractParameters(existingParams)); Assert.Single(enhancedParams); Assert.True(enhancedParams.Find(x => x.GetQueryStringParameter() == $"system.type=TypeWithoutContentTypeCodename") == null); @@ -132,7 +80,7 @@ public void ExtractParameters_WhenGivenTypeWithCodenameAndExistingTypeParameter_ { var existingParams = new List() { new EqualsFilter("system.type", CONTENT_TYPE_CODENAME) }; - var enhancedParams = new List(_extractor.ExtractParameters(existingParams)); + var enhancedParams = new List(_client.ExtractParameters(existingParams)); Assert.Single(enhancedParams); Assert.True(enhancedParams.Find(x => x.GetQueryStringParameter() == $"system.type={CONTENT_TYPE_CODENAME}") != null); diff --git a/KenticoCloud.Delivery/DeliveryClient.cs b/KenticoCloud.Delivery/DeliveryClient.cs index 60916893..65a80017 100644 --- a/KenticoCloud.Delivery/DeliveryClient.cs +++ b/KenticoCloud.Delivery/DeliveryClient.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Net; using System.Net.Http; using System.Threading.Tasks; @@ -18,7 +19,6 @@ namespace KenticoCloud.Delivery public sealed class DeliveryClient : IDeliveryClient { private readonly DeliveryOptions _deliveryOptions; - private readonly QueryParameters.Utilities.ContentTypeExtractor _extractor; private HttpClient _httpClient; private DeliveryEndpointUrlBuilder _urlBuilder; @@ -129,7 +129,6 @@ public DeliveryClient(DeliveryOptions deliveryOptions) } _deliveryOptions.ProjectId = projectIdGuid.ToString("D"); - _extractor = new QueryParameters.Utilities.ContentTypeExtractor(); } /// @@ -310,7 +309,7 @@ public async Task> GetItemsAsync(params IQuery /// The instance that contains the content items. If no query parameters are specified, all content items are returned. public async Task> GetItemsAsync(IEnumerable parameters) { - var enhancedParameters = _extractor.ExtractParameters(parameters); + var enhancedParameters = ExtractParameters(parameters); var endpointUrl = UrlBuilder.GetItemsUrl(enhancedParameters); var response = await GetDeliverResponseAsync(endpointUrl); @@ -590,5 +589,30 @@ private async Task GetResponseContent(HttpResponseMessage httpResponseM throw new DeliveryException(httpResponseMessage, faultContent); } + + internal IEnumerable ExtractParameters(IEnumerable parameters = null) + { + var enhancedParameters = parameters != null + ? new List(parameters) + : new List(); + + var codename = _codeFirstModelProvider.TypeProvider.GetCodename(typeof(T)); + + if (codename != null && !IsTypeInQueryParameters(parameters)) + { + enhancedParameters.Add(new EqualsFilter("system.type", codename)); + } + return enhancedParameters; + } + + private static bool IsTypeInQueryParameters(IEnumerable parameters) + { + var typeFilterExists = parameters? + .OfType() + .Any(filter => filter + .ElementOrAttributePath + .Equals("system.type", StringComparison.Ordinal)); + return typeFilterExists ?? false; + } } } diff --git a/KenticoCloud.Delivery/QueryParameters/Utilities/ContentTypeExtractor.cs b/KenticoCloud.Delivery/QueryParameters/Utilities/ContentTypeExtractor.cs deleted file mode 100644 index a18512ab..00000000 --- a/KenticoCloud.Delivery/QueryParameters/Utilities/ContentTypeExtractor.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; - -namespace KenticoCloud.Delivery.QueryParameters.Utilities -{ - internal class ContentTypeExtractor - { - internal IEnumerable ExtractParameters(IEnumerable parameters = null) - { - var enhancedParameters = parameters != null ? new List(parameters) : new List(); - - if (!IsAlreadyInParameters(parameters) && TryGetContentTypeCodename(typeof(T), out string contentTypeCodename)) - { - enhancedParameters.Add(new EqualsFilter("system.type", contentTypeCodename)); - } - return enhancedParameters; - } - - private bool IsAlreadyInParameters(IEnumerable parameters) - { - var typeFilterExists = parameters? - .OfType() - .Any(filter => filter - .ElementOrAttributePath - .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; - } - } -}