using System.CommandLine; using ScadaLink.CLI.Commands; namespace ScadaLink.CLI.Tests.Commands; /// /// Shared helpers for invoking the audit command tree in tests and capturing /// stdout/stderr/exit code. /// internal static class AuditCommandTestHarness { public static RootCommand BuildRoot() { var url = new Option("--url") { Recursive = true }; var username = new Option("--username") { Recursive = true }; var password = new Option("--password") { Recursive = true }; var format = CliOptions.CreateFormatOption(); var root = new RootCommand(); root.Add(url); root.Add(username); root.Add(password); root.Add(format); root.Add(AuditCommands.Build(url, format, username, password)); return root; } /// /// Parses and invokes the command tree, capturing output from both channels the CLI /// uses: System.CommandLine's parser diagnostics flow through the /// writers, while command actions write through /// (consistent with the rest of the CLI). Both are merged into /// the returned Out/Err strings. Callers must be in the Console /// xUnit collection so the global redirect is not racy. /// public static (int Exit, string Out, string Err) Invoke(RootCommand root, params string[] args) { var output = new StringWriter(); var error = new StringWriter(); var originalOut = Console.Out; var originalErr = Console.Error; Console.SetOut(output); Console.SetError(error); int exit; try { exit = root.Parse(args).Invoke(new InvocationConfiguration { Output = output, Error = error, }); } finally { Console.SetOut(originalOut); Console.SetError(originalErr); } return (exit, output.ToString(), error.ToString()); } }