1 /*
2 SPDX-FileCopyrightText: 2007 Volker Krause <vkrause@kde.org>
3 SPDX-FileCopyrightText: 2014 Daniel Vrátil <dvratil@redhat.com>
4
5 SPDX-License-Identifier: LGPL-2.0-or-later
6 */
7
8 #include "searchjobtest.h"
9 #include "qtest_akonadi.h"
10
11 #include "collection.h"
12 #include "collectiondeletejob.h"
13 #include "collectionfetchjob.h"
14 #include "collectionmodifyjob.h"
15 #include "collectionutils.h"
16 #include "itemfetchjob.h"
17 #include "persistentsearchattribute.h"
18 #include "searchcreatejob.h"
19 #include "searchquery.h"
20
21 QTEST_AKONADIMAIN(SearchJobTest)
22
23 using namespace Akonadi;
24
initTestCase()25 void SearchJobTest::initTestCase()
26 {
27 AkonadiTest::checkTestIsIsolated();
28 }
29
testCreateDeleteSearch()30 void SearchJobTest::testCreateDeleteSearch()
31 {
32 Akonadi::SearchQuery query;
33 query.addTerm(Akonadi::SearchTerm(QStringLiteral("plugin"), 1));
34 query.addTerm(Akonadi::SearchTerm(QStringLiteral("resource"), 2));
35 query.addTerm(Akonadi::SearchTerm(QStringLiteral("plugin"), 3));
36 query.addTerm(Akonadi::SearchTerm(QStringLiteral("resource"), 4));
37
38 // Create collection
39 SearchCreateJob *create = new SearchCreateJob(QStringLiteral("search123456"), query, this);
40 create->setRemoteSearchEnabled(false);
41 AKVERIFYEXEC(create);
42 const Collection created = create->createdCollection();
43 QVERIFY(created.isValid());
44
45 // Fetch "Search" collection, check the search collection has been created
46 CollectionFetchJob *list = new CollectionFetchJob(Collection(1), CollectionFetchJob::Recursive, this);
47 AKVERIFYEXEC(list);
48 const Collection::List cols = list->collections();
49 Collection col;
50 for (const auto &c : cols) {
51 if (c.name() == QLatin1String("search123456")) {
52 col = c;
53 break;
54 }
55 }
56 QVERIFY(col == created);
57 QCOMPARE(col.parentCollection().id(), 1LL);
58 QVERIFY(col.isVirtual());
59
60 // Fetch items in the search collection, check whether they are there
61 ItemFetchJob *fetch = new ItemFetchJob(created, this);
62 AKVERIFYEXEC(fetch);
63 const Item::List items = fetch->items();
64 QCOMPARE(items.count(), 2);
65
66 CollectionDeleteJob *delJob = new CollectionDeleteJob(col, this);
67 AKVERIFYEXEC(delJob);
68 }
69
testModifySearch()70 void SearchJobTest::testModifySearch()
71 {
72 Akonadi::SearchQuery query;
73 query.addTerm(Akonadi::SearchTerm(QStringLiteral("plugin"), 1));
74 query.addTerm(Akonadi::SearchTerm(QStringLiteral("resource"), 2));
75
76 // make sure there is a virtual collection
77 SearchCreateJob *create = new SearchCreateJob(QStringLiteral("search123456"), query, this);
78 AKVERIFYEXEC(create);
79 Collection created = create->createdCollection();
80 QVERIFY(created.isValid());
81 QVERIFY(created.hasAttribute<PersistentSearchAttribute>());
82
83 auto attr = created.attribute<PersistentSearchAttribute>();
84 QVERIFY(!attr->isRecursive());
85 QVERIFY(!attr->isRemoteSearchEnabled());
86 QCOMPARE(attr->queryCollections(), QVector<qint64>{0});
87 const QString oldQueryString = attr->queryString();
88
89 // Change the attributes
90 attr->setRecursive(true);
91 attr->setRemoteSearchEnabled(true);
92 attr->setQueryCollections(QVector<qint64>{1});
93 Akonadi::SearchQuery newQuery;
94 newQuery.addTerm(Akonadi::SearchTerm(QStringLiteral("plugin"), 3));
95 newQuery.addTerm(Akonadi::SearchTerm(QStringLiteral("resource"), 4));
96 attr->setQueryString(QString::fromUtf8(newQuery.toJSON()));
97
98 auto modify = new CollectionModifyJob(created, this);
99 AKVERIFYEXEC(modify);
100
101 auto fetch = new CollectionFetchJob(created, CollectionFetchJob::Base, this);
102 AKVERIFYEXEC(fetch);
103 QCOMPARE(fetch->collections().size(), 1);
104
105 const auto col = fetch->collections().first();
106 QVERIFY(col.hasAttribute<PersistentSearchAttribute>());
107 attr = col.attribute<PersistentSearchAttribute>();
108
109 QVERIFY(attr->isRecursive());
110 QVERIFY(attr->isRemoteSearchEnabled());
111 QCOMPARE(attr->queryCollections(), QVector<qint64>{1});
112 QVERIFY(attr->queryString() != oldQueryString);
113
114 auto delJob = new CollectionDeleteJob(col, this);
115 AKVERIFYEXEC(delJob);
116 }
117