File indexing completed on 2024-06-16 04:49:40
0001 /* 0002 * This file is part of the KDE Akonadi Search Project 0003 * SPDX-FileCopyrightText: 2014 Christian Mollekopf <mollekopf@kolabsys.com> 0004 * 0005 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0006 * 0007 */ 0008 0009 #include <Akonadi/Collection> 0010 #include <KContacts/Addressee> 0011 #include <KContacts/ContactGroup> 0012 #include <QDir> 0013 #include <QTest> 0014 0015 #include "../agent/akonotesindexer.h" 0016 #include "../agent/calendarindexer.h" 0017 #include "../agent/contactindexer.h" 0018 #include "../agent/emailindexer.h" 0019 #include "../search/calendar/calendarsearchstore.h" 0020 #include "../search/contact/contactsearchstore.h" 0021 #include "../search/email/emailsearchstore.h" 0022 #include "../search/note/notesearchstore.h" 0023 #include "searchplugin.h" 0024 #include <Akonadi/MessageFlags> 0025 #include <Akonadi/SearchQuery> 0026 0027 #include <QElapsedTimer> 0028 0029 Q_DECLARE_METATYPE(QSet<qint64>) 0030 Q_DECLARE_METATYPE(QList<qint64>) 0031 0032 class SearchPluginTest : public QObject 0033 { 0034 Q_OBJECT 0035 private: 0036 QString emailDir; 0037 QString emailContactsDir; 0038 QString contactsDir; 0039 QString noteDir; 0040 QString calendarDir; 0041 0042 void resultSearch() 0043 { 0044 QFETCH(QString, query); 0045 QFETCH(QList<qint64>, collections); 0046 QFETCH(QStringList, mimeTypes); 0047 QFETCH(QSet<qint64>, expectedResult); 0048 0049 qDebug() << "starting search"; 0050 QElapsedTimer t; 0051 t.start(); 0052 SearchPlugin plugin; 0053 const QSet<qint64> result = plugin.search(query, collections, mimeTypes); 0054 qDebug() << "result:" << result << "(in" << t.elapsed() << "ms)"; 0055 QEXPECT_FAIL("contact by name (oe)", "Does not work for the moment", Continue); 0056 QEXPECT_FAIL("search extras in subject", "Does not work for the moment", Continue); 0057 QCOMPARE(result, expectedResult); 0058 } 0059 0060 private Q_SLOTS: 0061 void initTestCase() 0062 { 0063 emailDir = QDir::tempPath() + QLatin1StringView("/searchplugintest/email/"); 0064 emailContactsDir = QDir::tempPath() + QLatin1StringView("/searchplugintest/emailcontacts/"); 0065 contactsDir = QDir::tempPath() + QLatin1StringView("/searchplugintest/contacts/"); 0066 noteDir = QDir::tempPath() + QLatin1StringView("/searchplugintest/notes/"); 0067 calendarDir = QDir::tempPath() + QLatin1StringView("/searchplugintest/calendar/"); 0068 0069 QDir dir; 0070 QVERIFY(QDir(QDir::tempPath() + QStringLiteral("/searchplugintest")).removeRecursively()); 0071 QVERIFY(dir.mkpath(emailDir)); 0072 QVERIFY(dir.mkpath(emailContactsDir)); 0073 QVERIFY(dir.mkpath(contactsDir)); 0074 QVERIFY(dir.mkpath(noteDir)); 0075 QVERIFY(dir.mkpath(calendarDir)); 0076 0077 qDebug() << "indexing sample data"; 0078 qDebug() << emailDir; 0079 qDebug() << emailContactsDir; 0080 qDebug() << noteDir; 0081 qDebug() << calendarDir; 0082 0083 EmailIndexer emailIndexer(emailDir, emailContactsDir); 0084 ContactIndexer contactIndexer(contactsDir); 0085 AkonotesIndexer noteIndexer(noteDir); 0086 CalendarIndexer calendarIndexer(calendarDir); 0087 0088 { 0089 KMime::Message::Ptr msg(new KMime::Message); 0090 msg->subject()->from7BitString("subject1"); 0091 msg->contentType()->setMimeType("text/plain"); 0092 msg->contentType()->setCharset("utf-8"); 0093 msg->setBody("body1 mälmöö"); 0094 msg->from()->addAddress("john@test.com", QStringLiteral("John Doe")); 0095 msg->to()->addAddress("jane@test.com", QStringLiteral("Jane Doe")); 0096 msg->date()->setDateTime(QDateTime(QDate(2013, 11, 10), QTime(12, 0, 0))); 0097 msg->assemble(); 0098 0099 Akonadi::Item item(QStringLiteral("message/rfc822")); 0100 item.setId(1); 0101 item.setSize(1000); 0102 item.setPayload(msg); 0103 item.setParentCollection(Akonadi::Collection(1)); 0104 item.setFlags(Akonadi::Item::Flags() << Akonadi::MessageFlags::Replied << Akonadi::MessageFlags::Encrypted); 0105 emailIndexer.index(item); 0106 } 0107 { 0108 KMime::Message::Ptr msg(new KMime::Message); 0109 msg->contentType()->setMimeType("multipart/mixed"); 0110 msg->subject()->from7BitString("subject2"); 0111 0112 // Multipart message 0113 auto b = new KMime::Content; 0114 b->contentType()->setMimeType("text/plain"); 0115 b->setBody("body2"); 0116 msg->prependContent(b); 0117 0118 msg->from()->addAddress("john@test.com", QStringLiteral("John Doe")); 0119 msg->to()->addAddress("jane@test.com", QStringLiteral("Jane Doe")); 0120 msg->date()->setDateTime(QDateTime(QDate(2013, 11, 10), QTime(13, 0, 0))); 0121 msg->organization()->from7BitString("kde"); 0122 msg->assemble(); 0123 0124 Akonadi::Item item(QStringLiteral("message/rfc822")); 0125 item.setId(2); 0126 item.setSize(1002); 0127 item.setPayload(msg); 0128 item.setParentCollection(Akonadi::Collection(2)); 0129 item.setFlags(Akonadi::Item::Flags() << Akonadi::MessageFlags::Flagged << Akonadi::MessageFlags::Replied); 0130 emailIndexer.index(item); 0131 } 0132 { 0133 KMime::Message::Ptr msg(new KMime::Message); 0134 msg->contentType()->setMimeType("multipart/mixed"); 0135 msg->subject()->from7BitString("subject3"); 0136 0137 // Multipart message 0138 auto b = new KMime::Content; 0139 b->contentType()->setMimeType("text/plain"); 0140 b->setBody("body3"); 0141 msg->prependContent(b); 0142 0143 msg->from()->addAddress("john@test.com", QStringLiteral("John Doe")); 0144 msg->to()->addAddress("jane@test.com", QStringLiteral("Jane Doe")); 0145 msg->date()->setDateTime(QDateTime(QDate(2014, 11, 10), QTime(13, 0, 0))); 0146 msg->organization()->from7BitString("kde5"); 0147 msg->assemble(); 0148 0149 Akonadi::Item item(QStringLiteral("message/rfc822")); 0150 item.setId(3); 0151 item.setSize(1002); 0152 item.setPayload(msg); 0153 item.setParentCollection(Akonadi::Collection(2)); 0154 item.setFlags(Akonadi::Item::Flags() << Akonadi::MessageFlags::Flagged << Akonadi::MessageFlags::Replied); 0155 emailIndexer.index(item); 0156 } 0157 { 0158 KMime::Message::Ptr msg(new KMime::Message); 0159 msg->contentType()->setMimeType("multipart/mixed"); 0160 msg->subject()->from7BitString("subject4"); 0161 0162 // Multipart message 0163 auto b = new KMime::Content; 0164 b->contentType()->setMimeType("text/plain"); 0165 b->setBody("body4"); 0166 msg->prependContent(b); 0167 0168 msg->from()->addAddress("john_blue@test.com", QStringLiteral("John Doe")); 0169 msg->to()->addAddress("jane@test.com", QStringLiteral("Jane Doe")); 0170 msg->cc()->addAddress("cc@test.com", QStringLiteral("Jane Doe")); 0171 msg->bcc()->addAddress("bcc@test.com", QStringLiteral("Jane Doe")); 0172 msg->date()->setDateTime(QDateTime(QDate(2014, 11, 11), QTime(13, 0, 0))); 0173 msg->replyTo()->from7BitString("test@kde.org"); 0174 auto header = new KMime::Headers::Generic("Resent-From"); 0175 header->fromUnicodeString(QStringLiteral("resent@kde.org"), "utf-8"); 0176 msg->setHeader(header); 0177 header = new KMime::Headers::Generic("List-Id"); 0178 header->fromUnicodeString(QStringLiteral("KDE PIM <kde-pim.kde.org>"), "utf-8"); 0179 msg->setHeader(header); 0180 0181 msg->assemble(); 0182 0183 Akonadi::Item item(QStringLiteral("message/rfc822")); 0184 item.setId(4); 0185 item.setSize(1002); 0186 item.setPayload(msg); 0187 item.setParentCollection(Akonadi::Collection(2)); 0188 item.setFlags(Akonadi::Item::Flags() << Akonadi::MessageFlags::Flagged << Akonadi::MessageFlags::Replied); 0189 emailIndexer.index(item); 0190 } 0191 { 0192 KMime::Message::Ptr msg(new KMime::Message); 0193 msg->contentType()->setMimeType("multipart/mixed"); 0194 msg->subject()->from7BitString("all tags"); 0195 0196 // Multipart message 0197 auto b = new KMime::Content; 0198 b->contentType()->setMimeType("text/plain"); 0199 b->setBody("tags"); 0200 msg->prependContent(b); 0201 0202 msg->from()->addAddress("john@test.com", QStringLiteral("John Doe")); 0203 msg->to()->addAddress("jane@test.com", QStringLiteral("Jane Doe")); 0204 msg->date()->setDateTime(QDateTime(QDate(2014, 11, 11), QTime(13, 0, 0))); 0205 msg->assemble(); 0206 0207 Akonadi::Item item(QStringLiteral("message/rfc822")); 0208 item.setId(5); 0209 item.setSize(1002); 0210 item.setPayload(msg); 0211 item.setParentCollection(Akonadi::Collection(2)); 0212 item.setFlags(Akonadi::Item::Flags() << Akonadi::MessageFlags::Seen << Akonadi::MessageFlags::Deleted << Akonadi::MessageFlags::Answered 0213 << Akonadi::MessageFlags::Flagged << Akonadi::MessageFlags::HasAttachment 0214 << Akonadi::MessageFlags::HasInvitation 0215 << Akonadi::MessageFlags::Sent 0216 //<< Akonadi::MessageFlags::Queued //can't have Sent and Queued at the same time 0217 << Akonadi::MessageFlags::Replied << Akonadi::MessageFlags::Forwarded << Akonadi::MessageFlags::ToAct 0218 << Akonadi::MessageFlags::Watched 0219 //<< Akonadi::MessageFlags::Ignored // can't have Watched and Ignored at the same time 0220 << Akonadi::MessageFlags::Encrypted 0221 /*<< Akonadi::MessageFlags::Spam*/ 0222 << Akonadi::MessageFlags::Ham); 0223 // Spam is exclude from indexer. So we can't add it. 0224 emailIndexer.index(item); 0225 } 0226 { 0227 KMime::Message::Ptr msg(new KMime::Message); 0228 msg->subject()->from7BitString("Change in qt/qtx11extras[stable]: remove QtWidgets dependency"); 0229 msg->contentType()->setMimeType("multipart/mixed"); 0230 0231 // Multipart message 0232 auto b = new KMime::Content; 0233 b->contentType()->setMimeType("text/plain"); 0234 b->setBody("body5"); 0235 msg->prependContent(b); 0236 0237 msg->from()->addAddress("john@test.com", QStringLiteral("John Doe")); 0238 msg->to()->addAddress("jane@test.com", QStringLiteral("Jane Doe")); 0239 msg->date()->setDateTime(QDateTime(QDate(2014, 11, 11), QTime(13, 0, 0))); 0240 msg->assemble(); 0241 0242 Akonadi::Item item(QStringLiteral("message/rfc822")); 0243 item.setId(6); 0244 item.setSize(50); 0245 item.setPayload(msg); 0246 item.setParentCollection(Akonadi::Collection(2)); 0247 item.setFlags(Akonadi::Item::Flags() << Akonadi::MessageFlags::Flagged << Akonadi::MessageFlags::Replied); 0248 emailIndexer.index(item); 0249 } 0250 emailIndexer.commit(); 0251 0252 // Contact item 0253 { 0254 KContacts::Addressee addressee; 0255 addressee.setUid(QStringLiteral("uid1")); 0256 addressee.setName(QStringLiteral("John Doe")); 0257 addressee.setFormattedName(QStringLiteral("John Doe")); 0258 addressee.setNickName(QStringLiteral("JD")); 0259 addressee.setEmails({QStringLiteral("john@test.com")}); 0260 addressee.setBirthday(QDateTime(QDate(2000, 01, 01).startOfDay())); 0261 Akonadi::Item item(KContacts::Addressee::mimeType()); 0262 item.setId(100); 0263 item.setPayload(addressee); 0264 item.setParentCollection(Akonadi::Collection(3)); 0265 contactIndexer.index(item); 0266 } 0267 { 0268 KContacts::Addressee addressee; 0269 addressee.setUid(QStringLiteral("uid2")); 0270 addressee.setName(QStringLiteral("Jane Doe")); 0271 addressee.setEmails({QStringLiteral("jane@test.com"), QStringLiteral("jack_sparrow@test.com")}); 0272 addressee.setBirthday(QDateTime(QDate(2000, 01, 01).startOfDay())); 0273 Akonadi::Item item(KContacts::Addressee::mimeType()); 0274 item.setId(101); 0275 item.setPayload(addressee); 0276 item.setParentCollection(Akonadi::Collection(3)); 0277 contactIndexer.index(item); 0278 } 0279 { 0280 KContacts::Addressee addressee; 0281 addressee.setUid(QStringLiteral("uid2")); 0282 addressee.setName(QStringLiteral("Jane Doe")); 0283 addressee.setEmails({QStringLiteral("JANE@TEST.COM")}); 0284 addressee.setBirthday(QDateTime(QDate(2000, 01, 01).startOfDay())); 0285 Akonadi::Item item(KContacts::Addressee::mimeType()); 0286 item.setId(102); 0287 item.setPayload(addressee); 0288 item.setParentCollection(Akonadi::Collection(3)); 0289 contactIndexer.index(item); 0290 } 0291 { 0292 KContacts::Addressee addressee; 0293 addressee.setUid(QStringLiteral("abcd-efgh-1234-5678")); 0294 addressee.setName(QStringLiteral("Dan Vrátil")); 0295 addressee.setEmails({QStringLiteral("dan@test.com")}); 0296 addressee.setBirthday(QDateTime(QDate(2000, 01, 01).startOfDay())); 0297 Akonadi::Item item(KContacts::Addressee::mimeType()); 0298 item.setId(105); 0299 item.setPayload(addressee); 0300 item.setParentCollection(Akonadi::Collection(3)); 0301 contactIndexer.index(item); 0302 } 0303 0304 { 0305 KContacts::ContactGroup group; 0306 group.setName(QStringLiteral("group1")); 0307 Akonadi::Item item(KContacts::ContactGroup::mimeType()); 0308 item.setId(103); 0309 item.setPayload(group); 0310 item.setParentCollection(Akonadi::Collection(3)); 0311 contactIndexer.index(item); 0312 } 0313 { 0314 KContacts::ContactGroup group; 0315 group.setName(QStringLiteral("group3")); 0316 Akonadi::Item item(KContacts::ContactGroup::mimeType()); 0317 item.setId(104); 0318 item.setPayload(group); 0319 item.setParentCollection(Akonadi::Collection(4)); 0320 contactIndexer.index(item); 0321 } 0322 contactIndexer.commit(); 0323 0324 // Note item 0325 { 0326 KMime::Message::Ptr msg(new KMime::Message); 0327 msg->contentType()->setMimeType("multipart/mixed"); 0328 msg->subject()->from7BitString("note"); 0329 0330 // Multipart message 0331 auto b = new KMime::Content; 0332 b->contentType()->setMimeType("text/plain"); 0333 b->setBody("body note"); 0334 msg->prependContent(b); 0335 msg->assemble(); 0336 0337 Akonadi::Item item(QStringLiteral("text/x-vnd.akonadi.note")); 0338 item.setId(1000); 0339 item.setSize(1002); 0340 item.setPayload(msg); 0341 item.setParentCollection(Akonadi::Collection(5)); 0342 item.setFlags(Akonadi::Item::Flags() << Akonadi::MessageFlags::Flagged << Akonadi::MessageFlags::Replied); 0343 noteIndexer.index(item); 0344 } 0345 { 0346 KMime::Message::Ptr msg(new KMime::Message); 0347 msg->contentType()->setMimeType("multipart/mixed"); 0348 msg->subject()->from7BitString("note2"); 0349 0350 // Multipart message 0351 auto b = new KMime::Content; 0352 b->contentType()->setMimeType("text/plain"); 0353 b->setBody("note"); 0354 msg->prependContent(b); 0355 msg->assemble(); 0356 0357 Akonadi::Item item(QStringLiteral("text/x-vnd.akonadi.note")); 0358 item.setId(1001); 0359 item.setSize(1002); 0360 item.setPayload(msg); 0361 item.setParentCollection(Akonadi::Collection(5)); 0362 item.setFlags(Akonadi::Item::Flags() << Akonadi::MessageFlags::Flagged << Akonadi::MessageFlags::Replied); 0363 noteIndexer.index(item); 0364 } 0365 { 0366 KMime::Message::Ptr msg(new KMime::Message); 0367 msg->contentType()->setMimeType("multipart/mixed"); 0368 msg->subject()->from7BitString("note3"); 0369 0370 // Multipart message 0371 auto b = new KMime::Content; 0372 b->contentType()->setMimeType("text/plain"); 0373 b->setBody("note3"); 0374 msg->prependContent(b); 0375 msg->assemble(); 0376 0377 Akonadi::Item item(QStringLiteral("text/x-vnd.akonadi.note")); 0378 item.setId(1002); 0379 item.setSize(1002); 0380 item.setPayload(msg); 0381 item.setParentCollection(Akonadi::Collection(5)); 0382 item.setFlags(Akonadi::Item::Flags() << Akonadi::MessageFlags::Flagged << Akonadi::MessageFlags::Replied); 0383 noteIndexer.index(item); 0384 } 0385 0386 // Calendar item 0387 { 0388 KCalendarCore::Event::Ptr event(new KCalendarCore::Event); 0389 KCalendarCore::Attendee attendee(QStringLiteral("attendee1"), QStringLiteral("attendee1@example.com"), false, KCalendarCore::Attendee::NeedsAction); 0390 event->setOrganizer(QStringLiteral("organizer@example.com")); 0391 event->addAttendee(attendee); 0392 attendee = KCalendarCore::Attendee(QStringLiteral("attendee2"), QStringLiteral("attendee2@example.com"), false, KCalendarCore::Attendee::Accepted); 0393 event->addAttendee(attendee); 0394 attendee = KCalendarCore::Attendee(QStringLiteral("attendee3"), QStringLiteral("attendee3@example.com"), false, KCalendarCore::Attendee::Declined); 0395 event->addAttendee(attendee); 0396 attendee = KCalendarCore::Attendee(QStringLiteral("attendee4"), QStringLiteral("attendee4@example.com"), false, KCalendarCore::Attendee::Tentative); 0397 event->addAttendee(attendee); 0398 attendee = KCalendarCore::Attendee(QStringLiteral("attendee5"), QStringLiteral("attendee5@example.com"), false, KCalendarCore::Attendee::Delegated); 0399 event->addAttendee(attendee); 0400 0401 event->setSummary(QStringLiteral("title")); 0402 event->setLocation(QStringLiteral("here")); 0403 0404 Akonadi::Item item(KCalendarCore::Event::eventMimeType()); 0405 item.setId(2001); 0406 item.setPayload<KCalendarCore::Event::Ptr>(event); 0407 item.setParentCollection(Akonadi::Collection(6)); 0408 calendarIndexer.index(item); 0409 } 0410 calendarIndexer.commit(); 0411 0412 auto emailSearchStore = new Akonadi::Search::EmailSearchStore(); 0413 emailSearchStore->setDbPath(emailDir); 0414 auto contactSearchStore = new Akonadi::Search::ContactSearchStore(); 0415 contactSearchStore->setDbPath(contactsDir); 0416 auto noteSearchStore = new Akonadi::Search::NoteSearchStore(); 0417 noteSearchStore->setDbPath(noteDir); 0418 auto calendarSearchStore = new Akonadi::Search::CalendarSearchStore(); 0419 calendarSearchStore->setDbPath(calendarDir); 0420 0421 Akonadi::Search::SearchStore::overrideSearchStores(QList<Akonadi::Search::SearchStore *>() 0422 << emailSearchStore << contactSearchStore << noteSearchStore << calendarSearchStore); 0423 } 0424 0425 void cleanupTestCase() 0426 { 0427 QVERIFY(QDir(QDir::tempPath() + QStringLiteral("/searchplugintest")).removeRecursively()); 0428 } 0429 0430 void testCalendarSearch_data() 0431 { 0432 QTest::addColumn<QString>("query"); 0433 QTest::addColumn<QList<qint64>>("collections"); 0434 QTest::addColumn<QStringList>("mimeTypes"); 0435 QTest::addColumn<QSet<qint64>>("expectedResult"); 0436 const QStringList calendarMimeTypes({KCalendarCore::Event::eventMimeType()}); 0437 { 0438 Akonadi::SearchQuery query; 0439 query.addTerm( 0440 Akonadi::IncidenceSearchTerm(Akonadi::IncidenceSearchTerm::Organizer, QStringLiteral("organizer@example.com"), Akonadi::SearchTerm::CondEqual)); 0441 0442 QList<qint64> collections({6}); 0443 QSet<qint64> result({2001}); 0444 QTest::newRow("find organizer") << QString::fromLatin1(query.toJSON()) << collections << calendarMimeTypes << result; 0445 } 0446 { 0447 Akonadi::SearchQuery query; 0448 query.addTerm(Akonadi::IncidenceSearchTerm(Akonadi::IncidenceSearchTerm::Organizer, 0449 QStringLiteral("organizer2@example.com"), 0450 Akonadi::SearchTerm::CondEqual)); 0451 0452 QList<qint64> collections({6}); 0453 QSet<qint64> result; 0454 QTest::newRow("find no organizer") << QString::fromLatin1(query.toJSON()) << collections << calendarMimeTypes << result; 0455 } 0456 { 0457 Akonadi::SearchQuery query; 0458 query.addTerm(Akonadi::IncidenceSearchTerm(Akonadi::IncidenceSearchTerm::PartStatus, 0459 QStringLiteral("attendee1@example.com0"), 0460 Akonadi::SearchTerm::CondEqual)); 0461 QList<qint64> collections({6}); 0462 QSet<qint64> result({2001}); 0463 QTest::newRow("find events needsAction") << QString::fromLatin1(query.toJSON()) << collections << calendarMimeTypes << result; 0464 } 0465 { 0466 Akonadi::SearchQuery query; 0467 query.addTerm(Akonadi::IncidenceSearchTerm(Akonadi::IncidenceSearchTerm::PartStatus, 0468 QStringLiteral("attendee2@example.com1"), 0469 Akonadi::SearchTerm::CondEqual)); 0470 QList<qint64> collections({6}); 0471 QSet<qint64> result({2001}); 0472 QTest::newRow("find events accepted") << QString::fromLatin1(query.toJSON()) << collections << calendarMimeTypes << result; 0473 } 0474 { 0475 Akonadi::SearchQuery query; 0476 query.addTerm(Akonadi::IncidenceSearchTerm(Akonadi::IncidenceSearchTerm::PartStatus, 0477 QStringLiteral("attendee3@example.com2"), 0478 Akonadi::SearchTerm::CondEqual)); 0479 QList<qint64> collections({6}); 0480 QSet<qint64> result({2001}); 0481 QTest::newRow("find events declined") << QString::fromLatin1(query.toJSON()) << collections << calendarMimeTypes << result; 0482 } 0483 { 0484 Akonadi::SearchQuery query; 0485 query.addTerm(Akonadi::IncidenceSearchTerm(Akonadi::IncidenceSearchTerm::PartStatus, 0486 QStringLiteral("attendee4@example.com3"), 0487 Akonadi::SearchTerm::CondEqual)); 0488 QList<qint64> collections({6}); 0489 QSet<qint64> result({2001}); 0490 QTest::newRow("find events tentative") << QString::fromLatin1(query.toJSON()) << collections << calendarMimeTypes << result; 0491 } 0492 { 0493 Akonadi::SearchQuery query; 0494 query.addTerm(Akonadi::IncidenceSearchTerm(Akonadi::IncidenceSearchTerm::PartStatus, 0495 QStringLiteral("attendee5@example.com4"), 0496 Akonadi::SearchTerm::CondEqual)); 0497 QList<qint64> collections({6}); 0498 QSet<qint64> result({2001}); 0499 QTest::newRow("find events delegated") << QString::fromLatin1(query.toJSON()) << collections << calendarMimeTypes << result; 0500 } 0501 { 0502 Akonadi::SearchQuery query; 0503 query.addTerm(Akonadi::IncidenceSearchTerm(Akonadi::IncidenceSearchTerm::PartStatus, 0504 QStringLiteral("attendee5@example.com5"), 0505 Akonadi::SearchTerm::CondEqual)); 0506 QList<qint64> collections({6}); 0507 QSet<qint64> result; 0508 QTest::newRow("unknown partstatus") << QString::fromLatin1(query.toJSON()) << collections << calendarMimeTypes << result; 0509 } 0510 { 0511 Akonadi::SearchQuery query; 0512 query.addTerm(Akonadi::IncidenceSearchTerm(Akonadi::IncidenceSearchTerm::Summary, QStringLiteral("title"), Akonadi::SearchTerm::CondEqual)); 0513 QList<qint64> collections({6}); 0514 QSet<qint64> result({2001}); 0515 QTest::newRow("find event summary") << QString::fromLatin1(query.toJSON()) << collections << calendarMimeTypes << result; 0516 } 0517 { 0518 Akonadi::SearchQuery query; 0519 query.addTerm(Akonadi::IncidenceSearchTerm(Akonadi::IncidenceSearchTerm::Location, QStringLiteral("here"), Akonadi::SearchTerm::CondEqual)); 0520 QList<qint64> collections({6}); 0521 QSet<qint64> result({2001}); 0522 QTest::newRow("find events location") << QString::fromLatin1(query.toJSON()) << collections << calendarMimeTypes << result; 0523 } 0524 } 0525 0526 void testCalendarSearch() 0527 { 0528 resultSearch(); 0529 } 0530 0531 void testNoteSearch_data() 0532 { 0533 QTest::addColumn<QString>("query"); 0534 QTest::addColumn<QList<qint64>>("collections"); 0535 QTest::addColumn<QStringList>("mimeTypes"); 0536 QTest::addColumn<QSet<qint64>>("expectedResult"); 0537 const QStringList notesMimeTypes({QStringLiteral("text/x-vnd.akonadi.note")}); 0538 { 0539 Akonadi::SearchQuery query; 0540 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Subject, QStringLiteral("note"), Akonadi::SearchTerm::CondEqual)); 0541 0542 QList<qint64> collections({5}); 0543 QSet<qint64> result({1000}); 0544 QTest::newRow("find note subject equal") << QString::fromLatin1(query.toJSON()) << collections << notesMimeTypes << result; 0545 } 0546 { 0547 Akonadi::SearchQuery query; 0548 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Subject, QStringLiteral("note1"), Akonadi::SearchTerm::CondEqual)); 0549 0550 QList<qint64> collections({5}); 0551 QSet<qint64> result; 0552 QTest::newRow("find note subject equal") << QString::fromLatin1(query.toJSON()) << collections << notesMimeTypes << result; 0553 } 0554 { 0555 Akonadi::SearchQuery query(Akonadi::SearchTerm::RelOr); 0556 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Subject, QStringLiteral("note"), Akonadi::SearchTerm::CondEqual)); 0557 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Body, QStringLiteral("note"), Akonadi::SearchTerm::CondEqual)); 0558 0559 QList<qint64> collections({5}); 0560 QSet<qint64> result({1000, 1001}); 0561 QTest::newRow("find note subject equal or body equal") << QString::fromLatin1(query.toJSON()) << collections << notesMimeTypes << result; 0562 } 0563 { 0564 Akonadi::SearchQuery query(Akonadi::SearchTerm::RelAnd); 0565 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Subject, QStringLiteral("note3"), Akonadi::SearchTerm::CondEqual)); 0566 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Body, QStringLiteral("note3"), Akonadi::SearchTerm::CondEqual)); 0567 0568 QList<qint64> collections({5}); 0569 QSet<qint64> result({1002}); 0570 QTest::newRow("find note subject equal and body equal") << QString::fromLatin1(query.toJSON()) << collections << notesMimeTypes << result; 0571 } 0572 { 0573 Akonadi::SearchQuery query; 0574 Akonadi::EmailSearchTerm term(Akonadi::EmailSearchTerm::Subject, QStringLiteral("note3"), Akonadi::SearchTerm::CondEqual); 0575 term.setIsNegated(true); 0576 query.addTerm(term); 0577 QList<qint64> collections({5}); 0578 QSet<qint64> result({1000, 1001}); 0579 QTest::newRow("find not subject equal note3") << QString::fromLatin1(query.toJSON()) << collections << notesMimeTypes << result; 0580 } 0581 } 0582 0583 void testNoteSearch() 0584 { 0585 resultSearch(); 0586 } 0587 0588 void testContactSearch() 0589 { 0590 resultSearch(); 0591 } 0592 0593 void testContactSearch_data() 0594 { 0595 QTest::addColumn<QString>("query"); 0596 QTest::addColumn<QList<qint64>>("collections"); 0597 QTest::addColumn<QStringList>("mimeTypes"); 0598 QTest::addColumn<QSet<qint64>>("expectedResult"); 0599 const QStringList contactMimeTypes({KContacts::Addressee::mimeType()}); 0600 const QStringList contactGroupMimeTypes({KContacts::ContactGroup::mimeType()}); 0601 { 0602 Akonadi::SearchQuery query; 0603 query.addTerm(Akonadi::ContactSearchTerm(Akonadi::ContactSearchTerm::Name, QStringLiteral("John"), Akonadi::SearchTerm::CondContains)); 0604 0605 QList<qint64> collections; 0606 QSet<qint64> result({100}); 0607 QTest::newRow("contact by name") << QString::fromLatin1(query.toJSON()) << collections << contactMimeTypes << result; 0608 } 0609 { 0610 Akonadi::SearchQuery query; 0611 query.addTerm(Akonadi::ContactSearchTerm(Akonadi::ContactSearchTerm::Name, QStringLiteral("John"), Akonadi::SearchTerm::CondContains)); 0612 0613 QList<qint64> collections({4}); 0614 QSet<qint64> result; 0615 QTest::newRow("contact collectionfilter") << QString::fromLatin1(query.toJSON()) << collections << contactMimeTypes << result; 0616 } 0617 { 0618 Akonadi::SearchQuery query; 0619 query.addTerm(Akonadi::ContactSearchTerm(Akonadi::ContactSearchTerm::Name, QStringLiteral("john"), Akonadi::SearchTerm::CondContains)); 0620 0621 QList<qint64> collections({3}); 0622 QSet<qint64> result({100}); 0623 QTest::newRow("contact by lowercase name") << QString::fromLatin1(query.toJSON()) << collections << contactMimeTypes << result; 0624 } 0625 { 0626 Akonadi::SearchQuery query; 0627 query.addTerm(Akonadi::ContactSearchTerm(Akonadi::ContactSearchTerm::Nickname, QStringLiteral("JD"), Akonadi::SearchTerm::CondContains)); 0628 0629 QList<qint64> collections({3}); 0630 QSet<qint64> result({100}); 0631 QTest::newRow("contact by nickname") << QString::fromLatin1(query.toJSON()) << collections << contactMimeTypes << result; 0632 } 0633 { 0634 Akonadi::SearchQuery query; 0635 query.addTerm(Akonadi::ContactSearchTerm(Akonadi::ContactSearchTerm::Uid, QStringLiteral("uid1"), Akonadi::SearchTerm::CondEqual)); 0636 0637 QList<qint64> collections({3}); 0638 QSet<qint64> result({100}); 0639 QTest::newRow("contact by uid") << QString::fromLatin1(query.toJSON()) << collections << contactMimeTypes << result; 0640 } 0641 { 0642 Akonadi::SearchQuery query; 0643 query.addTerm(Akonadi::ContactSearchTerm(Akonadi::ContactSearchTerm::Uid, QStringLiteral("abcd-efgh-1234-5678"), Akonadi::SearchTerm::CondEqual)); 0644 0645 QList<qint64> collections({3}); 0646 QSet<qint64> result({105}); 0647 QTest::newRow("contact by uid 2") << QString::fromLatin1(query.toJSON()) << collections << contactMimeTypes << result; 0648 } 0649 { 0650 Akonadi::SearchQuery query; 0651 query.addTerm(Akonadi::ContactSearchTerm(Akonadi::ContactSearchTerm::Email, QStringLiteral("JANE@TEST.COM"), Akonadi::SearchTerm::CondEqual)); 0652 0653 QList<qint64> collections({3}); 0654 QSet<qint64> result({101, 102}); 0655 QTest::newRow("contact by email (JANE@TEST.COM)") << QString::fromLatin1(query.toJSON()) << collections << contactMimeTypes << result; 0656 } 0657 { 0658 Akonadi::SearchQuery query; 0659 query.addTerm( 0660 Akonadi::ContactSearchTerm(Akonadi::ContactSearchTerm::Email, QStringLiteral("jack_sparrow@test.com"), Akonadi::SearchTerm::CondContains)); 0661 QList<qint64> collections = {3}; 0662 QSet<qint64> result = {101}; 0663 QTest::newRow("contact by email (jack_sparrow@test.com)") << QString::fromLatin1(query.toJSON()) << collections << contactMimeTypes << result; 0664 } 0665 { 0666 Akonadi::SearchQuery query; 0667 query.addTerm(Akonadi::ContactSearchTerm(Akonadi::ContactSearchTerm::Email, QStringLiteral("jack_sparrow"), Akonadi::SearchTerm::CondContains)); 0668 QList<qint64> collections = {3}; 0669 QSet<qint64> result = {101}; 0670 QTest::newRow("contact by email (jack_sparrow)") << QString::fromLatin1(query.toJSON()) << collections << contactMimeTypes << result; 0671 } 0672 { 0673 Akonadi::SearchQuery query; 0674 query.addTerm(Akonadi::ContactSearchTerm(Akonadi::ContactSearchTerm::Email, QStringLiteral("jack"), Akonadi::SearchTerm::CondContains)); 0675 QList<qint64> collections = {3}; 0676 QSet<qint64> result = {101}; 0677 QTest::newRow("contact by email (jack)") << QString::fromLatin1(query.toJSON()) << collections << contactMimeTypes << result; 0678 } 0679 { 0680 Akonadi::SearchQuery query; 0681 query.addTerm(Akonadi::ContactSearchTerm(Akonadi::ContactSearchTerm::Email, QStringLiteral("sparrow"), Akonadi::SearchTerm::CondContains)); 0682 QList<qint64> collections = {3}; 0683 QSet<qint64> result = {101}; 0684 QTest::newRow("contact by email (sparrow)") << QString::fromLatin1(query.toJSON()) << collections << contactMimeTypes << result; 0685 } 0686 { 0687 Akonadi::SearchQuery query; 0688 query.addTerm(Akonadi::ContactSearchTerm(Akonadi::ContactSearchTerm::Name, QStringLiteral("Doe"), Akonadi::SearchTerm::CondContains)); 0689 0690 QList<qint64> collections; 0691 QSet<qint64> result({100, 101, 102}); 0692 QTest::newRow("contact by name (Doe)") << QString::fromLatin1(query.toJSON()) << collections << contactMimeTypes << result; 0693 } 0694 { 0695 Akonadi::SearchQuery query; 0696 query.addTerm(Akonadi::ContactSearchTerm(Akonadi::ContactSearchTerm::Name, QStringLiteral("Do"), Akonadi::SearchTerm::CondContains)); 0697 0698 QList<qint64> collections; 0699 QSet<qint64> result({100, 101, 102}); 0700 QTest::newRow("contact by name (Do)") << QString::fromLatin1(query.toJSON()) << collections << contactMimeTypes << result; 0701 } 0702 { 0703 Akonadi::SearchQuery query; 0704 query.addTerm(Akonadi::ContactSearchTerm(Akonadi::ContactSearchTerm::Name, QStringLiteral("group1"), Akonadi::SearchTerm::CondContains)); 0705 0706 QList<qint64> collections; 0707 QSet<qint64> result({103}); 0708 QTest::newRow("contact group by name (group1)") << QString::fromLatin1(query.toJSON()) << collections << contactGroupMimeTypes << result; 0709 } 0710 { 0711 Akonadi::SearchQuery query; 0712 query.addTerm(Akonadi::ContactSearchTerm(Akonadi::ContactSearchTerm::Name, QStringLiteral("group2"), Akonadi::SearchTerm::CondContains)); 0713 0714 QList<qint64> collections; 0715 QSet<qint64> result; 0716 QTest::newRow("contact group by name (group2)") << QString::fromLatin1(query.toJSON()) << collections << contactGroupMimeTypes << result; 0717 } 0718 { 0719 Akonadi::SearchQuery query; 0720 query.addTerm(Akonadi::ContactSearchTerm(Akonadi::ContactSearchTerm::Name, QStringLiteral("group3"), Akonadi::SearchTerm::CondContains)); 0721 0722 QList<qint64> collections({4}); 0723 QSet<qint64> result({104}); 0724 QTest::newRow("contact group by name (group3 in collection 4)") 0725 << QString::fromLatin1(query.toJSON()) << collections << contactGroupMimeTypes << result; 0726 } 0727 { 0728 Akonadi::SearchQuery query; 0729 query.addTerm(Akonadi::ContactSearchTerm(Akonadi::ContactSearchTerm::Name, QStringLiteral("group3"), Akonadi::SearchTerm::CondContains)); 0730 0731 QList<qint64> collections({3}); 0732 QSet<qint64> result; 0733 QTest::newRow("contact group by name (group3 in collection 3)") 0734 << QString::fromLatin1(query.toJSON()) << collections << contactGroupMimeTypes << result; 0735 } 0736 0737 { 0738 Akonadi::SearchQuery query; 0739 query.addTerm(Akonadi::ContactSearchTerm(Akonadi::ContactSearchTerm::Name, QStringLiteral("oe"), Akonadi::SearchTerm::CondContains)); 0740 0741 QList<qint64> collections; 0742 QSet<qint64> result({100, 101, 102}); 0743 QTest::newRow("contact by name (oe)") << QString::fromLatin1(query.toJSON()) << collections << contactMimeTypes << result; 0744 } 0745 } 0746 0747 void testEmailSearch_data() 0748 { 0749 QTest::addColumn<QString>("query"); 0750 QTest::addColumn<QList<qint64>>("collections"); 0751 QTest::addColumn<QStringList>("mimeTypes"); 0752 QTest::addColumn<QSet<qint64>>("expectedResult"); 0753 const QStringList emailMimeTypes = QStringList() << QStringLiteral("message/rfc822"); 0754 const QList<qint64> allEmailCollections({1, 2}); 0755 { 0756 Akonadi::SearchQuery query; 0757 QList<qint64> collections({1}); 0758 QSet<qint64> result = {1}; 0759 QTest::newRow("all emails in collection") << QString::fromLatin1(query.toJSON()) << collections << emailMimeTypes << result; 0760 } 0761 { 0762 Akonadi::SearchQuery query; 0763 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Subject, QStringLiteral("subject1"), Akonadi::SearchTerm::CondEqual)); 0764 QList<qint64> collections({1}); 0765 QSet<qint64> result({1}); 0766 QTest::newRow("find subject equal") << QString::fromLatin1(query.toJSON()) << collections << emailMimeTypes << result; 0767 } 0768 { 0769 Akonadi::SearchQuery query; 0770 Akonadi::EmailSearchTerm term(Akonadi::EmailSearchTerm::Subject, QStringLiteral("subject1"), Akonadi::SearchTerm::CondEqual); 0771 term.setIsNegated(true); 0772 query.addTerm(term); 0773 QList<qint64> collections({2}); 0774 QSet<qint64> result({2, 3, 4, 5, 6}); 0775 QTest::newRow("find subject equal negated") << QString::fromLatin1(query.toJSON()) << collections << emailMimeTypes << result; 0776 } 0777 { 0778 Akonadi::SearchQuery query; 0779 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Subject, QStringLiteral("subject"), Akonadi::SearchTerm::CondContains)); 0780 QSet<qint64> result({1, 2, 3, 4}); 0781 QTest::newRow("find subject contains") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0782 } 0783 { 0784 Akonadi::SearchQuery query; 0785 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Body, QStringLiteral("body"), Akonadi::SearchTerm::CondContains)); 0786 QList<qint64> collections({1, 2, 3, 4}); 0787 QSet<qint64> result({1, 2, 3, 4, 6}); 0788 QTest::newRow("find body contains") << QString::fromLatin1(query.toJSON()) << collections << emailMimeTypes << result; 0789 } 0790 { 0791 Akonadi::SearchQuery query; 0792 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Body, QStringLiteral("mälmöö"), Akonadi::SearchTerm::CondContains)); 0793 QSet<qint64> result({1}); 0794 QTest::newRow("find utf8 body contains") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0795 } 0796 { 0797 Akonadi::SearchQuery query; 0798 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Headers, QStringLiteral("From:"), Akonadi::SearchTerm::CondContains)); 0799 QSet<qint64> result({1, 2, 3, 4, 5, 6}); 0800 QTest::newRow("find header contains") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0801 } 0802 { 0803 Akonadi::SearchQuery query; 0804 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Message, QStringLiteral("body"), Akonadi::SearchTerm::CondContains)); 0805 QSet<qint64> result({1, 2, 3, 4, 6}); 0806 QTest::newRow("find message contains") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0807 } 0808 { 0809 Akonadi::SearchQuery query(Akonadi::SearchTerm::RelOr); 0810 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Subject, QStringLiteral("subject1"), Akonadi::SearchTerm::CondEqual)); 0811 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Subject, QStringLiteral("subject2"), Akonadi::SearchTerm::CondEqual)); 0812 QSet<qint64> result({1, 2}); 0813 QTest::newRow("or term") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0814 } 0815 { 0816 Akonadi::SearchQuery query(Akonadi::SearchTerm::RelAnd); 0817 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Subject, QStringLiteral("subject1"), Akonadi::SearchTerm::CondEqual)); 0818 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Body, QStringLiteral("body1"), Akonadi::SearchTerm::CondContains)); 0819 QSet<qint64> result({1}); 0820 QTest::newRow("and term") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0821 } 0822 { 0823 Akonadi::SearchQuery query(Akonadi::SearchTerm::RelAnd); 0824 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Subject, QStringLiteral("subject1"), Akonadi::SearchTerm::CondEqual)); 0825 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Body, QStringLiteral("body2"), Akonadi::SearchTerm::CondEqual)); 0826 QSet<qint64> result; 0827 QTest::newRow("and term equal") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0828 } 0829 { 0830 Akonadi::SearchQuery query; 0831 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Subject, QStringLiteral("subject"), Akonadi::SearchTerm::CondContains)); 0832 QList<qint64> collections({1}); 0833 QSet<qint64> result({1}); 0834 QTest::newRow("filter by collection") << QString::fromLatin1(query.toJSON()) << collections << emailMimeTypes << result; 0835 } 0836 { 0837 Akonadi::SearchQuery query; 0838 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 0839 QString::fromLatin1(Akonadi::MessageFlags::Flagged), 0840 Akonadi::SearchTerm::CondContains)); 0841 QSet<qint64> result({2, 3, 4, 5, 6}); 0842 QTest::newRow("find by message flag") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0843 } 0844 { 0845 Akonadi::SearchQuery query; 0846 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 0847 QString::fromLatin1(Akonadi::MessageFlags::Replied), 0848 Akonadi::SearchTerm::CondContains)); 0849 QSet<qint64> result({1, 2, 3, 4, 5, 6}); 0850 QTest::newRow("find by message replied") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0851 } 0852 0853 { 0854 Akonadi::SearchQuery query(Akonadi::SearchTerm::RelAnd); 0855 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 0856 QString::fromLatin1(Akonadi::MessageFlags::Replied), 0857 Akonadi::SearchTerm::CondContains)); 0858 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 0859 QString::fromLatin1(Akonadi::MessageFlags::Encrypted), 0860 Akonadi::SearchTerm::CondContains)); 0861 QSet<qint64> result({1, 5}); 0862 QTest::newRow("find by message replied and encrypted") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0863 } 0864 { 0865 Akonadi::SearchQuery query(Akonadi::SearchTerm::RelAnd); 0866 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 0867 QString::fromLatin1(Akonadi::MessageFlags::Seen), 0868 Akonadi::SearchTerm::CondContains)); 0869 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 0870 QString::fromLatin1(Akonadi::MessageFlags::Deleted), 0871 Akonadi::SearchTerm::CondContains)); 0872 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 0873 QString::fromLatin1(Akonadi::MessageFlags::Answered), 0874 Akonadi::SearchTerm::CondContains)); 0875 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 0876 QString::fromLatin1(Akonadi::MessageFlags::Flagged), 0877 Akonadi::SearchTerm::CondContains)); 0878 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 0879 QString::fromLatin1(Akonadi::MessageFlags::HasAttachment), 0880 Akonadi::SearchTerm::CondContains)); 0881 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 0882 QString::fromLatin1(Akonadi::MessageFlags::HasInvitation), 0883 Akonadi::SearchTerm::CondContains)); 0884 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 0885 QString::fromLatin1(Akonadi::MessageFlags::Sent), 0886 Akonadi::SearchTerm::CondContains)); 0887 // query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, QString::fromLatin1(Akonadi::MessageFlags::Queued), 0888 // Akonadi::SearchTerm::CondContains)); 0889 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 0890 QString::fromLatin1(Akonadi::MessageFlags::Replied), 0891 Akonadi::SearchTerm::CondContains)); 0892 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 0893 QString::fromLatin1(Akonadi::MessageFlags::Forwarded), 0894 Akonadi::SearchTerm::CondContains)); 0895 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 0896 QString::fromLatin1(Akonadi::MessageFlags::ToAct), 0897 Akonadi::SearchTerm::CondContains)); 0898 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 0899 QString::fromLatin1(Akonadi::MessageFlags::Watched), 0900 Akonadi::SearchTerm::CondContains)); 0901 // query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, QString::fromLatin1(Akonadi::MessageFlags::Ignored), 0902 // Akonadi::SearchTerm::CondContains)); 0903 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 0904 QString::fromLatin1(Akonadi::MessageFlags::Encrypted), 0905 Akonadi::SearchTerm::CondContains)); 0906 // Spam is exclude from indexer. 0907 // query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, QString::fromLatin1(Akonadi::MessageFlags::Spam), 0908 // Akonadi::SearchTerm::CondContains)); 0909 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 0910 QString::fromLatin1(Akonadi::MessageFlags::Ham), 0911 Akonadi::SearchTerm::CondContains)); 0912 0913 QSet<qint64> result({5}); 0914 QTest::newRow("find by message by all status") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0915 } 0916 { 0917 Akonadi::SearchQuery query; 0918 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::ByteSize, QString::number(1000), Akonadi::SearchTerm::CondGreaterOrEqual)); 0919 QSet<qint64> result({1, 2, 3, 4, 5, 6}); 0920 QTest::newRow("find by size greater than equal great or equal") 0921 << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0922 } 0923 0924 { 0925 Akonadi::SearchQuery query; 0926 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::ByteSize, QString::number(1000), Akonadi::SearchTerm::CondEqual)); 0927 QSet<qint64> result({1}); 0928 QTest::newRow("find by size equal") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0929 } 0930 0931 { 0932 Akonadi::SearchQuery query; 0933 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::ByteSize, QString::number(1002), Akonadi::SearchTerm::CondLessOrEqual)); 0934 QSet<qint64> result({1, 2, 3, 4, 5}); 0935 QTest::newRow("find by size greater than equal less or equal") 0936 << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0937 } 0938 { 0939 Akonadi::SearchQuery query; 0940 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::ByteSize, QString::number(1001), Akonadi::SearchTerm::CondGreaterOrEqual)); 0941 QSet<qint64> result({2, 3, 4, 5, 6}); 0942 QTest::newRow("find by size separate") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0943 } 0944 { 0945 Akonadi::SearchQuery query; 0946 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::ByteSize, QString::number(1001), Akonadi::SearchTerm::CondGreaterThan)); 0947 QSet<qint64> result({2, 3, 4, 5, 6}); 0948 QTest::newRow("find by size separate (greater than)") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0949 } 0950 { 0951 Akonadi::SearchQuery query; 0952 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderDate, 0953 QDateTime(QDate(2013, 11, 10), QTime(12, 30, 0)), 0954 Akonadi::SearchTerm::CondGreaterOrEqual)); 0955 QSet<qint64> result({2, 3, 4, 5, 6}); 0956 QTest::newRow("find by date") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0957 } 0958 0959 { 0960 Akonadi::SearchQuery query; 0961 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderDate, 0962 QDateTime(QDate(2013, 11, 10), QTime(12, 0, 0)), 0963 Akonadi::SearchTerm::CondEqual)); 0964 QSet<qint64> result({1}); 0965 QTest::newRow("find by date equal") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0966 } 0967 0968 { 0969 Akonadi::SearchQuery query; 0970 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderOnlyDate, QDate(2014, 11, 11), Akonadi::SearchTerm::CondEqual)); 0971 QSet<qint64> result({4, 5, 6}); 0972 QTest::newRow("find by date only (equal condition)") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0973 } 0974 0975 { 0976 Akonadi::SearchQuery query; 0977 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderOnlyDate, QDate(2013, 11, 10), Akonadi::SearchTerm::CondGreaterOrEqual)); 0978 QSet<qint64> result({1, 2, 3, 4, 5, 6}); 0979 QTest::newRow("find by date only (greater or equal)") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0980 } 0981 { 0982 Akonadi::SearchQuery query; 0983 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderOnlyDate, QDate(2014, 11, 10), Akonadi::SearchTerm::CondGreaterOrEqual)); 0984 QSet<qint64> result({3, 4, 5, 6}); 0985 QTest::newRow("find by date only greater or equal") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0986 } 0987 { 0988 Akonadi::SearchQuery query; 0989 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderOnlyDate, QDate(2014, 11, 10), Akonadi::SearchTerm::CondGreaterThan)); 0990 QSet<qint64> result({4, 5, 6}); 0991 QTest::newRow("find by date only greater than") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0992 } 0993 { 0994 Akonadi::SearchQuery query; 0995 query.addTerm( 0996 Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderCC, QStringLiteral("Jane Doe <cc@test.com>"), Akonadi::SearchTerm::CondEqual)); 0997 QSet<qint64> result({4}); 0998 QTest::newRow("find by header cc") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 0999 } 1000 1001 { 1002 Akonadi::SearchQuery query; 1003 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderCC, QStringLiteral("cc@test.com"), Akonadi::SearchTerm::CondContains)); 1004 QSet<qint64> result({4}); 1005 QTest::newRow("find by header cc (contains)") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 1006 } 1007 1008 { 1009 Akonadi::SearchQuery query; 1010 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderOrganization, QStringLiteral("kde"), Akonadi::SearchTerm::CondEqual)); 1011 QSet<qint64> result({2}); 1012 QTest::newRow("find by header organization (equal)") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 1013 } 1014 { 1015 Akonadi::SearchQuery query; 1016 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderOrganization, QStringLiteral("kde"), Akonadi::SearchTerm::CondContains)); 1017 QSet<qint64> result({2, 3}); 1018 QTest::newRow("find by header organization (contains)") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 1019 } 1020 { 1021 Akonadi::SearchQuery query; 1022 query.addTerm( 1023 Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderBCC, QStringLiteral("Jane Doe <bcc@test.com>"), Akonadi::SearchTerm::CondContains)); 1024 QSet<qint64> result({4}); 1025 QTest::newRow("find by header bcc") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 1026 } 1027 { 1028 Akonadi::SearchQuery query; 1029 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderReplyTo, QStringLiteral("test@kde.org"), Akonadi::SearchTerm::CondContains)); 1030 QSet<qint64> result({4}); 1031 QTest::newRow("find by reply to") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 1032 } 1033 { 1034 Akonadi::SearchQuery query; 1035 query.addTerm( 1036 Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderListId, QStringLiteral("kde-pim.kde.org"), Akonadi::SearchTerm::CondContains)); 1037 QSet<qint64> result({4}); 1038 QTest::newRow("find by list id") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 1039 } 1040 { 1041 Akonadi::SearchQuery query(Akonadi::SearchTerm::RelOr); 1042 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 1043 QString::fromLatin1(Akonadi::MessageFlags::Deleted), 1044 Akonadi::SearchTerm::CondContains)); 1045 query.addTerm( 1046 Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderListId, QStringLiteral("kde-pim.kde.org"), Akonadi::SearchTerm::CondContains)); 1047 1048 QSet<qint64> result({4, 5}); 1049 QTest::newRow("find by message by deleted status or headerListId") 1050 << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 1051 } 1052 { 1053 Akonadi::SearchQuery query(Akonadi::SearchTerm::RelOr); 1054 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 1055 QString::fromLatin1(Akonadi::MessageFlags::Deleted), 1056 Akonadi::SearchTerm::CondContains)); 1057 query.addTerm( 1058 Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderListId, QStringLiteral("kde-pim.kde.org"), Akonadi::SearchTerm::CondContains)); 1059 1060 QList<qint64> collections; 1061 QSet<qint64> result({4, 5}); 1062 QTest::newRow("find by message by deleted status or headerListId in all collections") 1063 << QString::fromLatin1(query.toJSON()) << collections << emailMimeTypes << result; 1064 } 1065 { 1066 Akonadi::SearchQuery query(Akonadi::SearchTerm::RelAnd); 1067 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::MessageStatus, 1068 QString::fromLatin1(Akonadi::MessageFlags::Deleted), 1069 Akonadi::SearchTerm::CondContains)); 1070 query.addTerm( 1071 Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderListId, QStringLiteral("kde-pim.kde.org"), Akonadi::SearchTerm::CondContains)); 1072 1073 QSet<qint64> result; 1074 QTest::newRow("find by message by deleted status and headerListId") 1075 << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 1076 } 1077 { 1078 Akonadi::SearchQuery query; 1079 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Message, QStringLiteral("subject"), Akonadi::SearchTerm::CondEqual)); 1080 QSet<qint64> result({1, 2, 3, 4, 5, 6}); 1081 QTest::newRow("find by message term") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 1082 } 1083 { 1084 Akonadi::SearchQuery query; 1085 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderCC, QStringLiteral("CC@TEST.com"), Akonadi::SearchTerm::CondContains)); 1086 QSet<qint64> result({4}); 1087 QTest::newRow("find by header cc (contains) with case") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 1088 } 1089 { 1090 Akonadi::SearchQuery query; 1091 // Change in qt/qtx11extras[stable]: remove QtWidgets dependency 1092 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Subject, QStringLiteral("extras"), Akonadi::SearchTerm::CondContains)); 1093 QSet<qint64> result({6}); 1094 QTest::newRow("search extras in subject") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 1095 } 1096 { 1097 Akonadi::SearchQuery query; 1098 // Change in qt/qtx11extras[stable]: remove QtWidgets dependency 1099 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Subject, QStringLiteral("change"), Akonadi::SearchTerm::CondContains)); 1100 QSet<qint64> result({6}); 1101 QTest::newRow("search \"change\" in subject") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 1102 } 1103 { 1104 Akonadi::SearchQuery query; 1105 // Change in qt/qtx11extras[stable]: remove QtWidgets dependency 1106 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::Subject, QStringLiteral("qtx11extras"), Akonadi::SearchTerm::CondContains)); 1107 QSet<qint64> result({6}); 1108 QTest::newRow("search qtx11extras in subject") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 1109 } 1110 { 1111 Akonadi::SearchQuery query; 1112 query.addTerm(Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderFrom, QStringLiteral("test.com"), Akonadi::SearchTerm::CondContains)); 1113 QSet<qint64> result({1, 2, 3, 4, 5, 6}); 1114 QTest::newRow("search by from email part") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 1115 } 1116 { 1117 Akonadi::SearchQuery query; 1118 query.addTerm( 1119 Akonadi::EmailSearchTerm(Akonadi::EmailSearchTerm::HeaderFrom, QStringLiteral("john_blue@test.com"), Akonadi::SearchTerm::CondContains)); 1120 QSet<qint64> result = QSet<qint64>() << 4; 1121 QTest::newRow("search by from email part") << QString::fromLatin1(query.toJSON()) << allEmailCollections << emailMimeTypes << result; 1122 } 1123 } 1124 1125 void testEmailSearch() 1126 { 1127 resultSearch(); 1128 } 1129 }; 1130 1131 QTEST_GUILESS_MAIN(SearchPluginTest) 1132 1133 #include "searchplugintest.moc"