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"