using System; using System.IO; using System.Threading.Tasks; using Moq; using Xunit; using TwitchArchive.Core.Services; namespace TwitchArchive.Tests { public class ProcessorServiceTests : IDisposable { private readonly string _tmp; public ProcessorServiceTests() { _tmp = Path.Combine(Path.GetTempPath(), "ta_proc_" + Guid.NewGuid().ToString("N")); Directory.CreateDirectory(_tmp); } [Fact] public async Task ProcessRawStream_CallsFfmpeg_CopyMode() { var mock = new Mock(); mock.Setup(r => r.RunAsync(It.IsAny(), default)).ReturnsAsync(new ProcessRunResult { ExitCode = 0 }); var svc = new ProcessorService(mock.Object); var raw = Path.Combine(_tmp, "in.ts"); var outp = Path.Combine(_tmp, "out.mp4"); File.WriteAllText(raw, "x"); var ok = await svc.ProcessRawStreamAsync(raw, outp, "best"); Assert.True(ok); mock.Verify(r => r.RunAsync(It.Is(o => o.FileName == "ffmpeg" && o.Arguments.Contains("-c:v copy")), default), Times.Once); } [Fact] public async Task ProcessRawStream_AudioOnly_UsesAac() { var mock = new Mock(); mock.Setup(r => r.RunAsync(It.IsAny(), default)).ReturnsAsync(new ProcessRunResult { ExitCode = 0 }); var svc = new ProcessorService(mock.Object); var raw = Path.Combine(_tmp, "in.ts"); var outp = Path.Combine(_tmp, "out.mp4"); File.WriteAllText(raw, "x"); var ok = await svc.ProcessRawStreamAsync(raw, outp, "audio_only"); Assert.True(ok); mock.Verify(r => r.RunAsync(It.Is(o => o.FileName == "ffmpeg" && o.Arguments.Contains("-vn") && o.Arguments.Contains("-c:a aac")), default), Times.Once); } public void Dispose() { try { Directory.Delete(_tmp, true); } catch { } } } }