using Microsoft.Extensions.Options;
using TeleWave.Infrastructure.Media;
using Xunit;
namespace TeleWave.Application.Tests.Media;
///
/// Сигнальная очередь конвейера и предел параллельности. Мелочь, но на первой держится реакция
/// обработчика на новый файл, а на втором — оценка «сколько ещё ждать».
///
public class MediaQueueTests
{
[Fact]
public async Task Queue_WakesUpOnce_ForAWholeBurstOfSignals()
{
var queue = new MediaProcessingQueue();
queue.Enqueue(Guid.NewGuid());
queue.Enqueue(Guid.NewGuid());
queue.Enqueue(Guid.NewGuid());
// Первый вызов возвращается сразу и дренирует накопленное: работу обработчик всё равно
// берёт из БД пачкой, и три сигнала не должны означать три круга.
await queue.WaitAsync(CancellationToken.None);
using var cts = new CancellationTokenSource();
await cts.CancelAsync();
// Очередь пуста — следующий вызов ждёт нового сигнала, а не возвращается снова.
await Assert.ThrowsAnyAsync(async () =>
await queue.WaitAsync(cts.Token)
);
}
[Theory]
[InlineData(4, 4)]
[InlineData(0, 1)]
[InlineData(-2, 1)]
public void Limits_NeverReportLessThanOneTranscode(int configured, int expected)
{
var limits = new MediaProcessingLimits(
Options.Create(new MediaOptions { MaxParallelTranscodes = configured })
);
// Ноль и отрицательное в настройках — не повод делить оценку очереди на ноль.
Assert.Equal(expected, limits.MaxParallelTranscodes);
}
}