From 7ef382f7c1ea2dda38f81d007be29ae49612b95f Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Sat, 31 Oct 2026 11:44:55 +0100 Subject: feat: apply a tag change to every message a query would move Co-Authored-By: Claude Sonnet 5.5 --- tests/test_notmuchworker.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'tests') diff --git a/tests/test_notmuchworker.cpp b/tests/test_notmuchworker.cpp index 10f8dbc..9b64f8e 100644 --- a/tests/test_notmuchworker.cpp +++ b/tests/test_notmuchworker.cpp @@ -59,6 +59,7 @@ private slots: void aThreadCarriesItsCardMessagesOwnTags(); void applyTagsToThreadsTagsEveryMessage(); + void applyTagsToQueryWritesOnlyWhatWouldChange(); void applyTagsToThreadsSpansMultipleThreads(); void applyTagsToThreadsWithNoThreadsDoesNothing(); @@ -1290,6 +1291,39 @@ void TestNotmuchWorker::applyTagsToThreadsTagsEveryMessage() restore.applyTags(emitted.inverted()); } +void TestNotmuchWorker::applyTagsToQueryWritesOnlyWhatWouldChange() +{ + // Item 212. Two messages in OPPOSITE states (item 87's lesson): a1 + // already carries the tag, a2 does not. Only a2 may be reported, or the + // undo would strip the tag from a message that had it before. + const QString threadId = threadIdOf(QStringLiteral("Release notes")); + QVERIFY(!threadId.isEmpty()); + + NotmuchWorker setup(m_fixture.configPath()); + setup.applyTags(TagChange{ { QStringLiteral("a1@example.org") }, + { QStringLiteral("backfill") }, {}, + QStringLiteral("seed") }); + + NotmuchWorker worker(m_fixture.configPath()); + QSignalSpy applied(&worker, &NotmuchWorker::tagsApplied); + worker.applyTagsToQuery(QStringLiteral("thread:%1").arg(threadId), + { QStringLiteral("backfill") }, {}, + QStringLiteral("Apply rule")); + + QCOMPARE(applied.size(), 1); + const TagChange emitted = applied.first().at(0).value(); + QCOMPARE(emitted.messageIds, QStringList{ QStringLiteral("a2@example.org") }); + QCOMPARE(emitted.description, QStringLiteral("Apply rule")); + QVERIFY(tagsOf(QStringLiteral("a2@example.org")) + .contains(QStringLiteral("backfill"))); + + NotmuchWorker restore(m_fixture.configPath()); + restore.applyTags(TagChange{ { QStringLiteral("a1@example.org"), + QStringLiteral("a2@example.org") }, + {}, { QStringLiteral("backfill") }, + QStringLiteral("restore") }); +} + void TestNotmuchWorker::applyTagsToThreadsSpansMultipleThreads() { const QString threadA = threadIdOf(QStringLiteral("Release notes")); -- cgit v1.2.3