diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2018-08-19 10:21:38 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2018-08-19 10:21:38 +0200 |
commit | af91a18748b91f4a4fc0d83247561371d376bec5 (patch) | |
tree | 73f509e2678f2fa2ed5426f9f7b11c63177f2f9f /examples/caldavresource/tests | |
parent | 7c4b023c09a041c199af1a2ded9b1f2a75a857b9 (diff) | |
download | sink-af91a18748b91f4a4fc0d83247561371d376bec5.tar.gz sink-af91a18748b91f4a4fc0d83247561371d376bec5.zip |
Caldav test cleanupdevelop
Diffstat (limited to 'examples/caldavresource/tests')
-rw-r--r-- | examples/caldavresource/tests/caldavtest.cpp | 391 |
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 | ||
53 | private slots: | 116 | private 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 | ||
368 | QTEST_MAIN(CalDavTest) | 413 | QTEST_MAIN(CalDavTest) |