From 10d19014fe2c9c02f2bc3e19732cbe340e316076 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 10 Nov 2015 12:05:39 +0100 Subject: A result model The result model drives the data retrieval and provides the interace for consumers --- tests/clientapitest.cpp | 117 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 94 insertions(+), 23 deletions(-) (limited to 'tests/clientapitest.cpp') diff --git a/tests/clientapitest.cpp b/tests/clientapitest.cpp index 665d29b..5bfad4b 100644 --- a/tests/clientapitest.cpp +++ b/tests/clientapitest.cpp @@ -6,28 +6,45 @@ #include "facade.h" #include "synclistresult.h" #include "resourceconfig.h" +#include "modelresult.h" +#include "resultprovider.h" -class DummyResourceFacade : public Akonadi2::StoreFacade +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 Akonadi2::ApplicationDomain::Event &domainObject) Q_DECL_OVERRIDE { return KAsync::null(); }; - KAsync::Job modify(const Akonadi2::ApplicationDomain::Event &domainObject) Q_DECL_OVERRIDE { return KAsync::null(); }; - KAsync::Job remove(const Akonadi2::ApplicationDomain::Event &domainObject) Q_DECL_OVERRIDE { return KAsync::null(); }; - KAsync::Job load(const Akonadi2::Query &query, const QSharedPointer > &resultProvider) Q_DECL_OVERRIDE + 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, const QSharedPointer > &resultProvider) Q_DECL_OVERRIDE { capturedResultProvider = resultProvider; return KAsync::start([this, resultProvider, query]() { for (const auto &res : results) { - resultProvider->add(res); + 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); + } } }); } - QList results; - QWeakPointer > capturedResultProvider; + QList results; + QWeakPointer > capturedResultProvider; }; + /** * Test of the client api implementation. * @@ -38,17 +55,6 @@ class ClientAPITest : public QObject Q_OBJECT private Q_SLOTS: - static std::shared_ptr registerDummyFacade() - { - auto facade = std::make_shared(); - Akonadi2::FacadeFactory::instance().registerFacade("dummyresource", - [facade](const QByteArray &instanceIdentifier) { - return facade; - } - ); - return facade; - } - void initTestCase() { Akonadi2::FacadeFactory::instance().resetFactory(); @@ -57,8 +63,8 @@ private Q_SLOTS: void testLoad() { - auto facade = registerDummyFacade(); - facade->results << QSharedPointer::create("resource", "id", 0, QSharedPointer()); + auto facade = DummyResourceFacade::registerFacade(); + facade->results << QSharedPointer::create("resource", "id", 0, QSharedPointer::create()); ResourceConfig::addResource("dummyresource.instance1", "dummyresource"); Akonadi2::Query query; @@ -73,8 +79,8 @@ private Q_SLOTS: //The query provider is supposed to delete itself void testQueryLifetime() { - auto facade = registerDummyFacade(); - facade->results << QSharedPointer::create("resource", "id", 0, QSharedPointer()); + auto facade = DummyResourceFacade::registerFacade(); + facade->results << QSharedPointer::create("resource", "id", 0, QSharedPointer::create()); ResourceConfig::addResource("dummyresource.instance1", "dummyresource"); Akonadi2::Query query; @@ -119,6 +125,71 @@ private Q_SLOTS: } } + 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 = new ModelResult(query, QList() << "summary" << "uid"); + 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 = 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); + } + + // 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) -- cgit v1.2.3 From 09aafbd1373b5d1152ac7a453a140a7f76c2e90e Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Fri, 13 Nov 2015 19:34:47 +0100 Subject: It's starting to work --- tests/clientapitest.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'tests/clientapitest.cpp') diff --git a/tests/clientapitest.cpp b/tests/clientapitest.cpp index 5bfad4b..2b3cc46 100644 --- a/tests/clientapitest.cpp +++ b/tests/clientapitest.cpp @@ -27,7 +27,7 @@ public: 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, const QSharedPointer > &resultProvider) Q_DECL_OVERRIDE + KAsync::Job load(const Akonadi2::Query &query, const QSharedPointer > &resultProvider) Q_DECL_OVERRIDE { capturedResultProvider = resultProvider; return KAsync::start([this, resultProvider, query]() { @@ -41,7 +41,7 @@ public: } QList results; - QWeakPointer > capturedResultProvider; + QWeakPointer > capturedResultProvider; }; -- cgit v1.2.3 From ec902175d53d371b03d8e754d917e196cd15aafa Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sun, 15 Nov 2015 09:46:27 +0100 Subject: Fixed clientapitest --- tests/clientapitest.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'tests/clientapitest.cpp') diff --git a/tests/clientapitest.cpp b/tests/clientapitest.cpp index 2b3cc46..2ce64d3 100644 --- a/tests/clientapitest.cpp +++ b/tests/clientapitest.cpp @@ -30,14 +30,15 @@ public: KAsync::Job load(const Akonadi2::Query &query, const QSharedPointer > &resultProvider) Q_DECL_OVERRIDE { capturedResultProvider = resultProvider; - return KAsync::start([this, resultProvider, query]() { - for (const auto &res : results) { + resultProvider->setFetcher([query, resultProvider, this](const QByteArray &) { + 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; @@ -135,7 +136,7 @@ private Q_SLOTS: query.resources << "dummyresource.instance1"; query.liveQuery = false; - auto model = new ModelResult(query, QList() << "summary" << "uid"); + auto model = Akonadi2::Store::loadModel(query); model->fetchMore(QModelIndex()); QTRY_COMPARE(model->rowCount(), 1); } @@ -154,7 +155,7 @@ private Q_SLOTS: query.resources << "dummyresource.instance1"; query.liveQuery = false; - auto model = new ModelResult(query, QList() << "summary" << "uid"); + auto model = Akonadi2::Store::loadModel(query); model->fetchMore(QModelIndex()); QTRY_COMPARE(model->rowCount(), 1); model->fetchMore(model->index(0, 0)); -- cgit v1.2.3 From 0f24357d01bd8a278f03793db863d3f71ac37ef2 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 18 Nov 2015 00:51:55 +0100 Subject: Don't use a smart pointer for the result provider We're not doing any lifetime management anyways. --- tests/clientapitest.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'tests/clientapitest.cpp') diff --git a/tests/clientapitest.cpp b/tests/clientapitest.cpp index 2ce64d3..9202e29 100644 --- a/tests/clientapitest.cpp +++ b/tests/clientapitest.cpp @@ -27,14 +27,14 @@ public: 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, const QSharedPointer > &resultProvider) Q_DECL_OVERRIDE + KAsync::Job load(const Akonadi2::Query &query, Akonadi2::ResultProviderInterface &resultProvider) Q_DECL_OVERRIDE { - capturedResultProvider = resultProvider; - resultProvider->setFetcher([query, resultProvider, this](const QByteArray &) { + capturedResultProvider = &resultProvider; + resultProvider.setFetcher([query, &resultProvider, this](const QByteArray &) { 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); + resultProvider.add(res); } } }); @@ -42,7 +42,7 @@ public: } QList results; - QWeakPointer > capturedResultProvider; + Akonadi2::ResultProviderInterface *capturedResultProvider; }; @@ -94,7 +94,7 @@ private Q_SLOTS: 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); + // QTRY_VERIFY(!facade->capturedResultProvider); } //TODO: This test doesn't belong to this testsuite -- cgit v1.2.3 From c4a6746e4420b580fe35cc89783de4dbc3205ac6 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 19 Nov 2015 18:14:09 +0100 Subject: The parent is always an object, so we might as well make that explicit --- tests/clientapitest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests/clientapitest.cpp') diff --git a/tests/clientapitest.cpp b/tests/clientapitest.cpp index 9202e29..ce11221 100644 --- a/tests/clientapitest.cpp +++ b/tests/clientapitest.cpp @@ -30,7 +30,7 @@ public: KAsync::Job load(const Akonadi2::Query &query, Akonadi2::ResultProviderInterface &resultProvider) Q_DECL_OVERRIDE { capturedResultProvider = &resultProvider; - resultProvider.setFetcher([query, &resultProvider, this](const QByteArray &) { + 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()) { -- cgit v1.2.3 From 0b967e06a1a50c1f540b941d381680cdf3ac4706 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sat, 21 Nov 2015 02:29:35 +0100 Subject: Fixed build --- tests/clientapitest.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'tests/clientapitest.cpp') diff --git a/tests/clientapitest.cpp b/tests/clientapitest.cpp index ce11221..4883b5e 100644 --- a/tests/clientapitest.cpp +++ b/tests/clientapitest.cpp @@ -8,6 +8,7 @@ #include "resourceconfig.h" #include "modelresult.h" #include "resultprovider.h" +#include "facadefactory.h" template class DummyResourceFacade : public Akonadi2::StoreFacade -- cgit v1.2.3 From 5b41b26a349967acf2197f9f9228526193fd826e Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Fri, 27 Nov 2015 17:30:04 +0100 Subject: Introduced a QueryRunner object The QueryRunner object lives for the duration of the query (so just for the initial query for non-live queries, and for the lifetime of the result model for live queries). It's supposed to handle all the threading internally and decouple the lifetime of the facade. --- tests/clientapitest.cpp | 86 +++++++++++++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 35 deletions(-) (limited to 'tests/clientapitest.cpp') diff --git a/tests/clientapitest.cpp b/tests/clientapitest.cpp index 4883b5e..d76fac8 100644 --- a/tests/clientapitest.cpp +++ b/tests/clientapitest.cpp @@ -4,7 +4,6 @@ #include "clientapi.h" #include "facade.h" -#include "synclistresult.h" #include "resourceconfig.h" #include "modelresult.h" #include "resultprovider.h" @@ -28,22 +27,35 @@ public: 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 + QPair, typename Akonadi2::ResultEmitter::Ptr > load(const Akonadi2::Query &query) Q_DECL_OVERRIDE { - capturedResultProvider = &resultProvider; - resultProvider.setFetcher([query, &resultProvider, this](const typename T::Ptr &) { - for (const auto &res : results) { + // capturedResultProvider = &resultProvider; + Trace() << "lkjsdflkjsdfljsdfljsdlfj"; + + auto resultProvider = new Akonadi2::ResultProvider(); + resultProvider->onDone([resultProvider]() { + Trace() << "Result provider is done"; + delete resultProvider; + }); + //We have to do it this way, otherwise we're not setting the fetcher right + auto emitter = resultProvider->emitter(); + + resultProvider->setFetcher([query, resultProvider, this](const typename T::Ptr &) { + Trace() << "Running the fetcher"; + 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); + resultProvider->add(res); } } }); - return KAsync::null(); + auto job = KAsync::start([query, resultProvider]() { + }); + return qMakePair(job, emitter); } QList results; - Akonadi2::ResultProviderInterface *capturedResultProvider; + // Akonadi2::ResultProviderInterface *capturedResultProvider; }; @@ -61,24 +73,25 @@ private Q_SLOTS: { Akonadi2::FacadeFactory::instance().resetFactory(); ResourceConfig::clear(); + Akonadi2::Log::setDebugOutputLevel(Akonadi2::Log::Trace); } - 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 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(); @@ -90,12 +103,12 @@ private Q_SLOTS: query.liveQuery = true; { - async::SyncListResult result(Akonadi2::Store::load(query)); - result.exec(); - QCOMPARE(result.size(), 1); + auto model = Akonadi2::Store::loadModel(query); + QTRY_COMPARE(model->rowCount(QModelIndex()), 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); + QTest::qWait(300); } //TODO: This test doesn't belong to this testsuite @@ -112,18 +125,22 @@ private Q_SLOTS: { Akonadi2::Query query; query.propertyFilter.insert("type", "dummyresource"); - async::SyncListResult result(Akonadi2::Store::load(query)); - result.exec(); - QCOMPARE(result.size(), 1); + // async::SyncListResult result(Akonadi2::Store::load(query)); + auto model = Akonadi2::Store::loadModel(query); + // result.exec(); + QTRY_COMPARE(model->rowCount(QModelIndex()), 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); + // async::SyncListResult result(Akonadi2::Store::load(query)); + auto model = Akonadi2::Store::loadModel(query); + // result.exec(); + // QCOMPARE(result.size(), 0); + // QTRY_COMPARE(result.size(), 0); + QTRY_COMPARE(model->rowCount(QModelIndex()), 0); } } @@ -138,7 +155,6 @@ private Q_SLOTS: query.liveQuery = false; auto model = Akonadi2::Store::loadModel(query); - model->fetchMore(QModelIndex()); QTRY_COMPARE(model->rowCount(), 1); } @@ -155,9 +171,9 @@ private Q_SLOTS: Akonadi2::Query query; query.resources << "dummyresource.instance1"; query.liveQuery = false; + query.parentProperty = "parent"; 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); -- cgit v1.2.3 From 088d8a40c195ce6dcb91556a17f69d26e5586a3e Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sat, 28 Nov 2015 12:48:43 +0100 Subject: Removed most uses of SyncListResult and brought back the dummyresourcetest --- tests/clientapitest.cpp | 90 +++++++++++++++++++++++-------------------------- 1 file changed, 42 insertions(+), 48 deletions(-) (limited to 'tests/clientapitest.cpp') diff --git a/tests/clientapitest.cpp b/tests/clientapitest.cpp index d76fac8..e97b2a4 100644 --- a/tests/clientapitest.cpp +++ b/tests/clientapitest.cpp @@ -76,21 +76,20 @@ private Q_SLOTS: Akonadi2::Log::setDebugOutputLevel(Akonadi2::Log::Trace); } - // 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); - // } - // + 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; + + auto model = Akonadi2::Store::loadModel(query); + QTRY_COMPARE(model->rowCount(QModelIndex()), 1); + } + // //The query provider is supposed to delete itself void testQueryLifetime() { @@ -125,9 +124,7 @@ private Q_SLOTS: { Akonadi2::Query query; query.propertyFilter.insert("type", "dummyresource"); - // async::SyncListResult result(Akonadi2::Store::load(query)); auto model = Akonadi2::Store::loadModel(query); - // result.exec(); QTRY_COMPARE(model->rowCount(QModelIndex()), 1); } @@ -135,11 +132,8 @@ private Q_SLOTS: { Akonadi2::Query query; query.propertyFilter.insert("type", "dummyresource"); - // async::SyncListResult result(Akonadi2::Store::load(query)); auto model = Akonadi2::Store::loadModel(query); - // result.exec(); - // QCOMPARE(result.size(), 0); - // QTRY_COMPARE(result.size(), 0); + //TODO ensure the initial query completed QTRY_COMPARE(model->rowCount(QModelIndex()), 0); } } @@ -179,33 +173,33 @@ private Q_SLOTS: 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(); - // } + 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; + query.parentProperty = "parent"; + + auto model = Akonadi2::Store::loadModel(query); + 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(); + } }; -- cgit v1.2.3 From f715898a1b6781e2860727942ce510f324a23c71 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Mon, 30 Nov 2015 10:32:41 +0100 Subject: Test model signals --- tests/clientapitest.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'tests/clientapitest.cpp') diff --git a/tests/clientapitest.cpp b/tests/clientapitest.cpp index e97b2a4..bd1cccd 100644 --- a/tests/clientapitest.cpp +++ b/tests/clientapitest.cpp @@ -173,6 +173,28 @@ private Q_SLOTS: QTRY_COMPARE(model->rowCount(model->index(0, 0)), 1); } + void testModelSignals() + { + 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; + query.parentProperty = "parent"; + + auto model = Akonadi2::Store::loadModel(query); + QSignalSpy spy(model.data(), SIGNAL(rowsInserted(const QModelIndex &, int, int))); + QVERIFY(spy.isValid()); + model->fetchMore(model->index(0, 0)); + QTRY_VERIFY(spy.count() >= 1); + } + void testModelNestedLive() { auto facade = DummyResourceFacade::registerFacade(); -- cgit v1.2.3 From 32a6d2f881bb6d12a4ab685b7bb3fb10c3bdf72c Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Mon, 30 Nov 2015 11:41:09 +0100 Subject: Use the ChildrenFetchedRole --- tests/clientapitest.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'tests/clientapitest.cpp') diff --git a/tests/clientapitest.cpp b/tests/clientapitest.cpp index bd1cccd..5d8cd9f 100644 --- a/tests/clientapitest.cpp +++ b/tests/clientapitest.cpp @@ -30,7 +30,6 @@ public: QPair, typename Akonadi2::ResultEmitter::Ptr > load(const Akonadi2::Query &query) Q_DECL_OVERRIDE { // capturedResultProvider = &resultProvider; - Trace() << "lkjsdflkjsdfljsdfljsdlfj"; auto resultProvider = new Akonadi2::ResultProvider(); resultProvider->onDone([resultProvider]() { @@ -40,7 +39,7 @@ public: //We have to do it this way, otherwise we're not setting the fetcher right auto emitter = resultProvider->emitter(); - resultProvider->setFetcher([query, resultProvider, this](const typename T::Ptr &) { + resultProvider->setFetcher([query, resultProvider, this](const typename T::Ptr &parent) { Trace() << "Running the fetcher"; for (const auto &res : results) { qDebug() << "Parent filter " << query.propertyFilter.value("parent").toByteArray() << res->identifier(); @@ -48,6 +47,7 @@ public: resultProvider->add(res); } } + resultProvider->initialResultSetComplete(parent); }); auto job = KAsync::start([query, resultProvider]() { }); @@ -87,7 +87,8 @@ private Q_SLOTS: query.liveQuery = false; auto model = Akonadi2::Store::loadModel(query); - QTRY_COMPARE(model->rowCount(QModelIndex()), 1); + QTRY_VERIFY(model->data(QModelIndex(), Akonadi2::Store::ChildrenFetchedRole).toBool()); + QCOMPARE(model->rowCount(QModelIndex()), 1); } // //The query provider is supposed to delete itself @@ -168,9 +169,11 @@ private Q_SLOTS: query.parentProperty = "parent"; auto model = Akonadi2::Store::loadModel(query); - QTRY_COMPARE(model->rowCount(), 1); + QTRY_VERIFY(model->data(QModelIndex(), Akonadi2::Store::ChildrenFetchedRole).toBool()); + QCOMPARE(model->rowCount(), 1); model->fetchMore(model->index(0, 0)); - QTRY_COMPARE(model->rowCount(model->index(0, 0)), 1); + QTRY_VERIFY(model->data(model->index(0, 0), Akonadi2::Store::ChildrenFetchedRole).toBool()); + QCOMPARE(model->rowCount(model->index(0, 0)), 1); } void testModelSignals() -- cgit v1.2.3 From 0c744f0f14836ee70ca675135a9ca4cef080baa3 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Mon, 30 Nov 2015 15:58:56 +0100 Subject: Test modifications --- tests/clientapitest.cpp | 62 ++++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 29 deletions(-) (limited to 'tests/clientapitest.cpp') diff --git a/tests/clientapitest.cpp b/tests/clientapitest.cpp index 5d8cd9f..8f956ab 100644 --- a/tests/clientapitest.cpp +++ b/tests/clientapitest.cpp @@ -29,8 +29,6 @@ public: KAsync::Job remove(const T &domainObject) Q_DECL_OVERRIDE { return KAsync::null(); }; QPair, typename Akonadi2::ResultEmitter::Ptr > load(const Akonadi2::Query &query) Q_DECL_OVERRIDE { - // capturedResultProvider = &resultProvider; - auto resultProvider = new Akonadi2::ResultProvider(); resultProvider->onDone([resultProvider]() { Trace() << "Result provider is done"; @@ -51,11 +49,12 @@ public: }); auto job = KAsync::start([query, resultProvider]() { }); + mResultProvider = resultProvider; return qMakePair(job, emitter); } QList results; - // Akonadi2::ResultProviderInterface *capturedResultProvider; + Akonadi2::ResultProviderInterface *mResultProvider; }; @@ -91,26 +90,6 @@ private Q_SLOTS: QCOMPARE(model->rowCount(QModelIndex()), 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; - - { - auto model = Akonadi2::Store::loadModel(query); - QTRY_COMPARE(model->rowCount(QModelIndex()), 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); - QTest::qWait(300); - } - //TODO: This test doesn't belong to this testsuite void resourceManagement() { @@ -134,8 +113,8 @@ private Q_SLOTS: Akonadi2::Query query; query.propertyFilter.insert("type", "dummyresource"); auto model = Akonadi2::Store::loadModel(query); - //TODO ensure the initial query completed - QTRY_COMPARE(model->rowCount(QModelIndex()), 0); + QTRY_VERIFY(model->data(QModelIndex(), Akonadi2::Store::ChildrenFetchedRole).toBool()); + QCOMPARE(model->rowCount(QModelIndex()), 0); } } @@ -218,12 +197,37 @@ private Q_SLOTS: model->fetchMore(model->index(0, 0)); QTRY_COMPARE(model->rowCount(model->index(0, 0)), 1); - // auto resultProvider = facade->capturedResultProvider.toStrongRef(); + auto resultProvider = facade->mResultProvider; + + //Test new toplevel folder + { + QSignalSpy rowsInsertedSpy(model.data(), SIGNAL(rowsInserted(const QModelIndex &, int, int))); + auto folder2 = QSharedPointer::create("resource", "id2", 0, QSharedPointer::create()); + resultProvider->add(folder2); + QTRY_COMPARE(model->rowCount(), 2); + QTRY_COMPARE(rowsInsertedSpy.count(), 1); + QCOMPARE(rowsInsertedSpy.at(0).at(0).value(), QModelIndex()); + } - //A modification can also be a move - // resultProvider->modify(); + //Test changed name + { + QSignalSpy dataChanged(model.data(), SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &, const QVector &))); + folder->setProperty("subject", "modifiedSubject"); + resultProvider->modify(folder); + QTRY_COMPARE(model->rowCount(), 2); + QTRY_COMPARE(dataChanged.count(), 1); + } + + //Test removal + { + QSignalSpy rowsRemovedSpy(model.data(), SIGNAL(rowsRemoved(const QModelIndex &, int, int))); + folder->setProperty("subject", "modifiedSubject"); + resultProvider->remove(subfolder); + QTRY_COMPARE(model->rowCount(model->index(0, 0)), 0); + QTRY_COMPARE(rowsRemovedSpy.count(), 1); + } - // resultProvider->remove(); + //TODO: A modification can also be a move } -- cgit v1.2.3