Separate responsibilities: start-listening command, API-side JSON converters, bulk track endpoints, mix kinds

This commit is contained in:
2026-09-24 12:14:53 +02:00
parent 75d0c0817e
commit 0fa033faff
64 changed files with 2903 additions and 651 deletions
@@ -40,7 +40,6 @@ public sealed class GenreEndpointsTests(ApiTestFixture fixture)
tag.TrackId = track.Id;
database.Users.Add(owner);
database.Tracks.Add(track);
database.UserHasTracks.Add(new UserHasTrack { UserId = owner.Id, TrackId = track.Id });
await database.SaveChangesAsync(TestContext.Current.CancellationToken);
return title;
}
@@ -0,0 +1,48 @@
using Musify.Api.DataTransferObjects.Tracks;
using Musify.Api.Validators.Tracks;
using Musify.Domain.ValueObjects;
using Xunit;
namespace Musify.Api.Tests.Validators;
public sealed class TrackRequestValidatorTests
{
[Fact]
public void CreateTrack_ValidRequest_Passes()
{
var request = new CreateTrackRequest("Song", Guid.NewGuid(), Guid.NewGuid(), [Genre.Pop, Genre.Rock]);
Assert.True(new CreateTrackRequestValidator().Validate(request).IsValid);
}
[Fact]
public void CreateTrack_NoTags_Fails()
{
var request = new CreateTrackRequest("Song", Guid.NewGuid(), Guid.NewGuid(), []);
Assert.False(new CreateTrackRequestValidator().Validate(request).IsValid);
}
[Fact]
public void CreateTrack_IncompatibleTags_Fails()
{
var request = new CreateTrackRequest("Song", Guid.NewGuid(), Guid.NewGuid(), [Genre.Classical, Genre.Metal]);
Assert.False(new CreateTrackRequestValidator().Validate(request).IsValid);
}
[Theory]
[InlineData(-1)]
[InlineData(double.NaN)]
[InlineData(double.PositiveInfinity)]
public void RecordListeningProgress_InvalidSeconds_Fails(double seconds)
{
Assert.False(new RecordListeningProgressRequestValidator().Validate(new RecordListeningProgressRequest(seconds)).IsValid);
}
[Fact]
public void RecordListeningProgress_ZeroSeconds_Passes()
{
Assert.True(new RecordListeningProgressRequestValidator().Validate(new RecordListeningProgressRequest(0)).IsValid);
}
}