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); } }