using DodoSSH.Client.App.Platform; namespace DodoSSH.Client.App.Tests; /// /// LocalEditor: a remote file opened for editing is never run. /// /// /// The file's name was chosen by whoever can write to the host, so the question for every name here is /// whether the desktop's default action would execute it. Only the Windows rule is exercised directly — it /// is a pure function of the name and PATHEXT — while what each platform starts is checked on the /// platform the suite is running on. /// public sealed class LocalEditorTests { [Theory] [InlineData("deploy.bat")] [InlineData("DEPLOY.CMD")] [InlineData("notes.hta")] [InlineData("setup.js")] [InlineData("link.lnk")] [InlineData("run.ps1")] [InlineData("settings.reg")] [InlineData("deploy.bat.")] [InlineData("deploy.bat ")] public void AFileWindowsWouldRun_IsRecognised(string name) => LocalEditor.WouldRunOnWindows(name, pathExt: string.Empty).ShouldBeTrue(); [Theory] [InlineData("nginx.conf")] [InlineData("authorized_keys")] [InlineData(".bashrc")] [InlineData("app.json")] [InlineData("bat")] public void AnOrdinaryConfigFile_IsLeftToItsAssociation(string name) => LocalEditor.WouldRunOnWindows(name, pathExt: string.Empty).ShouldBeFalse(); [Fact] public void WhateverPathExtAdds_IsTreatedAsRunnableToo() => LocalEditor.WouldRunOnWindows("tool.foo", pathExt: ".COM;.EXE;.FOO").ShouldBeTrue(); [Fact] public void ARunnableFile_IsNeverHandedToTheDefaultOpenAction() { var path = Path.Combine(Path.GetTempPath(), "deploy.bat"); if (OperatingSystem.IsLinux()) { // No portable editor to name, and a .bat is not something a Linux desktop runs. LocalEditor.StartInfoFor(path).UseShellExecute.ShouldBeTrue(); Should.Throw(() => LocalEditor.StartInfoFor("/tmp/app.desktop")); return; } var start = LocalEditor.StartInfoFor(OperatingSystem.IsMacOS() ? "/tmp/run.command" : path); // Either the type's own "edit" verb, or a named editor with the file as an argument — never the // file itself under its default verb. (start.Verb == "edit" || !start.UseShellExecute).ShouldBeTrue(); } [Fact] public void AnOrdinaryFile_StillOpensWithItsAssociation() { var start = LocalEditor.StartInfoFor(Path.Combine(Path.GetTempPath(), "nginx.conf")); start.UseShellExecute.ShouldBeTrue(); start.Verb.ShouldBeEmpty(); } }