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