aboutsummaryrefslogtreecommitdiffstats
path: root/tests/test_mainwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_mainwindow.cpp')
-rw-r--r--tests/test_mainwindow.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/tests/test_mainwindow.cpp b/tests/test_mainwindow.cpp
index 4887647..918fe00 100644
--- a/tests/test_mainwindow.cpp
+++ b/tests/test_mainwindow.cpp
@@ -299,6 +299,7 @@ private slots:
void aWorkerBackedWindowReturnsRealThreads();
void aWriteSaysItIsApplyingUntilTheWorkerHasRunIt();
void applyingARuleConfirmsWithTheCountAndUndoesExactly();
+ void aSilentWriteDoesNotStealTheNextConfirmation();
void aPurgeTakesTheRowsOutOfTheViewWithoutARefresh();
void theDashboardFollowsAWriteToTheConversationItShows();
void anEditHeldByASyncSaysSoInsteadOfClaimingItLanded();
@@ -10020,6 +10021,35 @@ void TestMainWindow::applyingARuleConfirmsWithTheCountAndUndoesExactly()
QStringLiteral("1"));
}
+void TestMainWindow::aSilentWriteDoesNotStealTheNextConfirmation()
+{
+ // Items 176 and 212. A rule is written one tag at a time, each operation
+ // its own armed command. If the first moves nothing (another writer got
+ // there between the count and the write), the worker stays silent for it,
+ // and the second operation's confirmation must not be credited to the
+ // first: its undo would then invert `+x` on messages that only lost `y`.
+ const Config config;
+ MainWindow window(config);
+
+ const QList<const TagCommand *> commands = window.armTagCommandsForTesting(
+ { { { QStringLiteral("x") }, {} },
+ { {}, { QStringLiteral("y") } } });
+ QCOMPARE(commands.size(), 2);
+
+ // Only the SECOND operation's confirmation arrives.
+ TagChange change;
+ change.messageIds = { QStringLiteral("moved@example.org") };
+ change.removed = { QStringLiteral("y") };
+ change.description = QStringLiteral("Apply rule");
+ QVERIFY(QMetaObject::invokeMethod(&window, "onTagsApplied",
+ Q_ARG(TagChange, change)));
+
+ QVERIFY2(commands.at(0)->changedMessageIds().isEmpty(),
+ qPrintable(commands.at(0)->changedMessageIds().join(u',')));
+ QCOMPARE(commands.at(1)->changedMessageIds(),
+ QStringList{ QStringLiteral("moved@example.org") });
+}
+
/// Item 181, from the user: "the thread dashboard doesn't update live with the
/// modifications applied to the list pane. If I mark the thread as read, the
/// dash still reports N unread".