File indexing completed on 2024-05-12 05:17:11

0001 /*
0002  * SPDX-FileCopyrightText: 2013 Daniel Vrátil <dvratil@redhat.com>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  *
0006  */
0007 
0008 #include <QTest>
0009 
0010 #include "kimap/loginjob.h"
0011 #include "kimap/searchjob.h"
0012 #include "kimap/session.h"
0013 #include "kimaptest/fakeserver.h"
0014 
0015 #include <QTest>
0016 
0017 using SearchCriteriaValuePair = QPair<KIMAP::SearchJob::SearchCriteria, QByteArray>;
0018 
0019 Q_DECLARE_METATYPE(QList<SearchCriteriaValuePair>)
0020 Q_DECLARE_METATYPE(KIMAP::SearchJob::SearchLogic)
0021 Q_DECLARE_METATYPE(KIMAP::Term)
0022 
0023 #define searchPair(a, b) qMakePair<KIMAP::SearchJob::SearchCriteria, QByteArray>(a, b)
0024 
0025 class SearchJobTest : public QObject
0026 {
0027     Q_OBJECT
0028 
0029 private Q_SLOTS:
0030 
0031     void testSearch_data()
0032     {
0033         QTest::addColumn<QList<QByteArray>>("scenario");
0034         QTest::addColumn<bool>("uidbased");
0035         QTest::addColumn<int>("expectedResultsCount");
0036         QTest::addColumn<KIMAP::SearchJob::SearchLogic>("searchLogic");
0037         QTest::addColumn<QList<SearchCriteriaValuePair>>("searchCriteria");
0038 
0039         QList<QByteArray> scenario;
0040         QList<SearchCriteriaValuePair> criteria;
0041         scenario << FakeServer::preauth() << "C: A000001 UID SEARCH HEADER Message-Id <12345678@mail.box>"
0042                  << "S: * SEARCH 10 12"
0043                  << "S: A000001 OK search done";
0044 
0045         criteria << searchPair(KIMAP::SearchJob::Header, "Message-Id <12345678@mail.box>");
0046         QTest::newRow("uidbased header search") << scenario << true << 2 << KIMAP::SearchJob::And << criteria;
0047 
0048         scenario.clear();
0049         criteria.clear();
0050         scenario << FakeServer::preauth() << "C: A000001 SEARCH OR (NEW) (HEADER Message-Id <12345678@mail.box>)"
0051                  << "S: * SEARCH"
0052                  << "S: A000001 OK search done";
0053 
0054         criteria << searchPair(KIMAP::SearchJob::New, QByteArray()) << searchPair(KIMAP::SearchJob::Header, "Message-Id <12345678@mail.box>");
0055         QTest::newRow("OR search with no results") << scenario << false << 0 << KIMAP::SearchJob::Or << criteria;
0056 
0057         scenario.clear();
0058         criteria.clear();
0059         scenario << FakeServer::preauth() << "C: A000001 SEARCH TO {25}\r\n<testuser@kde.testserver>"
0060                  << "S: * SEARCH 1"
0061                  << "S: A000001 OK search done";
0062         criteria << searchPair(KIMAP::SearchJob::To, "<testuser@kde.testserver>");
0063         QTest::newRow("literal data search") << scenario << false << 1 << KIMAP::SearchJob::And << criteria;
0064 
0065         scenario.clear();
0066         criteria.clear();
0067         scenario << FakeServer::preauth() << "C: A000001 UID SEARCH NOT (NEW)"
0068                  << "S: * SEARCH 1 2 3 4 5 6"
0069                  << "S: A000001 OK search done";
0070         criteria << searchPair(KIMAP::SearchJob::New, QByteArray());
0071         QTest::newRow("uidbased NOT NEW search") << scenario << true << 6 << KIMAP::SearchJob::Not << criteria;
0072     }
0073 
0074     void testSearch()
0075     {
0076         QFETCH(QList<QByteArray>, scenario);
0077         QFETCH(bool, uidbased);
0078         QFETCH(int, expectedResultsCount);
0079         QFETCH(KIMAP::SearchJob::SearchLogic, searchLogic);
0080         QFETCH(QList<SearchCriteriaValuePair>, searchCriteria);
0081 
0082         FakeServer fakeServer;
0083         fakeServer.setScenario(scenario);
0084         fakeServer.startAndWait();
0085 
0086         KIMAP::Session session(QStringLiteral("127.0.0.1"), 5989);
0087 
0088         auto job = new KIMAP::SearchJob(&session);
0089         job->setUidBased(uidbased);
0090         job->setSearchLogic(searchLogic);
0091         for (const SearchCriteriaValuePair &pair : std::as_const(searchCriteria)) {
0092             if (pair.second.isEmpty()) {
0093                 job->addSearchCriteria(pair.first);
0094             } else {
0095                 job->addSearchCriteria(pair.first, pair.second);
0096             }
0097         }
0098 
0099         bool result = job->exec();
0100         QVERIFY(result);
0101         if (result) {
0102             QList<qint64> foundItems = job->results();
0103             QCOMPARE(foundItems.size(), expectedResultsCount);
0104         }
0105 
0106         fakeServer.quit();
0107     }
0108 
0109     void testSearchTerm_data()
0110     {
0111         QTest::addColumn<QList<QByteArray>>("scenario");
0112         QTest::addColumn<bool>("uidbased");
0113         QTest::addColumn<int>("expectedResultsCount");
0114         QTest::addColumn<KIMAP::Term>("searchTerm");
0115 
0116         {
0117             QList<QByteArray> scenario;
0118             scenario << FakeServer::preauth() << "C: A000001 UID SEARCH HEADER Message-Id \"<12345678@mail.box>\""
0119                      << "S: * SEARCH 10 12"
0120                      << "S: A000001 OK search done";
0121 
0122             QTest::newRow("uidbased header search") << scenario << true << 2
0123                                                     << KIMAP::Term(QStringLiteral("Message-Id"), QStringLiteral("<12345678@mail.box>"));
0124         }
0125         {
0126             QList<QByteArray> scenario;
0127             scenario << FakeServer::preauth() << "C: A000001 SEARCH OR NEW HEADER Message-Id \"<12345678@mail.box>\""
0128                      << "S: * SEARCH"
0129                      << "S: A000001 OK search done";
0130 
0131             QTest::newRow("OR search with no results")
0132                 << scenario << false << 0
0133                 << KIMAP::Term(KIMAP::Term::Or,
0134                                QList<KIMAP::Term>() << KIMAP::Term(KIMAP::Term::New)
0135                                                     << KIMAP::Term(QStringLiteral("Message-Id"), QStringLiteral("<12345678@mail.box>")));
0136         }
0137         {
0138             QList<QByteArray> scenario;
0139             scenario << FakeServer::preauth() << "C: A000001 SEARCH TO \"<testuser@kde.testserver>\""
0140                      << "S: * SEARCH 1"
0141                      << "S: A000001 OK search done";
0142             QTest::newRow("literal data search") << scenario << false << 1 << KIMAP::Term(KIMAP::Term::To, QStringLiteral("<testuser@kde.testserver>"));
0143         }
0144         {
0145             QList<QByteArray> scenario;
0146             scenario << FakeServer::preauth() << "C: A000001 UID SEARCH NOT NEW"
0147                      << "S: * SEARCH 1 2 3 4 5 6"
0148                      << "S: A000001 OK search done";
0149             QTest::newRow("uidbased NOT NEW search") << scenario << true << 6 << KIMAP::Term(KIMAP::Term::New).setNegated(true);
0150         }
0151 
0152         {
0153             QList<QByteArray> scenario;
0154             scenario
0155                 << FakeServer::preauth()
0156                 << R"(C: A000001 UID SEARCH OR HEADER Message-Id "<1234567@mail.box>" (OR HEADER Message-Id "<7654321@mail.box>" (OR HEADER Message-Id "<abcdefg@mail.box>" HEADER Message-Id "<gfedcba@mail.box>")))"
0157                 << "S: * SEARCH 1 2 3 4"
0158                 << "S: A000001 OK search done";
0159             KIMAP::Term term{KIMAP::Term::Or,
0160                              {KIMAP::Term{QStringLiteral("Message-Id"), QStringLiteral("<1234567@mail.box>")},
0161                               KIMAP::Term{QStringLiteral("Message-Id"), QStringLiteral("<7654321@mail.box>")},
0162                               KIMAP::Term{QStringLiteral("Message-Id"), QStringLiteral("<abcdefg@mail.box>")},
0163                               KIMAP::Term{QStringLiteral("Message-Id"), QStringLiteral("<gfedcba@mail.box>")}}};
0164             QTest::newRow("OR with multiple subterms") << scenario << true << 4 << term;
0165         }
0166     }
0167 
0168     void testSearchTerm()
0169     {
0170         QFETCH(QList<QByteArray>, scenario);
0171         QFETCH(bool, uidbased);
0172         QFETCH(int, expectedResultsCount);
0173         QFETCH(KIMAP::Term, searchTerm);
0174 
0175         FakeServer fakeServer;
0176         fakeServer.setScenario(scenario);
0177         fakeServer.startAndWait();
0178 
0179         KIMAP::Session session(QStringLiteral("127.0.0.1"), 5989);
0180 
0181         auto job = new KIMAP::SearchJob(&session);
0182         job->setUidBased(uidbased);
0183         job->setTerm(searchTerm);
0184 
0185         bool result = job->exec();
0186         QVERIFY(result);
0187         if (result) {
0188             QList<qint64> foundItems = job->results();
0189             QCOMPARE(foundItems.size(), expectedResultsCount);
0190         }
0191 
0192         fakeServer.quit();
0193     }
0194 };
0195 
0196 QTEST_GUILESS_MAIN(SearchJobTest)
0197 
0198 #include "searchjobtest.moc"