From a8e430df94f79e4c79e8f0394fd00573dbbdc3cc Mon Sep 17 00:00:00 2001 From: jNullj <15849761+jNullj@users.noreply.github.com> Date: Thu, 6 Jul 2023 22:36:57 +0300 Subject: [PATCH] fix: edge case - disable autosave delay after triggering a save User might trigger the autosave delay timer and disable autosave delay or autosave. This commmit fixes potential issues from the timer triggering after the feature is disabled. The timer now checks if the feature is still enabled when triggered. Adds tests for those edge cases as well --- src/gui/DatabaseWidget.cpp | 8 +++++++- tests/gui/TestGui.cpp | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index dcc04e8d17..440df2afc3 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -1535,7 +1535,7 @@ void DatabaseWidget::onDatabaseModified() refreshSearch(); int autosaveDelayMs = m_db->metadata()->autosaveDelayMin() * 60 * 1000; // min to msec for QTimer bool autosaveAfterEveryChangeConfig = config()->get(Config::AutoSaveAfterEveryChange).toBool(); - if (m_autosaveTimer->isActive() || (autosaveDelayMs > 0 && autosaveAfterEveryChangeConfig)) { + if (autosaveDelayMs > 0 && autosaveAfterEveryChangeConfig) { // reset delay when modified m_autosaveTimer->start(autosaveDelayMs); return; @@ -1550,6 +1550,12 @@ void DatabaseWidget::onDatabaseModified() void DatabaseWidget::onAutosaveDelayTimeout() { + const bool isAutosaveDelayEnabled = m_db->metadata()->autosaveDelayMin() > 0; + const bool autosaveAfterEveryChangeConfig = config()->get(Config::AutoSaveAfterEveryChange).toBool(); + if (!(isAutosaveDelayEnabled && autosaveAfterEveryChangeConfig)) { + // User might disable the delay/autosave while the timer is running + return; + } if (!m_blockAutoSave) { save(); } else { diff --git a/tests/gui/TestGui.cpp b/tests/gui/TestGui.cpp index 37ac9497c7..35caeb98de 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -1556,7 +1556,43 @@ void TestGui::testDatabaseSettings() m_dbWidget->triggerAutosaveTimer(); QTRY_COMPARE(writeDbSignalSpy.count(), 1); - // 4 cleanup + // 4 Test no delay when disabled autosave or autosaveDelay + // 4.a) create new entry + QTest::mouseClick(entryNewWidget, Qt::LeftButton); + QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::EditMode); + QTest::keyClicks(titleEdit, "Test autosaveDelay 3"); + + // 4.b) Save changes + editEntryWidget->setCurrentPage(0); + editEntryWidgetButtonBox = editEntryWidget->findChild("buttonBox"); + QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton); + + // 4.c) Start timer + Tools::wait(150); // due to modify timer + + // 4.d) Disable autosave + config()->set(Config::AutoSaveAfterEveryChange, false); + + // 4.e) Make sure changes are not saved + m_dbWidget->triggerAutosaveTimer(); + QTRY_COMPARE(writeDbSignalSpy.count(), 1); + + // 4.f) Repeat for autosaveDelay + config()->set(Config::AutoSaveAfterEveryChange, true); + QTest::mouseClick(entryNewWidget, Qt::LeftButton); + QCOMPARE(m_dbWidget->currentMode(), DatabaseWidget::Mode::EditMode); + QTest::keyClicks(titleEdit, "Test autosaveDelay 4"); + editEntryWidget->setCurrentPage(0); + editEntryWidgetButtonBox = editEntryWidget->findChild("buttonBox"); + QTest::mouseClick(editEntryWidgetButtonBox->button(QDialogButtonBox::Ok), Qt::LeftButton); + Tools::wait(150); // due to modify timer + m_db->metadat()->setAutosaveDelayMin(0); + + // 4.g) Make sure changes are not saved + m_dbWidget->triggerAutosaveTimer(); + QTRY_COMPARE(writeDbSignalSpy.count(), 1); + + // 5 Cleanup config()->set(Config::AutoSaveAfterEveryChange, false); }