143 lines
4.0 KiB
C#
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);
|
|
}
|
|
}
|