From ddb522a8d3b37b3f5ed71b6639757c62929ff34a Mon Sep 17 00:00:00 2001 From: MrMirDan Date: Tue, 7 Apr 2026 16:31:09 +0300 Subject: [PATCH] update: app ui model and controller test --- client/core/controllers/coreController.h | 2 + client/tests/CMakeLists.txt | 10 ++ .../tests/testUiAppSTModelAndController.cpp | 120 ++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 client/tests/testUiAppSTModelAndController.cpp diff --git a/client/core/controllers/coreController.h b/client/core/controllers/coreController.h index 2ec3aac93..442ec2322 100644 --- a/client/core/controllers/coreController.h +++ b/client/core/controllers/coreController.h @@ -91,6 +91,7 @@ class TestMultipleExports; class TestSerialization; class TestUiLanguageModelAndController; class TestUiSitesModelAndController; +class TestUiAppSTModelAndController; class CoreController : public QObject { @@ -112,6 +113,7 @@ class CoreController : public QObject friend class TestSerialization; friend class TestUiLanguageModelAndController; friend class TestUiSitesModelAndController; + friend class TestUiAppSTModelAndController; public: explicit CoreController(const QSharedPointer &vpnConnection, SecureQSettings* settings, diff --git a/client/tests/CMakeLists.txt b/client/tests/CMakeLists.txt index 2de98c842..d7d56f3ae 100644 --- a/client/tests/CMakeLists.txt +++ b/client/tests/CMakeLists.txt @@ -178,6 +178,15 @@ target_link_libraries(test_ui_sites_model_and_controller PRIVATE test_common ) +add_executable(test_ui_app_st_model_and_controller + testUiAppSTModelAndController.cpp +) + +target_link_libraries(test_ui_app_st_model_and_controller PRIVATE + Qt6::Test + test_common +) + enable_testing() add_test(NAME ImportExportTest COMMAND test_import_export) add_test(NAME MultipleImportsTest COMMAND test_multiple_imports) @@ -195,3 +204,4 @@ add_test(NAME MultipleExportsTest COMMAND test_exports) add_test(NAME SerializationTest COMMAND test_serialization) add_test(NAME UiLanguageModelAndControllerTest COMMAND test_ui_language_model_and_controller) add_test(NAME UiSitesModelAndControllerTest COMMAND test_ui_sites_model_and_controller) +add_test(NAME UiAppSTModelAndControllerTest COMMAND test_ui_app_st_model_and_controller) diff --git a/client/tests/testUiAppSTModelAndController.cpp b/client/tests/testUiAppSTModelAndController.cpp new file mode 100644 index 000000000..0c80cb424 --- /dev/null +++ b/client/tests/testUiAppSTModelAndController.cpp @@ -0,0 +1,120 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "core/controllers/coreController.h" +#include "core/models/serverConfig.h" +#include "secureQSettings.h" +#include "vpnConnection.h" + +using namespace amnezia; + +class TestUiAppSTModelAndController : public QObject +{ + Q_OBJECT + +private: + CoreController *m_coreController; + SecureQSettings *m_settings; + + QString getSHAdminConfig() + { + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + return env.value("TEST_SELF_HOSTED_CONFIG"); + } + + QString getAppPath() + { + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + return env.value("TEST_APP_PATH"); + } + +private slots: + void initTestCase() + { + QString testOrg = "AmneziaVPN-Test-" + QUuid::createUuid().toString(); + m_settings = new SecureQSettings(testOrg, "amnezia-client", nullptr, false); + + auto vpnConnection = QSharedPointer::create(nullptr, nullptr); + + m_coreController = new CoreController(vpnConnection, m_settings, nullptr, this); + + QString vpnKey = getSHAdminConfig(); + QJsonObject importedConfig = m_coreController->m_importCoreController->extractConfigFromData(vpnKey).config; + + m_coreController->m_importCoreController->importConfig(importedConfig); + + qDebug() << "SELF-HOSTED ADMIN SERVER IMPORTED\n"; + } + + void cleanupTestCase() + { + int serverIndex = m_coreController->m_serversRepository->defaultServerIndex(); + m_coreController->m_serversController->removeServer(serverIndex); + + qDebug() << "\nSERVER REMOVED\n"; + + m_settings->clearSettings(); + delete m_coreController; + delete m_settings; + } + + void init() + { + m_settings->clearSettings(); + if (m_coreController->m_serversModel) { + m_coreController->m_serversModel->updateModel(QVector(), -1, false); + } + } + + void testRolesAndSignals() + { + QSignalSpy finishedSpy(m_coreController->m_appSplitTunnelingUiController, &AppSplitTunnelingUiController::finished); + QSignalSpy errorOccurredSpy(m_coreController->m_appSplitTunnelingUiController, &AppSplitTunnelingUiController::errorOccurred); + QSignalSpy isSplitTunnelingChangedSpy(m_coreController->m_appSplitTunnelingUiController, &AppSplitTunnelingUiController::isTunnelingEnabledChanged); + + m_coreController->m_appSplitTunnelingUiController->toggleSplitTunneling(true); + QVERIFY(isSplitTunnelingChangedSpy.count() == 1, "isSplitTunnelingChangedSpy signal should be emitted"); + QVERIFY(m_coreController->m_appSplitTunnelingUiController->isTunnelingEnabled() == true, "AppSplitTunneling should be enabled"); + + m_coreController->m_appSplitTunnelingUiController->toggleSplitTunneling(false); + QVERIFY(isSplitTunnelingChangedSpy.count() == 2, "isSplitTunnelingChangedSpy signal should be emitted 2nd time"); + QVERIFY(m_coreController->m_appSplitTunnelingUiController->isTunnelingEnabled() == false, "AppSplitTunneling should be disabled"); + + QString app = getAppPath(); + + m_coreController->m_appSplitTunnelingUiController->addApp(app); + m_coreController->m_appSplitTunnelingUiController->updateModel(); + QVERIFY(finishedSpy.count() == 1, "finished signal should be emitted"); + QVERIFY(m_coreController->m_appSplitTunnelingModel->rowCount() == 1, "AppSplitTunnelingModel should have 1 row"); + + QModelIndex appSTModelIndex = m_coreController->m_appSplitTunnelingModel->index(0, 0); + QVERIFY2(appSTModelIndex.isValid(), "Site model index should be valid"); + + auto appPath = m_coreController->m_appSplitTunnelingModel->data(appSTModelIndex, AppSplitTunnelingModel::AppPathRole); + QVERIFY(app.contains(appPath.toString()) == true, QString("app path should be %1, got %2").arg(app, appPath)); + + auto pkgAppName = m_coreController->m_appSplitTunnelingModel->data(appSTModelIndex, AppSplitTunnelingModel::PackageAppNameRole); + QVERIFY(pkgAppName == true, "app name should be set"); + + auto pkgAppIcon = m_coreController->m_appSplitTunnelingModel->data(appSTModelIndex, AppSplitTunnelingModel::PackageAppIconRole); + QVERIFY(pkgAppIcon == true, "app image should be set"); + + m_coreController->m_appSplitTunnelingUiController->addApp(app); + m_coreController->m_appSplitTunnelingUiController->updateModel(); + QVERIFY(errorOccurredSpy.count() == 1, "errorOccurred signal should be emitted"); + QVERIFY(m_coreController->m_appSplitTunnelingModel->rowCount() == 1, "AppSplitTunnelingModel should have 3 rows (same app should not be added)"); + + m_coreController->m_appSplitTunnelingUiController->removeApp(0); + m_coreController->m_appSplitTunnelingUiController->updateModel(); + QVERIFY(finishedSpy.count() == 2, "finished signal should be emitted"); + QVERIFY(m_coreController->m_appSplitTunnelingModel->rowCount() == 0, "AppSplitTunnelingModel should have 0 rows"); + } +}; + +QTEST_MAIN(TestUiAppSTModelAndController) +#include "testUiAppSTModelAndController.moc"