using System.Diagnostics; using OneClickRun.Core.Models; using OneClickRun.Core.Services; using Xunit; namespace OneClickRun.Core.Tests; public class CommandRunnerTests { private static string SystemRoot => Environment.GetFolderPath(Environment.SpecialFolder.Windows); [Fact] public void App_BuildsShellExecuteInfo() { var item = new CommandItem { ActionType = ActionType.App, Target = SystemRoot + "\\explorer.exe", Arguments = "-n" }; var psi = CommandRunner.BuildStartInfo(item); Assert.True(psi.UseShellExecute); Assert.Equal("-n", psi.Arguments); Assert.False(string.IsNullOrEmpty(psi.WorkingDirectory)); } [Fact] public void App_Admin_SetsVerb() { var item = new CommandItem { ActionType = ActionType.App, Target = SystemRoot + "\\explorer.exe", RunAsAdmin = true }; var psi = CommandRunner.BuildStartInfo(item); Assert.Equal("runas", psi.Verb); } [Fact] public void Folder_UsesExplorer() { var item = new CommandItem { ActionType = ActionType.Folder, Target = "C:\\Some Folder" }; var psi = CommandRunner.BuildStartInfo(item); Assert.Equal("explorer.exe", psi.FileName); Assert.Contains("\"C:\\Some Folder\"", psi.Arguments); Assert.False(psi.UseShellExecute); } [Theory] [InlineData("www.bing.com", "https://www.bing.com")] [InlineData("bing.com", "https://bing.com")] [InlineData("https://example.com/x", "https://example.com/x")] [InlineData("ms-settings:", "ms-settings:")] public void Url_Normalization(string input, string expected) { Assert.Equal(expected, CommandRunner.NormalizeUrl(input)); } [Fact] public void Script_BuildsPowerShellArgs() { var item = new CommandItem { ActionType = ActionType.Script, Target = "C:\\Scripts\\demo.ps1" }; var psi = CommandRunner.BuildStartInfo(item); Assert.Equal("powershell.exe", psi.FileName); Assert.Contains("-NoProfile", psi.Arguments); Assert.Contains("-ExecutionPolicy Bypass", psi.Arguments); Assert.Contains("-File \"C:\\Scripts\\demo.ps1\"", psi.Arguments); Assert.False(psi.UseShellExecute); Assert.False(psi.CreateNoWindow); } [Fact] public void Script_Hidden_SetsNoWindow() { var item = new CommandItem { ActionType = ActionType.Script, Target = "C:\\a.ps1", HideWindow = true }; var psi = CommandRunner.BuildStartInfo(item); Assert.True(psi.CreateNoWindow); Assert.Equal(ProcessWindowStyle.Hidden, psi.WindowStyle); } [Fact] public void Script_Admin_SetsVerb() { var item = new CommandItem { ActionType = ActionType.Script, Target = "C:\\a.ps1", RunAsAdmin = true }; var psi = CommandRunner.BuildStartInfo(item); Assert.True(psi.UseShellExecute); Assert.Equal("runas", psi.Verb); } [Theory] [InlineData(ActionType.App)] [InlineData(ActionType.Folder)] [InlineData(ActionType.Script)] [InlineData(ActionType.Url)] public void Validate_MissingTarget_ReturnsError(ActionType type) { var item = new CommandItem { Name = "x", ActionType = type, Target = "" }; Assert.NotNull(CommandRunner.Validate(item)); } [Fact] public void Validate_ExistingApp_ReturnsNull() { var item = new CommandItem { Name = "x", ActionType = ActionType.App, Target = SystemRoot + "\\notepad.exe" }; Assert.Null(CommandRunner.Validate(item)); } [Fact] public void Validate_InvalidUrl_ReturnsError() { var item = new CommandItem { Name = "x", ActionType = ActionType.Url, Target = "::not a url::" }; Assert.NotNull(CommandRunner.Validate(item)); } [Theory] [InlineData(@"C:\Scripts\run.cmd")] [InlineData(@"C:\Scripts\run.bat")] public void Script_Batch_BuildsCmdArgs(string target) { var item = new CommandItem { ActionType = ActionType.Script, Target = target }; var psi = CommandRunner.BuildStartInfo(item); Assert.Equal("cmd.exe", psi.FileName); Assert.Equal("/c \"\"" + target + "\"\"", psi.Arguments); Assert.False(psi.UseShellExecute); } [Fact] public void Script_Batch_Admin_SetsVerb() { var item = new CommandItem { ActionType = ActionType.Script, Target = "C:\run.bat", RunAsAdmin = true }; var psi = CommandRunner.BuildStartInfo(item); Assert.Equal("cmd.exe", psi.FileName); Assert.True(psi.UseShellExecute); Assert.Equal("runas", psi.Verb); } }