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"