diff --git a/src/JsonApiDotNetCore/Services/QueryParser.cs b/src/JsonApiDotNetCore/Services/QueryParser.cs index 5787ab722f..bffcdc9a59 100644 --- a/src/JsonApiDotNetCore/Services/QueryParser.cs +++ b/src/JsonApiDotNetCore/Services/QueryParser.cs @@ -153,7 +153,10 @@ protected virtual List ParseSortParameters(string value) const char DESCENDING_SORT_OPERATOR = '-'; var sortSegments = value.Split(QueryConstants.COMMA); - + if(sortSegments.Where(s => s == string.Empty).Count() >0) + { + throw new JsonApiException(400, "The sort URI segment contained a null value."); + } foreach (var sortSegment in sortSegments) { var propertyName = sortSegment; diff --git a/test/UnitTests/Services/QueryParser_Tests.cs b/test/UnitTests/Services/QueryParserTests.cs similarity index 92% rename from test/UnitTests/Services/QueryParser_Tests.cs rename to test/UnitTests/Services/QueryParserTests.cs index c0e5752dad..58cd6251e9 100644 --- a/test/UnitTests/Services/QueryParser_Tests.cs +++ b/test/UnitTests/Services/QueryParserTests.cs @@ -12,12 +12,12 @@ namespace UnitTests.Services { - public class QueryParser_Tests + public class QueryParserTests { private readonly Mock _controllerContextMock; private readonly Mock _queryCollectionMock; - public QueryParser_Tests() + public QueryParserTests() { _controllerContextMock = new Mock(); _queryCollectionMock = new Mock(); @@ -126,11 +126,34 @@ public void Can_Disable_Filters() // assert Assert.Empty(querySet.Filters); } + [Theory] + [InlineData("text,,1")] + [InlineData("text,hello,,5")] + [InlineData(",,2")] + public void Parse_EmptySortSegment_ReceivesJsonApiException(string stringSortQuery) + { + // Arrange + var query = new Dictionary { + { "sort", new StringValues(stringSortQuery) } + }; + + _queryCollectionMock + .Setup(m => m.GetEnumerator()) + .Returns(query.GetEnumerator()); + + var queryParser = new QueryParser(_controllerContextMock.Object, new JsonApiOptions()); + // Act / Assert + var exception = Assert.Throws(() => + { + var querySet = queryParser.Parse(_queryCollectionMock.Object); + }); + Assert.Contains("sort", exception.Message); + } [Fact] public void Can_Disable_Sort() { - // arrange + // Arrange var query = new Dictionary { { "sort", new StringValues("-key") } }; diff --git a/test/UnitTests/UnitTests.csproj b/test/UnitTests/UnitTests.csproj index 1e344d064b..b4f96631ca 100644 --- a/test/UnitTests/UnitTests.csproj +++ b/test/UnitTests/UnitTests.csproj @@ -1,4 +1,4 @@ - + $(NetCoreAppVersion) false @@ -9,6 +9,7 @@ +