diff options
author | Jonathan White <support@dmapps.us> | 2020-01-11 06:28:31 +0300 |
---|---|---|
committer | Jonathan White <support@dmapps.us> | 2020-01-16 18:53:41 +0300 |
commit | 0d3eb047c7e1e42482b1d37e23e4701b66bd1138 (patch) | |
tree | 6234cf391e068050bac921a87cf1930e4627aafd /tests | |
parent | 6cde2b83e8f35d4c402783c4727672176dad414a (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.cpp | 16 |
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()); } |