diff --git a/client/core/controllers/coreController.h b/client/core/controllers/coreController.h index 792cb7792..2ec3aac93 100644 --- a/client/core/controllers/coreController.h +++ b/client/core/controllers/coreController.h @@ -90,6 +90,7 @@ class TestSelfHostedServerSetup; class TestMultipleExports; class TestSerialization; class TestUiLanguageModelAndController; +class TestUiSitesModelAndController; class CoreController : public QObject { @@ -110,6 +111,7 @@ class CoreController : public QObject friend class TestMultipleExports; friend class TestSerialization; friend class TestUiLanguageModelAndController; + friend class TestUiSitesModelAndController; public: explicit CoreController(const QSharedPointer &vpnConnection, SecureQSettings* settings, diff --git a/client/tests/CMakeLists.txt b/client/tests/CMakeLists.txt index 37b57bdd8..2de98c842 100644 --- a/client/tests/CMakeLists.txt +++ b/client/tests/CMakeLists.txt @@ -169,6 +169,15 @@ target_link_libraries(test_ui_language_model_and_controller PRIVATE test_common ) +add_executable(test_ui_sites_model_and_controller + testUiSitesModelAndController.cpp +) + +target_link_libraries(test_ui_sites_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) @@ -185,3 +194,4 @@ add_test(NAME SelfHostedServerSetupTest COMMAND test_self_hosted_server_setup) 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) diff --git a/client/tests/testSitesModel.cpp b/client/tests/testSitesModel.cpp deleted file mode 100644 index e7cf8211c..000000000 --- a/client/tests/testSitesModel.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#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 TestSerialization : public QObject -{ - Q_OBJECT - -private: - CoreController *m_coreController; - SecureQSettings *m_settings; - - QString getSHAdminConfig() - { - QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); - return env.value("TEST_SELF_HOSTED_CONFIG"); - } - -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() << "SERVER 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 test() - { - - } -}; - -QTEST_MAIN(TestSerialization) -#include "testSerialization.moc" diff --git a/client/tests/testUiSitesModelAndController.cpp b/client/tests/testUiSitesModelAndController.cpp new file mode 100644 index 000000000..7af547729 --- /dev/null +++ b/client/tests/testUiSitesModelAndController.cpp @@ -0,0 +1,110 @@ +#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 TestUiSitesModelAndController : 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 normalizeHostname(const QString &hostname) const + { + QString normalized = hostname; + normalized.replace("https://", ""); + normalized.replace("http://", ""); + normalized.replace("ftp://", ""); + normalized = normalized.split("/", Qt::SkipEmptyParts).first(); + return normalized; + } + +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() << "SERVER 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 testRoles() + { + QSignalSpy finishedSpy(m_coreController->m_sitesUiController, &SitesUiController::finished); + + m_coreController->m_sitesUiController->addSite("2ip.io"); + m_coreController->m_sitesUiController->addSite("whatismyipaddress.com"); + m_coreController->m_sitesUiController->updateModel(); + QVERIFY(finishedSpy.count() == 2, "finished signal should be emitted 2 times"); + QVERIFY(m_coreController->m_sitesModel->rowCount() == 2, "SitesModel should have 2 rows"); + + QModelIndex siteModelIndex = m_coreController->m_sitesModel->index(0, 0); + QVERIFY2(siteModelIndex.isValid(), "Site model index should be valid"); + + auto siteUrl = m_coreController->m_sitesModel->data(siteModelIndex, SitesModel::UrlRole); + QVERIFY(siteUrl == normalizeHostname("2ip.io"), QString("site url should be %1, got %2").arg(normalizeHostname("2ip.io"), siteUrl)); + + // auto siteIp = m_coreController->m_sitesModel->data(siteModelIndex, SitesModel::IpRole); + // QVERIFY(siteIp != "", "site ip should not be empty"); + + m_coreController->m_sitesUiController->removeSite(0); + m_coreController->m_sitesUiController->updateModel(); + QVERIFY(finishedSpy.count() == 3, "finished signal should be emitted"); + QVERIFY(m_coreController->m_sitesModel->rowCount() == 1, "SitesModel should have 1 row"); + + m_coreController->m_sitesUiController->removeSites(); + m_coreController->m_sitesUiController->updateModel(); + QVERIFY(finishedSpy.count() == 4, "finished signal should be emitted"); + QVERIFY(m_coreController->m_sitesModel->rowCount() == 0, "SitesModel should have 0 rows"); + } +}; + +QTEST_MAIN(TestUiSitesModelAndController) +#include "testUiSitesModelAndController.moc"