69 lines
2.4 KiB
C#
69 lines
2.4 KiB
C#
using Musify.Application.Genres;
|
|
using Musify.Application.Tests.TestSupport;
|
|
using Musify.Domain.Entities;
|
|
using Musify.Domain.ValueObjects;
|
|
using Xunit;
|
|
|
|
namespace Musify.Application.Tests.Genres;
|
|
|
|
public sealed class GetGenresQueryHandlerTests : HandlerTestBase
|
|
{
|
|
private GetGenresQueryHandler CreateHandler() => new(Database);
|
|
|
|
[Fact]
|
|
public async Task Handle_NoTracks_ReturnsEmpty()
|
|
{
|
|
var result = await CreateHandler().Handle(new GetGenresQuery(), TestContext.Current.CancellationToken);
|
|
|
|
Assert.Empty(result);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Handle_ReturnsOnlyGenresInUse_MostPopulatedFirst()
|
|
{
|
|
var owner = TestEntities.User();
|
|
var rockA = TestEntities.Track(owner, "Rock A", tags: [Genre.Rock]);
|
|
var rockB = TestEntities.Track(owner, "Rock B", tags: [Genre.Rock, Genre.Indie]);
|
|
var jazz = TestEntities.Track(owner, "Jazz", tags: [Genre.Jazz]);
|
|
await SeedAsync(
|
|
owner, rockA, rockB, jazz,
|
|
new UserHasTrack { UserId = owner.Id, TrackId = rockA.Id },
|
|
new UserHasTrack { UserId = owner.Id, TrackId = rockB.Id },
|
|
new UserHasTrack { UserId = owner.Id, TrackId = jazz.Id });
|
|
|
|
var result = await CreateHandler().Handle(new GetGenresQuery(), TestContext.Current.CancellationToken);
|
|
|
|
Assert.Equal(
|
|
[(Genre.Rock, 2), (Genre.Jazz, 1), (Genre.Indie, 1)],
|
|
result.Select(r => (r.Genre, r.TrackCount)));
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Handle_TrackInSeveralLibraries_IsCountedOnce()
|
|
{
|
|
var owner = TestEntities.User();
|
|
var other = TestEntities.User(id: 2, name: "other-user");
|
|
var track = TestEntities.Track(owner, tags: [Genre.Pop]);
|
|
await SeedAsync(
|
|
owner, other, track,
|
|
new UserHasTrack { UserId = owner.Id, TrackId = track.Id },
|
|
new UserHasTrack { UserId = other.Id, TrackId = track.Id });
|
|
|
|
var result = await CreateHandler().Handle(new GetGenresQuery(), TestContext.Current.CancellationToken);
|
|
|
|
Assert.Equal(1, Assert.Single(result).TrackCount);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Handle_TrackNotInAnyLibrary_IsIgnored()
|
|
{
|
|
var owner = TestEntities.User();
|
|
var track = TestEntities.Track(owner, tags: [Genre.Metal]);
|
|
await SeedAsync(owner, track);
|
|
|
|
var result = await CreateHandler().Handle(new GetGenresQuery(), TestContext.Current.CancellationToken);
|
|
|
|
Assert.Empty(result);
|
|
}
|
|
}
|