summaryrefslogtreecommitdiffstats
path: root/examples/caldavresource/tests
diff options
context:
space:
mode:
Diffstat (limited to 'examples/caldavresource/tests')
-rw-r--r--examples/caldavresource/tests/caldavtest.cpp391
1 files changed, 218 insertions, 173 deletions
diff --git a/examples/caldavresource/tests/caldavtest.cpp b/examples/caldavresource/tests/caldavtest.cpp
index daa890d..d62616f 100644
--- a/examples/caldavresource/tests/caldavtest.cpp
+++ b/examples/caldavresource/tests/caldavtest.cpp
@@ -1,8 +1,10 @@
1#include <QtTest> 1#include <QtTest>
2 2
3#include <KDAV2/DavCollectionsFetchJob> 3#include <KDAV2/DavCollectionsFetchJob>
4#include <KDAV2/DavCollectionCreateJob>
4#include <KDAV2/DavItemFetchJob> 5#include <KDAV2/DavItemFetchJob>
5#include <KDAV2/DavItemModifyJob> 6#include <KDAV2/DavItemModifyJob>
7#include <KDAV2/DavItemCreateJob>
6#include <KDAV2/DavItemsListJob> 8#include <KDAV2/DavItemsListJob>
7#include <KDAV2/EtagCache> 9#include <KDAV2/EtagCache>
8 10
@@ -41,20 +43,82 @@ class CalDavTest : public QObject
41 resource.setProperty("server", baseUrl); 43 resource.setProperty("server", baseUrl);
42 resource.setProperty("username", username); 44 resource.setProperty("username", username);
43 Sink::SecretStore::instance().insert(resource.identifier(), password); 45 Sink::SecretStore::instance().insert(resource.identifier(), password);
44 resource.setProperty("testmode", true);
45 return resource; 46 return resource;
46 } 47 }
47 48
48 QByteArray mResourceInstanceIdentifier; 49 QByteArray mResourceInstanceIdentifier;
49 50
50 QString addedEventUid; 51 QByteArray createEvent(const QString &subject, const QString &collectionName)
51 QString addedTodoUid; 52 {
53 QUrl mainUrl{"http://localhost/dav/calendars/user/doe"};
54 mainUrl.setUserName(QStringLiteral("doe"));
55 mainUrl.setPassword(QStringLiteral("doe"));
56
57 KDAV2::DavUrl davUrl(mainUrl, KDAV2::CalDav);
58
59 auto *job = new KDAV2::DavCollectionsFetchJob(davUrl);
60 job->exec();
61
62 const auto collectionUrl = [&] {
63 for (const auto &col : job->collections()) {
64 // qWarning() << "Looking for " << collectionName << col.displayName();
65 if (col.displayName() == collectionName) {
66 return col.url().url();
67 }
68 }
69 return QUrl{};
70 }();
71
72 QUrl url{collectionUrl.toString() + subject + ".ical"};
73 url.setUserInfo(mainUrl.userInfo());
74
75 KDAV2::DavUrl testItemUrl(url, KDAV2::CardDav);
76
77 auto event = QSharedPointer<KCalCore::Event>::create();
78 event->setSummary(subject);
79 event->setDtStart(QDateTime::currentDateTime());
80 event->setDtEnd(QDateTime::currentDateTime().addSecs(3600));
81 event->setCreated(QDateTime::currentDateTime());
82 event->setUid(subject);
83
84 auto data = KCalCore::ICalFormat().toICalString(event).toUtf8();
85
86 KDAV2::DavItem item(testItemUrl, QStringLiteral("text/calendar"), data, QString());
87 auto createJob = new KDAV2::DavItemCreateJob(item);
88 createJob->exec();
89 if (createJob->error()) {
90 qWarning() << createJob->errorString();
91 }
92 return event->uid().toUtf8();
93 }
94
95 void createCollection(const QString &name)
96 {
97 QUrl mainUrl(QStringLiteral("http://localhost/dav/calendars/user/doe/") + name);
98 mainUrl.setUserName(QStringLiteral("doe"));
99 mainUrl.setPassword(QStringLiteral("doe"));
100
101 KDAV2::DavUrl davUrl(mainUrl, KDAV2::CalDav);
102 KDAV2::DavCollection collection{davUrl, name, KDAV2::DavCollection::Events};
103
104 auto createJob = new KDAV2::DavCollectionCreateJob(collection);
105 createJob->exec();
106 if (createJob->error()) {
107 qWarning() << createJob->errorString();
108 }
109 }
110
111 void resetTestEnvironment()
112 {
113 system("resetmailbox.sh");
114 }
52 115
53private slots: 116private slots:
54 117
55 void initTestCase() 118 void initTestCase()
56 { 119 {
57 Sink::Test::initTest(); 120 Sink::Test::initTest();
121 resetTestEnvironment();
58 auto resource = createResource(); 122 auto resource = createResource();
59 QVERIFY(!resource.identifier().isEmpty()); 123 QVERIFY(!resource.identifier().isEmpty());
60 VERIFYEXEC(Sink::Store::create(resource)); 124 VERIFYEXEC(Sink::Store::create(resource));
@@ -76,42 +140,73 @@ private slots:
76 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier))); 140 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
77 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier)); 141 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
78 142
79 auto eventJob = Sink::Store::fetchAll<Event>(Sink::Query().request<Event::Uid>()) 143 QCOMPARE(Sink::Store::read<Event>({}).size(), 0);
80 .then([](const QList<Event::Ptr> &events) { QCOMPARE(events.size(), 0); }); 144 QCOMPARE(Sink::Store::read<Todo>({}).size(), 0);
81 auto todoJob = Sink::Store::fetchAll<Todo>(Sink::Query().request<Todo::Uid>()) 145
82 .then([](const QList<Todo::Ptr> &todos) { QCOMPARE(todos.size(), 0); }); 146 const auto calendars = Sink::Store::read<Calendar>(Sink::Query().request<Calendar::Name>());
147 QCOMPARE(calendars.size(), 1);
148 QCOMPARE(calendars.first().getName(), {"personal"});
149 }
150
151 void testSyncCalendars()
152 {
153 createCollection("calendar2");
154
155 Sink::SyncScope scope;
156 scope.setType<Calendar>();
157 scope.resourceFilter(mResourceInstanceIdentifier);
158
159 VERIFYEXEC(Sink::Store::synchronize(scope));
160 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
161 const auto calendars = Sink::Store::read<Calendar>(Sink::Query().resourceFilter(mResourceInstanceIdentifier));
162 QCOMPARE(calendars.size(), 2);
163 }
83 164
84 VERIFYEXEC(eventJob); 165 void testSyncEvents()
85 VERIFYEXEC(todoJob); 166 {
167 createEvent("event1", "personal");
168 createEvent("event2", "personal");
169 createEvent("event3", "calendar2");
170 Sink::SyncScope scope;
171 scope.setType<Event>();
172 scope.resourceFilter(mResourceInstanceIdentifier);
173
174 VERIFYEXEC(Sink::Store::synchronize(scope));
175 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
176 const auto events = Sink::Store::read<Event>(Sink::Query().resourceFilter(mResourceInstanceIdentifier));
177 QCOMPARE(events.size(), 3);
86 178
87 auto calendarJob = Sink::Store::fetchAll<Calendar>(Sink::Query().request<Calendar::Name>()) 179 //Ensure a resync works
88 .then([](const QList<Calendar::Ptr> &calendars) { 180 {
89 QCOMPARE(calendars.size(), 1); 181 VERIFYEXEC(Sink::Store::synchronize(scope));
90 for (const auto &calendar : calendars) { 182 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
91 QVERIFY(calendar->getName() == "personal"); 183 const auto events = Sink::Store::read<Event>(Sink::Query().resourceFilter(mResourceInstanceIdentifier));
92 } 184 QCOMPARE(events.size(), 3);
93 }); 185 }
94 VERIFYEXEC(calendarJob);
95 186
96 SinkLog() << "Finished"; 187 //Ensure a resync after another creation works
188 createEvent("event4", "calendar2");
189 {
190 VERIFYEXEC(Sink::Store::synchronize(scope));
191 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
192 const auto events = Sink::Store::read<Event>(Sink::Query().resourceFilter(mResourceInstanceIdentifier));
193 QCOMPARE(events.size(), 4);
194 }
97 } 195 }
98 196
99 void testAddEvent() 197 void testCreateModifyDeleteEvent()
100 { 198 {
101 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier))); 199 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
102 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier)); 200 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
103 201
104 auto future = Sink::Store::fetchOne<Calendar>({}).exec(); 202 auto calendar = Sink::Store::readOne<Calendar>(Sink::Query{}.filter<Calendar::Name>("personal"));
105 future.waitForFinished();
106 QVERIFY2(!future.errorCode(), "Fetching Calendar failed");
107 auto calendar = future.value();
108 203
109 auto event = QSharedPointer<KCalCore::Event>::create(); 204 auto event = QSharedPointer<KCalCore::Event>::create();
110 event->setSummary("Hello"); 205 event->setSummary("Hello");
111 event->setDtStart(QDateTime::currentDateTime()); 206 event->setDtStart(QDateTime::currentDateTime());
112 event->setDtEnd(QDateTime::currentDateTime().addSecs(3600)); 207 event->setDtEnd(QDateTime::currentDateTime().addSecs(3600));
113 event->setCreated(QDateTime::currentDateTime()); 208 event->setCreated(QDateTime::currentDateTime());
114 addedEventUid = QUuid::createUuid().toString(); 209 auto addedEventUid = QUuid::createUuid().toString();
115 event->setUid(addedEventUid); 210 event->setUid(addedEventUid);
116 211
117 auto ical = KCalCore::ICalFormat().toICalString(event); 212 auto ical = KCalCore::ICalFormat().toICalString(event);
@@ -119,37 +214,60 @@ private slots:
119 sinkEvent.setIcal(ical.toUtf8()); 214 sinkEvent.setIcal(ical.toUtf8());
120 sinkEvent.setCalendar(calendar); 215 sinkEvent.setCalendar(calendar);
121 216
122 SinkLog() << "Adding event";
123 VERIFYEXEC(Sink::Store::create(sinkEvent)); 217 VERIFYEXEC(Sink::Store::create(sinkEvent));
124 VERIFYEXEC(Sink::ResourceControl::flushReplayQueue(mResourceInstanceIdentifier)); 218 VERIFYEXEC(Sink::ResourceControl::flushReplayQueue(mResourceInstanceIdentifier));
125 219
126 auto verifyEventCountJob = 220 auto events = Sink::Store::read<Event>(Sink::Query().filter("uid", Sink::Query::Comparator(addedEventUid)));
127 Sink::Store::fetchAll<Event>(Sink::Query().request<Event::Uid>()).then([](const QList<Event::Ptr> &events) { 221 QCOMPARE(events.size(), 1);
128 QCOMPARE(events.size(), 1); 222 QCOMPARE(events.first().getSummary(), {"Hello"});
129 }); 223
130 VERIFYEXEC(verifyEventCountJob); 224 //Modify
225 {
226 auto event = events.first();
227 auto incidence = KCalCore::ICalFormat().readIncidence(event.getIcal());
228 auto calevent = incidence.dynamicCast<KCalCore::Event>();
229 QVERIFY2(calevent, "Cannot convert to KCalCore event");
230
231 calevent->setSummary("Hello World!");
232 auto dummy = QSharedPointer<KCalCore::Event>(calevent);
233 auto newical = KCalCore::ICalFormat().toICalString(dummy);
234
235 event.setIcal(newical.toUtf8());
236
237 VERIFYEXEC(Sink::Store::modify(event));
238
239 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
240 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
131 241
132 auto verifyEventJob = 242 auto events = Sink::Store::read<Event>(Sink::Query().filter("uid", Sink::Query::Comparator(addedEventUid)));
133 Sink::Store::fetchOne<Event>(Sink::Query().filter("uid", Sink::Query::Comparator(addedEventUid))) 243 QCOMPARE(events.size(), 1);
134 .then([](const Event &event) { QCOMPARE(event.getSummary(), {"Hello"}); }); 244 QCOMPARE(events.first().getSummary(), {"Hello World!"});
135 VERIFYEXEC(verifyEventJob); 245 }
246 //Delete
247 {
248 auto event = events.first();
249
250 VERIFYEXEC(Sink::Store::remove(event));
251 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
252 VERIFYEXEC(Sink::ResourceControl::flushReplayQueue(mResourceInstanceIdentifier));
253
254 auto events = Sink::Store::read<Event>(Sink::Query().filter("uid", Sink::Query::Comparator(addedEventUid)));
255 QCOMPARE(events.size(), 0);
256 }
136 } 257 }
137 258
138 void testAddTodo() 259 void testCreateModifyDeleteTodo()
139 { 260 {
140 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier))); 261 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
141 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier)); 262 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
142 263
143 auto job = Sink::Store::fetchOne<Calendar>({}).exec(); 264 auto calendar = Sink::Store::readOne<Calendar>(Sink::Query{}.filter<Calendar::Name>("personal"));
144 job.waitForFinished();
145 QVERIFY2(!job.errorCode(), "Fetching Calendar failed");
146 auto calendar = job.value();
147 265
148 auto todo = QSharedPointer<KCalCore::Todo>::create(); 266 auto todo = QSharedPointer<KCalCore::Todo>::create();
149 todo->setSummary("Hello"); 267 todo->setSummary("Hello");
150 todo->setDtStart(QDateTime::currentDateTime()); 268 todo->setDtStart(QDateTime::currentDateTime());
151 todo->setCreated(QDateTime::currentDateTime()); 269 todo->setCreated(QDateTime::currentDateTime());
152 addedTodoUid = QUuid::createUuid().toString(); 270 auto addedTodoUid = QUuid::createUuid().toString();
153 todo->setUid(addedTodoUid); 271 todo->setUid(addedTodoUid);
154 272
155 auto ical = KCalCore::ICalFormat().toICalString(todo); 273 auto ical = KCalCore::ICalFormat().toICalString(todo);
@@ -157,104 +275,74 @@ private slots:
157 sinkTodo.setIcal(ical.toUtf8()); 275 sinkTodo.setIcal(ical.toUtf8());
158 sinkTodo.setCalendar(calendar); 276 sinkTodo.setCalendar(calendar);
159 277
160 SinkLog() << "Adding todo";
161 VERIFYEXEC(Sink::Store::create(sinkTodo)); 278 VERIFYEXEC(Sink::Store::create(sinkTodo));
162 VERIFYEXEC(Sink::ResourceControl::flushReplayQueue(mResourceInstanceIdentifier)); 279 VERIFYEXEC(Sink::ResourceControl::flushReplayQueue(mResourceInstanceIdentifier));
163 280
164 auto verifyTodoCountJob = 281 auto todos = Sink::Store::read<Todo>(Sink::Query().filter("uid", Sink::Query::Comparator(addedTodoUid)));
165 Sink::Store::fetchAll<Todo>(Sink::Query().request<Todo::Uid>()).then([](const QList<Todo::Ptr> &todos) { 282 QCOMPARE(todos.size(), 1);
166 QCOMPARE(todos.size(), 1); 283 QCOMPARE(todos.first().getSummary(), {"Hello"});
167 });
168 VERIFYEXEC(verifyTodoCountJob);
169 284
170 auto verifyTodoJob = 285 //Modify
171 Sink::Store::fetchOne<Todo>(Sink::Query().filter("uid", Sink::Query::Comparator(addedTodoUid))) 286 {
172 .then([](const Todo &todo) { QCOMPARE(todo.getSummary(), {"Hello"}); }); 287 auto todo = todos.first();
173 VERIFYEXEC(verifyTodoJob); 288 auto incidence = KCalCore::ICalFormat().readIncidence(todo.getIcal());
174 } 289 auto caltodo = incidence.dynamicCast<KCalCore::Todo>();
175 290 QVERIFY2(caltodo, "Cannot convert to KCalCore todo");
176 void testModifyEvent()
177 {
178 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
179 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
180
181 auto job = Sink::Store::fetchOne<Event>(
182 Sink::Query().filter("uid", Sink::Query::Comparator(addedEventUid)))
183 .exec();
184 job.waitForFinished();
185 QVERIFY2(!job.errorCode(), "Fetching Event failed");
186 auto event = job.value();
187 291
188 auto incidence = KCalCore::ICalFormat().readIncidence(event.getIcal()); 292 caltodo->setSummary("Hello World!");
189 auto calevent = incidence.dynamicCast<KCalCore::Event>(); 293 auto dummy = QSharedPointer<KCalCore::Todo>(caltodo);
190 QVERIFY2(calevent, "Cannot convert to KCalCore event"); 294 auto newical = KCalCore::ICalFormat().toICalString(dummy);
191 295
192 calevent->setSummary("Hello World!"); 296 todo.setIcal(newical.toUtf8());
193 auto dummy = QSharedPointer<KCalCore::Event>(calevent);
194 auto newical = KCalCore::ICalFormat().toICalString(dummy);
195 297
196 event.setIcal(newical.toUtf8()); 298 VERIFYEXEC(Sink::Store::modify(todo));
197 299
198 VERIFYEXEC(Sink::Store::modify(event)); 300 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
301 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
199 302
200 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier))); 303 auto todos = Sink::Store::read<Todo>(Sink::Query().filter("uid", Sink::Query::Comparator(addedTodoUid)));
201 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier)); 304 QCOMPARE(todos.size(), 1);
305 QCOMPARE(todos.first().getSummary(), {"Hello World!"});
306 }
307 //Delete
308 {
309 auto todo = todos.first();
202 310
203 auto verifyEventCountJob = Sink::Store::fetchAll<Event>({}).then( 311 VERIFYEXEC(Sink::Store::remove(todo));
204 [](const QList<Event::Ptr> &events) { QCOMPARE(events.size(), 1); }); 312 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
205 VERIFYEXEC(verifyEventCountJob); 313 VERIFYEXEC(Sink::ResourceControl::flushReplayQueue(mResourceInstanceIdentifier));
206 314
207 auto verifyEventJob = 315 auto todos = Sink::Store::read<Todo>(Sink::Query().filter("uid", Sink::Query::Comparator(addedTodoUid)));
208 Sink::Store::fetchOne<Event>(Sink::Query().filter("uid", Sink::Query::Comparator(addedEventUid))) 316 QCOMPARE(todos.size(), 0);
209 .then([](const Event &event) { QCOMPARE(event.getSummary(), {"Hello World!"}); }); 317 }
210 VERIFYEXEC(verifyEventJob);
211 } 318 }
212 319
213 void testModifyTodo() 320 void testModificationConflict()
214 { 321 {
215 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier))); 322 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
216 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier)); 323 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
217 324
218 auto job = Sink::Store::fetchOne<Todo>( 325 auto calendar = Sink::Store::readOne<Calendar>(Sink::Query{}.filter<Calendar::Name>("personal"));
219 Sink::Query().filter("uid", Sink::Query::Comparator(addedTodoUid)))
220 .exec();
221 job.waitForFinished();
222 QVERIFY2(!job.errorCode(), "Fetching Todo failed");
223 auto todo = job.value();
224
225 auto incidence = KCalCore::ICalFormat().readIncidence(todo.getIcal());
226 auto caltodo = incidence.dynamicCast<KCalCore::Todo>();
227 QVERIFY2(caltodo, "Cannot convert to KCalCore todo");
228
229 caltodo->setSummary("Hello World!");
230 auto dummy = QSharedPointer<KCalCore::Todo>(caltodo);
231 auto newical = KCalCore::ICalFormat().toICalString(dummy);
232
233 todo.setIcal(newical.toUtf8());
234
235 VERIFYEXEC(Sink::Store::modify(todo));
236 326
237 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier))); 327 auto event = QSharedPointer<KCalCore::Event>::create();
238 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier)); 328 event->setSummary("Hello");
239 329 event->setDtStart(QDateTime::currentDateTime());
240 auto verifyTodoCountJob = Sink::Store::fetchAll<Todo>({}).then( 330 event->setDtEnd(QDateTime::currentDateTime().addSecs(3600));
241 [](const QList<Todo::Ptr> &todos) { QCOMPARE(todos.size(), 1); }); 331 event->setCreated(QDateTime::currentDateTime());
242 VERIFYEXEC(verifyTodoCountJob); 332 auto addedEventUid = QUuid::createUuid().toString();
333 event->setUid(addedEventUid);
243 334
244 auto verifyTodoJob = 335 auto ical = KCalCore::ICalFormat().toICalString(event);
245 Sink::Store::fetchOne<Todo>(Sink::Query().filter("uid", Sink::Query::Comparator(addedTodoUid))) 336 Event sinkEvent(mResourceInstanceIdentifier);
246 .then([](const Todo &todo) { QCOMPARE(todo.getSummary(), {"Hello World!"}); }); 337 sinkEvent.setIcal(ical.toUtf8());
247 VERIFYEXEC(verifyTodoJob); 338 sinkEvent.setCalendar(calendar);
248 }
249 339
250 void testSneakyModifyEvent() 340 VERIFYEXEC(Sink::Store::create(sinkEvent));
251 { 341 VERIFYEXEC(Sink::ResourceControl::flushReplayQueue(mResourceInstanceIdentifier));
252 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
253 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
254 342
255 // Change the item without sink's knowledge 343 // Change the item without sink's knowledge
256 { 344 {
257 auto collection = ([this]() -> KDAV2::DavCollection { 345 auto collection = [&]() -> KDAV2::DavCollection {
258 QUrl url(baseUrl); 346 QUrl url(baseUrl);
259 url.setUserName(username); 347 url.setUserName(username);
260 url.setPassword(password); 348 url.setPassword(password);
@@ -262,8 +350,13 @@ private slots:
262 auto collectionsJob = new KDAV2::DavCollectionsFetchJob(davurl); 350 auto collectionsJob = new KDAV2::DavCollectionsFetchJob(davurl);
263 collectionsJob->exec(); 351 collectionsJob->exec();
264 Q_ASSERT(collectionsJob->error() == 0); 352 Q_ASSERT(collectionsJob->error() == 0);
265 return collectionsJob->collections()[0]; 353 for (const auto &col : collectionsJob->collections()) {
266 })(); 354 if (col.displayName() == "personal") {
355 return col;
356 }
357 }
358 return {};
359 }();
267 360
268 auto itemList = ([&collection]() -> KDAV2::DavItem::List { 361 auto itemList = ([&collection]() -> KDAV2::DavItem::List {
269 auto cache = std::make_shared<KDAV2::EtagCache>(); 362 auto cache = std::make_shared<KDAV2::EtagCache>();
@@ -273,12 +366,12 @@ private slots:
273 return itemsListJob->items(); 366 return itemsListJob->items();
274 })(); 367 })();
275 auto hollowDavItemIt = 368 auto hollowDavItemIt =
276 std::find_if(itemList.begin(), itemList.end(), [this](const KDAV2::DavItem &item) { 369 std::find_if(itemList.begin(), itemList.end(), [&](const KDAV2::DavItem &item) {
277 return item.url().url().path().endsWith(addedEventUid); 370 return item.url().url().path().endsWith(addedEventUid);
278 }); 371 });
279 QVERIFY(hollowDavItemIt != itemList.end()); 372 QVERIFY(hollowDavItemIt != itemList.end());
280 373
281 auto davitem = ([this, &collection, &hollowDavItemIt]() -> KDAV2::DavItem { 374 auto davitem = ([&]() -> KDAV2::DavItem {
282 QString itemUrl = collection.url().url().toEncoded() + addedEventUid; 375 QString itemUrl = collection.url().url().toEncoded() + addedEventUid;
283 auto itemFetchJob = new KDAV2::DavItemFetchJob (*hollowDavItemIt); 376 auto itemFetchJob = new KDAV2::DavItemFetchJob (*hollowDavItemIt);
284 itemFetchJob->exec(); 377 itemFetchJob->exec();
@@ -299,70 +392,22 @@ private slots:
299 QVERIFY2(itemModifyJob->error() == 0, "Cannot modify item"); 392 QVERIFY2(itemModifyJob->error() == 0, "Cannot modify item");
300 } 393 }
301 394
302 // Try to change the item with sink 395 //Change the item with sink as well
303 { 396 {
304 auto job = Sink::Store::fetchOne<Event>( 397 auto event = Sink::Store::readOne<Event>(Sink::Query().filter("uid", Sink::Query::Comparator(addedEventUid)));
305 Sink::Query().filter("uid", Sink::Query::Comparator(addedEventUid))) 398 auto calevent = KCalCore::ICalFormat().readIncidence(event.getIcal()).dynamicCast<KCalCore::Event>();
306 .exec(); 399 QVERIFY(calevent);
307 job.waitForFinished();
308 QVERIFY2(!job.errorCode(), "Fetching Event failed");
309 auto event = job.value();
310
311 auto incidence = KCalCore::ICalFormat().readIncidence(event.getIcal());
312 auto calevent = incidence.dynamicCast<KCalCore::Event>();
313 QVERIFY2(calevent, "Cannot convert to KCalCore event");
314 400
315 calevent->setSummary("Sink Hello World!"); 401 calevent->setSummary("Sink Hello World!");
316 auto dummy = QSharedPointer<KCalCore::Event>(calevent); 402 event.setIcal(KCalCore::ICalFormat().toICalString(calevent).toUtf8());
317 auto newical = KCalCore::ICalFormat().toICalString(dummy);
318 403
319 event.setIcal(newical.toUtf8()); 404 // TODO: this produced a conflict, but we're not dealing with it in any way
320
321 // TODO: make that fail
322 VERIFYEXEC(Sink::Store::modify(event)); 405 VERIFYEXEC(Sink::Store::modify(event));
323 VERIFYEXEC(Sink::ResourceControl::flushReplayQueue(mResourceInstanceIdentifier)); 406 VERIFYEXEC(Sink::ResourceControl::flushReplayQueue(mResourceInstanceIdentifier));
324 } 407 }
325 } 408 }
326 409
327 void testRemoveEvent()
328 {
329 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
330 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
331
332 auto job = Sink::Store::fetchOne<Event>(
333 Sink::Query().filter("uid", Sink::Query::Comparator(addedEventUid)))
334 .exec();
335 job.waitForFinished();
336 QVERIFY2(!job.errorCode(), "Fetching Event failed");
337 auto event = job.value();
338
339 VERIFYEXEC(Sink::Store::remove(event));
340 VERIFYEXEC(Sink::ResourceControl::flushReplayQueue(mResourceInstanceIdentifier));
341
342 auto verifyEventCountJob = Sink::Store::fetchAll<Event>({}).then(
343 [](const QList<Event::Ptr> &events) { QCOMPARE(events.size(), 0); });
344 VERIFYEXEC(verifyEventCountJob);
345 }
346
347 void testRemoveTodo()
348 {
349 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
350 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
351
352 auto job = Sink::Store::fetchOne<Todo>(
353 Sink::Query().filter("uid", Sink::Query::Comparator(addedTodoUid)))
354 .exec();
355 job.waitForFinished();
356 QVERIFY2(!job.errorCode(), "Fetching Todo failed");
357 auto todo = job.value();
358 410
359 VERIFYEXEC(Sink::Store::remove(todo));
360 VERIFYEXEC(Sink::ResourceControl::flushReplayQueue(mResourceInstanceIdentifier));
361
362 auto verifyTodoCountJob = Sink::Store::fetchAll<Todo>({}).then(
363 [](const QList<Todo::Ptr> &todos) { QCOMPARE(todos.size(), 0); });
364 VERIFYEXEC(verifyTodoCountJob);
365 }
366}; 411};
367 412
368QTEST_MAIN(CalDavTest) 413QTEST_MAIN(CalDavTest)