Files
Generic.CL/Generic.Tests/Services/AdvancedFilterExtensionTests.cs

143 lines
4.0 KiB
C#

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<TestTranslation> 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<TestEntity> GetTestData()
{
return new List<TestEntity>
{
new TestEntity
{
Id = Guid.NewGuid(),
Price = 100,
SKU = "IPHONE-15",
Translations = new List<TestTranslation>
{
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<TestTranslation>
{
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);
}
}