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"