#include #include #include #include "clientapi.h" #include "facade.h" #include "synclistresult.h" #include "resourceconfig.h" #include "modelresult.h" #include "resultprovider.h" #include "facadefactory.h" template class DummyResourceFacade : public Akonadi2::StoreFacade { public: static std::shared_ptr > registerFacade() { auto facade = std::make_shared >(); Akonadi2::FacadeFactory::instance().registerFacade >("dummyresource", [facade](const QByteArray &instanceIdentifier) { return facade; } ); return facade; } ~DummyResourceFacade(){}; KAsync::Job create(const T &domainObject) Q_DECL_OVERRIDE { return KAsync::null(); }; KAsync::Job modify(const T &domainObject) Q_DECL_OVERRIDE { return KAsync::null(); }; KAsync::Job remove(const T &domainObject) Q_DECL_OVERRIDE { return KAsync::null(); }; KAsync::Job load(const Akonadi2::Query &query, Akonadi2::ResultProviderInterface &resultProvider) Q_DECL_OVERRIDE { capturedResultProvider = &resultProvider; resultProvider.setFetcher([query, &resultProvider, this](const typename T::Ptr &) { for (const auto &res : results) { qDebug() << "Parent filter " << query.propertyFilter.value("parent").toByteArray() << res->identifier(); if (!query.propertyFilter.contains("parent") || query.propertyFilter.value("parent").toByteArray() == res->getProperty("parent").toByteArray()) { resultProvider.add(res); } } }); return KAsync::null(); } QList results; Akonadi2::ResultProviderInterface *capturedResultProvider; }; /** * Test of the client api implementation. * * This test works with injected dummy facades and thus doesn't write to storage. */ class ClientAPITest : public QObject { Q_OBJECT private Q_SLOTS: void initTestCase() { Akonadi2::FacadeFactory::instance().resetFactory(); ResourceConfig::clear(); } void testLoad() { auto facade = DummyResourceFacade::registerFacade(); facade->results << QSharedPointer::create("resource", "id", 0, QSharedPointer::create()); ResourceConfig::addResource("dummyresource.instance1", "dummyresource"); Akonadi2::Query query; query.resources << "dummyresource.instance1"; query.liveQuery = false; async::SyncListResult result(Akonadi2::Store::load(query)); result.exec(); QCOMPARE(result.size(), 1); } //The query provider is supposed to delete itself void testQueryLifetime() { auto facade = DummyResourceFacade::registerFacade(); facade->results << QSharedPointer::create("resource", "id", 0, QSharedPointer::create()); ResourceConfig::addResource("dummyresource.instance1", "dummyresource"); Akonadi2::Query query; query.resources << "dummyresource.instance1"; query.liveQuery = true; { async::SyncListResult result(Akonadi2::Store::load(query)); result.exec(); QCOMPARE(result.size(), 1); } //It's running in a separate thread, so we have to wait for a moment until the query provider deletes itself. // QTRY_VERIFY(!facade->capturedResultProvider); } //TODO: This test doesn't belong to this testsuite void resourceManagement() { ResourceConfig::clear(); Akonadi2::FacadeFactory::instance().registerStaticFacades(); Akonadi2::ApplicationDomain::AkonadiResource res; res.setProperty("identifier", "dummyresource.identifier1"); res.setProperty("type", "dummyresource"); Akonadi2::Store::create(res).exec().waitForFinished(); { Akonadi2::Query query; query.propertyFilter.insert("type", "dummyresource"); async::SyncListResult result(Akonadi2::Store::load(query)); result.exec(); QCOMPARE(result.size(), 1); } Akonadi2::Store::remove(res).exec().waitForFinished(); { Akonadi2::Query query; query.propertyFilter.insert("type", "dummyresource"); async::SyncListResult result(Akonadi2::Store::load(query)); result.exec(); QCOMPARE(result.size(), 0); } } void testModelSingle() { auto facade = DummyResourceFacade::registerFacade(); facade->results << QSharedPointer::create("resource", "id", 0, QSharedPointer::create()); ResourceConfig::addResource("dummyresource.instance1", "dummyresource"); Akonadi2::Query query; query.resources << "dummyresource.instance1"; query.liveQuery = false; auto model = Akonadi2::Store::loadModel(query); model->fetchMore(QModelIndex()); QTRY_COMPARE(model->rowCount(), 1); } void testModelNested() { auto facade = DummyResourceFacade::registerFacade(); auto folder = QSharedPointer::create("resource", "id", 0, QSharedPointer::create()); auto subfolder = QSharedPointer::create("resource", "subId", 0, QSharedPointer::create()); subfolder->setProperty("parent", "id"); facade->results << folder << subfolder; ResourceConfig::addResource("dummyresource.instance1", "dummyresource"); //Test Akonadi2::Query query; query.resources << "dummyresource.instance1"; query.liveQuery = false; auto model = Akonadi2::Store::loadModel(query); model->fetchMore(QModelIndex()); QTRY_COMPARE(model->rowCount(), 1); model->fetchMore(model->index(0, 0)); QTRY_COMPARE(model->rowCount(model->index(0, 0)), 1); } // void testModelNestedLive() // { // auto facade = DummyResourceFacade::registerFacade(); // auto folder = QSharedPointer::create("resource", "id", 0, QSharedPointer::create()); // auto subfolder = QSharedPointer::create("resource", "subId", 0, QSharedPointer::create()); // subfolder->setProperty("parent", "id"); // facade->results << folder << subfolder; // ResourceConfig::addResource("dummyresource.instance1", "dummyresource"); // // //Test // Akonadi2::Query query; // query.resources << "dummyresource.instance1"; // query.liveQuery = true // // auto model = new ModelResult(query, QList() << "summary" << "uid"); // model->fetchMore(QModelIndex()); // QTRY_COMPARE(model->rowCount(), 1); // model->fetchMore(model->index(0, 0)); // QTRY_COMPARE(model->rowCount(model->index(0, 0)), 1); // // auto resultProvider = facade->capturedResultProvider.toStrongRef(); // // //A modification can also be a move // // resultProvider->modify(); // // // resultProvider->remove(); // } }; QTEST_MAIN(ClientAPITest) #include "clientapitest.moc"