Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/keepassxreboot/keepassxc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJonathan White <support@dmapps.us>2020-01-11 06:28:31 +0300
committerJonathan White <support@dmapps.us>2020-01-16 18:53:41 +0300
commit0d3eb047c7e1e42482b1d37e23e4701b66bd1138 (patch)
tree6234cf391e068050bac921a87cf1930e4627aafd /tests
parent6cde2b83e8f35d4c402783c4727672176dad414a (diff)
Prevent crash when all entries are deleted from a group
* Fix #4093 - The first entry in the list is selected after deleting an entry * Prevents crashes due to dangling pointers held by the Entry Preview Widget when entries were deleted. * Improve GUI tests to ensure this new behavior occurs.
Diffstat (limited to 'tests')
-rw-r--r--tests/gui/TestGui.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp
index 48b5c7351..9118d3e21 100644
--- a/tests/gui/TestGui.cpp
+++ b/tests/gui/TestGui.cpp
@@ -54,6 +54,7 @@
#include "gui/CloneDialog.h"
#include "gui/DatabaseTabWidget.h"
#include "gui/DatabaseWidget.h"
+#include "gui/EntryPreviewWidget.h"
#include "gui/FileDialog.h"
#include "gui/MessageBox.h"
#include "gui/PasswordEdit.h"
@@ -967,6 +968,7 @@ void TestGui::testDeleteEntry()
QWidget* entryDeleteWidget = toolBar->widgetForAction(entryDeleteAction);
entryView->setFocus();
+ // Move one entry to the recycling bin
QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::ViewMode);
clickIndex(entryView->model()->index(1, 1), entryView, Qt::LeftButton);
QVERIFY(entryDeleteWidget->isVisible());
@@ -979,6 +981,7 @@ void TestGui::testDeleteEntry()
QCOMPARE(entryView->model()->rowCount(), 3);
QCOMPARE(m_db->metadata()->recycleBin()->entries().size(), 1);
+ // Select multiple entries and move them to the recycling bin
clickIndex(entryView->model()->index(1, 1), entryView, Qt::LeftButton);
clickIndex(entryView->model()->index(2, 1), entryView, Qt::LeftButton, Qt::ControlModifier);
QCOMPARE(entryView->selectionModel()->selectedRows().size(), 2);
@@ -993,6 +996,7 @@ void TestGui::testDeleteEntry()
QCOMPARE(entryView->model()->rowCount(), 1);
QCOMPARE(m_db->metadata()->recycleBin()->entries().size(), 3);
+ // Go to the recycling bin
QCOMPARE(groupView->currentGroup(), m_db->rootGroup());
QModelIndex rootGroupIndex = groupView->model()->index(0, 0);
clickIndex(groupView->model()->index(groupView->model()->rowCount(rootGroupIndex) - 1, 0, rootGroupIndex),
@@ -1000,6 +1004,7 @@ void TestGui::testDeleteEntry()
Qt::LeftButton);
QCOMPARE(groupView->currentGroup()->name(), m_db->metadata()->recycleBin()->name());
+ // Delete one entry from the bin
clickIndex(entryView->model()->index(0, 1), entryView, Qt::LeftButton);
MessageBox::setNextAnswer(MessageBox::Cancel);
QTest::mouseClick(entryDeleteWidget, Qt::LeftButton);
@@ -1011,6 +1016,7 @@ void TestGui::testDeleteEntry()
QCOMPARE(entryView->model()->rowCount(), 2);
QCOMPARE(m_db->metadata()->recycleBin()->entries().size(), 2);
+ // Select the remaining entries and delete them
clickIndex(entryView->model()->index(0, 1), entryView, Qt::LeftButton);
clickIndex(entryView->model()->index(1, 1), entryView, Qt::LeftButton, Qt::ControlModifier);
MessageBox::setNextAnswer(MessageBox::Delete);
@@ -1018,6 +1024,16 @@ void TestGui::testDeleteEntry()
QCOMPARE(entryView->model()->rowCount(), 0);
QCOMPARE(m_db->metadata()->recycleBin()->entries().size(), 0);
+ // Ensure the entry preview widget shows the recycling group since all entries are deleted
+ auto* previewWidget = m_dbWidget->findChild<EntryPreviewWidget*>("previewWidget");
+ QVERIFY(previewWidget);
+ auto* groupTitleLabel = previewWidget->findChild<QLabel*>("groupTitleLabel");
+ QVERIFY(groupTitleLabel);
+
+ QTRY_VERIFY(groupTitleLabel->isVisible());
+ QVERIFY(groupTitleLabel->text().contains(m_db->metadata()->recycleBin()->name()));
+
+ // Go back to the root group
clickIndex(groupView->model()->index(0, 0), groupView, Qt::LeftButton);
QCOMPARE(groupView->currentGroup(), m_db->rootGroup());
}