Add grid auto-build functionality with profile management and preview capabilities
Implemented new API endpoints and frontend components for grid auto-building based on predefined profiles. Added functionality to list grid profiles, preview generated grids, and generate grids with specified parameters. Enhanced the TemplateEndpoints and related services to support these features, improving the user experience for channel scheduling. Localization updates were made to accommodate new features in both English and Russian.
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
using NSubstitute;
|
||||
using TeleWave.Application.Common.Interfaces;
|
||||
using TeleWave.Application.Media.Stats;
|
||||
using TeleWave.Application.Tests.Support;
|
||||
using TeleWave.Domain.Media;
|
||||
@@ -53,7 +55,7 @@ public class MediaStatsTests
|
||||
}
|
||||
|
||||
await using var db = fixture.New();
|
||||
var stats = await new GetMediaStatsQueryHandler(db).Handle(
|
||||
var stats = await new GetMediaStatsQueryHandler(db, Limits(1)).Handle(
|
||||
new GetMediaStatsQuery(),
|
||||
CancellationToken.None
|
||||
);
|
||||
@@ -63,4 +65,68 @@ public class MediaStatsTests
|
||||
Assert.NotNull(stats.AverageProcessingSeconds);
|
||||
Assert.True(stats.AverageProcessingSeconds >= 0);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Estimate_ScalesWithQueueAndParallelism()
|
||||
{
|
||||
var fixture = new TestDb();
|
||||
await using (var seed = fixture.New())
|
||||
{
|
||||
// Одна завершённая задаёт среднее, четыре ждут своей очереди.
|
||||
seed.MediaAssets.AddRange(
|
||||
Ready("done.mkv"),
|
||||
Pending("a.mkv"),
|
||||
Pending("b.mkv"),
|
||||
Pending("c.mkv"),
|
||||
Pending("d.mkv")
|
||||
);
|
||||
await seed.SaveChangesAsync(CancellationToken.None);
|
||||
}
|
||||
|
||||
await using var db = fixture.New();
|
||||
var single = await new GetMediaStatsQueryHandler(db, Limits(1)).Handle(
|
||||
new GetMediaStatsQuery(),
|
||||
CancellationToken.None
|
||||
);
|
||||
var parallel = await new GetMediaStatsQueryHandler(db, Limits(2)).Handle(
|
||||
new GetMediaStatsQuery(),
|
||||
CancellationToken.None
|
||||
);
|
||||
|
||||
var average = single.AverageProcessingSeconds!.Value;
|
||||
Assert.Equal(4 * average, single.EstimatedRemainingSeconds!.Value, 3);
|
||||
// Два транскода одновременно — вдвое меньше ждать.
|
||||
Assert.Equal(
|
||||
single.EstimatedRemainingSeconds!.Value / 2,
|
||||
parallel.EstimatedRemainingSeconds!.Value,
|
||||
3
|
||||
);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Estimate_IsAbsent_WhenQueueIsEmpty()
|
||||
{
|
||||
var fixture = new TestDb();
|
||||
await using (var seed = fixture.New())
|
||||
{
|
||||
seed.MediaAssets.Add(Ready("done.mkv"));
|
||||
await seed.SaveChangesAsync(CancellationToken.None);
|
||||
}
|
||||
|
||||
await using var db = fixture.New();
|
||||
var stats = await new GetMediaStatsQueryHandler(db, Limits(1)).Handle(
|
||||
new GetMediaStatsQuery(),
|
||||
CancellationToken.None
|
||||
);
|
||||
|
||||
// Ждать нечего — оценки нет вовсе, а не «0 секунд».
|
||||
Assert.Null(stats.EstimatedRemainingSeconds);
|
||||
}
|
||||
|
||||
private static IMediaProcessingLimits Limits(int parallel)
|
||||
{
|
||||
var limits = Substitute.For<IMediaProcessingLimits>();
|
||||
limits.MaxParallelTranscodes.Returns(parallel);
|
||||
return limits;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user