summaryrefslogtreecommitdiffstats
path: root/examples/caldavresource/tests/caldavtest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/caldavresource/tests/caldavtest.cpp')
-rw-r--r--examples/caldavresource/tests/caldavtest.cpp250
1 files changed, 218 insertions, 32 deletions
diff --git a/examples/caldavresource/tests/caldavtest.cpp b/examples/caldavresource/tests/caldavtest.cpp
index 584e288..35ab033 100644
--- a/examples/caldavresource/tests/caldavtest.cpp
+++ b/examples/caldavresource/tests/caldavtest.cpp
@@ -1,5 +1,14 @@
1#include <QtTest> 1#include <QtTest>
2 2
3#include <KDAV2/DavCollectionsFetchJob>
4#include <KDAV2/DavItemFetchJob>
5#include <KDAV2/DavItemModifyJob>
6#include <KDAV2/DavItemsListJob>
7#include <KDAV2/EtagCache>
8
9#include <KCalCore/Event>
10#include <KCalCore/ICalFormat>
11
3#include "../caldavresource.h" 12#include "../caldavresource.h"
4 13
5#include "common/resourcecontrol.h" 14#include "common/resourcecontrol.h"
@@ -8,6 +17,8 @@
8#include "common/test.h" 17#include "common/test.h"
9#include "tests/testutils.h" 18#include "tests/testutils.h"
10 19
20#include <algorithm>
21
11using Sink::ApplicationDomain::Calendar; 22using Sink::ApplicationDomain::Calendar;
12using Sink::ApplicationDomain::DummyResource; 23using Sink::ApplicationDomain::DummyResource;
13using Sink::ApplicationDomain::Event; 24using Sink::ApplicationDomain::Event;
@@ -20,16 +31,17 @@ class CalDavTest : public QObject
20 SinkResource createResource() 31 SinkResource createResource()
21 { 32 {
22 auto resource = Sink::ApplicationDomain::CalDavResource::create("account1"); 33 auto resource = Sink::ApplicationDomain::CalDavResource::create("account1");
23 resource.setProperty("server", "http://localhost/dav/calendars/users/doe"); 34 resource.setProperty("server", "http://localhost:5232");
24 resource.setProperty("username", "doe"); 35 resource.setProperty("username", "test1");
25 Sink::SecretStore::instance().insert(resource.identifier(), "doe"); 36 Sink::SecretStore::instance().insert(resource.identifier(), "test1");
26 resource.setProperty("testmode", true); 37 resource.setProperty("testmode", true);
27 return resource; 38 return resource;
28 } 39 }
29 40
30
31 QByteArray mResourceInstanceIdentifier; 41 QByteArray mResourceInstanceIdentifier;
32 42
43 QString addedEventUid;
44
33private slots: 45private slots:
34 46
35 void initTestCase() 47 void initTestCase()
@@ -51,34 +63,208 @@ private slots:
51 VERIFYEXEC(Sink::ResourceControl::start(mResourceInstanceIdentifier)); 63 VERIFYEXEC(Sink::ResourceControl::start(mResourceInstanceIdentifier));
52 } 64 }
53 65
54 // void testSyncCal() 66 void testSyncCal()
55 // { 67 {
56 // VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier))); 68 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
57 // // Check in the logs that it doesn't synchronize events again because same CTag 69 // Check in the logs that it doesn't synchronize events again because same CTag
58 // VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier))); 70 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
59 // } 71 }
60 72
61 // void testSyncCalEmpty() 73 void testSyncCalEmpty()
62 // { 74 {
63 // VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier))); 75 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
64 76 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
65 // auto eventJob = 77
66 // Sink::Store::fetchAll<Event>(Sink::Query().request<Event::Uid>()).then([](const QList<Event::Ptr> &events) { 78 auto eventJob = Sink::Store::fetchAll<Event>(Sink::Query().request<Event::Uid>())
67 // QCOMPARE(events.size(), 14); 79 .then([](const QList<Event::Ptr> &events) { QCOMPARE(events.size(), 1); });
68 // }); 80 VERIFYEXEC(eventJob);
69 // VERIFYEXEC(eventJob); 81
70 82 auto calendarJob = Sink::Store::fetchAll<Calendar>(Sink::Query().request<Calendar::Name>())
71 // auto calendarJob = 83 .then([](const QList<Calendar::Ptr> &calendars) {
72 // Sink::Store::fetchAll<Calendar>(Sink::Query().request<Calendar::Name>()).then([](const QList<Calendar::Ptr> &calendars) { 84 QCOMPARE(calendars.size(), 1);
73 // QCOMPARE(calendars.size(), 2); 85 for (const auto &calendar : calendars) {
74 // for (const auto &calendar : calendars) { 86 QVERIFY(calendar->getName() == "MyCalendar");
75 // QVERIFY(calendar->getName() == "Calendar" || calendar->getName() == "Tasks"); 87 }
76 // } 88 });
77 // }); 89 VERIFYEXEC(calendarJob);
78 // VERIFYEXEC(calendarJob); 90
79 91 SinkLog() << "Finished";
80 // SinkLog() << "Finished"; 92 }
81 // } 93
94 void testAddEvent()
95 {
96 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
97 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
98
99 auto job = Sink::Store::fetchOne<Calendar>({}).exec();
100 job.waitForFinished();
101 QVERIFY2(!job.errorCode(), "Fetching Calendar failed");
102 auto calendar = job.value();
103
104 auto event = QSharedPointer<KCalCore::Event>::create();
105 event->setSummary("Hello");
106 event->setDtStart(QDateTime::currentDateTime());
107 event->setDtEnd(QDateTime::currentDateTime().addSecs(3600));
108 event->setCreated(QDateTime::currentDateTime());
109 addedEventUid = QUuid::createUuid().toString();
110 event->setUid(addedEventUid);
111
112 auto ical = KCalCore::ICalFormat().toICalString(event);
113 Event sinkEvent(mResourceInstanceIdentifier);
114 sinkEvent.setIcal(ical.toUtf8());
115 sinkEvent.setCalendar(calendar);
116
117 SinkLog() << "Adding event";
118 VERIFYEXEC(Sink::Store::create(sinkEvent));
119 VERIFYEXEC(Sink::ResourceControl::flushReplayQueue(mResourceInstanceIdentifier));
120
121 auto verifyEventCountJob =
122 Sink::Store::fetchAll<Event>(Sink::Query().request<Event::Uid>()).then([](const QList<Event::Ptr> &events) {
123 QCOMPARE(events.size(), 2);
124 });
125 VERIFYEXEC(verifyEventCountJob);
126
127 auto verifyEventJob =
128 Sink::Store::fetchOne<Event>(Sink::Query().filter("uid", Sink::Query::Comparator(addedEventUid)))
129 .then([](const Event &event) { QCOMPARE(event.getSummary(), "Hello"); });
130 VERIFYEXEC(verifyEventJob);
131 }
132
133 void testModifyEvent()
134 {
135 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
136 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
137
138 auto job = Sink::Store::fetchOne<Event>(
139 Sink::Query().filter("uid", Sink::Query::Comparator(addedEventUid)))
140 .exec();
141 job.waitForFinished();
142 QVERIFY2(!job.errorCode(), "Fetching Event failed");
143 auto event = job.value();
144
145 auto incidence = KCalCore::ICalFormat().readIncidence(event.getIcal());
146 auto calevent = incidence.dynamicCast<KCalCore::Event>();
147 QVERIFY2(calevent, "Cannot convert to KCalCore event");
148
149 calevent->setSummary("Hello World!");
150 auto dummy = QSharedPointer<KCalCore::Event>(calevent);
151 auto newical = KCalCore::ICalFormat().toICalString(dummy);
152
153 event.setIcal(newical.toUtf8());
154
155 VERIFYEXEC(Sink::Store::modify(event));
156
157 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
158 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
159
160 auto verifyEventCountJob = Sink::Store::fetchAll<Event>({}).then(
161 [](const QList<Event::Ptr> &events) { QCOMPARE(events.size(), 2); });
162 VERIFYEXEC(verifyEventCountJob);
163
164 auto verifyEventJob =
165 Sink::Store::fetchOne<Event>(Sink::Query().filter("uid", Sink::Query::Comparator(addedEventUid)))
166 .then([](const Event &event) { QCOMPARE(event.getSummary(), "Hello World!"); });
167 VERIFYEXEC(verifyEventJob);
168 }
169
170 void testSneakyModifyEvent()
171 {
172 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
173 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
174
175 // Change the item without sink's knowledge
176 {
177 qWarning() << 1;
178 auto collection = ([]() -> KDAV2::DavCollection {
179 KDAV2::DavUrl davurl({ "http://test1:test1@localhost:5232" }, KDAV2::CalDav);
180 KDAV2::DavCollectionsFetchJob collectionsJob(davurl);
181 collectionsJob.exec();
182 Q_ASSERT(collectionsJob.error() == 0);
183 return collectionsJob.collections()[0];
184 })();
185
186 auto itemList = ([&collection]() -> KDAV2::DavItem::List {
187 auto cache = std::make_shared<KDAV2::EtagCache>();
188 KDAV2::DavItemsListJob itemsListJob(collection.url(), cache);
189 itemsListJob.exec();
190 Q_ASSERT(itemsListJob.error() == 0);
191 return itemsListJob.items();
192 })();
193 auto hollowDavItemIt =
194 std::find_if(itemList.begin(), itemList.end(), [this](const KDAV2::DavItem &item) {
195 return item.url().url().path().endsWith(addedEventUid);
196 });
197
198 auto davitem = ([this, &collection, &hollowDavItemIt]() -> KDAV2::DavItem {
199 QString itemUrl = collection.url().url().toEncoded() + addedEventUid;
200 KDAV2::DavItemFetchJob itemFetchJob(*hollowDavItemIt);
201 itemFetchJob.exec();
202 Q_ASSERT(itemFetchJob.error() == 0);
203 return itemFetchJob.item();
204 })();
205
206 qWarning() << 3;
207 auto incidence = KCalCore::ICalFormat().readIncidence(davitem.data());
208 auto calevent = incidence.dynamicCast<KCalCore::Event>();
209 QVERIFY2(calevent, "Cannot convert to KCalCore event");
210
211 qWarning() << 4;
212 calevent->setSummary("Manual Hello World!");
213 auto newical = KCalCore::ICalFormat().toICalString(calevent);
214
215 qWarning() << 5;
216 davitem.setData(newical.toUtf8());
217 KDAV2::DavItemModifyJob itemModifyJob(davitem);
218 itemModifyJob.exec();
219 QVERIFY2(itemModifyJob.error() == 0, "Cannot modify item");
220
221 qWarning() << 6;
222 }
223
224 // Try to change the item with sink
225 {
226 auto job = Sink::Store::fetchOne<Event>(
227 Sink::Query().filter("uid", Sink::Query::Comparator(addedEventUid)))
228 .exec();
229 job.waitForFinished();
230 QVERIFY2(!job.errorCode(), "Fetching Event failed");
231 auto event = job.value();
232
233 auto incidence = KCalCore::ICalFormat().readIncidence(event.getIcal());
234 auto calevent = incidence.dynamicCast<KCalCore::Event>();
235 QVERIFY2(calevent, "Cannot convert to KCalCore event");
236
237 calevent->setSummary("Sink Hello World!");
238 auto dummy = QSharedPointer<KCalCore::Event>(calevent);
239 auto newical = KCalCore::ICalFormat().toICalString(dummy);
240
241 event.setIcal(newical.toUtf8());
242
243 // TODO: make that fail
244 VERIFYEXEC(Sink::Store::modify(event));
245 VERIFYEXEC(Sink::ResourceControl::flushReplayQueue(mResourceInstanceIdentifier));
246 }
247 }
248
249 void testRemoveEvent()
250 {
251 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
252 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
253
254 auto job = Sink::Store::fetchOne<Event>(
255 Sink::Query().filter("uid", Sink::Query::Comparator(addedEventUid)))
256 .exec();
257 job.waitForFinished();
258 QVERIFY2(!job.errorCode(), "Fetching Event failed");
259 auto event = job.value();
260
261 VERIFYEXEC(Sink::Store::remove(event));
262 VERIFYEXEC(Sink::ResourceControl::flushReplayQueue(mResourceInstanceIdentifier));
263
264 auto verifyEventCountJob = Sink::Store::fetchAll<Event>({}).then(
265 [](const QList<Event::Ptr> &events) { QCOMPARE(events.size(), 1); });
266 VERIFYEXEC(verifyEventCountJob);
267 }
82}; 268};
83 269
84QTEST_MAIN(CalDavTest) 270QTEST_MAIN(CalDavTest)