diff --git a/src/JsonApiDotNetCore/Internal/Query/QuerySet.cs b/src/JsonApiDotNetCore/Internal/Query/QuerySet.cs index f4e1965efe..acf448d69d 100644 --- a/src/JsonApiDotNetCore/Internal/Query/QuerySet.cs +++ b/src/JsonApiDotNetCore/Internal/Query/QuerySet.cs @@ -101,8 +101,11 @@ private List ParseFilterQuery(string key, string value) return (string.Empty, value); // remove prefix from value + if(Enum.TryParse(operation[0], out FilterOperations op) == false) + return (string.Empty, value); + var prefix = operation[0]; - value = operation[1]; + value = string.Join(":", operation.Skip(1)); return (prefix, value); } diff --git a/src/JsonApiDotNetCore/JsonApiDotNetCore.csproj b/src/JsonApiDotNetCore/JsonApiDotNetCore.csproj index b974570a90..80f2a0cd77 100755 --- a/src/JsonApiDotNetCore/JsonApiDotNetCore.csproj +++ b/src/JsonApiDotNetCore/JsonApiDotNetCore.csproj @@ -1,6 +1,6 @@  - 2.1.2 + 2.1.3 netstandard1.6 JsonApiDotNetCore JsonApiDotNetCore diff --git a/test/UnitTests/Internal/QuerySet_Tests.cs b/test/UnitTests/Internal/QuerySet_Tests.cs index 7a78c7ee4a..2a433e63af 100644 --- a/test/UnitTests/Internal/QuerySet_Tests.cs +++ b/test/UnitTests/Internal/QuerySet_Tests.cs @@ -48,6 +48,60 @@ public void Can_Build_Filters() Assert.Equal("value", querySet.Filters.Single(f => f.Key == "Key").Value); } + [Fact] + public void Filters_Properly_Parses_DateTime_With_Operation() + { + // arrange + const string dt = "2017-08-15T22:43:47.0156350-05:00"; + var query = new Dictionary { + { "filter[key]", new StringValues("le:" + dt) } + }; + + _queryCollectionMock + .Setup(m => m.GetEnumerator()) + .Returns(query.GetEnumerator()); + + _jsonApiContextMock + .Setup(m => m.GetControllerAttribute()) + .Returns(new DisableQueryAttribute(QueryParams.None)); + + // act -- ctor calls BuildQuerySet() + var querySet = new QuerySet( + _jsonApiContextMock.Object, + _queryCollectionMock.Object); + + // assert + Assert.Equal(dt, querySet.Filters.Single(f => f.Key == "Key").Value); + Assert.Equal("le", querySet.Filters.Single(f => f.Key == "Key").Operation); + } + + [Fact] + public void Filters_Properly_Parses_DateTime_Without_Operation() + { + // arrange + const string dt = "2017-08-15T22:43:47.0156350-05:00"; + var query = new Dictionary { + { "filter[key]", new StringValues(dt) } + }; + + _queryCollectionMock + .Setup(m => m.GetEnumerator()) + .Returns(query.GetEnumerator()); + + _jsonApiContextMock + .Setup(m => m.GetControllerAttribute()) + .Returns(new DisableQueryAttribute(QueryParams.None)); + + // act -- ctor calls BuildQuerySet() + var querySet = new QuerySet( + _jsonApiContextMock.Object, + _queryCollectionMock.Object); + + // assert + Assert.Equal(dt, querySet.Filters.Single(f => f.Key == "Key").Value); + Assert.Equal(string.Empty, querySet.Filters.Single(f => f.Key == "Key").Operation); + } + [Fact] public void Can_Disable_Filters() {