diff --git a/src/akonadi/akonaditaskrepository.h b/src/akonadi/akonaditaskrepository.h --- a/src/akonadi/akonaditaskrepository.h +++ b/src/akonadi/akonaditaskrepository.h @@ -46,6 +46,7 @@ const MessagingInterface::Ptr &messaging); virtual KJob *create(Domain::Task::Ptr task) Q_DECL_OVERRIDE; + virtual KJob *createChild(Domain::Task::Ptr task, Domain::Task::Ptr parent) Q_DECL_OVERRIDE; virtual KJob *createInProject(Domain::Task::Ptr task, Domain::Project::Ptr project) Q_DECL_OVERRIDE; virtual KJob *createInContext(Domain::Task::Ptr task, Domain::Context::Ptr context) Q_DECL_OVERRIDE; diff --git a/src/akonadi/akonaditaskrepository.cpp b/src/akonadi/akonaditaskrepository.cpp --- a/src/akonadi/akonaditaskrepository.cpp +++ b/src/akonadi/akonaditaskrepository.cpp @@ -79,6 +79,20 @@ return createItem(item); } +KJob *TaskRepository::createChild(Domain::Task::Ptr task, Domain::Task::Ptr parent) +{ + Item taskItem = m_serializer->createItemFromTask(task); + Q_ASSERT(!taskItem.isValid()); + + Item parentItem = m_serializer->createItemFromTask(parent); + Q_ASSERT(parentItem.isValid()); + Q_ASSERT(parentItem.parentCollection().isValid()); + + m_serializer->updateItemParent(taskItem, parent); + + return m_storage->createItem(taskItem, parentItem.parentCollection()); +} + KJob *TaskRepository::createInProject(Domain::Task::Ptr task, Domain::Project::Ptr project) { Item taskItem = m_serializer->createItemFromTask(task); diff --git a/src/domain/taskrepository.h b/src/domain/taskrepository.h --- a/src/domain/taskrepository.h +++ b/src/domain/taskrepository.h @@ -42,6 +42,7 @@ virtual ~TaskRepository(); virtual KJob *create(Task::Ptr task) = 0; + virtual KJob *createChild(Domain::Task::Ptr task, Domain::Task::Ptr parent) = 0; virtual KJob *createInProject(Task::Ptr task, Project::Ptr project) = 0; virtual KJob *createInContext(Task::Ptr task, Context::Ptr context) = 0; diff --git a/tests/units/akonadi/akonaditaskrepositorytest.cpp b/tests/units/akonadi/akonaditaskrepositorytest.cpp --- a/tests/units/akonadi/akonaditaskrepositorytest.cpp +++ b/tests/units/akonadi/akonaditaskrepositorytest.cpp @@ -133,6 +133,47 @@ QVERIFY(storageMock(&Akonadi::StorageInterface::createItem).when(item, col2).exactly(1)); } + void shouldCreateNewChildrenInParentCollection() + { + // GIVEN + + // A parent item with a collection + Akonadi::Collection col(42); + Akonadi::Item parentItem(43); + parentItem.setParentCollection(col); + auto parent = Domain::Task::Ptr::create(); + + // A task and its corresponding item not existing in storage yet + Akonadi::Item childItem; + auto child = Domain::Task::Ptr::create(); + + // A mock create job + auto itemCreateJob = new FakeJob(this); + + // Storage mock returning the create job + Utils::MockObject storageMock; + storageMock(&Akonadi::StorageInterface::createItem).when(childItem, col) + .thenReturn(itemCreateJob); + + // Serializer mock returning the item for the task + Utils::MockObject serializerMock; + serializerMock(&Akonadi::SerializerInterface::createItemFromTask).when(parent).thenReturn(parentItem); + serializerMock(&Akonadi::SerializerInterface::createItemFromTask).when(child).thenReturn(childItem); + serializerMock(&Akonadi::SerializerInterface::updateItemParent).when(childItem, parent).thenReturn(); + + // WHEN + QScopedPointer repository(new Akonadi::TaskRepository(storageMock.getInstance(), + serializerMock.getInstance(), + Akonadi::MessagingInterface::Ptr())); + repository->createChild(child, parent)->exec(); + + // THEN + QVERIFY(serializerMock(&Akonadi::SerializerInterface::createItemFromTask).when(parent).exactly(1)); + QVERIFY(serializerMock(&Akonadi::SerializerInterface::createItemFromTask).when(child).exactly(1)); + QVERIFY(serializerMock(&Akonadi::SerializerInterface::updateItemParent).when(childItem, parent).exactly(1)); + QVERIFY(storageMock(&Akonadi::StorageInterface::createItem).when(childItem, col).exactly(1)); + } + void shouldCreateNewItemsInProjectCollection() { // GIVEN @@ -153,7 +194,7 @@ // Storage mock returning the create job Utils::MockObject storageMock; storageMock(&Akonadi::StorageInterface::createItem).when(taskItem, col) - .thenReturn(itemCreateJob); + .thenReturn(itemCreateJob); // Serializer mock returning the item for the task Utils::MockObject serializerMock;