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"