using System; using System.Collections.Generic; using System.Linq; using Generic.Services; using Xunit; namespace Generic.Tests.Services; public class AdvancedFilterExtensionTests { public class TestEntity { public Guid Id { get; set; } public double Price { get; set; } public string SKU { get; set; } = string.Empty; public List Translations { get; set; } = new(); } public class TestTranslation { public string Language { get; set; } = string.Empty; public TestInfo Info { get; set; } = new(); } public class TestInfo { public string Name { get; set; } = string.Empty; } public class TestFilter { public double? Price { get; set; } public string? SKU { get; set; } public string? Language { get; set; } public string? Name { get; set; } } private List GetTestData() { return new List { new TestEntity { Id = Guid.NewGuid(), Price = 100, SKU = "IPHONE-15", Translations = new List { new TestTranslation { Language = "en", Info = new TestInfo { Name = "iPhone 15" } }, new TestTranslation { Language = "ar", Info = new TestInfo { Name = "آيفون ١٥" } } } }, new TestEntity { Id = Guid.NewGuid(), Price = 200, SKU = "SAMSUNG-S24", Translations = new List { new TestTranslation { Language = "en", Info = new TestInfo { Name = "Samsung S24" } }, new TestTranslation { Language = "ar", Info = new TestInfo { Name = "سامسونج اس ٢٤" } } } } }; } [Fact] public void ApplyAdvancedFilter_RootProperty_Works() { // Arrange var data = GetTestData().AsQueryable(); var filter = new TestFilter { Price = 100 }; // Act var result = data.ApplyAdvancedFilter(filter).ToList(); // Assert Assert.Single(result); Assert.Equal("IPHONE-15", result[0].SKU); } [Fact] public void ApplyAdvancedFilter_DeepNestedProperty_Works() { // Arrange var data = GetTestData().AsQueryable(); var filter = new TestFilter { Name = "iPhone" }; // Act var result = data.ApplyAdvancedFilter(filter).ToList(); // Assert Assert.Single(result); Assert.Equal("IPHONE-15", result[0].SKU); } [Fact] public void ApplyAdvancedFilter_GroupedCorrelatedProperties_Works() { // Arrange var data = GetTestData().AsQueryable(); // Search for "iPhone" but only in Arabic (should return nothing because Arabic name is "آيفون") var filter = new TestFilter { Language = "ar", Name = "iPhone" }; // Act var result = data.ApplyAdvancedFilter(filter).ToList(); // Assert Assert.Empty(result); } [Fact] public void ApplyAdvancedFilter_GroupedCorrelatedProperties_CorrectMatch_Works() { // Arrange var data = GetTestData().AsQueryable(); // Search for "آيفون" in Arabic var filter = new TestFilter { Language = "ar", Name = "آيفون" }; // Act var result = data.ApplyAdvancedFilter(filter).ToList(); // Assert Assert.Single(result); Assert.Equal("IPHONE-15", result[0].SKU); } [Fact] public void ApplyAdvancedFilter_CaseInsensitiveSearch_Works() { // Arrange var data = GetTestData().AsQueryable(); // Search for "IPHONE" (all caps) vs "iPhone 15" var filter = new TestFilter { Name = "IPHONE" }; // Act var result = data.ApplyAdvancedFilter(filter).ToList(); // Assert Assert.Single(result); Assert.Equal("IPHONE-15", result[0].SKU); } }