From 244ed42231db9f3a9a7e8a36c363f2da0d0f57d8 Mon Sep 17 00:00:00 2001 From: Jonathan White Date: Sun, 23 Feb 2025 17:05:54 -0500 Subject: [PATCH] Improve remote sync tests --- tests/gui/TestGui.cpp | 61 ++++++++++++++++---------------- tests/gui/TestGui.h | 2 +- tests/mock/MockRemoteProcess.cpp | 6 ++-- tests/mock/MockRemoteProcess.h | 2 +- 4 files changed, 36 insertions(+), 35 deletions(-) diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index 7a5576fc3..a8f7cf650 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -375,26 +375,27 @@ void TestGui::testMergeDatabase() QCOMPARE(m_db->rootGroup()->findChildByName("General")->entries().size(), 1); } -void TestGui::prepareAndTriggerRemoteSync(const QString& sourceToSync) +void TestGui::prepareAndTriggerRemoteSync() { - auto* menuRemoteSync = m_mainWindow->findChild("menuRemoteSync"); - QSignalSpy remoteAboutToShow(menuRemoteSync, &QMenu::aboutToShow); - QApplication::processEvents(); - // create remote settings in settings dialog triggerAction("actionDatabaseSettings"); - auto* dbSettingsDialog = m_dbWidget->findChild("databaseSettingsDialog"); - auto* dbSettingsCategoryList = dbSettingsDialog->findChild("categoryList"); - auto* dbSettingsStackedWidget = dbSettingsDialog->findChild("stackedWidget"); - dbSettingsCategoryList->setCurrentCategory(2); // go into remote category + + auto dbSettingsDialog = m_dbWidget->findChild("databaseSettingsDialog"); + QVERIFY(dbSettingsDialog); + dbSettingsDialog->showRemoteSettings(); + auto name = "testCommand"; - auto* nameEdit = dbSettingsStackedWidget->findChild("nameLineEdit"); - auto* downloadCommandEdit = dbSettingsStackedWidget->findChild("downloadCommand"); - QVERIFY(downloadCommandEdit != nullptr); - downloadCommandEdit->setText(sourceToSync); + auto nameEdit = dbSettingsDialog->findChild("nameLineEdit"); + QVERIFY(nameEdit); + QVERIFY(nameEdit->isVisible()); nameEdit->setText(name); - auto* saveSettingsButton = dbSettingsStackedWidget->findChild("saveSettingsButton"); - QVERIFY(saveSettingsButton != nullptr); + + auto downloadCommandEdit = dbSettingsDialog->findChild("downloadCommand"); + QVERIFY(downloadCommandEdit); + downloadCommandEdit->setText("sftp user@server:Database.kdbx"); + + auto saveSettingsButton = dbSettingsDialog->findChild("saveSettingsButton"); + QVERIFY(saveSettingsButton); QTest::mouseClick(saveSettingsButton, Qt::LeftButton); auto okButton = dbSettingsDialog->findChild("buttonBox")->button(QDialogButtonBox::Ok); @@ -403,32 +404,33 @@ void TestGui::prepareAndTriggerRemoteSync(const QString& sourceToSync) QTRY_COMPARE(m_dbWidget->getRemoteParams().size(), 1); - // trigger aboutToShow to create remote actions - menuRemoteSync->popup(QPoint(0, 0)); + // Show menu to trigger populating with remote sync action + auto menuRemoteSync = m_mainWindow->findChild("menuRemoteSync"); + QVERIFY(menuRemoteSync); + menuRemoteSync->popup({0, 0}); QApplication::processEvents(); - QTRY_COMPARE(remoteAboutToShow.count(), 1); - // close the opened menu - QTest::keyClick(menuRemoteSync, Qt::Key::Key_Escape); + menuRemoteSync->close(); - // trigger remote sync action - for (auto* remoteAction : menuRemoteSync->actions()) { + // Trigger the remote sync action + for (const auto remoteAction : menuRemoteSync->actions()) { if (remoteAction->text() == name) { remoteAction->trigger(); - break; + return; } } - QApplication::processEvents(); + + // If we get here then something didn't work properly + QFAIL("Remote sync action not present in menu."); } void TestGui::testRemoteSyncDatabaseSameKey() { - QString sourceToSync = "sftp user@server:Database.kdbx"; - RemoteHandler::setRemoteProcessFunc([sourceToSync](QObject* parent) { + RemoteHandler::setRemoteProcessFunc([](QObject* parent) { return QScopedPointer( new MockRemoteProcess(parent, QString(KEEPASSX_TEST_DATA_DIR).append("/SyncDatabase.kdbx"))); }); QSignalSpy dbSyncSpy(m_dbWidget.data(), &DatabaseWidget::databaseSyncCompleted); - prepareAndTriggerRemoteSync(sourceToSync); + prepareAndTriggerRemoteSync(); QTRY_COMPARE(dbSyncSpy.count(), 1); m_db = m_tabWidget->currentDatabaseWidget()->database(); @@ -443,13 +445,12 @@ void TestGui::testRemoteSyncDatabaseSameKey() void TestGui::testRemoteSyncDatabaseRequiresPassword() { - QString sourceToSync = "sftp user@server:Database.kdbx"; - RemoteHandler::setRemoteProcessFunc([sourceToSync](QObject* parent) { + RemoteHandler::setRemoteProcessFunc([](QObject* parent) { return QScopedPointer(new MockRemoteProcess( parent, QString(KEEPASSX_TEST_DATA_DIR).append("/SyncDatabaseDifferentPassword.kdbx"))); }); QSignalSpy dbSyncSpy(m_dbWidget.data(), &DatabaseWidget::databaseSyncCompleted); - prepareAndTriggerRemoteSync(sourceToSync); + prepareAndTriggerRemoteSync(); // need to process more events as opening with the same key did not work and more events have been fired QApplication::processEvents(QEventLoop::WaitForMoreEvents); diff --git a/tests/gui/TestGui.h b/tests/gui/TestGui.h index 53bc875ee..514f7ce95 100644 --- a/tests/gui/TestGui.h +++ b/tests/gui/TestGui.h @@ -89,7 +89,7 @@ private: Qt::KeyboardModifiers stateKey = {}); void checkSaveDatabase(); void checkStatusBarText(const QString& textFragment); - void prepareAndTriggerRemoteSync(const QString& sourceToSync); + void prepareAndTriggerRemoteSync(); QScopedPointer m_mainWindow; QPointer m_statusBarLabel; diff --git a/tests/mock/MockRemoteProcess.cpp b/tests/mock/MockRemoteProcess.cpp index 861c4a5e6..4d2ed5806 100644 --- a/tests/mock/MockRemoteProcess.cpp +++ b/tests/mock/MockRemoteProcess.cpp @@ -19,15 +19,15 @@ #include "MockRemoteProcess.h" -MockRemoteProcess::MockRemoteProcess(QObject* parent, const QString& dbPath) +MockRemoteProcess::MockRemoteProcess(QObject* parent, QString dbPath) : RemoteProcess(parent) - , m_dbPath(dbPath) + , m_dbPath(std::move(dbPath)) { } void MockRemoteProcess::start(const QString&) { - QFile ::copy(m_dbPath, m_tempFileLocation); + QFile::copy(m_dbPath, m_tempFileLocation); } qint64 MockRemoteProcess::write(const QString& data) diff --git a/tests/mock/MockRemoteProcess.h b/tests/mock/MockRemoteProcess.h index 2ed0e72d6..95cb6b66b 100644 --- a/tests/mock/MockRemoteProcess.h +++ b/tests/mock/MockRemoteProcess.h @@ -23,7 +23,7 @@ class MockRemoteProcess : public RemoteProcess { public: - explicit MockRemoteProcess(QObject* parent, const QString& dbPath); + explicit MockRemoteProcess(QObject* parent, QString dbPath); ~MockRemoteProcess() override = default; void start(const QString& program) override;