diff options
| author | Danilo M. <danix@danix.xyz> | 2026-08-03 20:56:59 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-08-04 12:54:19 +0200 |
| commit | a6f73f77890d801ecd7209e97ba948c06fdd35c2 (patch) | |
| tree | bc3254e448f02c08d218b91246ee0233dab68334 /tests/test_querycompleter.cpp | |
| parent | 45e5887f5b33e5f30d3c16187bb5d6e707983804 (diff) | |
| download | qtmaildir-a6f73f77890d801ecd7209e97ba948c06fdd35c2.tar.gz qtmaildir-a6f73f77890d801ecd7209e97ba948c06fdd35c2.zip | |
feat(completion): select candidates per context
tag: and is: share the tag list, since notmuch aliases them. path: offers
each account maildir in both bare and recursive forms, the latter being
what Account::scopedQuery builds and not something a user would guess.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Diffstat (limited to 'tests/test_querycompleter.cpp')
| -rw-r--r-- | tests/test_querycompleter.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/tests/test_querycompleter.cpp b/tests/test_querycompleter.cpp index fb14adf..bd1e50f 100644 --- a/tests/test_querycompleter.cpp +++ b/tests/test_querycompleter.cpp @@ -17,7 +17,9 @@ */ #include <QtTest> +#include <QTemporaryDir> +#include "config.h" #include "querycompleter.h" class TestQueryCompleter : public QObject @@ -41,8 +43,25 @@ private slots: void rangeSuppressesRelativeEntries(); void prefixVocabularyCoversNotmuchKeywords(); void dateVocabularySeparatesRelativeEntries(); + void tagAndIsShareTheTagModel(); + void pathOffersAccountMaildirsBothForms(); + void folderOffersNothing(); + void mimetypeAppendsConfiguredEntries(); + void rangeContextDropsRelativeDates(); }; +// Copied from tests/test_config.cpp rather than shared, so the two test files +// stay independent. +static QString writeIni(const QTemporaryDir &dir, const QString &body) +{ + const QString path = dir.filePath(QStringLiteral("qtmaildir.conf")); + QFile f(path); + f.open(QIODevice::WriteOnly | QIODevice::Text); + f.write(body.toUtf8()); + f.close(); + return path; +} + void TestQueryCompleter::emptyTextCompletesPrefix() { const CompletionContext ctx = completionContext(QString(), 0); @@ -202,5 +221,82 @@ void TestQueryCompleter::dateVocabularySeparatesRelativeEntries() QVERIFY(sawRelative); } +void TestQueryCompleter::tagAndIsShareTheTagModel() +{ + Config config; + QueryCompleter completer(nullptr, config); + completer.setTags({ QStringLiteral("inbox"), QStringLiteral("shopping/amazon") }); + + const QStringList forTag = completer.candidatesFor( + completionContext(QStringLiteral("tag:"), 4)); + const QStringList forIs = completer.candidatesFor( + completionContext(QStringLiteral("is:"), 3)); + + QVERIFY(forTag.contains(QStringLiteral("shopping/amazon"))); + QCOMPARE(forTag, forIs); +} + +void TestQueryCompleter::pathOffersAccountMaildirsBothForms() +{ + QTemporaryDir dir; + Config config; + config.load(writeIni(dir, QStringLiteral( + "[account.work]\n" + "maildir = work\n" + "address = you@example.org\n"))); + + QueryCompleter completer(nullptr, config); + const QStringList candidates = completer.candidatesFor( + completionContext(QStringLiteral("path:"), 5)); + + QVERIFY(candidates.contains(QStringLiteral("work"))); + // The recursive form is what scopedQuery() itself builds and is not + // guessable, so it is offered directly. + QVERIFY(candidates.contains(QStringLiteral("work/**"))); +} + +void TestQueryCompleter::folderOffersNothing() +{ + // folder: matches a Maildir folder name, not a path, and its values are + // not enumerable from config. Prefix-only, like from: and to:. + Config config; + QueryCompleter completer(nullptr, config); + const QStringList candidates = completer.candidatesFor( + completionContext(QStringLiteral("folder:"), 7)); + QVERIFY(candidates.isEmpty()); +} + +void TestQueryCompleter::mimetypeAppendsConfiguredEntries() +{ + QTemporaryDir dir; + Config config; + config.load(writeIni(dir, QStringLiteral( + "[completion]\n" + "extra_mimetypes = application/epub+zip|EPUB book\n"))); + + QueryCompleter completer(nullptr, config); + const QStringList candidates = completer.candidatesFor( + completionContext(QStringLiteral("mimetype:"), 9)); + + QVERIFY(candidates.contains(QStringLiteral("application/epub+zip"))); + QVERIFY(candidates.contains(QStringLiteral("application/pdf"))); +} + +void TestQueryCompleter::rangeContextDropsRelativeDates() +{ + Config config; + QueryCompleter completer(nullptr, config); + + const QStringList bare = completer.candidatesFor( + completionContext(QStringLiteral("date:"), 5)); + QVERIFY(bare.contains(QStringLiteral("1week.."))); + + const QString ranged = QStringLiteral("date:today.."); + const QStringList inRange = completer.candidatesFor( + completionContext(ranged, ranged.size())); + QVERIFY(inRange.contains(QStringLiteral("yesterday"))); + QVERIFY(!inRange.contains(QStringLiteral("1week.."))); +} + QTEST_MAIN(TestQueryCompleter) #include "test_querycompleter.moc" |
