summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/caldavresource/caldavresource.cpp105
-rw-r--r--examples/caldavresource/tests/caldavtest.cpp111
2 files changed, 173 insertions, 43 deletions
diff --git a/examples/caldavresource/caldavresource.cpp b/examples/caldavresource/caldavresource.cpp
index d9f8c69..d33f625 100644
--- a/examples/caldavresource/caldavresource.cpp
+++ b/examples/caldavresource/caldavresource.cpp
@@ -25,25 +25,29 @@
25#include "applicationdomaintype.h" 25#include "applicationdomaintype.h"
26#include "domainadaptor.h" 26#include "domainadaptor.h"
27#include "eventpreprocessor.h" 27#include "eventpreprocessor.h"
28#include "todopreprocessor.h"
28#include "facade.h" 29#include "facade.h"
29#include "facadefactory.h" 30#include "facadefactory.h"
30 31
31#include <KCalCore/ICalFormat> 32#include <KCalCore/ICalFormat>
32 33
33#define ENTITY_TYPE_EVENT "event" 34#define ENTITY_TYPE_EVENT "event"
35#define ENTITY_TYPE_TODO "todo"
34#define ENTITY_TYPE_CALENDAR "calendar" 36#define ENTITY_TYPE_CALENDAR "calendar"
35 37
36using Sink::ApplicationDomain::getTypeName; 38using Sink::ApplicationDomain::getTypeName;
37 39
38class EventSynchronizer : public WebDavSynchronizer 40class CalDAVSynchronizer : public WebDavSynchronizer
39{ 41{
40 using Event = Sink::ApplicationDomain::Event; 42 using Event = Sink::ApplicationDomain::Event;
43 using Todo = Sink::ApplicationDomain::Todo;
41 using Calendar = Sink::ApplicationDomain::Calendar; 44 using Calendar = Sink::ApplicationDomain::Calendar;
42 45
43public: 46public:
44 explicit EventSynchronizer(const Sink::ResourceContext &context) 47 explicit CalDAVSynchronizer(const Sink::ResourceContext &context)
45 : WebDavSynchronizer(context, KDAV2::CalDav, getTypeName<Calendar>(), getTypeName<Event>()) 48 : WebDavSynchronizer(context, KDAV2::CalDav, getTypeName<Calendar>(), getTypeName<Event>())
46 {} 49 {
50 }
47 51
48protected: 52protected:
49 void updateLocalCollections(KDAV2::DavCollection::List calendarList) Q_DECL_OVERRIDE 53 void updateLocalCollections(KDAV2::DavCollection::List calendarList) Q_DECL_OVERRIDE
@@ -74,21 +78,27 @@ protected:
74 78
75 switch (incidence->type()) { 79 switch (incidence->type()) {
76 case Type::TypeEvent: { 80 case Type::TypeEvent: {
77 auto remoteEvent = dynamic_cast<const KCalCore::Event &>(*incidence);
78
79 Event localEvent; 81 Event localEvent;
80 localEvent.setIcal(ical); 82 localEvent.setIcal(ical);
81 localEvent.setCalendar(calendarLocalId); 83 localEvent.setCalendar(calendarLocalId);
82 84
83 SinkTrace() << "Found an event:" << localEvent.getSummary() << "with id:" << rid; 85 SinkTrace() << "Found an event with id:" << rid;
84 86
85 createOrModify(ENTITY_TYPE_EVENT, rid, localEvent, 87 createOrModify(ENTITY_TYPE_EVENT, rid, localEvent,
86 /* mergeCriteria = */ QHash<QByteArray, Sink::Query::Comparator>{}); 88 /* mergeCriteria = */ QHash<QByteArray, Sink::Query::Comparator>{});
87 break; 89 break;
88 } 90 }
89 case Type::TypeTodo: 91 case Type::TypeTodo: {
90 SinkWarning() << "Unimplemented add of a 'Todo' item in the Store"; 92 Todo localTodo;
93 localTodo.setIcal(ical);
94 localTodo.setCalendar(calendarLocalId);
95
96 SinkTrace() << "Found a Todo with id:" << rid;
97
98 createOrModify(ENTITY_TYPE_TODO, rid, localTodo,
99 /* mergeCriteria = */ QHash<QByteArray, Sink::Query::Comparator>{});
91 break; 100 break;
101 }
92 case Type::TypeJournal: 102 case Type::TypeJournal:
93 SinkWarning() << "Unimplemented add of a 'Journal' item in the Store"; 103 SinkWarning() << "Unimplemented add of a 'Journal' item in the Store";
94 break; 104 break;
@@ -108,58 +118,74 @@ protected:
108 return syncStore().resolveRemoteId(ENTITY_TYPE_CALENDAR, resourceID(calendar)); 118 return syncStore().resolveRemoteId(ENTITY_TYPE_CALENDAR, resourceID(calendar));
109 } 119 }
110 120
111 KAsync::Job<QByteArray> replay(const Event &event, Sink::Operation operation, 121 template<typename Item>
112 const QByteArray &oldRemoteId, const QList<QByteArray> &changedProperties) Q_DECL_OVERRIDE 122 KAsync::Job<QByteArray> replayItem(const Item &localItem, Sink::Operation operation,
123 const QByteArray &oldRemoteId, const QList<QByteArray> &changedProperties,
124 const QByteArray &entityType)
113 { 125 {
114 SinkLog() << "Replaying event"; 126 SinkLog() << "Replaying" << entityType;
115 127
116 KDAV2::DavItem item; 128 KDAV2::DavItem remoteItem;
117 129
118 switch (operation) { 130 switch (operation) {
119 case Sink::Operation_Creation: { 131 case Sink::Operation_Creation: {
120 auto rawIcal = event.getIcal(); 132 auto rawIcal = localItem.getIcal();
121 if(rawIcal == "") { 133 if (rawIcal == "") {
122 return KAsync::error<QByteArray>("No ICal in event for creation replay"); 134 return KAsync::error<QByteArray>("No ICal in item for creation replay");
123 } 135 }
124 136
125 auto collectionId = syncStore().resolveLocalId(ENTITY_TYPE_CALENDAR, event.getCalendar()); 137 auto collectionId = syncStore().resolveLocalId(ENTITY_TYPE_CALENDAR, localItem.getCalendar());
126 138
127 item.setData(rawIcal); 139 remoteItem.setData(rawIcal);
128 item.setContentType("text/calendar"); 140 remoteItem.setContentType("text/calendar");
129 item.setUrl(urlOf(collectionId, event.getUid())); 141 remoteItem.setUrl(urlOf(collectionId, localItem.getUid()));
130 142
131 SinkLog() << "Creating event:" << event.getSummary(); 143 SinkLog() << "Creating" << entityType << ":" << localItem.getSummary();
132 return createItem(item).then([item] { return resourceID(item); }); 144 return createItem(remoteItem).then([remoteItem] { return resourceID(remoteItem); });
133 } 145 }
134 case Sink::Operation_Removal: { 146 case Sink::Operation_Removal: {
135 // We only need the URL in the DAV item for removal 147 // We only need the URL in the DAV item for removal
136 item.setUrl(urlOf(oldRemoteId)); 148 remoteItem.setUrl(urlOf(oldRemoteId));
137 149
138 SinkLog() << "Removing event:" << oldRemoteId; 150 SinkLog() << "Removing" << entityType << ":" << oldRemoteId;
139 return removeItem(item).then([] { return QByteArray{}; }); 151 return removeItem(remoteItem).then([] { return QByteArray{}; });
140 } 152 }
141 case Sink::Operation_Modification: 153 case Sink::Operation_Modification:
142 auto rawIcal = event.getIcal(); 154 auto rawIcal = localItem.getIcal();
143 if(rawIcal == "") { 155 if (rawIcal == "") {
144 return KAsync::error<QByteArray>("No ICal in event for modification replay"); 156 return KAsync::error<QByteArray>("No ICal in item for modification replay");
145 } 157 }
146 158
147 item.setData(rawIcal); 159 remoteItem.setData(rawIcal);
148 item.setContentType("text/calendar"); 160 remoteItem.setContentType("text/calendar");
149 item.setUrl(urlOf(oldRemoteId)); 161 remoteItem.setUrl(urlOf(oldRemoteId));
150 162
151 SinkLog() << "Modifying event:" << event.getSummary(); 163 SinkLog() << "Modifying" << entityType << ":" << localItem.getSummary();
152 164
153 // It would be nice to check that the URL of the item hasn't 165 // It would be nice to check that the URL of the item hasn't
154 // changed and move he item if it did, but since the URL is 166 // changed and move he item if it did, but since the URL is
155 // pretty much arbitrary, whoe does that anyway? 167 // pretty much arbitrary, whoe does that anyway?
156 return modifyItem(item).then([oldRemoteId] { return oldRemoteId; }); 168 return modifyItem(remoteItem).then([oldRemoteId] { return oldRemoteId; });
157 } 169 }
158 } 170 }
159 171
172 KAsync::Job<QByteArray> replay(const Event &event, Sink::Operation operation,
173 const QByteArray &oldRemoteId, const QList<QByteArray> &changedProperties) Q_DECL_OVERRIDE
174 {
175 return replayItem(event, operation, oldRemoteId, changedProperties, ENTITY_TYPE_EVENT);
176 }
177
178 KAsync::Job<QByteArray> replay(const Todo &todo, Sink::Operation operation,
179 const QByteArray &oldRemoteId, const QList<QByteArray> &changedProperties) Q_DECL_OVERRIDE
180 {
181 return replayItem(todo, operation, oldRemoteId, changedProperties, ENTITY_TYPE_TODO);
182 }
183
160 KAsync::Job<QByteArray> replay(const Calendar &calendar, Sink::Operation operation, 184 KAsync::Job<QByteArray> replay(const Calendar &calendar, Sink::Operation operation,
161 const QByteArray &oldRemoteId, const QList<QByteArray> &changedProperties) Q_DECL_OVERRIDE 185 const QByteArray &oldRemoteId, const QList<QByteArray> &changedProperties) Q_DECL_OVERRIDE
162 { 186 {
187 SinkLog() << "Replaying calendar";
188
163 switch (operation) { 189 switch (operation) {
164 case Sink::Operation_Creation: 190 case Sink::Operation_Creation:
165 SinkWarning() << "Unimplemented replay of calendar creation"; 191 SinkWarning() << "Unimplemented replay of calendar creation";
@@ -180,19 +206,23 @@ protected:
180CalDavResource::CalDavResource(const Sink::ResourceContext &context) 206CalDavResource::CalDavResource(const Sink::ResourceContext &context)
181 : Sink::GenericResource(context) 207 : Sink::GenericResource(context)
182{ 208{
183 auto synchronizer = QSharedPointer<EventSynchronizer>::create(context); 209 auto synchronizer = QSharedPointer<CalDAVSynchronizer>::create(context);
184 setupSynchronizer(synchronizer); 210 setupSynchronizer(synchronizer);
185 211
186 setupPreprocessors(ENTITY_TYPE_EVENT, QVector<Sink::Preprocessor*>() << new EventPropertyExtractor); 212 setupPreprocessors(ENTITY_TYPE_EVENT, QVector<Sink::Preprocessor *>() << new EventPropertyExtractor);
213 setupPreprocessors(ENTITY_TYPE_TODO, QVector<Sink::Preprocessor *>() << new TodoPropertyExtractor);
187} 214}
188 215
189CalDavResourceFactory::CalDavResourceFactory(QObject *parent) 216CalDavResourceFactory::CalDavResourceFactory(QObject *parent)
190 : Sink::ResourceFactory(parent, { 217 : Sink::ResourceFactory(parent, {
191 Sink::ApplicationDomain::ResourceCapabilities::Event::event,
192 Sink::ApplicationDomain::ResourceCapabilities::Event::calendar, 218 Sink::ApplicationDomain::ResourceCapabilities::Event::calendar,
219 Sink::ApplicationDomain::ResourceCapabilities::Event::event,
193 Sink::ApplicationDomain::ResourceCapabilities::Event::storage, 220 Sink::ApplicationDomain::ResourceCapabilities::Event::storage,
221 Sink::ApplicationDomain::ResourceCapabilities::Todo::todo,
222 Sink::ApplicationDomain::ResourceCapabilities::Todo::storage,
194 }) 223 })
195{} 224{
225}
196 226
197Sink::Resource *CalDavResourceFactory::createResource(const Sink::ResourceContext &context) 227Sink::Resource *CalDavResourceFactory::createResource(const Sink::ResourceContext &context)
198{ 228{
@@ -201,10 +231,12 @@ Sink::Resource *CalDavResourceFactory::createResource(const Sink::ResourceContex
201 231
202using Sink::ApplicationDomain::Calendar; 232using Sink::ApplicationDomain::Calendar;
203using Sink::ApplicationDomain::Event; 233using Sink::ApplicationDomain::Event;
234using Sink::ApplicationDomain::Todo;
204 235
205void CalDavResourceFactory::registerFacades(const QByteArray &resourceName, Sink::FacadeFactory &factory) 236void CalDavResourceFactory::registerFacades(const QByteArray &resourceName, Sink::FacadeFactory &factory)
206{ 237{
207 factory.registerFacade<Event, Sink::DefaultFacade<Event>>(resourceName); 238 factory.registerFacade<Event, Sink::DefaultFacade<Event>>(resourceName);
239 factory.registerFacade<Todo, Sink::DefaultFacade<Todo>>(resourceName);
208 factory.registerFacade<Calendar, Sink::DefaultFacade<Calendar>>(resourceName); 240 factory.registerFacade<Calendar, Sink::DefaultFacade<Calendar>>(resourceName);
209} 241}
210 242
@@ -213,6 +245,7 @@ void CalDavResourceFactory::registerAdaptorFactories(
213 const QByteArray &resourceName, Sink::AdaptorFactoryRegistry &registry) 245 const QByteArray &resourceName, Sink::AdaptorFactoryRegistry &registry)
214{ 246{
215 registry.registerFactory<Event, DefaultAdaptorFactory<Event>>(resourceName); 247 registry.registerFactory<Event, DefaultAdaptorFactory<Event>>(resourceName);
248 registry.registerFactory<Todo, DefaultAdaptorFactory<Todo>>(resourceName);
216 registry.registerFactory<Calendar, DefaultAdaptorFactory<Calendar>>(resourceName); 249 registry.registerFactory<Calendar, DefaultAdaptorFactory<Calendar>>(resourceName);
217} 250}
218 251
diff --git a/examples/caldavresource/tests/caldavtest.cpp b/examples/caldavresource/tests/caldavtest.cpp
index f9920d9..9609fa0 100644
--- a/examples/caldavresource/tests/caldavtest.cpp
+++ b/examples/caldavresource/tests/caldavtest.cpp
@@ -22,13 +22,15 @@
22using Sink::ApplicationDomain::Calendar; 22using Sink::ApplicationDomain::Calendar;
23using Sink::ApplicationDomain::DummyResource; 23using Sink::ApplicationDomain::DummyResource;
24using Sink::ApplicationDomain::Event; 24using Sink::ApplicationDomain::Event;
25using Sink::ApplicationDomain::Todo;
25using Sink::ApplicationDomain::SinkResource; 26using Sink::ApplicationDomain::SinkResource;
26 27
27class CalDavTest : public QObject 28class CalDavTest : public QObject
28{ 29{
29 Q_OBJECT 30 Q_OBJECT
30 31
31 // This test assumes a calendar MyCalendar with one event in it. 32 // This test assumes a calendar MyCalendar with one event and one todo in
33 // it.
32 34
33 const QString baseUrl = "http://localhost/dav/calendars/users/doe"; 35 const QString baseUrl = "http://localhost/dav/calendars/users/doe";
34 const QString username = "doe"; 36 const QString username = "doe";
@@ -47,6 +49,7 @@ class CalDavTest : public QObject
47 QByteArray mResourceInstanceIdentifier; 49 QByteArray mResourceInstanceIdentifier;
48 50
49 QString addedEventUid; 51 QString addedEventUid;
52 QString addedTodoUid;
50 53
51private slots: 54private slots:
52 55
@@ -74,6 +77,7 @@ private slots:
74 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier))); 77 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
75 // Check in the logs that it doesn't synchronize events again because same CTag 78 // Check in the logs that it doesn't synchronize events again because same CTag
76 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier))); 79 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
80 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
77 } 81 }
78 82
79 void testSyncCalEmpty() 83 void testSyncCalEmpty()
@@ -83,7 +87,11 @@ private slots:
83 87
84 auto eventJob = Sink::Store::fetchAll<Event>(Sink::Query().request<Event::Uid>()) 88 auto eventJob = Sink::Store::fetchAll<Event>(Sink::Query().request<Event::Uid>())
85 .then([](const QList<Event::Ptr> &events) { QCOMPARE(events.size(), 1); }); 89 .then([](const QList<Event::Ptr> &events) { QCOMPARE(events.size(), 1); });
90 auto todoJob = Sink::Store::fetchAll<Todo>(Sink::Query().request<Todo::Uid>())
91 .then([](const QList<Todo::Ptr> &todos) { QCOMPARE(todos.size(), 1); });
92
86 VERIFYEXEC(eventJob); 93 VERIFYEXEC(eventJob);
94 VERIFYEXEC(todoJob);
87 95
88 auto calendarJob = Sink::Store::fetchAll<Calendar>(Sink::Query().request<Calendar::Name>()) 96 auto calendarJob = Sink::Store::fetchAll<Calendar>(Sink::Query().request<Calendar::Name>())
89 .then([](const QList<Calendar::Ptr> &calendars) { 97 .then([](const QList<Calendar::Ptr> &calendars) {
@@ -136,6 +144,44 @@ private slots:
136 VERIFYEXEC(verifyEventJob); 144 VERIFYEXEC(verifyEventJob);
137 } 145 }
138 146
147 void testAddTodo()
148 {
149 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
150 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
151
152 auto job = Sink::Store::fetchOne<Calendar>({}).exec();
153 job.waitForFinished();
154 QVERIFY2(!job.errorCode(), "Fetching Calendar failed");
155 auto calendar = job.value();
156
157 auto todo = QSharedPointer<KCalCore::Todo>::create();
158 todo->setSummary("Hello");
159 todo->setDtStart(QDateTime::currentDateTime());
160 todo->setCreated(QDateTime::currentDateTime());
161 addedTodoUid = QUuid::createUuid().toString();
162 todo->setUid(addedTodoUid);
163
164 auto ical = KCalCore::ICalFormat().toICalString(todo);
165 Todo sinkTodo(mResourceInstanceIdentifier);
166 sinkTodo.setIcal(ical.toUtf8());
167 sinkTodo.setCalendar(calendar);
168
169 SinkLog() << "Adding todo";
170 VERIFYEXEC(Sink::Store::create(sinkTodo));
171 VERIFYEXEC(Sink::ResourceControl::flushReplayQueue(mResourceInstanceIdentifier));
172
173 auto verifyTodoCountJob =
174 Sink::Store::fetchAll<Todo>(Sink::Query().request<Todo::Uid>()).then([](const QList<Todo::Ptr> &todos) {
175 QCOMPARE(todos.size(), 2);
176 });
177 VERIFYEXEC(verifyTodoCountJob);
178
179 auto verifyTodoJob =
180 Sink::Store::fetchOne<Todo>(Sink::Query().filter("uid", Sink::Query::Comparator(addedTodoUid)))
181 .then([](const Todo &todo) { QCOMPARE(todo.getSummary(), {"Hello"}); });
182 VERIFYEXEC(verifyTodoJob);
183 }
184
139 void testModifyEvent() 185 void testModifyEvent()
140 { 186 {
141 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier))); 187 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
@@ -173,6 +219,43 @@ private slots:
173 VERIFYEXEC(verifyEventJob); 219 VERIFYEXEC(verifyEventJob);
174 } 220 }
175 221
222 void testModifyTodo()
223 {
224 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
225 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
226
227 auto job = Sink::Store::fetchOne<Todo>(
228 Sink::Query().filter("uid", Sink::Query::Comparator(addedTodoUid)))
229 .exec();
230 job.waitForFinished();
231 QVERIFY2(!job.errorCode(), "Fetching Todo failed");
232 auto todo = job.value();
233
234 auto incidence = KCalCore::ICalFormat().readIncidence(todo.getIcal());
235 auto caltodo = incidence.dynamicCast<KCalCore::Todo>();
236 QVERIFY2(caltodo, "Cannot convert to KCalCore todo");
237
238 caltodo->setSummary("Hello World!");
239 auto dummy = QSharedPointer<KCalCore::Todo>(caltodo);
240 auto newical = KCalCore::ICalFormat().toICalString(dummy);
241
242 todo.setIcal(newical.toUtf8());
243
244 VERIFYEXEC(Sink::Store::modify(todo));
245
246 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
247 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
248
249 auto verifyTodoCountJob = Sink::Store::fetchAll<Todo>({}).then(
250 [](const QList<Todo::Ptr> &todos) { QCOMPARE(todos.size(), 2); });
251 VERIFYEXEC(verifyTodoCountJob);
252
253 auto verifyTodoJob =
254 Sink::Store::fetchOne<Todo>(Sink::Query().filter("uid", Sink::Query::Comparator(addedTodoUid)))
255 .then([](const Todo &todo) { QCOMPARE(todo.getSummary(), {"Hello World!"}); });
256 VERIFYEXEC(verifyTodoJob);
257 }
258
176 void testSneakyModifyEvent() 259 void testSneakyModifyEvent()
177 { 260 {
178 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier))); 261 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
@@ -180,7 +263,6 @@ private slots:
180 263
181 // Change the item without sink's knowledge 264 // Change the item without sink's knowledge
182 { 265 {
183 qWarning() << 1;
184 auto collection = ([this]() -> KDAV2::DavCollection { 266 auto collection = ([this]() -> KDAV2::DavCollection {
185 QUrl url(baseUrl); 267 QUrl url(baseUrl);
186 url.setUserName(username); 268 url.setUserName(username);
@@ -212,22 +294,17 @@ private slots:
212 return itemFetchJob.item(); 294 return itemFetchJob.item();
213 })(); 295 })();
214 296
215 qWarning() << 3;
216 auto incidence = KCalCore::ICalFormat().readIncidence(davitem.data()); 297 auto incidence = KCalCore::ICalFormat().readIncidence(davitem.data());
217 auto calevent = incidence.dynamicCast<KCalCore::Event>(); 298 auto calevent = incidence.dynamicCast<KCalCore::Event>();
218 QVERIFY2(calevent, "Cannot convert to KCalCore event"); 299 QVERIFY2(calevent, "Cannot convert to KCalCore event");
219 300
220 qWarning() << 4;
221 calevent->setSummary("Manual Hello World!"); 301 calevent->setSummary("Manual Hello World!");
222 auto newical = KCalCore::ICalFormat().toICalString(calevent); 302 auto newical = KCalCore::ICalFormat().toICalString(calevent);
223 303
224 qWarning() << 5;
225 davitem.setData(newical.toUtf8()); 304 davitem.setData(newical.toUtf8());
226 KDAV2::DavItemModifyJob itemModifyJob(davitem); 305 KDAV2::DavItemModifyJob itemModifyJob(davitem);
227 itemModifyJob.exec(); 306 itemModifyJob.exec();
228 QVERIFY2(itemModifyJob.error() == 0, "Cannot modify item"); 307 QVERIFY2(itemModifyJob.error() == 0, "Cannot modify item");
229
230 qWarning() << 6;
231 } 308 }
232 309
233 // Try to change the item with sink 310 // Try to change the item with sink
@@ -274,6 +351,26 @@ private slots:
274 [](const QList<Event::Ptr> &events) { QCOMPARE(events.size(), 1); }); 351 [](const QList<Event::Ptr> &events) { QCOMPARE(events.size(), 1); });
275 VERIFYEXEC(verifyEventCountJob); 352 VERIFYEXEC(verifyEventCountJob);
276 } 353 }
354
355 void testRemoveTodo()
356 {
357 VERIFYEXEC(Sink::Store::synchronize(Sink::Query().resourceFilter(mResourceInstanceIdentifier)));
358 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(mResourceInstanceIdentifier));
359
360 auto job = Sink::Store::fetchOne<Todo>(
361 Sink::Query().filter("uid", Sink::Query::Comparator(addedTodoUid)))
362 .exec();
363 job.waitForFinished();
364 QVERIFY2(!job.errorCode(), "Fetching Todo failed");
365 auto todo = job.value();
366
367 VERIFYEXEC(Sink::Store::remove(todo));
368 VERIFYEXEC(Sink::ResourceControl::flushReplayQueue(mResourceInstanceIdentifier));
369
370 auto verifyTodoCountJob = Sink::Store::fetchAll<Todo>({}).then(
371 [](const QList<Todo::Ptr> &todos) { QCOMPARE(todos.size(), 1); });
372 VERIFYEXEC(verifyTodoCountJob);
373 }
277}; 374};
278 375
279QTEST_MAIN(CalDavTest) 376QTEST_MAIN(CalDavTest)