using System.CommandLine; using ScadaLink.CLI.Commands; namespace ScadaLink.CLI.Tests.Commands; /// /// Scaffold tests for the scadalink audit command group (Audit Log #23 M8-T1). /// Verifies the parent command exists with its three subcommands and that every leaf /// has an action wired. /// public class AuditCommandsScaffoldTests { private static readonly Option Url = new("--url") { Recursive = true }; private static readonly Option Username = new("--username") { Recursive = true }; private static readonly Option Password = new("--password") { Recursive = true }; private static readonly Option Format = CliOptions.CreateFormatOption(); private static Command BuildAudit() => AuditCommands.Build(Url, Format, Username, Password); [Fact] public void Audit_Command_IsNamedAudit() { var audit = BuildAudit(); Assert.Equal("audit", audit.Name); Assert.False(string.IsNullOrWhiteSpace(audit.Description)); } [Fact] public void Audit_HasThreeSubcommands_QueryExportVerifyChain() { var audit = BuildAudit(); var names = audit.Subcommands.Select(c => c.Name).OrderBy(n => n).ToArray(); Assert.Equal(new[] { "export", "query", "verify-chain" }, names); } [Fact] public void Audit_HelpText_ListsAllSubcommands() { var root = new RootCommand(); root.Add(BuildAudit()); var output = new StringWriter(); var exit = root.Parse(new[] { "audit", "--help" }) .Invoke(new InvocationConfiguration { Output = output }); Assert.Equal(0, exit); var text = output.ToString(); Assert.Contains("query", text); Assert.Contains("export", text); Assert.Contains("verify-chain", text); } [Fact] public void Audit_EveryLeafCommand_HasAnAction() { var audit = BuildAudit(); Assert.All(audit.Subcommands, sub => Assert.True(sub.Action != null, $"Leaf command '{sub.Name}' has no action.")); } }