[Launcher] Categorize Lnk files in program plugin correctly as per the target file type (#6348)

* Updated UnregisteredApps code

* Added file type checking code and Folder and File classifications

* Added more file formats

* Removed run as admin for lnk folders

* Added script files as executable and changed hashset to case insensitive

* Removed runasadmin for generic files

* Removed FileTypes enum

* Extended ApplicationTypes enum

* Fix file format error

* Cleaned use of ApplicationType enum to public and match AppType and used ApplicationType in OnAppRenamed

* Modify tests to use ApplicationType enum

* Added tests for new App types

* Modified dummy appref

* Mock Directory.Exists and add tests for GetAppTypeFromPath

* Combined tests
This commit is contained in:
Arjun Balgovind
2020-09-10 15:06:37 -07:00
committed by GitHub
parent ab8bec8866
commit 82e1be2839
8 changed files with 287 additions and 59 deletions

View File

@@ -8,6 +8,7 @@ using System.Linq;
using Moq;
using NUnit.Framework;
using Wox.Infrastructure;
using Wox.Infrastructure.FileSystemHelper;
using Wox.Plugin;
namespace Microsoft.Plugin.Program.UnitTests.Programs
@@ -23,7 +24,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
ExecutableName = "notepad.exe",
FullPath = "c:\\windows\\system32\\notepad.exe",
LnkResolvedPath = "c:\\users\\powertoys\\appdata\\roaming\\microsoft\\windows\\start menu\\programs\\accessories\\notepad.lnk",
AppType = 2,
AppType = Win32Program.ApplicationType.Win32Application,
};
private static readonly Win32Program _notepadUsers = new Win32Program
@@ -32,7 +33,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
ExecutableName = "notepad.exe",
FullPath = "c:\\windows\\system32\\notepad.exe",
LnkResolvedPath = "c:\\programdata\\microsoft\\windows\\start menu\\programs\\accessories\\notepad.lnk",
AppType = 2,
AppType = Win32Program.ApplicationType.Win32Application,
};
private static readonly Win32Program _azureCommandPrompt = new Win32Program
@@ -41,7 +42,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
ExecutableName = "cmd.exe",
FullPath = "c:\\windows\\system32\\cmd.exe",
LnkResolvedPath = "c:\\programdata\\microsoft\\windows\\start menu\\programs\\microsoft azure\\microsoft azure sdk for .net\\v2.9\\microsoft azure command prompt - v2.9.lnk",
AppType = 2,
AppType = Win32Program.ApplicationType.Win32Application,
};
private static readonly Win32Program _visualStudioCommandPrompt = new Win32Program
@@ -50,7 +51,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
ExecutableName = "cmd.exe",
FullPath = "c:\\windows\\system32\\cmd.exe",
LnkResolvedPath = "c:\\programdata\\microsoft\\windows\\start menu\\programs\\visual studio 2019\\visual studio tools\\vc\\x64 native tools command prompt for vs 2019.lnk",
AppType = 2,
AppType = Win32Program.ApplicationType.Win32Application,
};
private static readonly Win32Program _commandPrompt = new Win32Program
@@ -59,7 +60,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
ExecutableName = "cmd.exe",
FullPath = "c:\\windows\\system32\\cmd.exe",
LnkResolvedPath = "c:\\users\\powertoys\\appdata\\roaming\\microsoft\\windows\\start menu\\programs\\system tools\\command prompt.lnk",
AppType = 2,
AppType = Win32Program.ApplicationType.Win32Application,
};
private static readonly Win32Program _fileExplorer = new Win32Program
@@ -68,7 +69,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
ExecutableName = "File Explorer.lnk",
FullPath = "c:\\users\\powertoys\\appdata\\roaming\\microsoft\\windows\\start menu\\programs\\system tools\\file explorer.lnk",
LnkResolvedPath = null,
AppType = 2,
AppType = Win32Program.ApplicationType.Win32Application,
};
private static readonly Win32Program _wordpad = new Win32Program
@@ -77,7 +78,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
ExecutableName = "wordpad.exe",
FullPath = "c:\\program files\\windows nt\\accessories\\wordpad.exe",
LnkResolvedPath = "c:\\programdata\\microsoft\\windows\\start menu\\programs\\accessories\\wordpad.lnk",
AppType = 2,
AppType = Win32Program.ApplicationType.Win32Application,
};
private static readonly Win32Program _wordpadDuplicate = new Win32Program
@@ -86,7 +87,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
ExecutableName = "WORDPAD.EXE",
FullPath = "c:\\program files\\windows nt\\accessories\\wordpad.exe",
LnkResolvedPath = null,
AppType = 2,
AppType = Win32Program.ApplicationType.Win32Application,
};
private static readonly Win32Program _twitterChromePwa = new Win32Program
@@ -122,7 +123,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
ExecutableName = "msedge.exe",
FullPath = "c:\\program files (x86)\\microsoft\\edge\\application\\msedge.exe",
LnkResolvedPath = "c:\\programdata\\microsoft\\windows\\start menu\\programs\\microsoft edge.lnk",
AppType = 2,
AppType = Win32Program.ApplicationType.Win32Application,
};
private static readonly Win32Program _chrome = new Win32Program
@@ -131,7 +132,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
ExecutableName = "chrome.exe",
FullPath = "c:\\program files (x86)\\google\\chrome\\application\\chrome.exe",
LnkResolvedPath = "c:\\programdata\\microsoft\\windows\\start menu\\programs\\google chrome.lnk",
AppType = 2,
AppType = Win32Program.ApplicationType.Win32Application,
};
private static readonly Win32Program _dummyProxyApp = new Win32Program
@@ -140,7 +141,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
ExecutableName = "test_proxy.exe",
FullPath = "c:\\program files (x86)\\microsoft\\edge\\application\\test_proxy.exe",
LnkResolvedPath = "c:\\programdata\\microsoft\\windows\\start menu\\programs\\test proxy.lnk",
AppType = 2,
AppType = Win32Program.ApplicationType.Win32Application,
};
private static readonly Win32Program _cmdRunCommand = new Win32Program
@@ -149,7 +150,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
ExecutableName = "cmd.exe",
FullPath = "c:\\windows\\system32\\cmd.exe",
LnkResolvedPath = null,
AppType = 3, // Run command
AppType = Win32Program.ApplicationType.RunCommand, // Run command
};
private static readonly Win32Program _cmderRunCommand = new Win32Program
@@ -159,7 +160,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
ExecutableName = "Cmder.exe",
FullPath = "c:\\tools\\cmder\\cmder.exe",
LnkResolvedPath = null,
AppType = 3, // Run command
AppType = Win32Program.ApplicationType.RunCommand, // Run command
};
private static readonly Win32Program _dummyInternetShortcutApp = new Win32Program
@@ -169,7 +170,7 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
FullPath = "steam://rungameid/1258080",
ParentDirectory = "C:\\Users\\temp\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Steam",
LnkResolvedPath = null,
AppType = 1,
AppType = Win32Program.ApplicationType.InternetShortcutApplication,
};
private static readonly Win32Program _dummyInternetShortcutAppDuplicate = new Win32Program
@@ -179,9 +180,59 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
FullPath = "steam://rungameid/1258080",
ParentDirectory = "C:\\Users\\temp\\Desktop",
LnkResolvedPath = null,
AppType = 1,
AppType = Win32Program.ApplicationType.InternetShortcutApplication,
};
private static readonly Win32Program _dummyAppRefApp = new Win32Program
{
Name = "Dummy AppRef Application",
ExecutableName = "dummy.appref-ms",
FullPath = "C:\\dummy.appref-ms",
ParentDirectory = "C:\\",
LnkResolvedPath = null,
AppType = Win32Program.ApplicationType.ApprefApplication,
};
private static readonly Win32Program _dummyShortcutApp = new Win32Program
{
Name = "Dummy Shortcut Application",
ExecutableName = "application.lnk",
FullPath = "C:\\application.lnk",
ParentDirectory = "C:\\",
LnkResolvedPath = "C:\\application.lnk",
AppType = Win32Program.ApplicationType.ShortcutApplication,
};
private static readonly Win32Program _dummyFolderApp = new Win32Program
{
Name = "Dummy Folder",
ExecutableName = "application.lnk",
FullPath = "C:\\dummy\\folder",
ParentDirectory = "C:\\dummy\\",
LnkResolvedPath = "C:\\tools\\application.lnk",
AppType = Win32Program.ApplicationType.Folder,
};
private static readonly Win32Program _dummyGenericFileApp = new Win32Program
{
Name = "Dummy Folder",
ExecutableName = "application.lnk",
FullPath = "C:\\dummy\\file.pdf",
ParentDirectory = "C:\\dummy\\",
LnkResolvedPath = "C:\\tools\\application.lnk",
AppType = Win32Program.ApplicationType.GenericFile,
};
private static IDirectoryWrapper GetMockedDirectoryWrapper()
{
var mockDirectory = new Mock<IDirectoryWrapper>();
// Check if the file has no extension. This is not actually true since there can be files without extensions, but this is sufficient for the purpose of a mock function
Func<string, bool> returnValue = arg => string.IsNullOrEmpty(System.IO.Path.GetExtension(arg));
mockDirectory.Setup(m => m.Exists(It.IsAny<string>())).Returns(returnValue);
return mockDirectory.Object;
}
[Test]
public void DedupFunctionWhenCalledMustRemoveDuplicateNotepads()
{
@@ -427,6 +478,68 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
Assert.AreEqual(contextMenuResults[2].Title, Properties.Resources.wox_plugin_program_open_in_console);
}
[Test]
public void AppRefApplicationShouldReturnContextMenuWithOpenInConsoleWhenContextMenusIsCalled()
{
// Arrange
var mock = new Mock<IPublicAPI>();
// Act
List<ContextMenuResult> contextMenuResults = _dummyAppRefApp.ContextMenus(mock.Object);
// Assert
Assert.AreEqual(contextMenuResults.Count, 3);
Assert.AreEqual(contextMenuResults[0].Title, Properties.Resources.wox_plugin_program_run_as_administrator);
Assert.AreEqual(contextMenuResults[1].Title, Properties.Resources.wox_plugin_program_open_containing_folder);
Assert.AreEqual(contextMenuResults[2].Title, Properties.Resources.wox_plugin_program_open_in_console);
}
[Test]
public void ShortcutApplicationShouldReturnContextMenuWithOpenInConsoleWhenContextMenusIsCalled()
{
// Arrange
var mock = new Mock<IPublicAPI>();
// Act
List<ContextMenuResult> contextMenuResults = _dummyShortcutApp.ContextMenus(mock.Object);
// Assert
Assert.AreEqual(contextMenuResults.Count, 3);
Assert.AreEqual(contextMenuResults[0].Title, Properties.Resources.wox_plugin_program_run_as_administrator);
Assert.AreEqual(contextMenuResults[1].Title, Properties.Resources.wox_plugin_program_open_containing_folder);
Assert.AreEqual(contextMenuResults[2].Title, Properties.Resources.wox_plugin_program_open_in_console);
}
[Test]
public void FolderApplicationShouldReturnContextMenuWithOpenInConsoleWhenContextMenusIsCalled()
{
// Arrange
var mock = new Mock<IPublicAPI>();
// Act
List<ContextMenuResult> contextMenuResults = _dummyFolderApp.ContextMenus(mock.Object);
// Assert
Assert.AreEqual(contextMenuResults.Count, 2);
Assert.AreEqual(contextMenuResults[0].Title, Properties.Resources.wox_plugin_program_open_containing_folder);
Assert.AreEqual(contextMenuResults[1].Title, Properties.Resources.wox_plugin_program_open_in_console);
}
[Test]
public void GenericFileApplicationShouldReturnContextMenuWithOpenInConsoleWhenContextMenusIsCalled()
{
// Arrange
var mock = new Mock<IPublicAPI>();
// Act
List<ContextMenuResult> contextMenuResults = _dummyGenericFileApp.ContextMenus(mock.Object);
// Assert
Assert.AreEqual(contextMenuResults.Count, 2);
Assert.AreEqual(contextMenuResults[0].Title, Properties.Resources.wox_plugin_program_open_containing_folder);
Assert.AreEqual(contextMenuResults[1].Title, Properties.Resources.wox_plugin_program_open_in_console);
}
[Test]
public void Win32AppsShouldSetNameAsTitleWhileCreatingResult()
{
@@ -440,5 +553,21 @@ namespace Microsoft.Plugin.Program.UnitTests.Programs
Assert.IsTrue(result.Title.Equals(_cmderRunCommand.Name, StringComparison.Ordinal));
Assert.IsFalse(result.Title.Equals(_cmderRunCommand.Description, StringComparison.Ordinal));
}
[TestCase("C:\\Program Files\\dummy.exe", ExpectedResult = Win32Program.ApplicationType.Win32Application)]
[TestCase("C:\\Program Files\\dummy.msc", ExpectedResult = Win32Program.ApplicationType.Win32Application)]
[TestCase("C:\\Program Files\\dummy.lnk", ExpectedResult = Win32Program.ApplicationType.ShortcutApplication)]
[TestCase("C:\\Program Files\\dummy.appref-ms", ExpectedResult = Win32Program.ApplicationType.ApprefApplication)]
[TestCase("C:\\Program Files\\dummy.url", ExpectedResult = Win32Program.ApplicationType.InternetShortcutApplication)]
[TestCase("C:\\Program Files\\dummy", ExpectedResult = Win32Program.ApplicationType.Folder)]
[TestCase("C:\\Program Files\\dummy.txt", ExpectedResult = Win32Program.ApplicationType.GenericFile)]
public Win32Program.ApplicationType GetAppTypeFromPathShouldReturnCorrectAppTypeWhenAppPathIsPassedAsArgument(string path)
{
// Directory.Exists must be mocked
Win32Program.DirectoryWrapper = GetMockedDirectoryWrapper();
// Act
return Win32Program.GetAppTypeFromPath(path);
}
}
}