File indexing completed on 2024-05-12 05:10:37

0001 /*
0002     SPDX-FileCopyrightText: 2010-2011 Sérgio Martins <iamsergio@gmail.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "calendarbasetest.h"
0008 
0009 #include "../src/calendarbase.h"
0010 #include "../src/incidencechanger.h"
0011 
0012 #include <Akonadi/CollectionFetchJob>
0013 #include <Akonadi/CollectionFetchScope>
0014 #include <Akonadi/ItemCreateJob>
0015 #include <Akonadi/ItemFetchJob>
0016 #include <akonadi/qtest_akonadi.h>
0017 
0018 using namespace Akonadi;
0019 using namespace KCalendarCore;
0020 
0021 QTEST_AKONADIMAIN(CalendarBaseTest)
0022 
0023 static bool compareUids(const QStringList &_uids, const Incidence::List &incidences)
0024 {
0025     QStringList uids = _uids;
0026 
0027     for (const KCalendarCore::Incidence::Ptr &incidence : incidences) {
0028         if (uids.contains(incidence->uid())) {
0029             uids.removeAll(incidence->uid());
0030         }
0031     }
0032 
0033     if (uids.isEmpty() && _uids.count() == incidences.count()) {
0034         return true;
0035     } else {
0036         qDebug() << uids.count() << incidences.count();
0037         return false;
0038     }
0039 }
0040 
0041 void CalendarBaseTest::fetchCollection()
0042 {
0043     auto job = new CollectionFetchJob(Collection::root(), CollectionFetchJob::Recursive, this);
0044     // Get list of collections
0045     job->fetchScope().setContentMimeTypes(QStringList() << QStringLiteral("application/x-vnd.akonadi.calendar.event"));
0046     AKVERIFYEXEC(job);
0047 
0048     // Find our collection
0049     const Collection::List collections = job->collections();
0050     QVERIFY(!collections.isEmpty());
0051     mCollection = collections.first();
0052 
0053     QVERIFY(mCollection.isValid());
0054 }
0055 
0056 void CalendarBaseTest::createInitialIncidences()
0057 {
0058     mExpectedSlotResult = true;
0059 
0060     for (int i = 0; i < 5; ++i) {
0061         Event::Ptr event = Event::Ptr(new Event());
0062         event->setUid(QStringLiteral("event") + QString::number(i));
0063         event->setSummary(QStringLiteral("summary") + QString::number(i));
0064         event->setDtStart(QDateTime::currentDateTimeUtc());
0065         mUids.append(event->uid());
0066         QVERIFY(mCalendar->addEvent(event));
0067         QTestEventLoop::instance().enterLoop(5);
0068         QVERIFY(!QTestEventLoop::instance().timeout());
0069     }
0070     mOneEventUid = mUids.last();
0071 
0072     for (int i = 0; i < 5; ++i) {
0073         Todo::Ptr todo = Todo::Ptr(new Todo());
0074         todo->setUid(QStringLiteral("todo") + QString::number(i));
0075         todo->setDtStart(QDateTime::currentDateTimeUtc());
0076         todo->setSummary(QStringLiteral("summary") + QString::number(i));
0077         mUids.append(todo->uid());
0078         QVERIFY(mCalendar->addTodo(todo));
0079         QTestEventLoop::instance().enterLoop(5);
0080         QVERIFY(!QTestEventLoop::instance().timeout());
0081     }
0082     mOneTodoUid = mUids.last();
0083 
0084     for (int i = 0; i < 5; ++i) {
0085         Journal::Ptr journal = Journal::Ptr(new Journal());
0086         journal->setUid(QStringLiteral("journal") + QString::number(i));
0087         journal->setSummary(QStringLiteral("summary") + QString::number(i));
0088         journal->setDtStart(QDateTime::currentDateTimeUtc());
0089         mUids.append(journal->uid());
0090         QVERIFY(mCalendar->addJournal(journal));
0091         QTestEventLoop::instance().enterLoop(5);
0092         QVERIFY(!QTestEventLoop::instance().timeout());
0093     }
0094     mOneJournalUid = mUids.last();
0095 
0096     for (int i = 0; i < 5; ++i) {
0097         Incidence::Ptr incidence = Incidence::Ptr(new Event());
0098         incidence->setUid(QStringLiteral("incidence") + QString::number(i));
0099         incidence->setSummary(QStringLiteral("summary") + QString::number(i));
0100         incidence->setDtStart(QDateTime::currentDateTimeUtc());
0101         mUids.append(incidence->uid());
0102         QVERIFY(mCalendar->addIncidence(incidence));
0103         QTestEventLoop::instance().enterLoop(5);
0104         QVERIFY(!QTestEventLoop::instance().timeout());
0105     }
0106     mOneIncidenceUid = mUids.last();
0107 }
0108 
0109 void CalendarBaseTest::initTestCase()
0110 {
0111     AkonadiTest::checkTestIsIsolated();
0112 
0113     fetchCollection();
0114     qRegisterMetaType<Akonadi::Item>("Akonadi::Item");
0115     mCalendar = new CalendarBase();
0116     mCalendar->incidenceChanger()->setDestinationPolicy(IncidenceChanger::DestinationPolicyDefault);
0117     mCalendar->incidenceChanger()->setDefaultCollection(mCollection);
0118     connect(mCalendar, &CalendarBase::createFinished, this, &CalendarBaseTest::handleCreateFinished);
0119 
0120     connect(mCalendar, &CalendarBase::deleteFinished, this, &CalendarBaseTest::handleDeleteFinished);
0121     createInitialIncidences();
0122 }
0123 
0124 void CalendarBaseTest::cleanupTestCase()
0125 {
0126     delete mCalendar;
0127 }
0128 
0129 void CalendarBaseTest::testItem()
0130 {
0131     for (const QString &uid : std::as_const(mUids)) {
0132         const Item item1 = mCalendar->item(uid);
0133         const Item item2 = mCalendar->item(item1.id());
0134         QVERIFY(item1.isValid());
0135         QVERIFY(item2.isValid());
0136         QCOMPARE(item1.id(), item2.id());
0137         QCOMPARE(item1.payload<KCalendarCore::Incidence::Ptr>()->uid(), uid);
0138         QCOMPARE(item2.payload<KCalendarCore::Incidence::Ptr>()->uid(), uid);
0139     }
0140 }
0141 
0142 void CalendarBaseTest::testChildIncidences_data()
0143 {
0144     QTest::addColumn<QString>("parentUid");
0145     QTest::addColumn<Akonadi::Item::Id>("parentId");
0146     QTest::addColumn<QStringList>("childrenUids");
0147 
0148     QTest::newRow("Invalid parent") << "doesn't exist" << Item::Id(404) << QStringList();
0149     Item::Id id = createTodo(tr("parent1"));
0150     QVERIFY(id > -1);
0151     QVERIFY(createTodo(tr("child1"), tr("parent1")) > -1);
0152     QVERIFY(createTodo(tr("child2"), tr("parent1")) > -1);
0153     QTest::newRow("2 children") << "parent1" << id << (QStringList() << tr("child1") << tr("child2"));
0154 }
0155 
0156 void CalendarBaseTest::testChildIncidences()
0157 {
0158     QFETCH(QString, parentUid);
0159     QFETCH(Akonadi::Item::Id, parentId);
0160     QFETCH(QStringList, childrenUids);
0161     KCalendarCore::Incidence::List children = mCalendar->childIncidences(parentId);
0162     QVERIFY(compareUids(childrenUids, children));
0163     children = mCalendar->childIncidences(parentUid);
0164     QVERIFY(compareUids(childrenUids, children));
0165 }
0166 
0167 void CalendarBaseTest::testDelete()
0168 { // No need for _data()
0169     const Item event = mCalendar->item(mOneEventUid);
0170     QVERIFY(event.isValid());
0171     const Item todo = mCalendar->item(mOneTodoUid);
0172     QVERIFY(todo.isValid());
0173     const Item journal = mCalendar->item(mOneJournalUid);
0174     QVERIFY(journal.isValid());
0175     const Item incidence = mCalendar->item(mOneIncidenceUid);
0176     QVERIFY(incidence.isValid());
0177 
0178     mExpectedSlotResult = true;
0179     QVERIFY(mCalendar->deleteEvent(event.payload<KCalendarCore::Event::Ptr>()));
0180     QTestEventLoop::instance().enterLoop(5);
0181     QVERIFY(!QTestEventLoop::instance().timeout());
0182 
0183     QVERIFY(mCalendar->deleteTodo(todo.payload<KCalendarCore::Todo::Ptr>()));
0184     QTestEventLoop::instance().enterLoop(5);
0185     QVERIFY(!QTestEventLoop::instance().timeout());
0186 
0187     QVERIFY(mCalendar->deleteJournal(journal.payload<KCalendarCore::Journal::Ptr>()));
0188     QTestEventLoop::instance().enterLoop(5);
0189     QVERIFY(!QTestEventLoop::instance().timeout());
0190 
0191     QVERIFY(mCalendar->deleteIncidence(incidence.payload<KCalendarCore::Incidence::Ptr>()));
0192     QTestEventLoop::instance().enterLoop(5);
0193     QVERIFY(!QTestEventLoop::instance().timeout());
0194 
0195     auto job1 = new ItemFetchJob(event, this);
0196     auto job2 = new ItemFetchJob(todo, this);
0197     auto job3 = new ItemFetchJob(journal, this);
0198     auto job4 = new ItemFetchJob(incidence, this);
0199     QVERIFY(!job1->exec());
0200     QVERIFY(!job2->exec());
0201     QVERIFY(!job3->exec());
0202     QVERIFY(!job4->exec());
0203     QVERIFY(mCalendar->item(event.id()) == Item());
0204     QVERIFY(mCalendar->item(todo.id()) == Item());
0205     QVERIFY(mCalendar->item(journal.id()) == Item());
0206     QVERIFY(mCalendar->item(incidence.id()) == Item());
0207 }
0208 
0209 /*
0210 void CalendarBaseTest::testDeleteAll()
0211 {
0212     mCalendar->deleteAllEvents();
0213     QTestEventLoop::instance().enterLoop( 5 );
0214     QVERIFY( !QTestEventLoop::instance().timeout() );
0215     QVERIFY( mCalendar->events().isEmpty() );
0216     QVERIFY( !mCalendar->journals().isEmpty() );
0217     QVERIFY( !mCalendar->todos().isEmpty() );
0218 
0219     mCalendar->deleteAllTodos();
0220     QTestEventLoop::instance().enterLoop( 5 );
0221     QVERIFY( !QTestEventLoop::instance().timeout() );
0222     QVERIFY( mCalendar->events().isEmpty() );
0223     QVERIFY( !mCalendar->journals().isEmpty() );
0224     QVERIFY( mCalendar->todos().isEmpty() );
0225 
0226     mCalendar->deleteAllJournals();
0227     QTestEventLoop::instance().enterLoop( 5 );
0228     QVERIFY( !QTestEventLoop::instance().timeout() );
0229     QVERIFY( mCalendar->events().isEmpty() );
0230     QVERIFY( mCalendar->journals().isEmpty() );
0231     QVERIFY( mCalendar->todos().isEmpty() );
0232 
0233     QVERIFY( mCalendar->incidences().isEmpty() );
0234 
0235     foreach( const QString &uid, mUids ) {
0236         QCOMPARE( mCalendar->item( uid ), Item() );
0237     }
0238 }
0239 */
0240 
0241 void CalendarBaseTest::handleCreateFinished(bool success, const QString &errorString)
0242 {
0243     if (!success) {
0244         qDebug() << "handleCreateFinished(): " << errorString;
0245     }
0246     QCOMPARE(success, mExpectedSlotResult);
0247     QTestEventLoop::instance().exitLoop();
0248 }
0249 
0250 void CalendarBaseTest::handleDeleteFinished(bool success, const QString &errorString)
0251 {
0252     if (!success) {
0253         qDebug() << "handleDeleteFinished(): " << errorString;
0254     }
0255     QCOMPARE(success, mExpectedSlotResult);
0256     QTestEventLoop::instance().exitLoop();
0257 }
0258 
0259 Item::Id CalendarBaseTest::createTodo(const QString &uid, const QString &parentUid)
0260 {
0261     Todo::Ptr todo = Todo::Ptr(new Todo());
0262     todo->setUid(uid);
0263     todo->setSummary(QStringLiteral("summary"));
0264     if (!parentUid.isEmpty()) {
0265         todo->setRelatedTo(parentUid);
0266     }
0267     mCalendar->addTodo(todo);
0268     QTestEventLoop::instance().enterLoop(5);
0269     // QVERIFY( !QTestEventLoop::instance().timeout() );
0270 
0271     return mCalendar->item(uid).id();
0272 }
0273 
0274 #include "moc_calendarbasetest.cpp"