Files
PowerToys/src/modules/Workspaces/WorkspacesLib.UnitTests/AppUtilsTests.cpp

239 lines
7.1 KiB
C++
Raw Normal View History

Workspaceslib ut (#40007) This pull request introduces a new unit testing framework for the `WorkspacesLib` module, adds test coverage for various utilities, and integrates the new test project into the build system. Key changes include adding the `WorkspacesLibUnitTests` project, implementing tests for `AppUtils`, `JsonUtils`, and `PwaHelper`, and updating the build configuration to include the new test project. ### Unit Tests Added: * **`AppUtilsTests`**: - Added comprehensive tests for methods such as `GetCurrentFolder`, `IsEdge`, `IsChrome`, and `IsSteamGame` to validate their behavior under various conditions. * **`JsonUtilsTests`**: - Implemented tests for reading and writing workspace data, including scenarios for invalid JSON, non-existent files, and valid workspace lists. * **`PwaHelperTests`**: - Added tests to ensure the stability of `PwaHelper` methods, such as `GetEdgeAppId`, `GetChromeAppId`, and `SearchPwaName`, even with invalid or empty inputs. ### Build System Updates: * **New Test Project Integration**: - Added the `WorkspacesLibUnitTests` project to the solution file `PowerToys.sln` with appropriate dependencies. - Updated build configurations to include the new test project for both Debug and Release builds across architectures. [[1]](diffhunk://#diff-ca837ce490070b91656ffffe31cbad8865ba9174e0f020231f77baf35ff3f811R2208-R2215) [[2]](diffhunk://#diff-ca837ce490070b91656ffffe31cbad8865ba9174e0f020231f77baf35ff3f811R2841) ### Pipeline Adjustments: * **Test Discovery**: - Updated the pipeline configuration in `.pipelines/v2/templates/job-build-project.yml` to discover the new `WorkspacesLibUnitTests.dll` during test runs. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2025-06-13 10:51:22 +08:00
#include "pch.h"
#include <filesystem> // Add this line
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace WorkspacesLibUnitTests
{
TEST_CLASS(AppUtilsTests)
{
public:
TEST_METHOD(GetCurrentFolder_ReturnsNonEmptyPath)
{
// Act
const std::wstring& result = Utils::Apps::GetCurrentFolder();
// Assert
Assert::IsFalse(result.empty());
Assert::IsTrue(std::filesystem::exists(result));
}
TEST_METHOD(GetCurrentFolderUpper_ReturnsUppercasePath)
{
// Act
const std::wstring& currentFolder = Utils::Apps::GetCurrentFolder();
const std::wstring& currentFolderUpper = Utils::Apps::GetCurrentFolderUpper();
// Assert
Assert::IsFalse(currentFolderUpper.empty());
Assert::AreEqual(currentFolder.length(), currentFolderUpper.length());
// Verify it's actually uppercase
std::wstring expectedUpper = currentFolder;
std::transform(expectedUpper.begin(), expectedUpper.end(), expectedUpper.begin(), towupper);
Assert::AreEqual(expectedUpper, currentFolderUpper);
}
TEST_METHOD(GetCurrentFolder_ConsistentResults)
{
// Act
const std::wstring& result1 = Utils::Apps::GetCurrentFolder();
const std::wstring& result2 = Utils::Apps::GetCurrentFolder();
// Assert
Assert::AreEqual(result1, result2);
}
TEST_METHOD(GetCurrentFolderUpper_ConsistentResults)
{
// Act
const std::wstring& result1 = Utils::Apps::GetCurrentFolderUpper();
const std::wstring& result2 = Utils::Apps::GetCurrentFolderUpper();
// Assert
Assert::AreEqual(result1, result2);
}
TEST_METHOD(AppData_IsEdge_EdgePath_ReturnsTrue)
{
// Arrange
Utils::Apps::AppData appData;
appData.installPath = L"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe";
// Act
bool result = appData.IsEdge();
// Assert
Assert::IsTrue(result);
}
TEST_METHOD(AppData_IsEdge_NonEdgePath_ReturnsFalse)
{
// Arrange
Utils::Apps::AppData appData;
appData.installPath = L"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";
// Act
bool result = appData.IsEdge();
// Assert
Assert::IsFalse(result);
}
TEST_METHOD(AppData_IsEdge_EmptyPath_ReturnsFalse)
{
// Arrange
Utils::Apps::AppData appData;
appData.installPath = L"";
// Act
bool result = appData.IsEdge();
// Assert
Assert::IsFalse(result);
}
TEST_METHOD(AppData_IsChrome_ChromePath_ReturnsTrue)
{
// Arrange
Utils::Apps::AppData appData;
appData.installPath = L"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";
// Act
bool result = appData.IsChrome();
// Assert
Assert::IsTrue(result);
}
TEST_METHOD(AppData_IsChrome_NonChromePath_ReturnsFalse)
{
// Arrange
Utils::Apps::AppData appData;
appData.installPath = L"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe";
// Act
bool result = appData.IsChrome();
// Assert
Assert::IsFalse(result);
}
TEST_METHOD(AppData_IsChrome_EmptyPath_ReturnsFalse)
{
// Arrange
Utils::Apps::AppData appData;
appData.installPath = L"";
// Act
bool result = appData.IsChrome();
// Assert
Assert::IsFalse(result);
}
TEST_METHOD(AppData_IsSteamGame_SteamProtocol_ReturnsTrue)
{
// Arrange
Utils::Apps::AppData appData;
appData.protocolPath = L"steam://run/123456";
// Act
bool result = appData.IsSteamGame();
// Assert
Assert::IsTrue(result);
}
TEST_METHOD(AppData_IsSteamGame_NonSteamProtocol_ReturnsFalse)
{
// Arrange
Utils::Apps::AppData appData;
appData.protocolPath = L"https://example.com";
// Act
bool result = appData.IsSteamGame();
// Assert
Assert::IsFalse(result);
}
TEST_METHOD(AppData_IsSteamGame_EmptyProtocol_ReturnsFalse)
{
// Arrange
Utils::Apps::AppData appData;
appData.protocolPath = L"";
// Act
bool result = appData.IsSteamGame();
// Assert
Assert::IsFalse(result);
}
TEST_METHOD(AppData_IsSteamGame_PartialSteamString_ReturnsFalse)
{
// Arrange
Utils::Apps::AppData appData;
appData.protocolPath = L"http://run/123456";
// Act
bool result = appData.IsSteamGame();
// Assert
Assert::IsFalse(result);
}
TEST_METHOD(AppData_DefaultValues)
{
// Arrange & Act
Utils::Apps::AppData appData;
// Assert
Assert::IsTrue(appData.name.empty());
Assert::IsTrue(appData.installPath.empty());
Assert::IsTrue(appData.packageFullName.empty());
Assert::IsTrue(appData.appUserModelId.empty());
Assert::IsTrue(appData.pwaAppId.empty());
Assert::IsTrue(appData.protocolPath.empty());
Assert::IsFalse(appData.canLaunchElevated);
}
TEST_METHOD(AppData_MultipleBrowserDetection)
{
// Arrange
Utils::Apps::AppData edgeApp;
edgeApp.installPath = L"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe";
Utils::Apps::AppData chromeApp;
chromeApp.installPath = L"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";
Utils::Apps::AppData otherApp;
otherApp.installPath = L"C:\\Program Files\\Firefox\\firefox.exe";
// Act & Assert
Assert::IsTrue(edgeApp.IsEdge());
Assert::IsFalse(edgeApp.IsChrome());
Assert::IsFalse(edgeApp.IsSteamGame());
Assert::IsFalse(chromeApp.IsEdge());
Assert::IsTrue(chromeApp.IsChrome());
Assert::IsFalse(chromeApp.IsSteamGame());
Assert::IsFalse(otherApp.IsEdge());
Assert::IsFalse(otherApp.IsChrome());
Assert::IsFalse(otherApp.IsSteamGame());
}
TEST_METHOD(GetAppsList_ReturnsAppList)
{
// Act
Utils::Apps::AppList apps = Utils::Apps::GetAppsList();
// Assert
// The list can be empty or non-empty depending on the system
// But it should not crash and should return a valid list
Assert::IsTrue(apps.size() >= 0);
}
};
}