using JSMR.Application.Circles.Contracts; 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(CircleSearchProviderFixture2 fixture) : IClassFixture { [Fact] public async Task Filter_None() { //await using AppDbContext context = fixture.CreateDbContext(); AppDbContext context = fixture.DbContext!; CircleSearchProvider provider = new(context); var options = new SearchOptions() { Criteria = new() { } }; var result = await provider.SearchAsync(options, CancellationToken.None); result.Items.Length.ShouldBe(4); result.TotalItems.ShouldBe(4); } [Fact] public async Task Filter_By_Status_Not_Blacklisted() { //await using AppDbContext context = fixture.CreateDbContext(); AppDbContext context = fixture.DbContext!; CircleSearchProvider provider = new(context); var options = new SearchOptions() { Criteria = new() { Status = Application.Circles.Queries.Search.CircleStatus.NotBlacklisted } }; var result = await provider.SearchAsync(options, CancellationToken.None); result.Items.Length.ShouldBe(3); result.TotalItems.ShouldBe(3); result.Items.ShouldNotContain(item => item.Blacklisted); } [Fact] public async Task Filter_By_Status_Favorited() { //await using AppDbContext context = fixture.CreateDbContext(); AppDbContext context = fixture.DbContext!; CircleSearchProvider provider = new(context); var options = new SearchOptions() { 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(); AppDbContext context = fixture.DbContext!; CircleSearchProvider provider = new(context); var options = new SearchOptions() { 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(); AppDbContext context = fixture.DbContext!; CircleSearchProvider provider = new(context); var options = new SearchOptions() { 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(); AppDbContext context = fixture.DbContext!; CircleSearchProvider provider = new(context); var options = new SearchOptions() { 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(); AppDbContext context = fixture.DbContext!; CircleSearchProvider provider = new(context); var options = new SearchOptions() { 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(); AppDbContext context = fixture.DbContext!; CircleSearchProvider provider = new(context); var options = new SearchOptions() { 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(); AppDbContext context = fixture.DbContext!; CircleSearchProvider provider = new(context); var options = new SearchOptions() { 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(); AppDbContext context = fixture.DbContext!; CircleSearchProvider provider = new(context); var options = new SearchOptions() { 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(); AppDbContext context = fixture.DbContext!; CircleSearchProvider provider = new(context); var options = new SearchOptions() { 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"); } }