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();
}
}