diff --git a/src/akonadi/akonadiserializer.cpp b/src/akonadi/akonadiserializer.cpp --- a/src/akonadi/akonadiserializer.cpp +++ b/src/akonadi/akonadiserializer.cpp @@ -202,6 +202,21 @@ task->setProperty("relatedUid", todo->relatedTo()); task->setRunning(todo->customProperty("Zanshin", "Running") == QLatin1String("1")); + switch (todo->recurrence()->recurrenceType()) { + case KCalCore::Recurrence::rDaily: + task->setRecurrence(Domain::Task::RecursDaily); + break; + case KCalCore::Recurrence::rWeekly: + task->setRecurrence(Domain::Task::RecursWeekly); + break; + case KCalCore::Recurrence::rMonthlyDay: + task->setRecurrence(Domain::Task::RecursMonthly); + break; + default: + // Other cases are not supported for now and as such just ignored + break; + } + QMimeDatabase mimeDb; const auto attachmentsInput = todo->attachments(); Domain::Task::Attachments attachments; @@ -268,6 +283,20 @@ todo->setRelatedTo(task->property("relatedUid").toString()); } + switch (task->recurrence()) { + case Domain::Task::NoRecurrence: + break; + case Domain::Task::RecursDaily: + todo->recurrence()->setDaily(1); + break; + case Domain::Task::RecursWeekly: + todo->recurrence()->setWeekly(1); + break; + case Domain::Task::RecursMonthly: + todo->recurrence()->setMonthly(1); + break; + } + for (const auto &attachment : task->attachments()) { KCalCore::Attachment::Ptr attach(new KCalCore::Attachment(QByteArray())); if (attachment.isUri()) diff --git a/tests/units/akonadi/akonadiserializertest.cpp b/tests/units/akonadi/akonadiserializertest.cpp --- a/tests/units/akonadi/akonadiserializertest.cpp +++ b/tests/units/akonadi/akonadiserializertest.cpp @@ -654,6 +654,7 @@ QTest::addColumn("updatedStartDate"); QTest::addColumn("updatedDueDate"); QTest::addColumn("updatedRelated"); + QTest::addColumn("updatedRecurs"); QTest::addColumn("updatedAttachmentData"); QTest::addColumn("updatedAttachmentUris"); QTest::addColumn("updatedAttachmentLabels"); @@ -663,9 +664,9 @@ QTest::addColumn("updatedDelegateEmail"); QTest::addColumn("updatedRunning"); - QTest::newRow("no change") << "summary" << "content" << false << QDateTime() << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) << "my-uid" << QByteArrayList() << QStringList() << QStringList() << QStringList() << QStringList() << "John Doe" << "j@d.com" << false; - QTest::newRow("changed") << "new summary" << "new content" << true << QDateTime(QDate(2013, 11, 28)) << QDateTime(QDate(2013, 11, 25)) << QDateTime(QDate(2014, 03, 02)) << "my-new-uid" << QByteArrayList({"foo", "# bar", QByteArray()}) << QStringList({QString(), QString(), "https://www.kde.org"}) << QStringList({"label1", "label2", "label3"}) << QStringList({"text/plain", "text/markdown", "text/html"}) << QStringList({"text-plain", "text-markdown", "text-html"}) << "John Smith" << "j@s.com" << false; - QTest::newRow("set_to_running") << "summary" << "content" << false << QDateTime() << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) << "my-uid" << QByteArrayList() << QStringList() << QStringList() << QStringList() << QStringList() << "John Doe" << "j@d.com" << true; + QTest::newRow("no change") << "summary" << "content" << false << QDateTime() << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) << "my-uid" << false << QByteArrayList() << QStringList() << QStringList() << QStringList() << QStringList() << "John Doe" << "j@d.com" << false; + QTest::newRow("changed") << "new summary" << "new content" << true << QDateTime(QDate(2013, 11, 28)) << QDateTime(QDate(2013, 11, 25)) << QDateTime(QDate(2014, 03, 02)) << "my-new-uid" << true << QByteArrayList({"foo", "# bar", QByteArray()}) << QStringList({QString(), QString(), "https://www.kde.org"}) << QStringList({"label1", "label2", "label3"}) << QStringList({"text/plain", "text/markdown", "text/html"}) << QStringList({"text-plain", "text-markdown", "text-html"}) << "John Smith" << "j@s.com" << false; + QTest::newRow("set_to_running") << "summary" << "content" << false << QDateTime() << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) << "my-uid" << false << QByteArrayList() << QStringList() << QStringList() << QStringList() << QStringList() << "John Doe" << "j@d.com" << true; } void shouldUpdateTaskFromItem() @@ -710,6 +711,7 @@ QFETCH(QDateTime, updatedStartDate); QFETCH(QDateTime, updatedDueDate); QFETCH(QString, updatedRelated); + QFETCH(bool, updatedRecurs); QFETCH(QByteArrayList, updatedAttachmentData); QFETCH(QStringList, updatedAttachmentUris); QFETCH(QStringList, updatedAttachmentLabels); @@ -738,6 +740,9 @@ updatedTodo->setDtDue(KDateTime(updatedDueDate, KDateTime::UTC)); updatedTodo->setRelatedTo(updatedRelated); + if (updatedRecurs) + updatedTodo->recurrence()->setDaily(1); + for (int i = 0; i < updatedAttachmentData.size(); i++) { KCalCore::Attachment::Ptr attachment(new KCalCore::Attachment(QByteArray())); if (!updatedAttachmentData.at(i).isEmpty()) @@ -785,6 +790,7 @@ QCOMPARE(task->property("relatedUid").toString(), updatedTodo->relatedTo()); QCOMPARE(task->property("itemId").toLongLong(), updatedItem.id()); QCOMPARE(task->property("parentCollectionId").toLongLong(), updatedCollection.id()); + QCOMPARE(task->recurrence(), (updatedRecurs ? Domain::Task::RecursDaily : Domain::Task::NoRecurrence)); QCOMPARE(task->attachments().size(), updatedAttachmentData.size()); for (int i = 0; i < task->attachments().size(); i++) { const auto attachment = task->attachments().at(i); @@ -809,6 +815,7 @@ QCOMPARE(task->property("relatedUid").toString(), updatedTodo->relatedTo()); QCOMPARE(task->property("itemId").toLongLong(), updatedItem.id()); QCOMPARE(task->property("parentCollectionId").toLongLong(), updatedCollection.id()); + QCOMPARE(task->recurrence(), (updatedRecurs ? Domain::Task::RecursDaily : Domain::Task::NoRecurrence)); QCOMPARE(task->attachments().size(), updatedAttachmentData.size()); for (int i = 0; i < task->attachments().size(); i++) { const auto attachment = task->attachments().at(i); @@ -823,6 +830,69 @@ QCOMPARE(task->isRunning(), updatedRunning); } + void shouldUpdateTaskRecurrenceFromItem_data() + { + QTest::addColumn("todoRecurrence"); + QTest::addColumn("expectedRecurrence"); + + QTest::newRow("none") << int(KCalCore::Recurrence::rNone) << Domain::Task::NoRecurrence; + QTest::newRow("minutely") << int(KCalCore::Recurrence::rMinutely) << Domain::Task::NoRecurrence; + QTest::newRow("hourly") << int(KCalCore::Recurrence::rHourly) << Domain::Task::NoRecurrence; + QTest::newRow("daily") << int(KCalCore::Recurrence::rDaily) << Domain::Task::RecursDaily; + QTest::newRow("weekly") << int(KCalCore::Recurrence::rWeekly) << Domain::Task::RecursWeekly; + QTest::newRow("monthly") << int(KCalCore::Recurrence::rMonthlyDay) << Domain::Task::RecursMonthly; + } + + void shouldUpdateTaskRecurrenceFromItem() + { + // GIVEN + + // A todo... + KCalCore::Todo::Ptr todo(new KCalCore::Todo); + todo->setSummary(QStringLiteral("summary")); + + QFETCH(int, todoRecurrence); + switch (todoRecurrence) { + case KCalCore::Recurrence::rNone: + break; + case KCalCore::Recurrence::rMinutely: + todo->recurrence()->setMinutely(1); + break; + case KCalCore::Recurrence::rHourly: + todo->recurrence()->setHourly(1); + break; + case KCalCore::Recurrence::rDaily: + todo->recurrence()->setDaily(1); + break; + case KCalCore::Recurrence::rWeekly: + todo->recurrence()->setWeekly(1); + break; + case KCalCore::Recurrence::rMonthlyDay: + todo->recurrence()->setMonthly(1); + break; + default: + qFatal("Shouldn't happen"); + } + + // ... as payload of an item... + Akonadi::Item item; + item.setMimeType(QStringLiteral("application/x-vnd.akonadi.calendar.todo")); + item.setPayload(todo); + + // ... which has a parent collection... + Akonadi::Collection collection(43); + item.setParentCollection(collection); + + // WHEN + // ... deserialized as a task + Akonadi::Serializer serializer; + auto task = serializer.createTaskFromItem(item); + + // THEN + QFETCH(Domain::Task::Recurrence, expectedRecurrence); + QCOMPARE(task->recurrence(), expectedRecurrence); + } + void shouldNotUpdateTaskFromInvalidItem() { // GIVEN @@ -960,6 +1030,7 @@ QTest::addColumn("itemId"); QTest::addColumn("parentCollectionId"); QTest::addColumn("todoUid"); + QTest::addColumn("recurrence"); QTest::addColumn("attachments"); QTest::addColumn("delegate"); QTest::addColumn("running"); @@ -983,49 +1054,78 @@ QTest::newRow("nominal case (no id)") << "summary" << "content" << false << QDateTime() << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) << qint64(-1) << qint64(-1) << QString() + << Domain::Task::NoRecurrence << attachments << Domain::Task::Delegate(QStringLiteral("John Doe"), QStringLiteral("j@d.com")) << false; + QTest::newRow("nominal case (daily)") << "summary" << "content" << false << QDateTime() + << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) + << qint64(-1) << qint64(-1) << QString() + << Domain::Task::RecursDaily + << Domain::Task::Attachments() + << Domain::Task::Delegate(QStringLiteral("John Doe"), QStringLiteral("j@d.com")) + << false; + QTest::newRow("nominal case (weekly)") << "summary" << "content" << false << QDateTime() + << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) + << qint64(-1) << qint64(-1) << QString() + << Domain::Task::RecursWeekly + << Domain::Task::Attachments() + << Domain::Task::Delegate(QStringLiteral("John Doe"), QStringLiteral("j@d.com")) + << false; + QTest::newRow("nominal case (monthly)") << "summary" << "content" << false << QDateTime() + << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) + << qint64(-1) << qint64(-1) << QString() + << Domain::Task::RecursMonthly + << Domain::Task::Attachments() + << Domain::Task::Delegate(QStringLiteral("John Doe"), QStringLiteral("j@d.com")) + << false; QTest::newRow("done case (no id)") << "summary" << "content" << true << QDateTime(QDate(2013, 11, 30)) << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) << qint64(-1) << qint64(-1) << QString() + << Domain::Task::NoRecurrence << Domain::Task::Attachments() << Domain::Task::Delegate(QStringLiteral("John Doe"), QStringLiteral("j@d.com")) << false; QTest::newRow("empty case (no id)") << QString() << QString() << false << QDateTime() << QDateTime() << QDateTime() << qint64(-1) << qint64(-1) << QString() + << Domain::Task::NoRecurrence << Domain::Task::Attachments() << Domain::Task::Delegate() << false; QTest::newRow("nominal_with_time_info_noid") << "summary" << "content" << true << QDateTime(QDate(2015, 3, 1), QTime(1, 2, 3), Qt::UTC) << QDateTime(QDate(2013, 11, 24), QTime(0, 1, 2), Qt::UTC) << QDateTime(QDate(2016, 3, 1), QTime(4, 5, 6), Qt::UTC) << qint64(-1) << qint64(-1) << QString() + << Domain::Task::NoRecurrence << Domain::Task::Attachments() << Domain::Task::Delegate(QStringLiteral("John Doe"), QStringLiteral("j@d.com")) << false; QTest::newRow("nominal case (with id)") << "summary" << "content" << false << QDateTime() << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) << qint64(42) << qint64(43) << "my-uid" + << Domain::Task::NoRecurrence << Domain::Task::Attachments() << Domain::Task::Delegate(QStringLiteral("John Doe"), QStringLiteral("j@d.com")) << false; QTest::newRow("done case (with id)") << "summary" << "content" << true << QDateTime(QDate(2013, 11, 30)) << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) << qint64(42) << qint64(43) << "my-uid" + << Domain::Task::NoRecurrence << Domain::Task::Attachments() << Domain::Task::Delegate(QStringLiteral("John Doe"), QStringLiteral("j@d.com")) << false; QTest::newRow("empty case (with id)") << QString() << QString() << false << QDateTime() << QDateTime() << QDateTime() << qint64(42) << qint64(43) << "my-uid" + << Domain::Task::NoRecurrence << Domain::Task::Attachments() << Domain::Task::Delegate() << false; QTest::newRow("nominal case (running)") << "running" << QString() << false << QDateTime() << QDateTime(QDate(2013, 11, 24)) << QDateTime(QDate(2014, 03, 01)) << qint64(-1) << qint64(-1) << QString() + << Domain::Task::NoRecurrence << Domain::Task::Attachments() << Domain::Task::Delegate() << true; @@ -1045,6 +1145,7 @@ QFETCH(qint64, itemId); QFETCH(qint64, parentCollectionId); QFETCH(QString, todoUid); + QFETCH(Domain::Task::Recurrence, recurrence); QFETCH(Domain::Task::Attachments, attachments); QFETCH(Domain::Task::Delegate, delegate); QFETCH(bool, running); @@ -1062,6 +1163,7 @@ task->setDoneDate(doneDate); task->setStartDate(startDate); task->setDueDate(dueDate); + task->setRecurrence(recurrence); task->setAttachments(attachments); task->setDelegate(delegate); task->setRunning(running); @@ -1106,6 +1208,15 @@ } QCOMPARE(todo->dtStart().isDateOnly(), todo->allDay()); + const ushort expectedRecurrence = recurrence == Domain::Task::NoRecurrence ? KCalCore::Recurrence::rNone + : recurrence == Domain::Task::RecursDaily ? KCalCore::Recurrence::rDaily + : recurrence == Domain::Task::RecursWeekly ? KCalCore::Recurrence::rWeekly + : recurrence == Domain::Task::RecursMonthly ? KCalCore::Recurrence::rMonthlyDay + : KCalCore::Recurrence::rNone; // Shouldn't happen though + QCOMPARE(todo->recurrence()->recurrenceType(), expectedRecurrence); + if (recurrence != Domain::Task::NoRecurrence) + QCOMPARE(todo->recurrence()->frequency(), 1); + QCOMPARE(todo->attachments().size(), attachments.size()); for (int i = 0; i < attachments.size(); i++) { auto attachment = todo->attachments().at(i);