Update search provider sort logic, and added testing for circle search provider.
This commit is contained in:
@@ -3,54 +3,234 @@ using JSMR.Application.Circles.Queries.Search;
|
||||
using JSMR.Application.Common.Search;
|
||||
using JSMR.Infrastructure.Data;
|
||||
using JSMR.Infrastructure.Data.Repositories.Circles;
|
||||
using JSMR.Tests.Fixtures;
|
||||
using Shouldly;
|
||||
|
||||
namespace JSMR.Tests.Integration;
|
||||
|
||||
public class CircleSearchProviderTests(MariaDbFixture fixture) : IClassFixture<MariaDbFixture>
|
||||
public class CircleSearchProviderTests(CircleSearchProviderFixture fixture) : IClassFixture<CircleSearchProviderFixture>
|
||||
{
|
||||
[Fact]
|
||||
public async Task Search_ByName_Filters_And_Sorts()
|
||||
public async Task Filter_None()
|
||||
{
|
||||
await fixture.ResetAsync();
|
||||
await using AppDbContext context = fixture.CreateDbContext();
|
||||
await Seed.SeedCirclesWithWorksAsync(context);
|
||||
|
||||
CircleSearchProvider provider = new(context);
|
||||
|
||||
var options = new SearchOptions<CircleSearchCriteria, CircleSortField>
|
||||
var options = new SearchOptions<CircleSearchCriteria, CircleSortField>()
|
||||
{
|
||||
PageNumber = 1,
|
||||
PageSize = 50,
|
||||
SortOptions = [new SortOption<CircleSortField>(CircleSortField.Name, SortDirection.Ascending)],
|
||||
Criteria = new CircleSearchCriteria { Name = "Circle" }
|
||||
Criteria = new()
|
||||
{
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
var result = await provider.SearchAsync(options, CancellationToken.None);
|
||||
|
||||
Assert.True(result.TotalItems >= 2);
|
||||
Assert.Equal("Circle A", result.Items[0].Name);
|
||||
Assert.Equal("Circle B", result.Items[1].Name);
|
||||
result.Items.Length.ShouldBe(4);
|
||||
result.TotalItems.ShouldBe(4);
|
||||
}
|
||||
|
||||
//[Fact]
|
||||
//public async Task Search_Status_Favorited_Only()
|
||||
//{
|
||||
// await fixture.ResetAsync();
|
||||
// await using var db = fixture.CreateDbContext();
|
||||
// await Seed.SeedCirclesWithWorksAsync(db);
|
||||
[Fact]
|
||||
public async Task Filter_By_Status_Not_Blacklisted()
|
||||
{
|
||||
await using AppDbContext context = fixture.CreateDbContext();
|
||||
CircleSearchProvider provider = new(context);
|
||||
|
||||
// var provider = new CircleSearchProvider(db);
|
||||
var options = new SearchOptions<CircleSearchCriteria, CircleSortField>()
|
||||
{
|
||||
Criteria = new()
|
||||
{
|
||||
Status = Application.Circles.Queries.Search.CircleStatus.NotBlacklisted
|
||||
}
|
||||
};
|
||||
|
||||
// var options = new SearchOptions<CircleSearchCriteria, CircleSortField>
|
||||
// {
|
||||
// PageNumber = 1,
|
||||
// PageSize = 50,
|
||||
// SortOptions = Array.Empty<SortOption<CircleSortField>>(),
|
||||
// Criteria = new CircleSearchCriteria { Status = Application.Circles.Queries.Search.CircleStatus.Favorited }
|
||||
// };
|
||||
var result = await provider.SearchAsync(options, CancellationToken.None);
|
||||
|
||||
// var result = await provider.SearchAsync(options, CancellationToken.None);
|
||||
result.Items.Length.ShouldBe(3);
|
||||
result.TotalItems.ShouldBe(3);
|
||||
result.Items.ShouldNotContain(item => item.Blacklisted);
|
||||
}
|
||||
|
||||
// Assert.All(result.Items, i => Assert.True(i.Favorite));
|
||||
//}
|
||||
}
|
||||
[Fact]
|
||||
public async Task Filter_By_Status_Favorited()
|
||||
{
|
||||
await using AppDbContext context = fixture.CreateDbContext();
|
||||
CircleSearchProvider provider = new(context);
|
||||
|
||||
var options = new SearchOptions<CircleSearchCriteria, CircleSortField>()
|
||||
{
|
||||
Criteria = new()
|
||||
{
|
||||
Status = Application.Circles.Queries.Search.CircleStatus.Favorited
|
||||
}
|
||||
};
|
||||
|
||||
var result = await provider.SearchAsync(options, CancellationToken.None);
|
||||
|
||||
result.Items.Length.ShouldBe(1);
|
||||
result.TotalItems.ShouldBe(1);
|
||||
result.Items.ShouldAllBe(item => item.Favorite);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Filter_By_Status_Blacklisted()
|
||||
{
|
||||
await using AppDbContext context = fixture.CreateDbContext();
|
||||
CircleSearchProvider provider = new(context);
|
||||
|
||||
var options = new SearchOptions<CircleSearchCriteria, CircleSortField>()
|
||||
{
|
||||
Criteria = new()
|
||||
{
|
||||
Status = Application.Circles.Queries.Search.CircleStatus.Blacklisted
|
||||
}
|
||||
};
|
||||
|
||||
var result = await provider.SearchAsync(options, CancellationToken.None);
|
||||
|
||||
result.Items.Length.ShouldBe(1);
|
||||
result.TotalItems.ShouldBe(1);
|
||||
result.Items.ShouldAllBe(item => item.Blacklisted);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Filter_By_Status_Spam()
|
||||
{
|
||||
await using AppDbContext context = fixture.CreateDbContext();
|
||||
CircleSearchProvider provider = new(context);
|
||||
|
||||
var options = new SearchOptions<CircleSearchCriteria, CircleSortField>()
|
||||
{
|
||||
Criteria = new()
|
||||
{
|
||||
Status = Application.Circles.Queries.Search.CircleStatus.Spam
|
||||
}
|
||||
};
|
||||
|
||||
var result = await provider.SearchAsync(options, CancellationToken.None);
|
||||
|
||||
result.Items.Length.ShouldBe(1);
|
||||
result.TotalItems.ShouldBe(1);
|
||||
result.Items.ShouldAllBe(item => item.Spam);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Filter_By_Name_Circle_Name()
|
||||
{
|
||||
await using AppDbContext context = fixture.CreateDbContext();
|
||||
CircleSearchProvider provider = new(context);
|
||||
|
||||
var options = new SearchOptions<CircleSearchCriteria, CircleSortField>()
|
||||
{
|
||||
Criteria = new()
|
||||
{
|
||||
Name = "Dreams"
|
||||
}
|
||||
};
|
||||
|
||||
var result = await provider.SearchAsync(options, CancellationToken.None);
|
||||
|
||||
result.Items.Length.ShouldBe(2);
|
||||
result.TotalItems.ShouldBe(2);
|
||||
result.Items.ShouldAllBe(item => item.Name.Contains("Dreams", StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Filter_By_Name_Circle_Id()
|
||||
{
|
||||
await using AppDbContext context = fixture.CreateDbContext();
|
||||
CircleSearchProvider provider = new(context);
|
||||
|
||||
var options = new SearchOptions<CircleSearchCriteria, CircleSortField>()
|
||||
{
|
||||
Criteria = new()
|
||||
{
|
||||
Name = "003"
|
||||
}
|
||||
};
|
||||
|
||||
var result = await provider.SearchAsync(options, CancellationToken.None);
|
||||
|
||||
result.Items.Length.ShouldBe(1);
|
||||
result.TotalItems.ShouldBe(1);
|
||||
result.Items.ShouldContain(item => item.MakerId.Contains("003", StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Sort_By_Name_Descending()
|
||||
{
|
||||
await using AppDbContext context = fixture.CreateDbContext();
|
||||
CircleSearchProvider provider = new(context);
|
||||
|
||||
var options = new SearchOptions<CircleSearchCriteria, CircleSortField>()
|
||||
{
|
||||
SortOptions = [new(CircleSortField.Name, Application.Common.Search.SortDirection.Descending)]
|
||||
};
|
||||
|
||||
var result = await provider.SearchAsync(options, CancellationToken.None);
|
||||
|
||||
result.Items.Length.ShouldBe(4);
|
||||
result.TotalItems.ShouldBe(4);
|
||||
result.Items[0].Name.ShouldBe("Sweet Dreams");
|
||||
result.Items[1].Name.ShouldBe("Nightmare Fuel");
|
||||
result.Items[2].Name.ShouldBe("Good Dreams");
|
||||
result.Items[3].Name.ShouldBe("Garbage Studio");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Sort_By_Favorite_Ascending()
|
||||
{
|
||||
await using AppDbContext context = fixture.CreateDbContext();
|
||||
CircleSearchProvider provider = new(context);
|
||||
|
||||
var options = new SearchOptions<CircleSearchCriteria, CircleSortField>()
|
||||
{
|
||||
SortOptions = [new(CircleSortField.Favorite, Application.Common.Search.SortDirection.Ascending)]
|
||||
};
|
||||
|
||||
var result = await provider.SearchAsync(options, CancellationToken.None);
|
||||
|
||||
result.Items.Length.ShouldBe(4);
|
||||
result.TotalItems.ShouldBe(4);
|
||||
result.Items[0].Name.ShouldBe("Sweet Dreams");
|
||||
result.Items[1].Name.ShouldBe("Garbage Studio");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Sort_By_Blacklisted_Ascending()
|
||||
{
|
||||
await using AppDbContext context = fixture.CreateDbContext();
|
||||
CircleSearchProvider provider = new(context);
|
||||
|
||||
var options = new SearchOptions<CircleSearchCriteria, CircleSortField>()
|
||||
{
|
||||
SortOptions = [new(CircleSortField.Blacklisted, Application.Common.Search.SortDirection.Ascending)]
|
||||
};
|
||||
|
||||
var result = await provider.SearchAsync(options, CancellationToken.None);
|
||||
|
||||
result.Items.Length.ShouldBe(4);
|
||||
result.TotalItems.ShouldBe(4);
|
||||
result.Items[0].Name.ShouldBe("Nightmare Fuel");
|
||||
result.Items[1].Name.ShouldBe("Garbage Studio");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Sort_By_Spam_Ascending()
|
||||
{
|
||||
await using AppDbContext context = fixture.CreateDbContext();
|
||||
CircleSearchProvider provider = new(context);
|
||||
|
||||
var options = new SearchOptions<CircleSearchCriteria, CircleSortField>()
|
||||
{
|
||||
SortOptions = [new(CircleSortField.Spam, Application.Common.Search.SortDirection.Ascending)]
|
||||
};
|
||||
|
||||
var result = await provider.SearchAsync(options, CancellationToken.None);
|
||||
|
||||
result.Items.Length.ShouldBe(4);
|
||||
result.TotalItems.ShouldBe(4);
|
||||
result.Items[0].Name.ShouldBe("Garbage Studio");
|
||||
result.Items[1].Name.ShouldBe("Good Dreams");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user