releases/tests/Paca.Tests/Platform/CliPipelineGateTests.cs

101 lines
3.3 KiB
C#

using System.Diagnostics;
using System.IO;
using Xunit;
namespace Paca.Tests.Platform;
/// <summary>
/// Paca.Cli 파이프라인 회귀 방지 게이트 테스트 (Phase 5).
/// CLI 옵션 파싱(--help, --dashparse, --dash, HLS), 프로세스 종료 코드 검증.
/// </summary>
public class CliPipelineGateTests
{
private static string GetSolutionRoot()
{
var dir = AppContext.BaseDirectory;
while (!string.IsNullOrEmpty(dir) && !File.Exists(Path.Combine(dir, "Paca.slnx")) && !File.Exists(Path.Combine(dir, "Paca.sln")))
{
var parent = Directory.GetParent(dir);
if (parent == null) break;
dir = parent.FullName;
}
return dir ?? AppContext.BaseDirectory;
}
private static string CliProjectDir => Path.Combine(GetSolutionRoot(), "src", "Paca.Cli");
[Fact]
public void Gate_Cli_Program_Source_Contains_All_Required_Pipelines()
{
var programPath = Path.Combine(CliProjectDir, "Program.cs");
Assert.True(File.Exists(programPath), $"Program.cs must exist at {programPath}");
var content = File.ReadAllText(programPath);
// 핵심 CLI 옵션 검증
Assert.Contains("--help", content);
Assert.Contains("-h", content);
Assert.Contains("--dashparse", content);
Assert.Contains("--dash", content);
Assert.Contains("HlsDownloader", content);
Assert.Contains("DashDownloader", content);
}
[Fact]
public async Task Gate_Cli_Help_Command_Exits_With_Code_Zero()
{
var root = GetSolutionRoot();
var psi = new ProcessStartInfo
{
FileName = "dotnet",
Arguments = "run --project src/Paca.Cli --no-build -- -h",
WorkingDirectory = root,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
};
using var process = new Process { StartInfo = psi };
process.Start();
var outputTask = process.StandardOutput.ReadToEndAsync();
var errorTask = process.StandardError.ReadToEndAsync();
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
await process.WaitForExitAsync(cts.Token);
var stdout = await outputTask;
var stderr = await errorTask;
Assert.Equal(0, process.ExitCode);
Assert.Contains("Usage: dotnet run", stdout);
}
[Fact]
public async Task Gate_Cli_NoArgs_Prints_Usage_And_Exits_Zero()
{
var root = GetSolutionRoot();
var psi = new ProcessStartInfo
{
FileName = "dotnet",
Arguments = "run --project src/Paca.Cli --no-build",
WorkingDirectory = root,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
};
using var process = new Process { StartInfo = psi };
process.Start();
var outputTask = process.StandardOutput.ReadToEndAsync();
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
await process.WaitForExitAsync(cts.Token);
var stdout = await outputTask;
Assert.Equal(0, process.ExitCode);
Assert.Contains("Usage: dotnet run", stdout);
}
}