Files
jsmr/JSMR.Tests/Integration/CircleSearchProviderTests.cs

236 lines
7.6 KiB
C#

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(CircleSearchProviderFixture fixture) : IClassFixture<CircleSearchProviderFixture>
{
[Fact]
public async Task Filter_None()
{
await using AppDbContext context = fixture.CreateDbContext();
CircleSearchProvider provider = new(context);
var options = new SearchOptions<CircleSearchCriteria, CircleSortField>()
{
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();
CircleSearchProvider provider = new(context);
var options = new SearchOptions<CircleSearchCriteria, CircleSortField>()
{
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();
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");
}
}