From 56e49aed7451473c66a8952ad0ae3c37e738dc87 Mon Sep 17 00:00:00 2001 From: "F. DeWayne Lane" Date: Tue, 12 May 2020 11:25:47 -0400 Subject: [PATCH 1/3] Fixed: GetDefaultSort Order --- src/JsonApiDotNetCore/QueryParameterServices/SortService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/JsonApiDotNetCore/QueryParameterServices/SortService.cs b/src/JsonApiDotNetCore/QueryParameterServices/SortService.cs index e8f6a9d837..b1ef0d8741 100644 --- a/src/JsonApiDotNetCore/QueryParameterServices/SortService.cs +++ b/src/JsonApiDotNetCore/QueryParameterServices/SortService.cs @@ -29,7 +29,7 @@ public SortService(IResourceDefinitionProvider resourceDefinitionProvider, /// public List Get() { - if (_queries == null) + if (!_queries.Any()) { var requestResourceDefinition = _resourceDefinitionProvider.Get(_requestResource.ResourceType); if (requestResourceDefinition != null) From 8df1d7b598ca49920f76a9038947acd3570246b4 Mon Sep 17 00:00:00 2001 From: "F. DeWayne Lane" Date: Tue, 12 May 2020 11:28:46 -0400 Subject: [PATCH 2/3] Added ResourceDefinition Test for GetDefaultSort --- test/UnitTests/Models/ResourceDefinitionTests.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/UnitTests/Models/ResourceDefinitionTests.cs b/test/UnitTests/Models/ResourceDefinitionTests.cs index 412af3c7f5..c57eb3ac9a 100644 --- a/test/UnitTests/Models/ResourceDefinitionTests.cs +++ b/test/UnitTests/Models/ResourceDefinitionTests.cs @@ -10,6 +10,19 @@ namespace UnitTests.Models { public sealed class ResourceDefinition_Scenario_Tests { + [Fact] + public void Property_Sort_Order_Uses_NewExpression() + { + // Arrange + var resource = new RequestFilteredResource(isAdmin: false); + + // Act + var sorts = resource.DefaultSort(); + + // Assert + Assert.Equal(SortDirection.Ascending, sorts[0].Item2); + } + [Fact] public void Request_Filter_Uses_Member_Expression() { From d8068723b816a25f131cb901b3a26550666ae7a3 Mon Sep 17 00:00:00 2001 From: Bart Koelman Date: Wed, 13 May 2020 11:46:29 +0200 Subject: [PATCH 3/3] Added named tuples to remove the need for Item1; expanded test a bit. --- src/JsonApiDotNetCore/Models/ResourceDefinition.cs | 12 +++++++----- .../QueryParameterServices/SortService.cs | 2 +- test/UnitTests/Models/ResourceDefinitionTests.cs | 14 +++++++++++--- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/JsonApiDotNetCore/Models/ResourceDefinition.cs b/src/JsonApiDotNetCore/Models/ResourceDefinition.cs index 07a71edaf2..2f8997992f 100644 --- a/src/JsonApiDotNetCore/Models/ResourceDefinition.cs +++ b/src/JsonApiDotNetCore/Models/ResourceDefinition.cs @@ -13,7 +13,7 @@ public interface IResourceDefinition List GetAllowedAttributes(); List GetAllowedRelationships(); object GetCustomQueryFilter(string key); - List<(AttrAttribute, SortDirection)> DefaultSort(); + List<(AttrAttribute Attribute, SortDirection SortDirection)> DefaultSort(); } /// @@ -146,14 +146,16 @@ public sealed class QueryFilters : Dictionary /// public virtual PropertySortOrder GetDefaultSortOrder() => null; - public List<(AttrAttribute, SortDirection)> DefaultSort() + public List<(AttrAttribute Attribute, SortDirection SortDirection)> DefaultSort() { var defaultSortOrder = GetDefaultSortOrder(); if (defaultSortOrder != null && defaultSortOrder.Count > 0) { - var order = new List<(AttrAttribute, SortDirection)>(); + var order = new List<(AttrAttribute Attribute, SortDirection SortDirection)>(); foreach (var sortProp in defaultSortOrder) - order.Add((_resourceGraph.GetAttributes(sortProp.Item1).Single(), sortProp.Item2)); + { + order.Add((_resourceGraph.GetAttributes(sortProp.Attribute).Single(), sortProp.SortDirection)); + } return order; } @@ -166,6 +168,6 @@ public sealed class QueryFilters : Dictionary /// method signature. /// See for usage details. /// - public sealed class PropertySortOrder : List<(Expression>, SortDirection)> { } + public sealed class PropertySortOrder : List<(Expression> Attribute, SortDirection SortDirection)> { } } } diff --git a/src/JsonApiDotNetCore/QueryParameterServices/SortService.cs b/src/JsonApiDotNetCore/QueryParameterServices/SortService.cs index b1ef0d8741..f1df933a70 100644 --- a/src/JsonApiDotNetCore/QueryParameterServices/SortService.cs +++ b/src/JsonApiDotNetCore/QueryParameterServices/SortService.cs @@ -33,7 +33,7 @@ public List Get() { var requestResourceDefinition = _resourceDefinitionProvider.Get(_requestResource.ResourceType); if (requestResourceDefinition != null) - return requestResourceDefinition.DefaultSort()?.Select(d => BuildQueryContext(new SortQuery(d.Item1.PublicAttributeName, d.Item2))).ToList(); + return requestResourceDefinition.DefaultSort()?.Select(d => BuildQueryContext(new SortQuery(d.Attribute.PublicAttributeName, d.SortDirection))).ToList(); } return _queries.ToList(); } diff --git a/test/UnitTests/Models/ResourceDefinitionTests.cs b/test/UnitTests/Models/ResourceDefinitionTests.cs index c57eb3ac9a..682d9e10d5 100644 --- a/test/UnitTests/Models/ResourceDefinitionTests.cs +++ b/test/UnitTests/Models/ResourceDefinitionTests.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using JsonApiDotNetCore.Builders; using JsonApiDotNetCore.Internal.Query; using JsonApiDotNetCore.Models; @@ -20,9 +21,15 @@ public void Property_Sort_Order_Uses_NewExpression() var sorts = resource.DefaultSort(); // Assert - Assert.Equal(SortDirection.Ascending, sorts[0].Item2); + Assert.Equal(2, sorts.Count); + + Assert.Equal(nameof(Model.Prop), sorts[0].Attribute.PropertyInfo.Name); + Assert.Equal(SortDirection.Ascending, sorts[0].SortDirection); + + Assert.Equal(nameof(Model.Password), sorts[1].Attribute.PropertyInfo.Name); + Assert.Equal(SortDirection.Descending, sorts[1].SortDirection); } - + [Fact] public void Request_Filter_Uses_Member_Expression() { @@ -76,7 +83,8 @@ public override QueryFilters GetQueryFilters() }; public override PropertySortOrder GetDefaultSortOrder() => new PropertySortOrder { - (t => t.Prop, SortDirection.Ascending) + (t => t.Prop, SortDirection.Ascending), + (t => t.Password, SortDirection.Descending) }; } }