Refactor user and media endpoints: remove unused GetUser and GetMedia methods, streamline AdminUserEndpoints and MediaEndpoints, and enhance metadata handling in MetadataEndpoints. Update Program.cs to remove legacy image relocation logic and improve overall code clarity.
build / backend (push) Successful in 1m14s
build / frontend (push) Successful in 35s
tests / backend-tests (push) Successful in 3m16s

This commit is contained in:
Leonid Pershin
2026-07-26 02:58:17 +03:00
parent 44e954920c
commit a0533a8ed8
50 changed files with 230 additions and 849 deletions
@@ -26,9 +26,7 @@ public class LoginCommandHandlerTests
.Returns(Result.Success(new AuthenticatedUser(userId, "alice", "user")));
_identityService
.GetProfileAsync(userId, Arg.Any<CancellationToken>())
.Returns(
new CurrentUserProfile(userId, "alice", Guid.NewGuid(), "user", IsBlocked: false)
);
.Returns(new CurrentUserProfile(userId, "alice", "user", IsBlocked: false));
_jwtTokenService
.GenerateAccessToken(Arg.Any<AuthenticatedUser>())
.Returns(("access-token", DateTimeOffset.UtcNow.AddMinutes(15)));
@@ -67,9 +65,7 @@ public class LoginCommandHandlerTests
.Returns(Result.Success(new AuthenticatedUser(userId, "alice", "user")));
_identityService
.GetProfileAsync(userId, Arg.Any<CancellationToken>())
.Returns(
new CurrentUserProfile(userId, "alice", Guid.NewGuid(), "user", IsBlocked: true)
);
.Returns(new CurrentUserProfile(userId, "alice", "user", IsBlocked: true));
var result = await CreateHandler()
.Handle(new LoginCommand("alice", "password123"), CancellationToken.None);
@@ -32,9 +32,7 @@ public class RegisterCommandHandlerTests
.Returns(Result.Success(userId));
_identityService
.GetProfileAsync(userId, Arg.Any<CancellationToken>())
.Returns(
new CurrentUserProfile(userId, "bob", Guid.NewGuid(), "user", IsBlocked: false)
);
.Returns(new CurrentUserProfile(userId, "bob", "user", IsBlocked: false));
_jwtTokenService
.GenerateAccessToken(Arg.Any<AuthenticatedUser>())
.Returns(("access-token", DateTimeOffset.UtcNow.AddMinutes(15)));
@@ -9,7 +9,6 @@ using TeleWave.Application.Broadcast.RemoveChannelAd;
using TeleWave.Application.Common.Interfaces;
using TeleWave.Application.Library.DeleteShow;
using TeleWave.Application.Library.GetShow;
using TeleWave.Application.Media.GetMedia;
using TeleWave.Application.Tests.Support;
using TeleWave.Domain.Broadcast;
using TeleWave.Domain.Library;
@@ -152,31 +151,6 @@ public class QueryHandlersTests
Assert.False(missing.IsSuccess);
}
[Fact]
public async Task GetMedia_ReturnsDtoOrNotFound()
{
var fixture = new TestDb();
var asset = MediaAsset.Register("clip.mp4", ".mp4", MediaSource.Upload);
await using (var seed = fixture.New())
{
seed.MediaAssets.Add(asset);
await seed.SaveChangesAsync(CancellationToken.None);
}
await using var db = fixture.New();
var ok = await new GetMediaAssetQueryHandler(db).Handle(
new GetMediaAssetQuery(asset.Id),
CancellationToken.None
);
Assert.True(ok.IsSuccess);
var missing = await new GetMediaAssetQueryHandler(db).Handle(
new GetMediaAssetQuery(Guid.NewGuid()),
CancellationToken.None
);
Assert.False(missing.IsSuccess);
}
[Fact]
public async Task DeleteShow_RemovesOrNotFound()
{
@@ -30,12 +30,8 @@ public class FindMissingEpisodesTests
}
var provider = Substitute.For<IMetadataProvider>();
provider
.GetSeasonEpisodeCountAsync("123", 1, Arg.Any<CancellationToken>())
.Returns(5);
provider
.GetSeasonEpisodeCountAsync("123", 2, Arg.Any<CancellationToken>())
.Returns(3);
provider.GetSeasonEpisodeCountAsync("123", 1, Arg.Any<CancellationToken>()).Returns(5);
provider.GetSeasonEpisodeCountAsync("123", 2, Arg.Any<CancellationToken>()).Returns(3);
var resolver = Substitute.For<IMetadataProviderResolver>();
resolver.Resolve("tmdb").Returns(provider);
@@ -47,7 +47,8 @@ public sealed class PostgresFixture : IAsyncLifetime
public sealed class PostgresCollection : ICollectionFixture<PostgresFixture>;
/// <summary>Детерминированный источник случайности для планировщика в тестах.</summary>
internal sealed class SequenceRandom(params int[] sequence) : Domain.Broadcast.Scheduling.IRandomSource
internal sealed class SequenceRandom(params int[] sequence)
: Domain.Broadcast.Scheduling.IRandomSource
{
private readonly int[] _sequence = sequence.Length == 0 ? [0] : sequence;
private int _i;
@@ -74,7 +74,11 @@ public sealed class TransactionIntegrationTests(PostgresFixture fixture)
var storage = Substitute.For<IMediaStorage>();
storage
.DeleteAssetArtifactsAsync(Arg.Any<Guid>(), Arg.Any<string>(), Arg.Any<CancellationToken>())
.DeleteAssetArtifactsAsync(
Arg.Any<Guid>(),
Arg.Any<string>(),
Arg.Any<CancellationToken>()
)
.Returns(Task.CompletedTask);
await using (var db = fixture.CreateContext())
@@ -89,9 +93,7 @@ public sealed class TransactionIntegrationTests(PostgresFixture fixture)
await using var verify = fixture.CreateContext();
Assert.False(await verify.MediaAssets.AnyAsync(a => a.Id == asset.Id));
Assert.False(await verify.ScheduleEntries.AnyAsync(e => e.MediaAssetId == asset.Id));
var reloaded = await verify
.Shows.Include(s => s.Episodes)
.FirstAsync(s => s.Id == show.Id);
var reloaded = await verify.Shows.Include(s => s.Episodes).FirstAsync(s => s.Id == show.Id);
Assert.Empty(reloaded.Episodes);
await storage
.Received()