summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/CMakeLists.txt1
-rw-r--r--tests/clientapitest.cpp151
2 files changed, 152 insertions, 0 deletions
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index d3e6870..24912f5 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -29,6 +29,7 @@ manual_tests (
29) 29)
30 30
31auto_tests ( 31auto_tests (
32 clientapitest
32 storagetest 33 storagetest
33 dummyresourcetest 34 dummyresourcetest
34 domainadaptortest 35 domainadaptortest
diff --git a/tests/clientapitest.cpp b/tests/clientapitest.cpp
new file mode 100644
index 0000000..7bcd7b0
--- /dev/null
+++ b/tests/clientapitest.cpp
@@ -0,0 +1,151 @@
1#include <QtTest>
2#include <QDebug>
3#include <functional>
4
5#include "clientapi.h"
6#include "facade.h"
7#include "synclistresult.h"
8
9class RevisionNotifier : public QObject
10{
11 Q_OBJECT
12public:
13 RevisionNotifier() : QObject() {};
14 void notify(qint64 revision)
15 {
16 emit revisionChanged(revision);
17 }
18
19Q_SIGNALS:
20 void revisionChanged(qint64);
21};
22
23class DummyResourceFacade : public Akonadi2::StoreFacade<Akonadi2::ApplicationDomain::Event>
24{
25public:
26 ~DummyResourceFacade(){};
27 virtual Async::Job<void> create(const Akonadi2::ApplicationDomain::Event &domainObject){ return Async::null<void>(); };
28 virtual Async::Job<void> modify(const Akonadi2::ApplicationDomain::Event &domainObject){ return Async::null<void>(); };
29 virtual Async::Job<void> remove(const Akonadi2::ApplicationDomain::Event &domainObject){ return Async::null<void>(); };
30 virtual Async::Job<qint64> load(const Akonadi2::Query &query, const std::function<void(const Akonadi2::ApplicationDomain::Event::Ptr &)> &resultCallback)
31 {
32 return Async::start<qint64>([this, resultCallback](Async::Future<qint64> &future) {
33 qDebug() << "load called";
34 for(const auto &result : results) {
35 resultCallback(result);
36 }
37 future.setValue(0);
38 future.setFinished();
39 });
40 }
41
42 Async::Job<void> load(const Akonadi2::Query &query, const QSharedPointer<Akonadi2::ResultProvider<Akonadi2::ApplicationDomain::Event::Ptr> > &resultProvider)
43 {
44 auto runner = QSharedPointer<QueryRunner>::create(query);
45 //The runner only lives as long as the resultProvider
46 resultProvider->setQueryRunner(runner);
47 runner->setQuery([this, resultProvider, query](qint64 oldRevision, qint64 newRevision) -> Async::Job<qint64> {
48 qDebug() << "Creating query for revisions: " << oldRevision << newRevision;
49 return Async::start<qint64>([this, resultProvider, query](Async::Future<qint64> &future) {
50 //TODO only emit changes and don't replace everything
51 resultProvider->clear();
52 //rerun query
53 std::function<void(const Akonadi2::ApplicationDomain::Event::Ptr &)> addCallback = std::bind(&Akonadi2::ResultProvider<Akonadi2::ApplicationDomain::Event::Ptr>::add, resultProvider, std::placeholders::_1);
54 load(query, addCallback).then<void, qint64>([resultProvider, &future](qint64 queriedRevision) {
55 //TODO set revision in result provider?
56 //TODO update all existing results with new revision
57 resultProvider->complete();
58 future.setValue(queriedRevision);
59 future.setFinished();
60 }).exec();
61 });
62 });
63
64 //Ensure the notification is emitted in the right thread
65 //Otherwise we get crashes as we call revisionChanged from the test.
66 if (!notifier) {
67 notifier.reset(new RevisionNotifier);
68 }
69
70 //TODO somehow disconnect as resultNotifier is destroyed. Otherwise we keep the runner alive forever.
71 if (query.liveQuery) {
72 QObject::connect(notifier.data(), &RevisionNotifier::revisionChanged, [runner](qint64 newRevision) {
73 runner->revisionChanged(newRevision);
74 });
75 }
76
77 return Async::start<void>([runner](Async::Future<void> &future) {
78 runner->run().then<void>([&future]() {
79 //TODO if not live query, destroy runner.
80 future.setFinished();
81 }).exec();
82 });
83 }
84
85 QList<Akonadi2::ApplicationDomain::Event::Ptr> results;
86 QSharedPointer<RevisionNotifier> notifier;
87};
88
89class ClientAPITest : public QObject
90{
91 Q_OBJECT
92private Q_SLOTS:
93
94 void initTestCase()
95 {
96 Akonadi2::FacadeFactory::instance().resetFactory();
97 }
98
99 void testLoad()
100 {
101 DummyResourceFacade facade;
102 facade.results << QSharedPointer<Akonadi2::ApplicationDomain::Event>::create("resource", "id", 0, QSharedPointer<Akonadi2::ApplicationDomain::BufferAdaptor>());
103
104 Akonadi2::FacadeFactory::instance().registerFacade<Akonadi2::ApplicationDomain::Event, DummyResourceFacade>("dummyresource",
105 [&facade](bool &externallyManaged) {
106 externallyManaged = true;
107 return &facade;
108 }
109 );
110
111 Akonadi2::Query query;
112 query.resources << "dummyresource";
113 query.liveQuery = false;
114
115 async::SyncListResult<Akonadi2::ApplicationDomain::Event::Ptr> result(Akonadi2::Store::load<Akonadi2::ApplicationDomain::Event>(query));
116 result.exec();
117 QCOMPARE(result.size(), 1);
118 }
119
120 void testLiveQuery()
121 {
122 DummyResourceFacade facade;
123 facade.results << QSharedPointer<Akonadi2::ApplicationDomain::Event>::create("resource", "id", 0, QSharedPointer<Akonadi2::ApplicationDomain::BufferAdaptor>());
124
125 Akonadi2::FacadeFactory::instance().registerFacade<Akonadi2::ApplicationDomain::Event, DummyResourceFacade>("dummyresource",
126 [&facade](bool &externallManage){
127 externallManage = true;
128 return &facade;
129 }
130 );
131
132 Akonadi2::Query query;
133 query.resources << "dummyresource";
134 query.liveQuery = true;
135
136 async::SyncListResult<Akonadi2::ApplicationDomain::Event::Ptr> result(Akonadi2::Store::load<Akonadi2::ApplicationDomain::Event>(query));
137 result.exec();
138 QCOMPARE(result.size(), 1);
139
140 //Enter a second result
141 facade.results << QSharedPointer<Akonadi2::ApplicationDomain::Event>::create("resource", "id2", 0, QSharedPointer<Akonadi2::ApplicationDomain::BufferAdaptor>());
142 qWarning() << &facade;
143 QVERIFY(facade.notifier);
144 facade.notifier->revisionChanged(2);
145 QTRY_COMPARE(result.size(), 2);
146 }
147
148};
149
150QTEST_MAIN(ClientAPITest)
151#include "clientapitest.moc"