From 9bc4285d770c4507ed6723874b216834333e6418 Mon Sep 17 00:00:00 2001 From: Milos Date: Fri, 25 May 2018 10:44:14 +0200 Subject: [PATCH 1/4] Add Negative filter --- src/JsonApiDotNetCore/Extensions/IQueryableExtensions.cs | 4 ++++ src/JsonApiDotNetCore/Internal/Query/FilterOperations.cs | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/JsonApiDotNetCore/Extensions/IQueryableExtensions.cs b/src/JsonApiDotNetCore/Extensions/IQueryableExtensions.cs index 73e3a14a3e..79eda6c598 100644 --- a/src/JsonApiDotNetCore/Extensions/IQueryableExtensions.cs +++ b/src/JsonApiDotNetCore/Extensions/IQueryableExtensions.cs @@ -195,6 +195,10 @@ private static Expression GetFilterExpressionLambda(Expression left, Expression case FilterOperations.like: body = Expression.Call(left, "Contains", null, right); break; + // {model.Id != 1} + case FilterOperations.ne: + body = Expression.NotEqual(left, right); + break; default: throw new JsonApiException(500, $"Unknown filter operation {operation}"); } diff --git a/src/JsonApiDotNetCore/Internal/Query/FilterOperations.cs b/src/JsonApiDotNetCore/Internal/Query/FilterOperations.cs index 260dc32655..e3c207ce47 100644 --- a/src/JsonApiDotNetCore/Internal/Query/FilterOperations.cs +++ b/src/JsonApiDotNetCore/Internal/Query/FilterOperations.cs @@ -8,6 +8,7 @@ public enum FilterOperations gt = 2, le = 3, ge = 4, - like = 5 + like = 5, + ne = 6 } -} \ No newline at end of file +} From b59ea151ea2412cc7a7199880b934ca8a62f7212 Mon Sep 17 00:00:00 2001 From: Milos Date: Fri, 25 May 2018 17:19:54 +0200 Subject: [PATCH 2/4] Add NotEqual acceptance test --- .../Acceptance/Spec/AttributeFilterTests.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/AttributeFilterTests.cs b/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/AttributeFilterTests.cs index 083b2c22d7..df68f06eb0 100644 --- a/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/AttributeFilterTests.cs +++ b/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/AttributeFilterTests.cs @@ -105,5 +105,32 @@ public async Task Cannot_Filter_If_Explicitly_Forbidden() // assert Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); } + + [Fact] + public async Task Can_Filter_On_Not_Equal_Values() + { + // arrange + var context = _fixture.GetService(); + var todoItems = _todoItemFaker.Generate(5); + context.TodoItems.AddRange(todoItems); + await context.SaveChangesAsync(); + + var lastTodoItem = context.TodoItems.Last(); + var httpMethod = new HttpMethod("GET"); + var route = $"/api/v1/todo-items?filter[guid-property]=ne:{lastTodoItem.GuidProperty}"; + var request = new HttpRequestMessage(httpMethod, route); + + // act + var response = await _fixture.Client.SendAsync(request); + var body = await response.Content.ReadAsStringAsync(); + var deserializedTodoItems = _fixture + .GetService() + .DeserializeList(body); + + // assert + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal(deserializedTodoItems.Count(), todoItems.Count() -1); + Assert.False(deserializedTodoItems.Any(i => i.GuidProperty == lastTodoItem.GuidProperty)); + } } } From e7a9b73c6972d9ec1e754b8b724ba4d7fb3ba656 Mon Sep 17 00:00:00 2001 From: Milos Date: Fri, 25 May 2018 17:55:19 +0200 Subject: [PATCH 3/4] Changed Count --- .../Acceptance/Spec/AttributeFilterTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/AttributeFilterTests.cs b/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/AttributeFilterTests.cs index df68f06eb0..e1d92be3b6 100644 --- a/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/AttributeFilterTests.cs +++ b/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/AttributeFilterTests.cs @@ -129,7 +129,7 @@ public async Task Can_Filter_On_Not_Equal_Values() // assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal(deserializedTodoItems.Count(), todoItems.Count() -1); + Assert.Equal(deserializedTodoItems.Count, todoItems.Count() -1); Assert.False(deserializedTodoItems.Any(i => i.GuidProperty == lastTodoItem.GuidProperty)); } } From 8817ff6850157eee3b59c2bea28d88fb5d4e9e96 Mon Sep 17 00:00:00 2001 From: Milos Date: Sat, 26 May 2018 23:58:46 +0200 Subject: [PATCH 4/4] Fix NotEqual filter test --- .../Acceptance/Spec/AttributeFilterTests.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/AttributeFilterTests.cs b/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/AttributeFilterTests.cs index e1d92be3b6..b84b57e31b 100644 --- a/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/AttributeFilterTests.cs +++ b/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/AttributeFilterTests.cs @@ -111,13 +111,13 @@ public async Task Can_Filter_On_Not_Equal_Values() { // arrange var context = _fixture.GetService(); - var todoItems = _todoItemFaker.Generate(5); - context.TodoItems.AddRange(todoItems); + var todoItem = _todoItemFaker.Generate(); + context.TodoItems.Add(todoItem); await context.SaveChangesAsync(); - var lastTodoItem = context.TodoItems.Last(); + var totalCount = context.TodoItems.Count(); var httpMethod = new HttpMethod("GET"); - var route = $"/api/v1/todo-items?filter[guid-property]=ne:{lastTodoItem.GuidProperty}"; + var route = $"/api/v1/todo-items?page[size]={totalCount}&filter[ordinal]=ne:{todoItem.Ordinal}"; var request = new HttpRequestMessage(httpMethod, route); // act @@ -129,8 +129,7 @@ public async Task Can_Filter_On_Not_Equal_Values() // assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.Equal(deserializedTodoItems.Count, todoItems.Count() -1); - Assert.False(deserializedTodoItems.Any(i => i.GuidProperty == lastTodoItem.GuidProperty)); + Assert.False(deserializedTodoItems.Any(i => i.Ordinal == todoItem.Ordinal)); } } }