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"