diff --git a/src/akonadi/akonadicachingstorage.h b/src/akonadi/akonadicachingstorage.h --- a/src/akonadi/akonadicachingstorage.h +++ b/src/akonadi/akonadicachingstorage.h @@ -51,10 +51,6 @@ KJob *createTransaction() override; - KJob *createTag(Akonadi::Tag tag) override; - KJob *updateTag(Akonadi::Tag tag) override; - KJob *removeTag(Akonadi::Tag tag) override; - CollectionFetchJobInterface *fetchCollections(Akonadi::Collection collection, FetchDepth depth) override; ItemFetchJobInterface *fetchItems(Akonadi::Collection collection) override; ItemFetchJobInterface *fetchItem(Akonadi::Item item) override; diff --git a/src/akonadi/akonadicachingstorage.cpp b/src/akonadi/akonadicachingstorage.cpp --- a/src/akonadi/akonadicachingstorage.cpp +++ b/src/akonadi/akonadicachingstorage.cpp @@ -499,21 +499,6 @@ return m_storage->createTransaction(); } -KJob *CachingStorage::createTag(Tag tag) -{ - return m_storage->createTag(tag); -} - -KJob *CachingStorage::updateTag(Tag tag) -{ - return m_storage->updateTag(tag); -} - -KJob *CachingStorage::removeTag(Tag tag) -{ - return m_storage->removeTag(tag); -} - CollectionFetchJobInterface *CachingStorage::fetchCollections(Collection collection, StorageInterface::FetchDepth depth) { return new CachingCollectionFetchJob(m_storage, m_cache, collection, depth); diff --git a/src/akonadi/akonadiserializer.cpp b/src/akonadi/akonadiserializer.cpp --- a/src/akonadi/akonadiserializer.cpp +++ b/src/akonadi/akonadiserializer.cpp @@ -589,8 +589,10 @@ void Serializer::addContextToTask(Domain::Context::Ptr context, Item item) { - if (!isTaskItem(item)) + if (!isTaskItem(item)) { + qWarning() << "Cannot add context to a non-task" << item.id(); return; + } auto todo = item.payload(); @@ -608,8 +610,10 @@ void Serializer::removeContextFromTask(Domain::Context::Ptr context, Item item) { - if (!isTaskItem(item)) + if (!isTaskItem(item)) { + qWarning() << "Cannot remove context from a non-task" << item.id(); return; + } auto todo = item.payload(); diff --git a/src/akonadi/akonadistorage.h b/src/akonadi/akonadistorage.h --- a/src/akonadi/akonadistorage.h +++ b/src/akonadi/akonadistorage.h @@ -52,10 +52,6 @@ KJob *createTransaction() override; - KJob *createTag(Akonadi::Tag tag) override; - KJob *updateTag(Akonadi::Tag tag) override; - KJob *removeTag(Akonadi::Tag tag) override; - CollectionFetchJobInterface *fetchCollections(Akonadi::Collection collection, FetchDepth depth) override; ItemFetchJobInterface *fetchItems(Akonadi::Collection collection) override; ItemFetchJobInterface *fetchItem(Akonadi::Item item) override; diff --git a/src/akonadi/akonadistorage.cpp b/src/akonadi/akonadistorage.cpp --- a/src/akonadi/akonadistorage.cpp +++ b/src/akonadi/akonadistorage.cpp @@ -39,11 +39,8 @@ #include #include #include -#include -#include #include #include -#include #include #include "akonadi/akonadicollectionfetchjobinterface.h" #include "akonadi/akonadiitemfetchjobinterface.h" @@ -208,21 +205,6 @@ return new TransactionSequence(); } -KJob *Storage::createTag(Tag tag) -{ - return new TagCreateJob(tag); -} - -KJob *Storage::updateTag(Tag tag) -{ - return new TagModifyJob(tag); -} - -KJob *Storage::removeTag(Tag tag) -{ - return new Akonadi::TagDeleteJob(tag); -} - CollectionFetchJobInterface *Storage::fetchCollections(Collection collection, StorageInterface::FetchDepth depth) { auto job = new CollectionJob(collection, jobTypeFromDepth(depth)); diff --git a/src/akonadi/akonadistorageinterface.h b/src/akonadi/akonadistorageinterface.h --- a/src/akonadi/akonadistorageinterface.h +++ b/src/akonadi/akonadistorageinterface.h @@ -69,10 +69,6 @@ virtual KJob *createTransaction() = 0; - virtual KJob *createTag(Akonadi::Tag tag) = 0; - virtual KJob *updateTag(Akonadi::Tag tag) = 0; - virtual KJob *removeTag(Akonadi::Tag tag) = 0; - virtual CollectionFetchJobInterface *fetchCollections(Akonadi::Collection collection, FetchDepth depth) = 0; virtual ItemFetchJobInterface *fetchItems(Akonadi::Collection collection) = 0; virtual ItemFetchJobInterface *fetchItem(Akonadi::Item item) = 0; diff --git a/src/akonadi/akonaditagfetchjobinterface.h b/src/akonadi/akonaditagfetchjobinterface.h deleted file mode 100644 --- a/src/akonadi/akonaditagfetchjobinterface.h +++ /dev/null @@ -1,48 +0,0 @@ -/* This file is part of Zanshin - - Copyright 2014 Franck Arrecot - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License or (at your option) version 3 or any later version - accepted by the membership of KDE e.V. (or its successor approved - by the membership of KDE e.V.), which shall act as a proxy - defined in Section 14 of version 3 of the license. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - USA. -*/ - - -#ifndef AKONADI_TAGFETCHJOBINTERFACE_H -#define AKONADI_TAGFETCHJOBINTERFACE_H - -#include - -class KJob; - -namespace Akonadi { - -class TagFetchJobInterface -{ - public: - TagFetchJobInterface(); - virtual ~TagFetchJobInterface(); - - KJob *kjob(); - - virtual Tag::List tags() const = 0; -}; - -} // Akonadi namespace - - -#endif // AKONADI_TAGFETCHJOBINTERFACE_H diff --git a/src/akonadi/akonaditagfetchjobinterface.cpp b/src/akonadi/akonaditagfetchjobinterface.cpp deleted file mode 100644 --- a/src/akonadi/akonaditagfetchjobinterface.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* This file is part of Zanshin - - Copyright 2014 Franck Arrecot - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License or (at your option) version 3 or any later version - accepted by the membership of KDE e.V. (or its successor approved - by the membership of KDE e.V.), which shall act as a proxy - defined in Section 14 of version 3 of the license. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - USA. -*/ - -#include "akonaditagfetchjobinterface.h" -#include - -using namespace Akonadi ; - -TagFetchJobInterface::TagFetchJobInterface() -{ -} - -TagFetchJobInterface::~TagFetchJobInterface() -{ -} - -KJob *TagFetchJobInterface::kjob() -{ - KJob *job = dynamic_cast(this); - Q_ASSERT(job); - return job; -} - - diff --git a/tests/testlib/akonadifakedata.h b/tests/testlib/akonadifakedata.h --- a/tests/testlib/akonadifakedata.h +++ b/tests/testlib/akonadifakedata.h @@ -28,7 +28,6 @@ #include #include -#include #include "testlib/akonadifakestoragebehavior.h" @@ -57,15 +56,16 @@ void modifyCollection(const Akonadi::Collection &collection); void removeCollection(const Akonadi::Collection &collection); - Akonadi::Tag::List tags() const; - Akonadi::Tag tag(Akonadi::Tag::Id id) const; - void createTag(const Akonadi::Tag &tag); - void modifyTag(const Akonadi::Tag &tag); - void removeTag(const Akonadi::Tag &tag); + QStringList contextsUids() const; + Akonadi::Item::List contexts() const; + Akonadi::Item contextItem(const QString &uid) const; + void createContext(const Akonadi::Item &item); + void modifyContext(const Akonadi::Item &item); + void removeContext(const Akonadi::Item &item); Akonadi::Item::List items() const; Akonadi::Item::List childItems(Akonadi::Collection::Id parentId) const; - Akonadi::Item::List tagItems(Akonadi::Tag::Id tagId) const; + Akonadi::Item::List contextItems(const QString& contextUid) const; Akonadi::Item item(Akonadi::Item::Id id) const; void createItem(const Akonadi::Item &item); void modifyItem(const Akonadi::Item &item); @@ -76,7 +76,6 @@ Akonadi::Collection::Id maxCollectionId() const; Akonadi::Item::Id maxItemId() const; - Akonadi::Tag::Id maxTagId() const; Akonadi::Collection reconstructAncestors(const Akonadi::Collection &collection, const Akonadi::Collection &root = Akonadi::Collection::root()) const; @@ -90,11 +89,12 @@ QHash m_collections; QHash> m_childCollections; - QHash m_tags; + using ContextUid = QString; + QHash m_contexts; QHash m_items; QHash> m_childItems; - QHash> m_tagItems; + QHash> m_contextItems; QScopedPointer m_monitor; diff --git a/tests/testlib/akonadifakedata.cpp b/tests/testlib/akonadifakedata.cpp --- a/tests/testlib/akonadifakedata.cpp +++ b/tests/testlib/akonadifakedata.cpp @@ -41,6 +41,51 @@ : Akonadi::Collection::root().id(); } +static const char s_contextListProperty[] = "ContextList"; +static const char s_appName[] = "Zanshin"; + +// Should be in the serializer ideally ... but we don't link to that from here anyway. +static QStringList extractContextUids(const Akonadi::Item &taskItem) +{ + if (!taskItem.hasPayload()) + return {}; + auto todo = taskItem.payload(); + const QString contexts = todo->customProperty(s_appName, s_contextListProperty); + return contexts.split(',', QString::SkipEmptyParts); +} + +// Duplicated from the serializer +static QString contextUid(const Akonadi::Item &contextItem) +{ + auto contextTodo = contextItem.payload(); + return contextTodo->uid(); +} + +// Somewhat duplicated from the serializer +static void removeContextFromTask(const QString &contextUid, Akonadi::Item &item) +{ + auto todo = item.payload(); + const QString contexts = todo->customProperty(s_appName, s_contextListProperty); + QStringList contextList = contexts.split(',', QString::SkipEmptyParts); + contextList.removeAll(contextUid); + if (contextList.isEmpty()) + todo->removeCustomProperty(s_appName, s_contextListProperty); + else + todo->setCustomProperty(s_appName, s_contextListProperty, contextList.join(',')); + item.setPayload(todo); + Q_ASSERT(contextList == extractContextUids(item)); +} + +// Duplicate from the serializer +static bool isContext(const Akonadi::Item &item) +{ + if (!item.hasPayload()) + return false; + + auto todo = item.payload(); + return !todo->customProperty(s_appName, "Context").isEmpty(); +} + AkonadiFakeData::AkonadiFakeData() : m_monitor(new AkonadiFakeMonitor) { @@ -170,53 +215,58 @@ m_monitor->removeCollection(col); } -Akonadi::Tag::List AkonadiFakeData::tags() const +QStringList AkonadiFakeData::contextsUids() const { - return m_tags.values().toVector(); + return m_contexts.keys(); } -Akonadi::Tag AkonadiFakeData::tag(Akonadi::Tag::Id id) const +Akonadi::Item::List AkonadiFakeData::contexts() const { - if (!m_tags.contains(id)) - return Akonadi::Tag(); + return m_contexts.values().toVector(); +} - return m_tags.value(id); +Akonadi::Item AkonadiFakeData::contextItem(const QString &uid) const +{ + return m_contexts.value(uid); } -void AkonadiFakeData::createTag(const Akonadi::Tag &tag) +void AkonadiFakeData::createContext(const Akonadi::Item &contextItem) { - Q_ASSERT(!m_tags.contains(tag.id())); - m_tags[tag.id()] = tag; - m_monitor->addTag(tag); + const QString uid = contextUid(contextItem); + Q_ASSERT(!m_contexts.contains(uid)); + m_contexts[uid] = contextItem; + m_monitor->addItem(contextItem); } -void AkonadiFakeData::modifyTag(const Akonadi::Tag &tag) +void AkonadiFakeData::modifyContext(const Akonadi::Item &contextItem) { - Q_ASSERT(m_tags.contains(tag.id())); - const auto oldTag = m_tags.take(tag.id()); - auto newTag = tag; - newTag.setGid(oldTag.gid()); - newTag.setRemoteId(oldTag.remoteId()); - m_tags[tag.id()] = newTag; - m_monitor->changeTag(newTag); + const QString uid = contextUid(contextItem); + Q_ASSERT(m_contexts.contains(uid)); + const auto oldContextItem = m_contexts.take(uid); + auto newItem = contextItem; + newItem.setGid(oldContextItem.gid()); + newItem.setRemoteId(oldContextItem.remoteId()); + m_contexts[uid] = newItem; + m_monitor->changeItem(newItem); } -void AkonadiFakeData::removeTag(const Akonadi::Tag &tag) +void AkonadiFakeData::removeContext(const Akonadi::Item &contextItem) { - Q_ASSERT(m_tags.contains(tag.id())); + const QString uid = contextUid(contextItem); + Q_ASSERT(m_contexts.contains(uid)); - const auto ids = m_tagItems[tag.id()]; + const auto ids = m_contextItems[uid]; foreach (const auto &id, ids) { Q_ASSERT(m_items.contains(id)); auto item = m_items.value(id); - item.clearTag(tag); + removeContextFromTask(uid, item); m_items[id] = item; m_monitor->changeItem(item); } - m_tagItems.remove(tag.id()); + m_contextItems.remove(uid); - m_tags.remove(tag.id()); - m_monitor->removeTag(tag); + m_contexts.remove(uid); + m_monitor->removeItem(contextItem); } Akonadi::Item::List AkonadiFakeData::items() const @@ -240,13 +290,11 @@ return result; } -Akonadi::Item::List AkonadiFakeData::tagItems(Akonadi::Tag::Id tagId) const +Akonadi::Item::List AkonadiFakeData::contextItems(const QString &contextUid) const { - if (!m_tagItems.contains(tagId)) - return {}; - - const auto ids = m_tagItems.value(tagId); + const auto ids = m_contextItems.value(contextUid); auto result = Akonadi::Item::List(); + result.reserve(ids.size()); std::transform(std::begin(ids), std::end(ids), std::back_inserter(result), [this] (Akonadi::Item::Id id) { @@ -266,25 +314,33 @@ void AkonadiFakeData::createItem(const Akonadi::Item &item) { + Q_ASSERT(item.isValid()); Q_ASSERT(!m_items.contains(item.id())); m_items[item.id()] = item; const auto parentId = findParentId(item); m_childItems[parentId] << item.id(); - foreach (const auto &tag, item.tags()) { - Q_ASSERT(m_tags.contains(tag.id())); - m_tagItems[tag.id()] << item.id(); + const QStringList contextUids = extractContextUids(item); + foreach (const auto &contextUid, contextUids) { + Q_ASSERT(m_contexts.contains(contextUid)); + m_contextItems[contextUid] << item.id(); } - m_monitor->addItem(reconstructItemDependencies(item)); + if (isContext(item)) { + createContext(item); + } else { + m_monitor->addItem(reconstructItemDependencies(item)); + } } void AkonadiFakeData::modifyItem(const Akonadi::Item &item) { Q_ASSERT(m_items.contains(item.id())); + Q_ASSERT(item.isValid()); - const auto oldTags = m_items[item.id()].tags(); + const auto oldContexts = extractContextUids(m_items[item.id()]); + const auto newContexts = extractContextUids(item); const auto oldParentId = findParentId(m_items[item.id()]); const auto oldItem = m_items.take(item.id()); auto newItem = item; @@ -301,30 +357,39 @@ m_monitor->moveItem(reconstructItemDependencies(newItem)); } - foreach (const auto &tag, oldTags) { - m_tagItems[tag.id()].removeAll(newItem.id()); + foreach (const auto &contextUid, oldContexts) { + m_contextItems[contextUid].removeAll(newItem.id()); } - foreach (const auto &tag, newItem.tags()) { - Q_ASSERT(m_tags.contains(tag.id())); - m_tagItems[tag.id()] << newItem.id(); + foreach (const auto &contextUid, newContexts) { + Q_ASSERT(m_contexts.contains(contextUid)); + m_contextItems[contextUid] << newItem.id(); } - m_monitor->changeItem(reconstructItemDependencies(newItem)); + if (isContext(item)) { + modifyContext(item); + } else { + m_monitor->changeItem(reconstructItemDependencies(newItem)); + } } void AkonadiFakeData::removeItem(const Akonadi::Item &item) { + Q_ASSERT(item.isValid()); Q_ASSERT(m_items.contains(item.id())); const auto parentId = findParentId(m_items[item.id()]); const auto i = m_items.take(item.id()); m_childItems[parentId].removeAll(item.id()); - foreach (const Akonadi::Tag &tag, item.tags()) { - m_tagItems[tag.id()].removeAll(item.id()); + foreach (const auto &contextUid, extractContextUids(item)) { + m_contextItems[contextUid].removeAll(item.id()); } - m_monitor->removeItem(reconstructItemDependencies(i)); + if (isContext(item)) { + removeContext(item); + } else { + m_monitor->removeItem(reconstructItemDependencies(i)); + } } Akonadi::MonitorInterface *AkonadiFakeData::createMonitor() @@ -338,12 +403,6 @@ monitor, &AkonadiFakeMonitor::changeCollectionSelection); QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::collectionRemoved, monitor, &AkonadiFakeMonitor::removeCollection); - QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::tagAdded, - monitor, &AkonadiFakeMonitor::addTag); - QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::tagChanged, - monitor, &AkonadiFakeMonitor::changeTag); - QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::tagRemoved, - monitor, &AkonadiFakeMonitor::removeTag); QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::itemAdded, monitor, &AkonadiFakeMonitor::addItem); QObject::connect(m_monitor.data(), &AkonadiFakeMonitor::itemChanged, @@ -386,16 +445,6 @@ return it.key(); } -Akonadi::Tag::Id AkonadiFakeData::maxTagId() const -{ - if (m_tags.isEmpty()) - return 0; - - auto it = std::max_element(m_tags.constBegin(), m_tags.constEnd(), - idLessThan); - return it.key(); -} - Akonadi::Collection AkonadiFakeData::reconstructAncestors(const Akonadi::Collection &collection, const Akonadi::Collection &root) const { @@ -417,15 +466,6 @@ { auto result = item; result.setParentCollection(reconstructAncestors(item.parentCollection(), root)); - - auto tags = item.tags(); - std::transform(tags.constBegin(), tags.constEnd(), - tags.begin(), - [=] (const Akonadi::Tag &t) { - return tag(t.id()); - }); - result.setTags(tags); - return result; } diff --git a/tests/testlib/akonadifakedataxmlloader.cpp b/tests/testlib/akonadifakedataxmlloader.cpp --- a/tests/testlib/akonadifakedataxmlloader.cpp +++ b/tests/testlib/akonadifakedataxmlloader.cpp @@ -41,19 +41,9 @@ Akonadi::XmlDocument doc(fileName); Q_ASSERT(doc.isValid()); - Akonadi::Tag::Id tagId = m_data->maxTagId() + 1; Akonadi::Collection::Id collectionId = m_data->maxCollectionId() + 1; Akonadi::Item::Id itemId = m_data->maxItemId() + 1; - QHash tagByRid; - - foreach (const Akonadi::Tag &tag, doc.tags()) { - auto t = tag; - t.setId(tagId++); - m_data->createTag(t); - tagByRid[t.remoteId()] = t; - } - QHash collectionByRid; foreach (const Akonadi::Collection &c, doc.collections()) { @@ -90,13 +80,6 @@ i.setId(itemId++); i.setParentCollection(c); i.setModificationTime(QDateTime::currentDateTime()); - auto tags = i.tags(); - std::transform(tags.constBegin(), tags.constEnd(), - tags.begin(), - [&tagByRid] (const Akonadi::Tag &tag) { - return tagByRid.value(tag.remoteId()); - }); - i.setTags(tags); m_data->createItem(i); } } diff --git a/tests/testlib/akonadifakestorage.h b/tests/testlib/akonadifakestorage.h --- a/tests/testlib/akonadifakestorage.h +++ b/tests/testlib/akonadifakestorage.h @@ -50,18 +50,13 @@ KJob *createTransaction() override; - KJob *createTag(Akonadi::Tag tag) override; - KJob *updateTag(Akonadi::Tag tag) override; - KJob *removeTag(Akonadi::Tag tag) override; - Akonadi::CollectionFetchJobInterface *fetchCollections(Akonadi::Collection collection, FetchDepth depth) override; Akonadi::ItemFetchJobInterface *fetchItems(Akonadi::Collection collection) override; Akonadi::ItemFetchJobInterface *fetchItem(Akonadi::Item item) override; Akonadi::ItemFetchJobInterface *fetchTagItems(Akonadi::Tag tag) override; Akonadi::TagFetchJobInterface *fetchTags() override; private: - Akonadi::Tag::Id findId(const Akonadi::Tag &tag); Akonadi::Collection::Id findId(const Akonadi::Collection &collection); Akonadi::Item::Id findId(const Akonadi::Item &item); Akonadi::Collection::List collectChildren(const Akonadi::Collection &root); diff --git a/tests/testlib/akonadifakestorage.cpp b/tests/testlib/akonadifakestorage.cpp --- a/tests/testlib/akonadifakestorage.cpp +++ b/tests/testlib/akonadifakestorage.cpp @@ -286,51 +286,6 @@ return job; } -KJob *AkonadiFakeStorage::createTag(Akonadi::Tag tag) -{ - Q_ASSERT(!tag.isValid()); - - auto job = new FakeJob; - if (!m_data->tag(tag.id()).isValid()) { - Utils::JobHandler::install(job, [=] () mutable { - tag.setId(m_data->maxTagId() + 1); - m_data->createTag(tag); - }); - } else { - job->setExpectedError(1, QStringLiteral("The tag already exists")); - Utils::JobHandler::install(job, noop); - } - return job; -} - -KJob *AkonadiFakeStorage::updateTag(Akonadi::Tag tag) -{ - auto job = new FakeJob; - if (m_data->tag(tag.id()).isValid()) { - Utils::JobHandler::install(job, [=] { - m_data->modifyTag(tag); - }); - } else { - job->setExpectedError(1, QStringLiteral("The tag doesn't exist")); - Utils::JobHandler::install(job, noop); - } - return job; -} - -KJob *AkonadiFakeStorage::removeTag(Akonadi::Tag tag) -{ - auto job = new FakeJob; - if (m_data->tag(tag.id()).isValid()) { - Utils::JobHandler::install(job, [=] { - m_data->removeTag(tag); - }); - } else { - job->setExpectedError(1, QStringLiteral("The tag doesn't exist")); - Utils::JobHandler::install(job, noop); - } - return job; -} - Akonadi::CollectionFetchJobInterface *AkonadiFakeStorage::fetchCollections(Akonadi::Collection collection, Akonadi::StorageInterface::FetchDepth depth) { @@ -408,7 +363,7 @@ Akonadi::ItemFetchJobInterface *AkonadiFakeStorage::fetchTagItems(Akonadi::Tag tag) { - auto items = m_data->tagItems(findId(tag)); + Akonadi::Item::List items; // TODO PORT = m_data->contextItems(findId(tag)); std::transform(items.begin(), items.end(), items.begin(), [this] (const Akonadi::Item &item) { @@ -433,27 +388,13 @@ { auto job = new AkonadiFakeTagFetchJob; const auto behavior = m_data->storageBehavior().fetchTagsBehavior(); - if (behavior == AkonadiFakeStorageBehavior::NormalFetch) - job->setTags(m_data->tags()); + //if (behavior == AkonadiFakeStorageBehavior::NormalFetch) + // TODO PORT job->setTags(m_data->contexts()); job->setExpectedError(m_data->storageBehavior().fetchTagsErrorCode()); Utils::JobHandler::install(job, noop); return job; } -Akonadi::Tag::Id AkonadiFakeStorage::findId(const Akonadi::Tag &tag) -{ - if (tag.isValid() || tag.gid().isEmpty()) - return tag.id(); - - const auto gid = tag.gid(); - auto tags = m_data->tags(); - auto result = std::find_if(tags.constBegin(), tags.constEnd(), - [gid] (const Akonadi::Tag &tag) { - return tag.gid() == gid; - }); - return (result != tags.constEnd()) ? result->id() : tag.id(); -} - Akonadi::Collection::Id AkonadiFakeStorage::findId(const Akonadi::Collection &collection) { if (collection.isValid() || collection.remoteId().isEmpty()) diff --git a/tests/testlib/akonadistoragetestbase.h b/tests/testlib/akonadistoragetestbase.h --- a/tests/testlib/akonadistoragetestbase.h +++ b/tests/testlib/akonadistoragetestbase.h @@ -57,11 +57,6 @@ void shouldNotifyItemAdded(); void shouldNotifyItemRemoved(); void shouldNotifyItemChanged(); - void shouldNotifyItemTagAdded(); - void shouldNotifyItemTagRemoved(); - void shouldNotifyTagAdded(); - void shouldNotifyTagRemoved(); - void shouldNotifyTagChanged(); void shouldReadDefaultCollectionFromSettings(); // This test must be run before shouldCreateItem because createItem @@ -80,9 +75,6 @@ void shouldMoveItems(); void shouldDeleteItem(); void shouldDeleteItems(); - void shouldCreateTag(); - void shouldRemoveTag(); - void shouldUpdateTag(); void shouldUpdateCollection(); void shouldNotifyCollectionTimestampChanges(); void shouldNotifyCollectionSelectionChanges(); diff --git a/tests/testlib/akonadistoragetestbase.cpp b/tests/testlib/akonadistoragetestbase.cpp --- a/tests/testlib/akonadistoragetestbase.cpp +++ b/tests/testlib/akonadistoragetestbase.cpp @@ -464,186 +464,6 @@ } } -void AkonadiStorageTestBase::shouldNotifyItemTagAdded() -{ - // GIVEN - - // A spied monitor - auto monitor = createMonitor(); - QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::itemChanged); - MonitorSpy monitorSpy(monitor.data()); - - // An existing item (if we trust the test data)... - Akonadi::Item item = fetchItemByRID(QStringLiteral("{1d33862f-f274-4c67-ab6c-362d56521ff5}"), calendar2()); - QVERIFY(item.isValid()); - item.setMimeType(QStringLiteral("application/x-vnd.akonadi.calendar.todo")); - - // An existing tag (if we trust the test data) - Akonadi::Tag tag(5); - - // WHEN - item.setTag(tag); - auto storage = createStorage(); - auto job = storage->updateItem(item); - AKVERIFYEXEC(job); - monitorSpy.waitForStableState(); - QTRY_VERIFY(!spy.isEmpty()); - - // THEN - QCOMPARE(spy.size(), 1); - auto notifiedItem = spy.takeFirst().at(0).value(); - QCOMPARE(notifiedItem.id(), item.id()); - QVERIFY(notifiedItem.hasPayload()); - - Akonadi::Tag::List notifiedTags = notifiedItem.tags(); - - QVERIFY(notifiedTags.contains(tag)); - foreach (const auto &tag, notifiedTags) { - QVERIFY(tag.isValid()); - QVERIFY(!tag.name().isEmpty()); - QVERIFY(!tag.type().isEmpty()); - } - - auto parent = notifiedItem.parentCollection(); - while (parent != Akonadi::Collection::root()) { - QVERIFY(parent.isValid()); - parent = parent.parentCollection(); - } -} - -void AkonadiStorageTestBase::shouldNotifyItemTagRemoved() // aka dissociate -{ - // GIVEN - auto storage = createStorage(); - Akonadi::Tag tag = fetchTagByGID(QStringLiteral("philosophy-tag")); - const QString expectedRemoteIds = {QStringLiteral("{7824df00-2fd6-47a4-8319-52659dc82006}")}; - auto job = storage->fetchTagItems(tag); - AKVERIFYEXEC(job->kjob()); - - auto item = job->items().at(0); - QCOMPARE(item.remoteId(), expectedRemoteIds); - - QVERIFY(item.loadedPayloadParts().contains(Akonadi::Item::FullPayload)); - QVERIFY(!item.attributes().isEmpty()); - QVERIFY(item.modificationTime().isValid()); - QVERIFY(!item.flags().isEmpty()); - QVERIFY(!item.tags().isEmpty()); - - // A spied monitor - auto monitor = createMonitor(); - QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::itemChanged); - MonitorSpy monitorSpy(monitor.data()); - - // WHEN - item.clearTag(tag); - auto jobUpdate = storage->updateItem(item); - AKVERIFYEXEC(jobUpdate); - monitorSpy.waitForStableState(); - QTRY_VERIFY(!spy.isEmpty()); - - // THEN - QCOMPARE(spy.size(), 1); - auto notifiedItem = spy.takeFirst().at(0).value(); - QCOMPARE(notifiedItem.id(), item.id()); - QVERIFY(!notifiedItem.tags().contains(tag)); -} - -void AkonadiStorageTestBase::shouldNotifyTagAdded() -{ - // GIVEN - - // A spied monitor - auto monitor = createMonitor(); - QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::tagAdded); - MonitorSpy monitorSpy(monitor.data()); - - // A tag - Akonadi::Tag tag; - tag.setGid("gid"); - tag.setName(QStringLiteral("name")); - tag.setType("type"); - - // WHEN - auto storage = createStorage(); - auto job = storage->createTag(tag); - AKVERIFYEXEC(job); - monitorSpy.waitForStableState(); - QTRY_VERIFY(!spy.isEmpty()); - - // THEN - QCOMPARE(spy.size(), 1); - auto notifiedTag = spy.takeFirst().at(0).value(); - QCOMPARE(notifiedTag.gid(), tag.gid()); - QCOMPARE(notifiedTag.name(), tag.name()); - QCOMPARE(notifiedTag.type(), tag.type()); -} - -void AkonadiStorageTestBase::shouldNotifyTagRemoved() -{ - // GIVEN - - // An existing tag (if we trust the test data) connected to an existing item tagged to it - auto storage = createStorage(); - Akonadi::Tag tag = fetchTagByGID(QStringLiteral("delete-me")); - // NOTE : this item was linked to the delete-me tag during test time - const QString expectedRemoteIds = {QStringLiteral("{1d33862f-f274-4c67-ab6c-362d56521ff5}")}; - auto job = storage->fetchTagItems(tag); - AKVERIFYEXEC(job->kjob()); - - QCOMPARE(job->items().size(), 1); - auto itemTagged = job->items().at(0); - QCOMPARE(itemTagged.remoteId(), expectedRemoteIds); - - // A spied monitor - auto monitor = createMonitor(); - QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::tagRemoved); - QSignalSpy spyItemChanged(monitor.data(), &Akonadi::MonitorInterface::itemChanged); - MonitorSpy monitorSpy(monitor.data()); - - // WHEN - auto jobDelete = storage->removeTag(tag); - AKVERIFYEXEC(jobDelete); - monitorSpy.waitForStableState(); - QTRY_VERIFY(!spy.isEmpty()); - QTRY_VERIFY(!spyItemChanged.isEmpty()); - - // THEN - QCOMPARE(spy.size(), 1); - auto notifiedTag = spy.takeFirst().at(0).value(); - QCOMPARE(notifiedTag.id(), tag.id()); - - QCOMPARE(spyItemChanged.size(), 1); - auto notifiedItem = spyItemChanged.takeFirst().at(0).value(); - QCOMPARE(notifiedItem.id(), itemTagged.id()); -} - -void AkonadiStorageTestBase::shouldNotifyTagChanged() -{ - // GIVEN - - // A spied monitor - auto monitor = createMonitor(); - QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::tagChanged); - MonitorSpy monitorSpy(monitor.data()); - - // An existing tag (if we trust the test data) - Akonadi::Tag tag(6); - tag.setName(QStringLiteral("Oh it changed!")); - - // WHEN - auto storage = createStorage(); - auto job = storage->updateTag(tag); - AKVERIFYEXEC(job); - monitorSpy.waitForStableState(); - QTRY_VERIFY(!spy.isEmpty()); - - // THEN - QCOMPARE(spy.size(), 1); - auto notifiedTag = spy.takeFirst().at(0).value(); - QCOMPARE(notifiedTag.id(), tag.id()); - QCOMPARE(notifiedTag.name(), tag.name()); -} - void AkonadiStorageTestBase::shouldReadDefaultCollectionFromSettings() { // GIVEN @@ -917,92 +737,6 @@ QCOMPARE(notifiedItem.id(), item2.id()); } -void AkonadiStorageTestBase::shouldCreateTag() -{ - // GIVEN - - // A storage implementation - auto storage = createStorage(); - - // A spied monitor - auto monitor = createMonitor(); - QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::tagAdded); - MonitorSpy monitorSpy(monitor.data()); - - // A tag - Akonadi::Tag tag; - QString name = QStringLiteral("Tag42"); - const QByteArray type = QByteArray("Zanshin-Context"); - const QByteArray gid = QByteArray(name.toLatin1()); - tag.setName(name); - tag.setType(QByteArray("Zanshin-Context")); - tag.setGid(gid); - - // WHEN - auto job = storage->createTag(tag); - AKVERIFYEXEC(job); - monitorSpy.waitForStableState(); - QTRY_VERIFY(!spy.isEmpty()); - - // THEN - QCOMPARE(spy.size(), 1); - auto notifiedTag = spy.takeFirst().at(0).value(); - QCOMPARE(notifiedTag.name(), name); - QCOMPARE(notifiedTag.type(), type); - QCOMPARE(notifiedTag.gid(), gid); -} - -void AkonadiStorageTestBase::shouldRemoveTag() -{ - - // GIVEN - auto storage = createStorage(); - - // A spied monitor - auto monitor = createMonitor(); - QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::tagRemoved); - MonitorSpy monitorSpy(monitor.data()); - - // An existing tag - Akonadi::Tag tag = fetchTagByGID(QStringLiteral("errands-context")); - - // WHEN - auto job = storage->removeTag(tag); - AKVERIFYEXEC(job); - monitorSpy.waitForStableState(); - QTRY_VERIFY(!spy.isEmpty()); - - // THEN - QCOMPARE(spy.size(), 1); - auto notifiedTag = spy.takeFirst().at(0).value(); - QCOMPARE(notifiedTag.id(), tag.id()); -} - -void AkonadiStorageTestBase::shouldUpdateTag() -{ - // GIVEN - auto storage = createStorage(); - - // A spied monitor - auto monitor = createMonitor(); - QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::tagChanged); - MonitorSpy monitorSpy(monitor.data()); - - // An existing tag - Akonadi::Tag tag = fetchTagByGID(QStringLiteral("change-me")); - - // WHEN - auto job = storage->updateTag(tag); - AKVERIFYEXEC(job); - monitorSpy.waitForStableState(); - QTRY_VERIFY(!spy.isEmpty()); - - // THEN - QCOMPARE(spy.size(), 1); - auto notifiedTag = spy.takeFirst().at(0).value(); - QCOMPARE(notifiedTag.id(), tag.id()); -} - void AkonadiStorageTestBase::shouldUpdateCollection() { // GIVEN diff --git a/tests/units/akonadi/akonadilivequeryintegratortest.cpp b/tests/units/akonadi/akonadilivequeryintegratortest.cpp --- a/tests/units/akonadi/akonadilivequeryintegratortest.cpp +++ b/tests/units/akonadi/akonadilivequeryintegratortest.cpp @@ -176,7 +176,7 @@ // Reacts to remove // WHEN - data.removeTag(Akonadi::Tag(45)); + data.removeItem(Akonadi::Item(45)); // THEN QCOMPARE(result->data().size(), 2); @@ -877,26 +877,6 @@ QCOMPARE(removedId, qint64(42)); } - void shouldCallTagRemoveHandlers() - { - // GIVEN - AkonadiFakeData data; - - // One tag - data.createItem(GenTodo().withId(42).withUid("ctx-42").withTitle(QStringLiteral("42"))); - - auto integrator = createIntegrator(data); - qint64 removedId = -1; - integrator->addRemoveHandler([&removedId] (const Akonadi::Tag &tag) { - removedId = tag.id(); - }); - - // WHEN - data.removeTag(Akonadi::Tag(42)); - - // THEN - QCOMPARE(removedId, qint64(42)); - } }; ZANSHIN_TEST_MAIN(AkonadiLiveQueryIntegratorTest) diff --git a/tests/units/testlib/akonadifakedatatest.cpp b/tests/units/testlib/akonadifakedatatest.cpp --- a/tests/units/testlib/akonadifakedatatest.cpp +++ b/tests/units/testlib/akonadifakedatatest.cpp @@ -23,9 +23,12 @@ #include "testlib/akonadifakedata.h" #include "akonadi/akonadimonitorinterface.h" +#include "akonadi/akonadiserializer.h" #include +#include + namespace QTest { template @@ -50,16 +53,6 @@ left, right, actual, expected, file, line); } -// More aggressive compare to make sure we just don't get tags with ids out -template <> -inline bool qCompare(const Akonadi::Tag &left, const Akonadi::Tag &right, - const char *actual, const char *expected, - const char *file, int line) -{ - return zCompareHelper((left == right) && (left.name() == right.name()), - left, right, actual, expected, file, line); -} - // More aggressive compare to make sure we just don't get items with ids out template <> inline bool qCompare(const Akonadi::Item &left, const Akonadi::Item &right, @@ -80,7 +73,6 @@ : QObject(parent) { qRegisterMetaType(); - qRegisterMetaType(); qRegisterMetaType(); } @@ -92,7 +84,7 @@ // THEN QVERIFY(data.collections().isEmpty()); - QVERIFY(data.tags().isEmpty()); + QVERIFY(data.contexts().isEmpty()); QVERIFY(data.items().isEmpty()); } @@ -148,7 +140,7 @@ QCOMPARE(spy.takeFirst().at(0).value(), c2); } - void shouldNotLooseParentCollectionOnModifyCollection() + void shouldNotLoseParentCollectionOnModifyCollection() { // GIVEN auto data = Testlib::AkonadiFakeData(); @@ -227,6 +219,7 @@ auto data = Testlib::AkonadiFakeData(); QScopedPointer monitor(data.createMonitor()); QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::collectionRemoved); + Akonadi::Serializer serializer; auto c1 = Akonadi::Collection(42); c1.setName(QStringLiteral("42")); @@ -242,13 +235,15 @@ c3.setParentCollection(Akonadi::Collection(43)); data.createCollection(c3); - auto i1 = Akonadi::Item(42); - i1.setPayloadFromData("42"); + auto task1 = Domain::Task::Ptr::create(); + auto i1 = serializer.createItemFromTask(task1); + i1.setId(42); i1.setParentCollection(Akonadi::Collection(43)); data.createItem(i1); - auto i2 = Akonadi::Item(43); - i2.setPayloadFromData("43"); + auto task2 = Domain::Task::Ptr::create(); + auto i2 = serializer.createItemFromTask(task2); + i2.setId(43); i2.setParentCollection(Akonadi::Collection(44)); data.createItem(i2); @@ -279,117 +274,139 @@ QCOMPARE(spy.takeFirst().at(0).value(), c2); } - void shouldCreateTags() + void shouldCreateContexts() { // GIVEN auto data = Testlib::AkonadiFakeData(); QScopedPointer monitor(data.createMonitor()); - QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::tagAdded); + QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::itemAdded); + Akonadi::Serializer serializer; + + auto context1 = Domain::Context::Ptr::create(); + context1->setName(QStringLiteral("42")); + context1->setProperty("todoUid", "ctx-42"); + auto t1 = serializer.createItemFromContext(context1); - auto t1 = Akonadi::Tag(42); - t1.setName(QStringLiteral("42")); - auto t2 = Akonadi::Tag(43); - t2.setName(QStringLiteral("43")); + auto context2 = Domain::Context::Ptr::create(); + context2->setName(QStringLiteral("43")); + context2->setProperty("todoUid", "ctx-43"); + auto t2 = serializer.createItemFromContext(context2); // WHEN - data.createTag(t1); - data.createTag(t2); + data.createContext(t1); + data.createContext(t2); // THEN - QCOMPARE(data.tags().size(), 2); - QVERIFY(data.tags().contains(t1)); - QVERIFY(data.tags().contains(t2)); - QCOMPARE(data.tag(t1.id()), t1); - QCOMPARE(data.tag(t2.id()), t2); + QCOMPARE(data.contexts().size(), 2); + QVERIFY(data.contexts().contains(t1)); + QVERIFY(data.contexts().contains(t2)); + QCOMPARE(data.contextItem("ctx-42"), t1); + QCOMPARE(data.contextItem("ctx-43"), t2); QCOMPARE(spy.size(), 2); - QCOMPARE(spy.takeFirst().at(0).value(), t1); - QCOMPARE(spy.takeFirst().at(0).value(), t2); + QCOMPARE(spy.takeFirst().at(0).value(), t1); + QCOMPARE(spy.takeFirst().at(0).value(), t2); } - void shouldModifyTags() + void shouldModifyContexts() { // GIVEN auto data = Testlib::AkonadiFakeData(); QScopedPointer monitor(data.createMonitor()); - QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::tagChanged); + QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::itemChanged); + Akonadi::Serializer serializer; - auto t1 = Akonadi::Tag(42); - t1.setName(QStringLiteral("42")); - data.createTag(t1); + auto context1 = Domain::Context::Ptr::create(); + context1->setName(QStringLiteral("42")); + context1->setProperty("todoUid", "ctx-42"); + auto t1 = serializer.createItemFromContext(context1); + data.createContext(t1); - auto t2 = Akonadi::Tag(t1.id()); - t2.setName(QStringLiteral("42-bis")); + auto context2 = Domain::Context::Ptr::create(); + context2->setName(QStringLiteral("42-bis")); + context2->setProperty("todoUid", "ctx-42"); + auto t2 = serializer.createItemFromContext(context2); // WHEN - data.modifyTag(t2); + data.modifyContext(t2); // THEN - QCOMPARE(data.tags().size(), 1); - QCOMPARE(data.tag(t1.id()), t2); + QCOMPARE(data.contexts().size(), 1); + QCOMPARE(data.contextItem("ctx-42"), t2); QCOMPARE(spy.size(), 1); - QCOMPARE(spy.takeFirst().at(0).value(), t2); + QCOMPARE(spy.takeFirst().at(0).value(), t2); } - void shouldRemoveTags() + void shouldRemoveContexts() { // GIVEN auto data = Testlib::AkonadiFakeData(); QScopedPointer monitor(data.createMonitor()); - QSignalSpy tagSpy(monitor.data(), &Akonadi::MonitorInterface::tagRemoved); + QSignalSpy contextSpy(monitor.data(), &Akonadi::MonitorInterface::itemRemoved); QSignalSpy itemSpy(monitor.data(), &Akonadi::MonitorInterface::itemChanged); + Akonadi::Serializer serializer; auto c1 = Akonadi::Collection(42); data.createCollection(c1); - auto t1 = Akonadi::Tag(42); - t1.setName(QStringLiteral("42")); - data.createTag(t1); + auto context1 = Domain::Context::Ptr::create(); + context1->setName(QStringLiteral("1")); + context1->setProperty("todoUid", "ctx-1"); + auto t1 = serializer.createItemFromContext(context1); + data.createContext(t1); - auto t2 = Akonadi::Tag(43); - t2.setName(QStringLiteral("43")); - data.createTag(t2); + auto context2 = Domain::Context::Ptr::create(); + context2->setName(QStringLiteral("2")); + context2->setProperty("todoUid", "ctx-2"); + auto t2 = serializer.createItemFromContext(context2); + data.createContext(t2); - auto i1 = Akonadi::Item(42); - i1.setPayloadFromData("42"); + auto task1 = Domain::Task::Ptr::create(); + auto i1 = serializer.createItemFromTask(task1); i1.setParentCollection(c1); - i1.setTag(Akonadi::Tag(t1.id())); + i1.setId(42); + serializer.addContextToTask(context1, i1); data.createItem(i1); + QVERIFY(serializer.isContextChild(context1, i1)); - auto i2 = Akonadi::Item(43); - i2.setPayloadFromData("43"); + auto task2 = Domain::Task::Ptr::create(); + auto i2 = serializer.createItemFromTask(task2); i2.setParentCollection(c1); - i2.setTag(Akonadi::Tag(t2.id())); + i2.setId(43); + serializer.addContextToTask(context2, i2); data.createItem(i2); + QVERIFY(serializer.isContextChild(context2, i2)); const auto itemSet = QSet() << i1 << i2; // WHEN - data.removeTag(t2); + data.removeContext(t2); // THEN - QCOMPARE(data.tags().size(), 1); - QCOMPARE(data.tags().at(0), t1); + QCOMPARE(data.contexts().size(), 1); + QCOMPARE(data.contexts().at(0), t1); - QVERIFY(!data.tag(t2.id()).isValid()); + QVERIFY(!data.contextItem("ctx-2").isValid()); - QCOMPARE(data.tagItems(t1.id()).size(), 1); - QCOMPARE(data.tagItems(t1.id()).at(0), i1); - QVERIFY(data.tagItems(t2.id()).isEmpty()); + QCOMPARE(data.contextItems("ctx-1").size(), 1); + QCOMPARE(data.contextItems("ctx-1").at(0), i1); + QVERIFY(data.contextItems("ctx-2").isEmpty()); QCOMPARE(data.items().toList().toSet(), itemSet); QVERIFY(data.item(i1.id()).isValid()); - QVERIFY(data.item(i2.id()).isValid()); - QVERIFY(!data.item(i2.id()).tags().contains(t2)); + const auto item2 = data.item(i2.id()); + QVERIFY(item2.isValid()); + QVERIFY(!serializer.isContextChild(context2, item2)); - QCOMPARE(tagSpy.size(), 1); - QCOMPARE(tagSpy.takeFirst().at(0).value(), t2); + QCOMPARE(contextSpy.size(), 1); + QCOMPARE(contextSpy.takeFirst().at(0).value(), t2); QCOMPARE(itemSpy.size(), 1); - QCOMPARE(itemSpy.first().at(0).value(), i2); - QVERIFY(!itemSpy.first().at(0).value().tags().contains(t2)); + const auto emittedItem2 = itemSpy.first().at(0).value(); + QCOMPARE(emittedItem2, i2); + QVERIFY(!serializer.isContextChild(context2, emittedItem2)); } void shouldCreateItems() @@ -453,7 +470,7 @@ QCOMPARE(moveSpy.size(), 0); } - void shouldNotLooseParentCollectionOnModifyItem() + void shouldNotLoseParentCollectionOnModifyItem() { // GIVEN auto data = Testlib::AkonadiFakeData(); @@ -537,55 +554,66 @@ { // GIVEN auto data = Testlib::AkonadiFakeData(); - auto t1 = Akonadi::Tag(42); - t1.setName(QStringLiteral("42")); - data.createTag(t1); + Akonadi::Serializer serializer; - auto i1 = Akonadi::Item(42); - i1.setPayloadFromData("42"); - i1.setTag(Akonadi::Tag(42)); + auto context1 = Domain::Context::Ptr::create(); + context1->setName(QStringLiteral("42")); + context1->setProperty("todoUid", "ctx-42"); + auto t1 = serializer.createItemFromContext(context1); + data.createContext(t1); + + auto task1 = Domain::Task::Ptr::create(); + auto i1 = serializer.createItemFromTask(task1); + i1.setId(1); + serializer.addContextToTask(context1, i1); // WHEN data.createItem(i1); // THEN - QCOMPARE(data.tagItems(t1.id()).size(), 1); - QCOMPARE(data.tagItems(t1.id()).at(0), i1); + QCOMPARE(data.contextItems("ctx-42").size(), 1); + QCOMPARE(data.contextItems("ctx-42").at(0), i1); } void shouldRetagItemsOnModify() { // GIVEN auto data = Testlib::AkonadiFakeData(); QScopedPointer monitor(data.createMonitor()); QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::itemChanged); - - auto t1 = Akonadi::Tag(42); - t1.setName(QStringLiteral("42")); - data.createTag(t1); - - auto t2 = Akonadi::Tag(43); - t2.setName(QStringLiteral("43")); - data.createTag(t2); - - auto i1 = Akonadi::Item(42); - i1.setPayloadFromData("42"); - i1.setTag(Akonadi::Tag(42)); + Akonadi::Serializer serializer; + + auto context1 = Domain::Context::Ptr::create(); + context1->setName(QStringLiteral("42")); + context1->setProperty("todoUid", "ctx-42"); + auto t1 = serializer.createItemFromContext(context1); + data.createContext(t1); + + auto context2 = Domain::Context::Ptr::create(); + context2->setName(QStringLiteral("43")); + context2->setProperty("todoUid", "ctx-43"); + auto t2 = serializer.createItemFromContext(context2); + data.createContext(t2); + + auto task1 = Domain::Task::Ptr::create(); + auto i1 = serializer.createItemFromTask(task1); + i1.setId(1); + serializer.addContextToTask(context1, i1); data.createItem(i1); // WHEN - i1.setPayloadFromData("42-bis"); - i1.clearTag(Akonadi::Tag(42)); - i1.setTag(Akonadi::Tag(43)); - data.modifyItem(i1); + auto i2 = serializer.createItemFromTask(task1); + i2.setId(1); + serializer.addContextToTask(context2, i2); + data.modifyItem(i2); // THEN - QVERIFY(data.tagItems(t1.id()).isEmpty()); - QCOMPARE(data.tagItems(t2.id()).size(), 1); - QCOMPARE(data.tagItems(t2.id()).at(0), i1); + QVERIFY(data.contextItems("ctx-42").isEmpty()); + QCOMPARE(data.contextItems("ctx-43").size(), 1); + QCOMPARE(data.contextItems("ctx-43").at(0), i2); QCOMPARE(spy.size(), 1); - QCOMPARE(spy.takeFirst().at(0).value(), i1); + QCOMPARE(spy.takeFirst().at(0).value(), i2); } void shouldRemoveItems() diff --git a/tests/units/testlib/akonadifakedataxmlloadertest.cpp b/tests/units/testlib/akonadifakedataxmlloadertest.cpp --- a/tests/units/testlib/akonadifakedataxmlloadertest.cpp +++ b/tests/units/testlib/akonadifakedataxmlloadertest.cpp @@ -49,7 +49,7 @@ // THEN QVERIFY(data.collections().size() > 1); QVERIFY(data.items().size() > 1); - QVERIFY(data.tags().size() > 1); + QVERIFY(data.contexts().size() > 1); // Do a bit of sanity checking, no need to do much more than that as // the xml loading will be extensively used in the AkonadiFakeStorageTest