File indexing completed on 2024-05-12 05:10:40
0001 /* 0002 SPDX-FileCopyrightText: 2013 Sérgio Martins <iamsergio@gmail.com> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "unittestbase.h" 0008 #include "../src/fetchjobcalendar.h" 0009 #include "helper.h" 0010 #include "mailclient_p.h" 0011 0012 #include "incidencechanger.h" 0013 #include "itiphandler.h" 0014 #include <Akonadi/ItemCreateJob> 0015 #include <KCalendarCore/Event> 0016 #include <KCalendarCore/ICalFormat> 0017 0018 #include <QByteArray> 0019 #include <QFile> 0020 #include <QTest> 0021 #include <QTestEventLoop> 0022 0023 using namespace Akonadi; 0024 using namespace KCalendarCore; 0025 0026 UnitTestBase::UnitTestBase() 0027 { 0028 qRegisterMetaType<Akonadi::Item>("Akonadi::Item"); 0029 qRegisterMetaType<QList<Akonadi::IncidenceChanger::ChangeType>>("QList<Akonadi::IncidenceChanger::ChangeType>"); 0030 qRegisterMetaType<QList<Akonadi::Item::Id>>("QList<Akonadi::Item::Id>"); 0031 qRegisterMetaType<Akonadi::MailClient::Result>("Akonadi::MailClient::Result"); 0032 0033 mChanger = new IncidenceChanger(this); 0034 mChanger->setShowDialogsOnError(false); 0035 mChanger->setHistoryEnabled(true); 0036 0037 mCollection = Helper::fetchCollection(); 0038 Q_ASSERT(mCollection.isValid()); 0039 mChanger->setDefaultCollection(mCollection); 0040 } 0041 0042 void UnitTestBase::waitForIt() 0043 { 0044 QTestEventLoop::instance().enterLoop(10); 0045 QVERIFY(!QTestEventLoop::instance().timeout()); 0046 } 0047 0048 void UnitTestBase::stopWaiting() 0049 { 0050 QTestEventLoop::instance().exitLoop(); 0051 } 0052 0053 void UnitTestBase::createIncidence(const QString &uid) 0054 { 0055 Item item = generateIncidence(uid); 0056 createIncidence(item); 0057 } 0058 0059 void UnitTestBase::createIncidence(const Item &item) 0060 { 0061 QVERIFY(mCollection.isValid()); 0062 auto job = new ItemCreateJob(item, mCollection, this); 0063 QVERIFY(job->exec()); 0064 } 0065 0066 void UnitTestBase::verifyExists(const QString &uid, bool exists) 0067 { 0068 auto calendar = new FetchJobCalendar(); 0069 connect(calendar, &FetchJobCalendar::loadFinished, this, &UnitTestBase::onLoadFinished); 0070 waitForIt(); 0071 calendar->deleteLater(); 0072 0073 QCOMPARE(calendar->incidence(uid) != nullptr, exists); 0074 } 0075 0076 Akonadi::Item::List UnitTestBase::calendarItems() 0077 { 0078 FetchJobCalendar::Ptr calendar = FetchJobCalendar::Ptr(new FetchJobCalendar()); 0079 connect(calendar.data(), &FetchJobCalendar::loadFinished, this, &UnitTestBase::onLoadFinished); 0080 waitForIt(); 0081 KCalendarCore::ICalFormat format; 0082 QString dump = format.toString(calendar.staticCast<KCalendarCore::Calendar>()); 0083 qDebug() << dump; 0084 calendar->deleteLater(); 0085 return calendar->items(); 0086 } 0087 0088 void UnitTestBase::onLoadFinished(bool success, const QString &) 0089 { 0090 QVERIFY(success); 0091 stopWaiting(); 0092 } 0093 0094 void UnitTestBase::compareCalendars(const KCalendarCore::Calendar::Ptr &expectedCalendar) 0095 { 0096 FetchJobCalendar::Ptr calendar = FetchJobCalendar::Ptr(new FetchJobCalendar()); 0097 connect(calendar.data(), &FetchJobCalendar::loadFinished, this, &UnitTestBase::onLoadFinished); 0098 waitForIt(); 0099 0100 // Now compare the expected calendar to the calendar we got. 0101 Incidence::List incidences = calendar->incidences(); 0102 const Incidence::List expectedIncidences = expectedCalendar->incidences(); 0103 0104 // First, replace the randomly generated UIDs with the UID that came in the invitation e-mail... 0105 for (const KCalendarCore::Incidence::Ptr &incidence : std::as_const(incidences)) { 0106 incidence->setUid(incidence->schedulingID()); 0107 qDebug() << "We have incidece with uid=" << incidence->uid() << "; instanceidentifier=" << incidence->instanceIdentifier(); 0108 auto attendees = incidence->attendees(); 0109 for (auto &attendee : attendees) { 0110 attendee.setUid(attendee.email()); 0111 } 0112 incidence->setAttendees(attendees); 0113 } 0114 0115 // ... so we can compare them 0116 for (const KCalendarCore::Incidence::Ptr &incidence : expectedIncidences) { 0117 incidence->setUid(incidence->schedulingID()); 0118 qDebug() << "We expect incidece with uid=" << incidence->uid() << "; instanceidentifier=" << incidence->instanceIdentifier(); 0119 auto attendees = incidence->attendees(); 0120 for (auto &attendee : attendees) { 0121 attendee.setUid(attendee.email()); 0122 } 0123 incidence->setAttendees(attendees); 0124 } 0125 0126 QCOMPARE(incidences.count(), expectedIncidences.count()); 0127 0128 for (const KCalendarCore::Incidence::Ptr &expectedIncidence : expectedIncidences) { 0129 KCalendarCore::Incidence::Ptr incidence; 0130 for (int i = 0; i < incidences.count(); i++) { 0131 if (incidences.at(i)->instanceIdentifier() == expectedIncidence->instanceIdentifier()) { 0132 incidence = incidences.at(i); 0133 incidences.remove(i); 0134 break; 0135 } 0136 } 0137 QVERIFY(incidence); 0138 // Don't fail on creation times, which are obviously different 0139 expectedIncidence->setCreated(incidence->created()); 0140 incidence->removeCustomProperty(QByteArray("LIBKCAL"), QByteArray("ID")); 0141 0142 if (*expectedIncidence != *incidence) { 0143 ICalFormat format; 0144 QString expectedData = format.toString(expectedIncidence); 0145 QString gotData = format.toString(incidence); 0146 qDebug() << "Test failed, expected:\n" << expectedData << "\nbut got " << gotData; 0147 QVERIFY(false); 0148 } 0149 } 0150 } 0151 0152 /** static */ 0153 QByteArray UnitTestBase::readFile(const QString &filename) 0154 { 0155 QFile file(filename); 0156 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { 0157 qWarning() << "File could not be opened for reading:" << filename; 0158 return {}; 0159 } 0160 0161 return file.readAll(); 0162 } 0163 0164 Item UnitTestBase::generateIncidence(const QString &uid, const QString &organizer) 0165 { 0166 Item item; 0167 item.setMimeType(KCalendarCore::Event::eventMimeType()); 0168 KCalendarCore::Incidence::Ptr incidence = KCalendarCore::Incidence::Ptr(new KCalendarCore::Event()); 0169 0170 if (!uid.isEmpty()) { 0171 incidence->setUid(uid); 0172 } 0173 0174 const QDateTime now = QDateTime::currentDateTimeUtc(); 0175 incidence->setDtStart(now); 0176 incidence->setDateTime(now.addSecs(3600), Incidence::RoleEnd); 0177 incidence->setSummary(QStringLiteral("summary")); 0178 item.setPayload<KCalendarCore::Incidence::Ptr>(incidence); 0179 0180 if (!organizer.isEmpty()) { 0181 incidence->setOrganizer(organizer); 0182 } 0183 0184 return item; 0185 } 0186 0187 #include "moc_unittestbase.cpp"