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 "todopurgertest.h"
0008 
0009 #include "../etmcalendar.h"
0010 #include "../todopurger.h"
0011 #include <Akonadi/CollectionFetchJob>
0012 #include <Akonadi/CollectionFetchScope>
0013 #include <Akonadi/CollectionModifyJob>
0014 #include <Akonadi/ItemCreateJob>
0015 #include <Akonadi/ItemDeleteJob>
0016 #include <Akonadi/ItemModifyJob>
0017 #include <KCheckableProxyModel>
0018 #include <akonadi/qtest_akonadi.h>
0019 
0020 #include <QTestEventLoop>
0021 
0022 using namespace Akonadi;
0023 using namespace KCalendarCore;
0024 
0025 Q_DECLARE_METATYPE(QSet<QByteArray>)
0026 
0027 void TodoPurgerTest::createTodo(const QString &uid, const QString &parentUid, bool completed, bool recurring)
0028 {
0029     Item item;
0030     item.setMimeType(Todo::todoMimeType());
0031     Todo::Ptr todo = Todo::Ptr(new Todo());
0032     todo->setUid(uid);
0033 
0034     const KDateTime today = KDateTime::currentDateTime(KDateTime::UTC);
0035     const KDateTime yesterday = today.addDays(-1);
0036 
0037     todo->setDtStart(yesterday);
0038     todo->setRelatedTo(parentUid);
0039 
0040     if (recurring) {
0041         todo->recurrence()->setDaily(1);
0042     }
0043 
0044     if (recurring && completed) {
0045         todo->setCompleted(today);
0046     } else {
0047         todo->setCompleted(completed);
0048     }
0049 
0050     todo->setSummary(QStringLiteral("summary"));
0051 
0052     item.setPayload<KCalendarCore::Incidence::Ptr>(todo);
0053     ItemCreateJob *job = new ItemCreateJob(item, m_collection, this);
0054     m_pendingCreations++;
0055     AKVERIFYEXEC(job);
0056 }
0057 
0058 void TodoPurgerTest::fetchCollection()
0059 {
0060     CollectionFetchJob *job = new CollectionFetchJob(Collection::root(), CollectionFetchJob::Recursive, this);
0061     // Get list of collections
0062     job->fetchScope().setContentMimeTypes(QStringList() << QStringLiteral("application/x-vnd.akonadi.calendar.todo"));
0063     AKVERIFYEXEC(job);
0064 
0065     // Find our collection
0066     Collection::List collections = job->collections();
0067     QVERIFY(!collections.isEmpty());
0068     m_collection = collections.first();
0069 
0070     QVERIFY(m_collection.isValid());
0071 }
0072 
0073 void TodoPurgerTest::initTestCase()
0074 {
0075     AkonadiTest::checkTestIsIsolated();
0076 
0077     qRegisterMetaType<QSet<QByteArray>>("QSet<QByteArray>");
0078     fetchCollection();
0079 
0080     m_pendingCreations = 0;
0081     m_pendingDeletions = 0;
0082     m_calendar = new ETMCalendar();
0083     m_calendar->registerObserver(this);
0084     m_todoPurger = new TodoPurger(this);
0085 
0086     connect(m_todoPurger, &Akonadi::TodoPurger::todosPurged, this, &TodoPurgerTest::onTodosPurged);
0087 
0088     connect(m_calendar, SIGNAL(collectionsAdded(Akonadi::Collection::List)), &QTestEventLoop::instance(), SLOT(exitLoop()));
0089 
0090     // Wait for the collection
0091     QTestEventLoop::instance().enterLoop(10);
0092     QVERIFY(!QTestEventLoop::instance().timeout());
0093 
0094     KCheckableProxyModel *checkable = m_calendar->checkableProxyModel();
0095     const QModelIndex firstIndex = checkable->index(0, 0);
0096     QVERIFY(firstIndex.isValid());
0097     checkable->setData(firstIndex, Qt::Checked, Qt::CheckStateRole);
0098 }
0099 
0100 void TodoPurgerTest::cleanupTestCase()
0101 {
0102     delete m_calendar;
0103 }
0104 
0105 void TodoPurgerTest::testPurge()
0106 {
0107     createTree();
0108 
0109     m_pendingDeletions = 8;
0110     m_pendingPurgeSignal = true;
0111 
0112     m_todoPurger->purgeCompletedTodos();
0113 
0114     // Wait for deletions and purged signal
0115     QTestEventLoop::instance().enterLoop(10);
0116     QVERIFY(!QTestEventLoop::instance().timeout());
0117 
0118     QCOMPARE(m_numDeleted, 10);
0119     QCOMPARE(m_numIgnored, 2);
0120 }
0121 
0122 void TodoPurgerTest::calendarIncidenceAdded(const Incidence::Ptr &incidence)
0123 {
0124     --m_pendingCreations;
0125     if (m_pendingCreations == 0) {
0126         QTestEventLoop::instance().exitLoop();
0127     }
0128 }
0129 
0130 void TodoPurgerTest::calendarIncidenceDeleted(const Incidence::Ptr &incidence, const KCalendarCore::Calendar *calendar)
0131 {
0132     --m_pendingDeletions;
0133     if (m_pendingDeletions == 0 && !m_pendingPurgeSignal) {
0134         QTestEventLoop::instance().exitLoop();
0135     }
0136 }
0137 
0138 void TodoPurgerTest::onTodosPurged(bool success, int numDeleted, int numIgnored)
0139 {
0140     QVERIFY(success);
0141     m_pendingPurgeSignal = false;
0142     m_numDeleted = numDeleted;
0143     m_numIgnored = numIgnored;
0144 
0145     if (m_pendingDeletions == 0) {
0146         QTestEventLoop::instance().enterLoop(10);
0147         QVERIFY(!QTestEventLoop::instance().timeout());
0148     }
0149 }
0150 
0151 void TodoPurgerTest::createTree()
0152 {
0153     createTodo(tr("a"), QString(), true); // Will be deleted
0154     createTodo(tr("b"), QString(), false); // Won't be deleted
0155 
0156     // Completed tree
0157     createTodo(tr("c"), QString(), true); // Will be deleted
0158     createTodo(tr("c1"), tr("c"), true); // Will be deleted
0159     createTodo(tr("c1.1"), tr("c1"), true); // Will be deleted
0160     createTodo(tr("c1.2"), tr("c1"), true); // Will be deleted
0161 
0162     // Root completed but children not completed
0163     createTodo(tr("d"), QString(), true); // Will be ignored (incomplete children)
0164     createTodo(tr("d1"), tr("d"), false); // Won't be deleted
0165     createTodo(tr("d1.1"), tr("d1"), false); // Won't be deleted
0166     createTodo(tr("d1.2"), tr("d1"), false); // Won't be deleted
0167 
0168     // Root incomplete with children complete
0169     createTodo(tr("e"), QString(), false); // Won't be deleted
0170     createTodo(tr("e1"), tr("e"), true); // Will be deleted
0171     createTodo(tr("e1.1"), tr("e1"), true); // Will be deleted
0172     createTodo(tr("e1.2"), tr("e1"), true); // Will be deleted
0173 
0174     // Recurring incomplete
0175     createTodo(tr("f"), QString(), false, true); // Won't be deleted
0176 
0177     // Recurring complete, this one is not deleted because recurrence didn't end
0178     createTodo(tr("g"), QString(), true, true); // Won't be deleted
0179 
0180     createTodo(tr("h"), QString(), true); // Will be ignored (incomplete children)
0181     createTodo(tr("h1"), tr("h"), false); // Won't be deleted
0182     createTodo(tr("h1.1"), tr("h1"), true); // Will be deleted
0183     createTodo(tr("h1.2"), tr("h1"), true); // Will be deleted
0184 
0185     // Now wait for incidences do be created
0186     QTestEventLoop::instance().enterLoop(10);
0187     QVERIFY(!QTestEventLoop::instance().timeout());
0188 }
0189 
0190 QTEST_AKONADIMAIN(TodoPurgerTest, GUI)
0191 
0192 #include "moc_todopurgertest.cpp"