mirror of
				https://github.com/Biarity/Sieve.git
				synced 2025-10-31 00:39:12 +01:00 
			
		
		
		
	interface type fixes & unit test improvements
This commit is contained in:
		| @@ -3,7 +3,6 @@ using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using Sieve.Exceptions; | ||||
| using Sieve.Models; | ||||
| using Sieve.Services; | ||||
| using SieveUnitTests.Abstractions.Entity; | ||||
| using SieveUnitTests.Entities; | ||||
| using SieveUnitTests.Services; | ||||
| @@ -12,28 +11,14 @@ using Xunit.Abstractions; | ||||
|  | ||||
| namespace SieveUnitTests | ||||
| { | ||||
|     public class GeneralWithInterfaces | ||||
|     public class GeneralWithInterfaces: TestBase | ||||
|     { | ||||
|         private readonly ITestOutputHelper _testOutputHelper; | ||||
|         private readonly SieveProcessor _processor; | ||||
|         private readonly SieveProcessor _nullableProcessor; | ||||
|         private readonly IQueryable<IPost> _posts; | ||||
|         private readonly IQueryable<Comment> _comments; | ||||
|  | ||||
|         public GeneralWithInterfaces(ITestOutputHelper testOutputHelper) | ||||
|             : base(testOutputHelper) | ||||
|         { | ||||
|             var nullableAccessor = new SieveOptionsAccessor(); | ||||
|             nullableAccessor.Value.IgnoreNullsOnNotEqual = false; | ||||
|  | ||||
|             _testOutputHelper = testOutputHelper; | ||||
|             _processor = new ApplicationSieveProcessor(new SieveOptionsAccessor(), | ||||
|                 new SieveCustomSortMethods(), | ||||
|                 new SieveCustomFilterMethods()); | ||||
|  | ||||
|             _nullableProcessor = new ApplicationSieveProcessor(nullableAccessor, | ||||
|                 new SieveCustomSortMethods(), | ||||
|                 new SieveCustomFilterMethods()); | ||||
|  | ||||
|             _posts = new List<IPost> | ||||
|             { | ||||
|                 new Post | ||||
| @@ -44,7 +29,8 @@ namespace SieveUnitTests | ||||
|                     IsDraft = true, | ||||
|                     CategoryId = null, | ||||
|                     TopComment = new Comment { Id = 0, Text = "A1" }, | ||||
|                     FeaturedComment = new Comment { Id = 4, Text = "A2" } | ||||
|                     FeaturedComment = new Comment { Id = 4, Text = "A2" }, | ||||
|                     DeletedBy = "Me" | ||||
|                 }, | ||||
|                 new Post | ||||
|                 { | ||||
| @@ -54,7 +40,9 @@ namespace SieveUnitTests | ||||
|                     IsDraft = false, | ||||
|                     CategoryId = 1, | ||||
|                     TopComment = new Comment { Id = 3, Text = "B1" }, | ||||
|                     FeaturedComment = new Comment { Id = 5, Text = "B2" } | ||||
|                     FeaturedComment = new Comment { Id = 5, Text = "B2" }, | ||||
|                     DeletedBy = "You", | ||||
|                     UpdatedBy = "Me" | ||||
|                 }, | ||||
|                 new Post | ||||
|                 { | ||||
| @@ -63,7 +51,9 @@ namespace SieveUnitTests | ||||
|                     LikeCount = 0, | ||||
|                     CategoryId = 1, | ||||
|                     TopComment = new Comment { Id = 2, Text = "C1" }, | ||||
|                     FeaturedComment = new Comment { Id = 6, Text = "C2" } | ||||
|                     FeaturedComment = new Comment { Id = 6, Text = "C2" }, | ||||
|                     DeletedBy = "Not Me", | ||||
|                     UpdatedBy = "Your highness" | ||||
|                 }, | ||||
|                 new Post | ||||
|                 { | ||||
| @@ -73,8 +63,29 @@ namespace SieveUnitTests | ||||
|                     IsDraft = true, | ||||
|                     CategoryId = 2, | ||||
|                     TopComment = new Comment { Id = 1, Text = "D1" }, | ||||
|                     FeaturedComment = new Comment { Id = 7, Text = "D2" } | ||||
|                     FeaturedComment = new Comment { Id = 7, Text = "D2" }, | ||||
|                     UpdatedBy = "Him" | ||||
|                 }, | ||||
|                 new Post | ||||
|                 { | ||||
|                     Id = 4, | ||||
|                     Title = "E", | ||||
|                     LikeCount = 5, | ||||
|                     IsDraft = false, | ||||
|                     CategoryId = null, | ||||
|                     TopComment = new Comment { Id = 4, Text = "E1" }, | ||||
|                     UpdatedBy = "You" | ||||
|                 }, | ||||
|                 new Post | ||||
|                 { | ||||
|                     Id = 5, | ||||
|                     Title = "Yen", | ||||
|                     LikeCount = 5, | ||||
|                     IsDraft = true, | ||||
|                     CategoryId = 5, | ||||
|                     TopComment = new Comment { Id = 4, Text = "Yen3" }, | ||||
|                     FeaturedComment = new Comment { Id = 8, Text = "Yen4" } | ||||
|                 } | ||||
|             }.AsQueryable(); | ||||
|  | ||||
|             _comments = new List<Comment> | ||||
| @@ -108,10 +119,13 @@ namespace SieveUnitTests | ||||
|                 Filters = "Title@=*a" | ||||
|             }; | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|  | ||||
|             Assert.Equal(0, result.First().Id); | ||||
|             Assert.True(result.Count() == 1); | ||||
|                 Assert.Equal(0, result.First().Id); | ||||
|                 Assert.True(result.Count() == 1); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
| @@ -122,23 +136,26 @@ namespace SieveUnitTests | ||||
|                 Filters = "Title!=*a" | ||||
|             }; | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|  | ||||
|             Assert.Equal(1, result.First().Id); | ||||
|             Assert.True(result.Count() == 3); | ||||
|                 Assert.Equal(1, result.First().Id); | ||||
|                 Assert.True(result.Count() == _posts.Count(post => !post.Title.Contains("a", StringComparison.OrdinalIgnoreCase))); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void ContainsIsCaseSensitive() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             var model = new SieveModel { Filters = "Title@=a", }; | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Filters = "Title@=a", | ||||
|             }; | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|  | ||||
|             Assert.True(!result.Any()); | ||||
|                 Assert.True(!result.Any()); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
| @@ -149,153 +166,158 @@ namespace SieveUnitTests | ||||
|                 Filters = "Title!@=D", | ||||
|             }; | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|  | ||||
|             Assert.True(result.Count() == 3); | ||||
|                 Assert.True(result.Count() == _posts.Count(post => !post.Title.Contains("D"))); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void CanFilterBools() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             var model = new SieveModel { Filters = "IsDraft==false" }; | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Filters = "IsDraft==false" | ||||
|             }; | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|  | ||||
|             Assert.True(result.Count() == 2); | ||||
|                 Assert.True(result.Count() == _posts.Count(post => !post.IsDraft)); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void CanSortBools() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             var model = new SieveModel { Sorts = "-IsDraft" }; | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Sorts = "-IsDraft" | ||||
|             }; | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|  | ||||
|             Assert.Equal(0, result.First().Id); | ||||
|                 Assert.Equal(0, result.First().Id); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void CanFilterNullableInts() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             var model = new SieveModel { Filters = "CategoryId==1" }; | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Filters = "CategoryId==1" | ||||
|             }; | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|             var nullableResult = _nullableProcessor.Apply(model, _posts); | ||||
|  | ||||
|             Assert.True(result.Count() == 2); | ||||
|             Assert.True(nullableResult.Count() == 2); | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|                  | ||||
|                 Assert.True(result.Count() == _posts.Count(post => post.CategoryId == 1)); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void CanFilterNullableIntsWithNotEqual() | ||||
|         { | ||||
|             var model = new SieveModel() | ||||
|             var model = new SieveModel() { Filters = "CategoryId!=1" }; | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Filters = "CategoryId!=1" | ||||
|             }; | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|             var nullableResult = _nullableProcessor.Apply(model, _posts); | ||||
|  | ||||
|             Assert.True(result.Count() == 1); | ||||
|             Assert.True(nullableResult.Count() == 2); | ||||
|                 Assert.Equal | ||||
|                 ( | ||||
|                     (sieveProcessor as ApplicationSieveProcessor)?.ExposedOptions.IgnoreNullsOnNotEqual ?? true | ||||
|                         ? _posts.Count(post => post.CategoryId != null && post.CategoryId != 1) | ||||
|                         : _posts.Count(post => post.CategoryId != 1), | ||||
|                     result.Count() | ||||
|                 ); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void EqualsDoesntFailWithNonStringTypes() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             var model = new SieveModel { Filters = "LikeCount==50", }; | ||||
|  | ||||
|             TestOutputHelper.WriteLine(model.GetFiltersParsed()[0].Values.ToString()); | ||||
|             TestOutputHelper.WriteLine(model.GetFiltersParsed()[0].Operator); | ||||
|             TestOutputHelper.WriteLine(model.GetFiltersParsed()[0].OperatorParsed.ToString()); | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Filters = "LikeCount==50", | ||||
|             }; | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|  | ||||
|             _testOutputHelper.WriteLine(model.GetFiltersParsed()[0].Values.ToString()); | ||||
|             _testOutputHelper.WriteLine(model.GetFiltersParsed()[0].Operator); | ||||
|             _testOutputHelper.WriteLine(model.GetFiltersParsed()[0].OperatorParsed.ToString()); | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|  | ||||
|             Assert.Equal(1, result.First().Id); | ||||
|             Assert.True(result.Count() == 1); | ||||
|                 Assert.Equal(1, result.First().Id); | ||||
|                 Assert.True(result.Count() == 1); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void CustomFiltersWork() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             var model = new SieveModel { Filters = "Isnew", }; | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Filters = "Isnew", | ||||
|             }; | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|  | ||||
|             Assert.False(result.Any(p => p.Id == 0)); | ||||
|             Assert.True(result.Count() == 3); | ||||
|                 Assert.False(result.Any(p => p.Id == 0)); | ||||
|                 Assert.True(result.Count() == _posts.Count(SieveCustomFilterMethods.IsNewFilterForIPost)); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void CustomGenericFiltersWork() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             var model = new SieveModel { Filters = "Latest", }; | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Filters = "Latest", | ||||
|             }; | ||||
|                 var result = sieveProcessor.Apply(model, _comments); | ||||
|  | ||||
|             var result = _processor.Apply(model, _comments); | ||||
|  | ||||
|             Assert.False(result.Any(p => p.Id == 0)); | ||||
|             Assert.True(result.Count() == 2); | ||||
|                 Assert.False(result.Any(p => p.Id == 0)); | ||||
|                 Assert.True(result.Count() == 2); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void CustomFiltersWithOperatorsWork() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             var model = new SieveModel { Filters = "HasInTitle==A", }; | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Filters = "HasInTitle==A", | ||||
|             }; | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|  | ||||
|             Assert.True(result.Any(p => p.Id == 0)); | ||||
|             Assert.True(result.Count() == 1); | ||||
|                 Assert.True(result.Any(p => p.Id == 0)); | ||||
|                 Assert.True(result.Count() == 1); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void CustomFiltersMixedWithUsualWork1() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             var model = new SieveModel { Filters = "Isnew,CategoryId==2", }; | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Filters = "Isnew,CategoryId==2", | ||||
|             }; | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|  | ||||
|             Assert.True(result.Any(p => p.Id == 3)); | ||||
|             Assert.True(result.Count() == 1); | ||||
|                 Assert.True(result.Any(p => p.Id == 3)); | ||||
|                 Assert.True(result.Count() == 1); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void CustomFiltersMixedWithUsualWork2() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             var model = new SieveModel { Filters = "CategoryId==2,Isnew", }; | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Filters = "CategoryId==2,Isnew", | ||||
|             }; | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|  | ||||
|             Assert.True(result.Any(p => p.Id == 3)); | ||||
|             Assert.True(result.Count() == 1); | ||||
|                 Assert.True(result.Any(p => p.Id == 3)); | ||||
|                 Assert.True(result.Count() == 1); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
| @@ -306,85 +328,91 @@ namespace SieveUnitTests | ||||
|                 Filters = "CategoryId==2,Isnew", | ||||
|             }; | ||||
|  | ||||
|             var postResult = _processor.Apply(postModel, _posts); | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 var postResult = sieveProcessor.Apply(postModel, _posts); | ||||
|  | ||||
|             Assert.True(postResult.Any(p => p.Id == 3)); | ||||
|             Assert.Equal(1, postResult.Count()); | ||||
|                 Assert.True(postResult.Any(p => p.Id == 3)); | ||||
|                 Assert.Equal(1, postResult.Count()); | ||||
|             } | ||||
|  | ||||
|             var commentModel = new SieveModel | ||||
|             { | ||||
|                 Filters = "Isnew", | ||||
|             }; | ||||
|  | ||||
|             var commentResult = _processor.Apply(commentModel, _comments); | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 var commentResult = sieveProcessor.Apply(commentModel, _comments); | ||||
|  | ||||
|             Assert.True(commentResult.Any(c => c.Id == 2)); | ||||
|             Assert.Equal(2, commentResult.Count()); | ||||
|                 Assert.True(commentResult.Any(c => c.Id == 2)); | ||||
|                 Assert.Equal(2, commentResult.Count()); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void CustomSortsWork() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             var model = new SieveModel { Sorts = "Popularity", }; | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Sorts = "Popularity", | ||||
|             }; | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|  | ||||
|             Assert.False(result.First().Id == 0); | ||||
|                 Assert.False(result.First().Id == 0); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void CustomGenericSortsWork() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             var model = new SieveModel { Sorts = "Oldest", }; | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Sorts = "Oldest", | ||||
|             }; | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|  | ||||
|             Assert.True(result.Last().Id == 0); | ||||
|                 Assert.True(result.Last().Id == 0); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void MethodNotFoundExceptionWork() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             { | ||||
|                 Filters = "does not exist", | ||||
|             }; | ||||
|             var model = new SieveModel { Filters = "does not exist", }; | ||||
|  | ||||
|             Assert.Throws<SieveMethodNotFoundException>(() => _processor.Apply(model, _posts)); | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Assert.Throws<SieveMethodNotFoundException>(() => sieveProcessor.Apply(model, _posts)); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void IncompatibleMethodExceptionsWork() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             { | ||||
|                 Filters = "TestComment", | ||||
|             }; | ||||
|             var model = new SieveModel { Filters = "TestComment", }; | ||||
|  | ||||
|             Assert.Throws<SieveIncompatibleMethodException>(() => _processor.Apply(model, _posts)); | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Assert.Throws<SieveIncompatibleMethodException>(() => sieveProcessor.Apply(model, _posts)); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void OrNameFilteringWorks() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             var model = new SieveModel { Filters = "(Title|LikeCount)==3", }; | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Filters = "(Title|LikeCount)==3", | ||||
|             }; | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|                 var entry = result.FirstOrDefault(); | ||||
|                 var resultCount = result.Count(); | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|             var entry = result.FirstOrDefault(); | ||||
|             var resultCount = result.Count(); | ||||
|  | ||||
|             Assert.NotNull(entry); | ||||
|             Assert.Equal(1, resultCount); | ||||
|             Assert.Equal(3, entry.Id); | ||||
|                 Assert.NotNull(entry); | ||||
|                 Assert.Equal(1, resultCount); | ||||
|                 Assert.Equal(3, entry.Id); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Theory] | ||||
| @@ -392,94 +420,105 @@ namespace SieveUnitTests | ||||
|         [InlineData("(CategoryId|LikeCount)==50,CategoryId==1")] | ||||
|         public void CombinedAndOrFilterIndependentOfOrder(string filter) | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             var model = new SieveModel { Filters = filter, }; | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Filters = filter, | ||||
|             }; | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|                 var entry = result.FirstOrDefault(); | ||||
|                 var resultCount = result.Count(); | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|             var entry = result.FirstOrDefault(); | ||||
|             var resultCount = result.Count(); | ||||
|  | ||||
|             Assert.NotNull(entry); | ||||
|             Assert.Equal(1, resultCount); | ||||
|                 Assert.NotNull(entry); | ||||
|                 Assert.Equal(1, resultCount); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void CombinedAndOrWithSpaceFilteringWorks() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             var model = new SieveModel { Filters = "Title==D, (Title|LikeCount)==3", }; | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Filters = "Title==D, (Title|LikeCount)==3", | ||||
|             }; | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|                 var entry = result.FirstOrDefault(); | ||||
|                 var resultCount = result.Count(); | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|             var entry = result.FirstOrDefault(); | ||||
|             var resultCount = result.Count(); | ||||
|  | ||||
|             Assert.NotNull(entry); | ||||
|             Assert.Equal(1, resultCount); | ||||
|             Assert.Equal(3, entry.Id); | ||||
|                 Assert.NotNull(entry); | ||||
|                 Assert.Equal(1, resultCount); | ||||
|                 Assert.Equal(3, entry.Id); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void OrValueFilteringWorks() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             { | ||||
|                 Filters = "Title==C|D", | ||||
|             }; | ||||
|             var model = new SieveModel { Filters = "Title==C|D", }; | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|             Assert.Equal(2, result.Count()); | ||||
|             Assert.True(result.Any(p => p.Id == 2)); | ||||
|             Assert.True(result.Any(p => p.Id == 3)); | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|                 Assert.Equal(2, result.Count()); | ||||
|                 Assert.True(result.Any(p => p.Id == 2)); | ||||
|                 Assert.True(result.Any(p => p.Id == 3)); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void OrValueFilteringWorks2() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             { | ||||
|                 Filters = "Text@=(|)", | ||||
|             }; | ||||
|             var model = new SieveModel { Filters = "Text@=(|)", }; | ||||
|  | ||||
|             var result = _processor.Apply(model, _comments); | ||||
|             Assert.Equal(1, result.Count()); | ||||
|             Assert.Equal(2, result.FirstOrDefault()?.Id); | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 var result = sieveProcessor.Apply(model, _comments); | ||||
|                 Assert.Equal(1, result.Count()); | ||||
|                 Assert.Equal(2, result.FirstOrDefault()?.Id); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void NestedFilteringWorks() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             { | ||||
|                 Filters = "TopComment.Text!@=A", | ||||
|             }; | ||||
|             var model = new SieveModel { Filters = "TopComment.Text!@=A", }; | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|             Assert.Equal(3, result.Count()); | ||||
|             var posts = result.ToList(); | ||||
|             Assert.Contains("B", posts[0].TopComment.Text); | ||||
|             Assert.Contains("C", posts[1].TopComment.Text); | ||||
|             Assert.Contains("D", posts[2].TopComment.Text); | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|                 Assert.Equal(_posts.Count(post => !post.TopComment.Text.Contains("A")), result.Count()); | ||||
|                 var posts = result.ToList(); | ||||
|                 Assert.Contains("B", posts[0].TopComment.Text); | ||||
|                 Assert.Contains("C", posts[1].TopComment.Text); | ||||
|                 Assert.Contains("D", posts[2].TopComment.Text); | ||||
|                 Assert.Contains("E1", posts[3].TopComment.Text); | ||||
|                 Assert.Contains("Yen", posts[4].TopComment.Text); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void NestedSortingWorks() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             { | ||||
|                 Sorts = "TopComment.Id", | ||||
|             }; | ||||
|             var model = new SieveModel { Sorts = "TopComment.Id", }; | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|             Assert.Equal(4, result.Count()); | ||||
|             var posts = result.ToList(); | ||||
|             Assert.Equal(0, posts[0].Id); | ||||
|             Assert.Equal(3, posts[1].Id); | ||||
|             Assert.Equal(2, posts[2].Id); | ||||
|             Assert.Equal(1, posts[3].Id); | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|                 Assert.Equal(_posts.Count(), result.Count()); | ||||
|                 var posts = result | ||||
|                     .Select(post => post.Id) | ||||
|                     .ToList(); | ||||
|  | ||||
|                 Assert.True | ||||
|                 ( | ||||
|                     posts.SequenceEqual | ||||
|                     ( | ||||
|                         _posts | ||||
|                             .AsEnumerable() | ||||
|                             .OrderBy(post => post.TopComment.Id) | ||||
|                             .Select(post => post.Id) | ||||
|                     ) | ||||
|                 ); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
| @@ -490,16 +529,22 @@ namespace SieveUnitTests | ||||
|                 Filters = "(topc|featc)@=*2", | ||||
|             }; | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|             Assert.Equal(4, result.Count()); | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|                 Assert.Equal(4, result.Count()); | ||||
|             } | ||||
|              | ||||
|             model = new SieveModel | ||||
|             { | ||||
|                 Filters = "(topc|featc)@=*B", | ||||
|             }; | ||||
|  | ||||
|             result = _processor.Apply(model, _posts); | ||||
|             Assert.Equal(1, result.Count()); | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|                 Assert.Equal(1, result.Count()); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
| @@ -519,13 +564,13 @@ namespace SieveUnitTests | ||||
|                 }, | ||||
|             }.AsQueryable(); | ||||
|  | ||||
|             var model = new SieveModel | ||||
|             { | ||||
|                 Filters = "FeaturedComment.Text!@=Some value", | ||||
|             }; | ||||
|             var model = new SieveModel { Filters = "FeaturedComment.Text!@=Some value", }; | ||||
|  | ||||
|             var result = _processor.Apply(model, posts); | ||||
|             Assert.Equal(0, result.Count()); | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 var result = sieveProcessor.Apply(model, posts); | ||||
|                 Assert.Equal(0, result.Count()); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
| @@ -540,7 +585,7 @@ namespace SieveUnitTests | ||||
|                     LikeCount = 0, | ||||
|                     IsDraft = false, | ||||
|                     CategoryId = null, | ||||
|                     TopComment =  new Comment { Id = 1 }, | ||||
|                     TopComment = new Comment { Id = 1 }, | ||||
|                     FeaturedComment = null | ||||
|                 }, | ||||
|                 new Post | ||||
| @@ -555,16 +600,16 @@ namespace SieveUnitTests | ||||
|                 }, | ||||
|             }.AsQueryable(); | ||||
|  | ||||
|             var model = new SieveModel | ||||
|             { | ||||
|                 Sorts = "TopComment.Id", | ||||
|             }; | ||||
|             var model = new SieveModel { Sorts = "TopComment.Id", }; | ||||
|  | ||||
|             var result = _processor.Apply(model, posts); | ||||
|             Assert.Equal(2, result.Count()); | ||||
|             var sortedPosts = result.ToList(); | ||||
|             Assert.Equal(2, sortedPosts[0].Id); | ||||
|             Assert.Equal(1, sortedPosts[1].Id); | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 var result = sieveProcessor.Apply(model, posts); | ||||
|                 Assert.Equal(2, result.Count()); | ||||
|                 var sortedPosts = result.ToList(); | ||||
|                 Assert.Equal(2, sortedPosts[0].Id); | ||||
|                 Assert.Equal(1, sortedPosts[1].Id); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
| @@ -590,37 +635,98 @@ namespace SieveUnitTests | ||||
|                     IsDraft = false, | ||||
|                     CategoryId = null, | ||||
|                     TopComment = null, | ||||
|                     FeaturedComment = new Comment {  Id = 1, Text = null } | ||||
|                     FeaturedComment = new Comment { Id = 1, Text = null } | ||||
|                 }, | ||||
|             }.AsQueryable(); | ||||
|  | ||||
|             var model = new SieveModel | ||||
|             { | ||||
|                 Filters = "FeaturedComment.Text==null", | ||||
|             }; | ||||
|             var model = new SieveModel { Filters = "FeaturedComment.Text==null", }; | ||||
|  | ||||
|             var result = _processor.Apply(model, posts); | ||||
|             Assert.Equal(1, result.Count()); | ||||
|             var filteredPosts = result.ToList(); | ||||
|             Assert.Equal(2, filteredPosts[0].Id); | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 var result = sieveProcessor.Apply(model, posts); | ||||
|                 Assert.Equal(1, result.Count()); | ||||
|                 var filteredPosts = result.ToList(); | ||||
|                 Assert.Equal(2, filteredPosts[0].Id); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Fact] | ||||
|         public void BaseDefinedPropertyMappingSortingWorks_WithCustomName() | ||||
|         { | ||||
|             var model = new SieveModel | ||||
|             var model = new SieveModel { Sorts = "-CreateDate" }; | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 Sorts = "-CreateDate" | ||||
|             }; | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|                 Assert.Equal(_posts.Count(), result.Count()); | ||||
|  | ||||
|             var result = _processor.Apply(model, _posts); | ||||
|             Assert.Equal(4, result.Count()); | ||||
|                 var posts = result | ||||
|                     .Select(post => post.Id) | ||||
|                     .ToList(); | ||||
|  | ||||
|             var posts = result.ToList(); | ||||
|             Assert.Equal(3,posts[0].Id); | ||||
|             Assert.Equal(2,posts[1].Id); | ||||
|             Assert.Equal(1,posts[2].Id); | ||||
|             Assert.Equal(0,posts[3].Id); | ||||
|                 Assert.True | ||||
|                 ( | ||||
|                     posts.SequenceEqual | ||||
|                     ( | ||||
|                         _posts | ||||
|                             .OrderByDescending(post => post.DateCreated) | ||||
|                             .Select(post => post.Id) | ||||
|                     ) | ||||
|                 ); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Theory] | ||||
|         [InlineData("DeletedBy")] | ||||
|         [InlineData("-DeletedBy")] | ||||
|         public void CanSortWithInterfaceProperties(string sort) | ||||
|         { | ||||
|             var model = new SieveModel { Sorts = sort }; | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|  | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|                 var entry = result.FirstOrDefault(); | ||||
|                 var resultCount = result.Count(); | ||||
|  | ||||
|                 Assert.NotNull(entry); | ||||
|                 Assert.Equal(_posts.Count(), resultCount); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [Theory] | ||||
|         [InlineData("UpdatedBy==Me", 1, 1, new [] {1})] | ||||
|         [InlineData("UpdatedBy==Me|You", 2, 2, null)] | ||||
|         [InlineData("UpdatedBy==You|Me", 2, 2, null)] | ||||
|         [InlineData("UpdatedBy!=Him", 5, 3, null)] | ||||
|         [InlineData("UpdatedBy_=*You", 2, 2, null)] | ||||
|         public void CanFilterWithInterfaceProperties(string filters, int recordCount, int nullIgnoredRecordCount, int[] filteredIds) | ||||
|         { | ||||
|             var model = new SieveModel { Filters = filters, Sorts = "Id" }; | ||||
|  | ||||
|             foreach (var sieveProcessor in GetProcessors()) | ||||
|             { | ||||
|                 var result = sieveProcessor.Apply(model, _posts); | ||||
|                 var resultCount = result.Count(); | ||||
|                 Assert.Equal | ||||
|                 ( | ||||
|                     (sieveProcessor as ApplicationSieveProcessor)?.ExposedOptions.IgnoreNullsOnNotEqual ?? true | ||||
|                         ? nullIgnoredRecordCount | ||||
|                         : recordCount, | ||||
|                     resultCount | ||||
|                 ); | ||||
|  | ||||
|                 if (filteredIds != null) | ||||
|                 { | ||||
|                     Assert.True | ||||
|                     ( | ||||
|                         result | ||||
|                             .Select(post => post.Id) | ||||
|                             .SequenceEqual(filteredIds) | ||||
|                     ); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user