summaryrefslogtreecommitdiffstats
path: root/tests/clientapitest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/clientapitest.cpp')
-rw-r--r--tests/clientapitest.cpp76
1 files changed, 40 insertions, 36 deletions
diff --git a/tests/clientapitest.cpp b/tests/clientapitest.cpp
index 879ffc4..172232f 100644
--- a/tests/clientapitest.cpp
+++ b/tests/clientapitest.cpp
@@ -13,34 +13,41 @@ template <typename T>
13class DummyResourceFacade : public Sink::StoreFacade<T> 13class DummyResourceFacade : public Sink::StoreFacade<T>
14{ 14{
15public: 15public:
16 static std::shared_ptr<DummyResourceFacade<T> > registerFacade(const QByteArray &instanceIdentifier = QByteArray()) 16 static std::shared_ptr<DummyResourceFacade<T>> registerFacade(const QByteArray &instanceIdentifier = QByteArray())
17 { 17 {
18 static QMap<QByteArray, std::shared_ptr<DummyResourceFacade<T> > > map; 18 static QMap<QByteArray, std::shared_ptr<DummyResourceFacade<T>>> map;
19 auto facade = std::make_shared<DummyResourceFacade<T> >(); 19 auto facade = std::make_shared<DummyResourceFacade<T>>();
20 map.insert(instanceIdentifier, facade); 20 map.insert(instanceIdentifier, facade);
21 bool alwaysReturnFacade = instanceIdentifier.isEmpty(); 21 bool alwaysReturnFacade = instanceIdentifier.isEmpty();
22 Sink::FacadeFactory::instance().registerFacade<T, DummyResourceFacade<T> >("dummyresource", 22 Sink::FacadeFactory::instance().registerFacade<T, DummyResourceFacade<T>>("dummyresource", [alwaysReturnFacade](const QByteArray &instanceIdentifier) {
23 [alwaysReturnFacade](const QByteArray &instanceIdentifier) { 23 if (alwaysReturnFacade) {
24 if (alwaysReturnFacade) { 24 return map.value(QByteArray());
25 return map.value(QByteArray());
26 }
27 return map.value(instanceIdentifier);
28 } 25 }
29 ); 26 return map.value(instanceIdentifier);
27 });
30 return facade; 28 return facade;
31 } 29 }
32 ~DummyResourceFacade(){}; 30 ~DummyResourceFacade(){};
33 KAsync::Job<void> create(const T &domainObject) Q_DECL_OVERRIDE { return KAsync::null<void>(); }; 31 KAsync::Job<void> create(const T &domainObject) Q_DECL_OVERRIDE
34 KAsync::Job<void> modify(const T &domainObject) Q_DECL_OVERRIDE { return KAsync::null<void>(); }; 32 {
35 KAsync::Job<void> remove(const T &domainObject) Q_DECL_OVERRIDE { return KAsync::null<void>(); }; 33 return KAsync::null<void>();
36 QPair<KAsync::Job<void>, typename Sink::ResultEmitter<typename T::Ptr>::Ptr > load(const Sink::Query &query) Q_DECL_OVERRIDE 34 };
35 KAsync::Job<void> modify(const T &domainObject) Q_DECL_OVERRIDE
36 {
37 return KAsync::null<void>();
38 };
39 KAsync::Job<void> remove(const T &domainObject) Q_DECL_OVERRIDE
40 {
41 return KAsync::null<void>();
42 };
43 QPair<KAsync::Job<void>, typename Sink::ResultEmitter<typename T::Ptr>::Ptr> load(const Sink::Query &query) Q_DECL_OVERRIDE
37 { 44 {
38 auto resultProvider = new Sink::ResultProvider<typename T::Ptr>(); 45 auto resultProvider = new Sink::ResultProvider<typename T::Ptr>();
39 resultProvider->onDone([resultProvider]() { 46 resultProvider->onDone([resultProvider]() {
40 Trace() << "Result provider is done"; 47 Trace() << "Result provider is done";
41 delete resultProvider; 48 delete resultProvider;
42 }); 49 });
43 //We have to do it this way, otherwise we're not setting the fetcher right 50 // We have to do it this way, otherwise we're not setting the fetcher right
44 auto emitter = resultProvider->emitter(); 51 auto emitter = resultProvider->emitter();
45 52
46 resultProvider->setFetcher([query, resultProvider, this](const typename T::Ptr &parent) { 53 resultProvider->setFetcher([query, resultProvider, this](const typename T::Ptr &parent) {
@@ -60,8 +67,7 @@ public:
60 } 67 }
61 resultProvider->initialResultSetComplete(parent); 68 resultProvider->initialResultSetComplete(parent);
62 }); 69 });
63 auto job = KAsync::start<void>([query, resultProvider]() { 70 auto job = KAsync::start<void>([query, resultProvider]() {});
64 });
65 mResultProvider = resultProvider; 71 mResultProvider = resultProvider;
66 return qMakePair(job, emitter); 72 return qMakePair(job, emitter);
67 } 73 }
@@ -73,7 +79,7 @@ public:
73 79
74/** 80/**
75 * Test of the client api implementation. 81 * Test of the client api implementation.
76 * 82 *
77 * This test works with injected dummy facades and thus doesn't write to storage. 83 * This test works with injected dummy facades and thus doesn't write to storage.
78 */ 84 */
79class ClientAPITest : public QObject 85class ClientAPITest : public QObject
@@ -113,7 +119,7 @@ private slots:
113 QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); 119 QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool());
114 } 120 }
115 121
116 //TODO: This test doesn't belong to this testsuite 122 // TODO: This test doesn't belong to this testsuite
117 void resourceManagement() 123 void resourceManagement()
118 { 124 {
119 ResourceConfig::clear(); 125 ResourceConfig::clear();
@@ -158,13 +164,13 @@ private slots:
158 void testModelNested() 164 void testModelNested()
159 { 165 {
160 auto facade = DummyResourceFacade<Sink::ApplicationDomain::Folder>::registerFacade(); 166 auto facade = DummyResourceFacade<Sink::ApplicationDomain::Folder>::registerFacade();
161 auto folder = QSharedPointer<Sink::ApplicationDomain::Folder>::create("resource", "id", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create()); 167 auto folder = QSharedPointer<Sink::ApplicationDomain::Folder>::create("resource", "id", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());
162 auto subfolder = QSharedPointer<Sink::ApplicationDomain::Folder>::create("resource", "subId", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create()); 168 auto subfolder = QSharedPointer<Sink::ApplicationDomain::Folder>::create("resource", "subId", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());
163 subfolder->setProperty("parent", "id"); 169 subfolder->setProperty("parent", "id");
164 facade->results << folder << subfolder; 170 facade->results << folder << subfolder;
165 ResourceConfig::addResource("dummyresource.instance1", "dummyresource"); 171 ResourceConfig::addResource("dummyresource.instance1", "dummyresource");
166 172
167 //Test 173 // Test
168 Sink::Query query; 174 Sink::Query query;
169 query.resources << "dummyresource.instance1"; 175 query.resources << "dummyresource.instance1";
170 query.liveQuery = false; 176 query.liveQuery = false;
@@ -181,13 +187,13 @@ private slots:
181 void testModelSignals() 187 void testModelSignals()
182 { 188 {
183 auto facade = DummyResourceFacade<Sink::ApplicationDomain::Folder>::registerFacade(); 189 auto facade = DummyResourceFacade<Sink::ApplicationDomain::Folder>::registerFacade();
184 auto folder = QSharedPointer<Sink::ApplicationDomain::Folder>::create("resource", "id", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create()); 190 auto folder = QSharedPointer<Sink::ApplicationDomain::Folder>::create("resource", "id", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());
185 auto subfolder = QSharedPointer<Sink::ApplicationDomain::Folder>::create("resource", "subId", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create()); 191 auto subfolder = QSharedPointer<Sink::ApplicationDomain::Folder>::create("resource", "subId", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());
186 subfolder->setProperty("parent", "id"); 192 subfolder->setProperty("parent", "id");
187 facade->results << folder << subfolder; 193 facade->results << folder << subfolder;
188 ResourceConfig::addResource("dummyresource.instance1", "dummyresource"); 194 ResourceConfig::addResource("dummyresource.instance1", "dummyresource");
189 195
190 //Test 196 // Test
191 Sink::Query query; 197 Sink::Query query;
192 query.resources << "dummyresource.instance1"; 198 query.resources << "dummyresource.instance1";
193 query.liveQuery = false; 199 query.liveQuery = false;
@@ -203,13 +209,14 @@ private slots:
203 void testModelNestedLive() 209 void testModelNestedLive()
204 { 210 {
205 auto facade = DummyResourceFacade<Sink::ApplicationDomain::Folder>::registerFacade(); 211 auto facade = DummyResourceFacade<Sink::ApplicationDomain::Folder>::registerFacade();
206 auto folder = QSharedPointer<Sink::ApplicationDomain::Folder>::create("dummyresource.instance1", "id", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create()); 212 auto folder = QSharedPointer<Sink::ApplicationDomain::Folder>::create("dummyresource.instance1", "id", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());
207 auto subfolder = QSharedPointer<Sink::ApplicationDomain::Folder>::create("dummyresource.instance1", "subId", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create()); 213 auto subfolder =
214 QSharedPointer<Sink::ApplicationDomain::Folder>::create("dummyresource.instance1", "subId", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());
208 subfolder->setProperty("parent", "id"); 215 subfolder->setProperty("parent", "id");
209 facade->results << folder << subfolder; 216 facade->results << folder << subfolder;
210 ResourceConfig::addResource("dummyresource.instance1", "dummyresource"); 217 ResourceConfig::addResource("dummyresource.instance1", "dummyresource");
211 218
212 //Test 219 // Test
213 Sink::Query query; 220 Sink::Query query;
214 query.resources << "dummyresource.instance1"; 221 query.resources << "dummyresource.instance1";
215 query.liveQuery = true; 222 query.liveQuery = true;
@@ -222,7 +229,7 @@ private slots:
222 229
223 auto resultProvider = facade->mResultProvider; 230 auto resultProvider = facade->mResultProvider;
224 231
225 //Test new toplevel folder 232 // Test new toplevel folder
226 { 233 {
227 QSignalSpy rowsInsertedSpy(model.data(), SIGNAL(rowsInserted(const QModelIndex &, int, int))); 234 QSignalSpy rowsInsertedSpy(model.data(), SIGNAL(rowsInserted(const QModelIndex &, int, int)));
228 auto folder2 = QSharedPointer<Sink::ApplicationDomain::Folder>::create("resource", "id2", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create()); 235 auto folder2 = QSharedPointer<Sink::ApplicationDomain::Folder>::create("resource", "id2", 0, QSharedPointer<Sink::ApplicationDomain::MemoryBufferAdaptor>::create());
@@ -232,7 +239,7 @@ private slots:
232 QCOMPARE(rowsInsertedSpy.at(0).at(0).value<QModelIndex>(), QModelIndex()); 239 QCOMPARE(rowsInsertedSpy.at(0).at(0).value<QModelIndex>(), QModelIndex());
233 } 240 }
234 241
235 //Test changed name 242 // Test changed name
236 { 243 {
237 QSignalSpy dataChanged(model.data(), SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &, const QVector<int> &))); 244 QSignalSpy dataChanged(model.data(), SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &, const QVector<int> &)));
238 folder->setProperty("subject", "modifiedSubject"); 245 folder->setProperty("subject", "modifiedSubject");
@@ -241,7 +248,7 @@ private slots:
241 QTRY_COMPARE(dataChanged.count(), 1); 248 QTRY_COMPARE(dataChanged.count(), 1);
242 } 249 }
243 250
244 //Test removal 251 // Test removal
245 { 252 {
246 QSignalSpy rowsRemovedSpy(model.data(), SIGNAL(rowsRemoved(const QModelIndex &, int, int))); 253 QSignalSpy rowsRemovedSpy(model.data(), SIGNAL(rowsRemoved(const QModelIndex &, int, int)));
247 folder->setProperty("subject", "modifiedSubject"); 254 folder->setProperty("subject", "modifiedSubject");
@@ -250,7 +257,7 @@ private slots:
250 QTRY_COMPARE(rowsRemovedSpy.count(), 1); 257 QTRY_COMPARE(rowsRemovedSpy.count(), 1);
251 } 258 }
252 259
253 //TODO: A modification can also be a move 260 // TODO: A modification can also be a move
254 } 261 }
255 262
256 void testLoadMultiResource() 263 void testLoadMultiResource()
@@ -274,7 +281,7 @@ private slots:
274 }); 281 });
275 QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); 282 QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool());
276 QCOMPARE(model->rowCount(QModelIndex()), 2); 283 QCOMPARE(model->rowCount(QModelIndex()), 2);
277 //Ensure children fetched is only emitted once (when all resources are done) 284 // Ensure children fetched is only emitted once (when all resources are done)
278 QTest::qWait(50); 285 QTest::qWait(50);
279 QCOMPARE(childrenFetchedCount, 1); 286 QCOMPARE(childrenFetchedCount, 1);
280 } 287 }
@@ -291,15 +298,12 @@ private slots:
291 298
292 bool gotValue = false; 299 bool gotValue = false;
293 auto result = Sink::Store::fetchOne<Sink::ApplicationDomain::Event>(query) 300 auto result = Sink::Store::fetchOne<Sink::ApplicationDomain::Event>(query)
294 .then<void, Sink::ApplicationDomain::Event>([&gotValue](const Sink::ApplicationDomain::Event &event) { 301 .then<void, Sink::ApplicationDomain::Event>([&gotValue](const Sink::ApplicationDomain::Event &event) { gotValue = true; })
295 gotValue = true; 302 .exec();
296 }).exec();
297 result.waitForFinished(); 303 result.waitForFinished();
298 QVERIFY(!result.errorCode()); 304 QVERIFY(!result.errorCode());
299 QVERIFY(gotValue); 305 QVERIFY(gotValue);
300 } 306 }
301
302
303}; 307};
304 308
305QTEST_MAIN(ClientAPITest) 309QTEST_MAIN(ClientAPITest)