From 3629a11b4a50aecc1d9ac6c91a2d493ba2655fc7 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 4915ea6fc4..a1dc7c967f 100644 --- a/tests/gui/TestGui.cpp +++ b/tests/gui/TestGui.cpp @@ -1577,7 +1577,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->metadata()->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); }