diff options
author | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-07-03 14:02:27 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2017-07-03 14:02:27 +0200 |
commit | 55fe06979ceebe67553135b43aa47e70d931304b (patch) | |
tree | 16b10a744879cc1872d6c07624b59ae64469ddbf /tests/querytest.cpp | |
parent | 56fae95f49a1ca8ca614bd9f89b0ea5f872765e9 (diff) | |
parent | 288946f1694c2abe1d2c5800c87339d1e8780e4b (diff) | |
download | sink-55fe06979ceebe67553135b43aa47e70d931304b.tar.gz sink-55fe06979ceebe67553135b43aa47e70d931304b.zip |
Merge branch 'develop'
Diffstat (limited to 'tests/querytest.cpp')
-rw-r--r-- | tests/querytest.cpp | 138 |
1 files changed, 89 insertions, 49 deletions
diff --git a/tests/querytest.cpp b/tests/querytest.cpp index f639d94..714e549 100644 --- a/tests/querytest.cpp +++ b/tests/querytest.cpp | |||
@@ -98,10 +98,7 @@ private slots: | |||
98 | void testSingle() | 98 | void testSingle() |
99 | { | 99 | { |
100 | // Setup | 100 | // Setup |
101 | { | 101 | VERIFYEXEC(Sink::Store::create<Mail>(Mail("sink.dummy.instance1"))); |
102 | Mail mail("sink.dummy.instance1"); | ||
103 | VERIFYEXEC(Sink::Store::create<Mail>(mail)); | ||
104 | } | ||
105 | 102 | ||
106 | // Test | 103 | // Test |
107 | Sink::Query query; | 104 | Sink::Query query; |
@@ -116,10 +113,7 @@ private slots: | |||
116 | void testSingleWithDelay() | 113 | void testSingleWithDelay() |
117 | { | 114 | { |
118 | // Setup | 115 | // Setup |
119 | { | 116 | VERIFYEXEC(Sink::Store::create<Mail>(Mail("sink.dummy.instance1"))); |
120 | Mail mail("sink.dummy.instance1"); | ||
121 | Sink::Store::create<Mail>(mail).exec().waitForFinished(); | ||
122 | } | ||
123 | 117 | ||
124 | // Test | 118 | // Test |
125 | Sink::Query query; | 119 | Sink::Query query; |
@@ -142,13 +136,13 @@ private slots: | |||
142 | Mail mail("sink.dummy.instance1"); | 136 | Mail mail("sink.dummy.instance1"); |
143 | mail.setExtractedMessageId("test1"); | 137 | mail.setExtractedMessageId("test1"); |
144 | mail.setFolder("folder1"); | 138 | mail.setFolder("folder1"); |
145 | Sink::Store::create<Mail>(mail).exec().waitForFinished(); | 139 | VERIFYEXEC(Sink::Store::create<Mail>(mail)); |
146 | } | 140 | } |
147 | { | 141 | { |
148 | Mail mail("sink.dummy.instance1"); | 142 | Mail mail("sink.dummy.instance1"); |
149 | mail.setExtractedMessageId("test2"); | 143 | mail.setExtractedMessageId("test2"); |
150 | mail.setFolder("folder2"); | 144 | mail.setFolder("folder2"); |
151 | Sink::Store::create<Mail>(mail).exec().waitForFinished(); | 145 | VERIFYEXEC(Sink::Store::create<Mail>(mail)); |
152 | } | 146 | } |
153 | 147 | ||
154 | // Test | 148 | // Test |
@@ -164,13 +158,13 @@ private slots: | |||
164 | auto mail = model->index(0, 0, QModelIndex()).data(Sink::Store::DomainObjectRole).value<Mail::Ptr>(); | 158 | auto mail = model->index(0, 0, QModelIndex()).data(Sink::Store::DomainObjectRole).value<Mail::Ptr>(); |
165 | { | 159 | { |
166 | mail->setFolder("folder2"); | 160 | mail->setFolder("folder2"); |
167 | Sink::Store::modify<Mail>(*mail).exec().waitForFinished(); | 161 | VERIFYEXEC(Sink::Store::modify<Mail>(*mail)); |
168 | } | 162 | } |
169 | QTRY_COMPARE(model->rowCount(), 0); | 163 | QTRY_COMPARE(model->rowCount(), 0); |
170 | 164 | ||
171 | { | 165 | { |
172 | mail->setFolder("folder1"); | 166 | mail->setFolder("folder1"); |
173 | Sink::Store::modify<Mail>(*mail).exec().waitForFinished(); | 167 | VERIFYEXEC(Sink::Store::modify<Mail>(*mail)); |
174 | } | 168 | } |
175 | QTRY_COMPARE(model->rowCount(), 1); | 169 | QTRY_COMPARE(model->rowCount(), 1); |
176 | } | 170 | } |
@@ -181,8 +175,8 @@ private slots: | |||
181 | // Setup | 175 | // Setup |
182 | { | 176 | { |
183 | Mail mail("sink.dummy.instance1"); | 177 | Mail mail("sink.dummy.instance1"); |
184 | Sink::Store::create<Mail>(mail).exec().waitForFinished(); | 178 | VERIFYEXEC(Sink::Store::create<Mail>(mail)); |
185 | Sink::Store::create<Mail>(mail).exec().waitForFinished(); | 179 | VERIFYEXEC(Sink::Store::create<Mail>(mail)); |
186 | 180 | ||
187 | Sink::Query query; | 181 | Sink::Query query; |
188 | query.resourceFilter("sink.dummy.instance1"); | 182 | query.resourceFilter("sink.dummy.instance1"); |
@@ -211,7 +205,7 @@ private slots: | |||
211 | // Setup | 205 | // Setup |
212 | { | 206 | { |
213 | Folder folder("sink.dummy.instance1"); | 207 | Folder folder("sink.dummy.instance1"); |
214 | Sink::Store::create<Folder>(folder).exec().waitForFinished(); | 208 | VERIFYEXEC(Sink::Store::create<Folder>(folder)); |
215 | } | 209 | } |
216 | 210 | ||
217 | // Test | 211 | // Test |
@@ -387,6 +381,7 @@ private slots: | |||
387 | { | 381 | { |
388 | // Setup | 382 | // Setup |
389 | Folder::Ptr folderEntity; | 383 | Folder::Ptr folderEntity; |
384 | const auto date = QDateTime(QDate(2015, 7, 7), QTime(12, 0)); | ||
390 | { | 385 | { |
391 | Folder folder("sink.dummy.instance1"); | 386 | Folder folder("sink.dummy.instance1"); |
392 | Sink::Store::create<Folder>(folder).exec().waitForFinished(); | 387 | Sink::Store::create<Folder>(folder).exec().waitForFinished(); |
@@ -404,7 +399,6 @@ private slots: | |||
404 | folderEntity = model->index(0, 0).data(Sink::Store::DomainObjectRole).value<Folder::Ptr>(); | 399 | folderEntity = model->index(0, 0).data(Sink::Store::DomainObjectRole).value<Folder::Ptr>(); |
405 | QVERIFY(!folderEntity->identifier().isEmpty()); | 400 | QVERIFY(!folderEntity->identifier().isEmpty()); |
406 | 401 | ||
407 | const auto date = QDateTime(QDate(2015, 7, 7), QTime(12, 0)); | ||
408 | { | 402 | { |
409 | Mail mail("sink.dummy.instance1"); | 403 | Mail mail("sink.dummy.instance1"); |
410 | mail.setExtractedMessageId("testSecond"); | 404 | mail.setExtractedMessageId("testSecond"); |
@@ -434,6 +428,11 @@ private slots: | |||
434 | query.filter<Mail::Folder>(*folderEntity); | 428 | query.filter<Mail::Folder>(*folderEntity); |
435 | query.sort<Mail::Date>(); | 429 | query.sort<Mail::Date>(); |
436 | query.limit(1); | 430 | query.limit(1); |
431 | query.setFlags(Query::LiveQuery); | ||
432 | query.reduce<ApplicationDomain::Mail::ThreadId>(Query::Reduce::Selector::max<ApplicationDomain::Mail::Date>()) | ||
433 | .count("count") | ||
434 | .collect<ApplicationDomain::Mail::Unread>("unreadCollected") | ||
435 | .collect<ApplicationDomain::Mail::Important>("importantCollected"); | ||
437 | 436 | ||
438 | // Ensure all local data is processed | 437 | // Ensure all local data is processed |
439 | VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(QByteArrayList() << "sink.dummy.instance1")); | 438 | VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(QByteArrayList() << "sink.dummy.instance1")); |
@@ -449,6 +448,26 @@ private slots: | |||
449 | QCOMPARE(model->rowCount(), 2); | 448 | QCOMPARE(model->rowCount(), 2); |
450 | // We can't make any assumptions about the order of the indexes | 449 | // We can't make any assumptions about the order of the indexes |
451 | // QCOMPARE(model->index(1, 0).data(Sink::Store::DomainObjectRole).value<Mail::Ptr>()->getProperty("messageId").toByteArray(), QByteArray("testSecond")); | 450 | // QCOMPARE(model->index(1, 0).data(Sink::Store::DomainObjectRole).value<Mail::Ptr>()->getProperty("messageId").toByteArray(), QByteArray("testSecond")); |
451 | |||
452 | //New revisions always go through | ||
453 | { | ||
454 | Mail mail("sink.dummy.instance1"); | ||
455 | mail.setExtractedMessageId("testInjected"); | ||
456 | mail.setFolder(folderEntity->identifier()); | ||
457 | mail.setExtractedDate(date.addDays(-2)); | ||
458 | Sink::Store::create<Mail>(mail).exec().waitForFinished(); | ||
459 | } | ||
460 | QTRY_COMPARE(model->rowCount(), 3); | ||
461 | |||
462 | //Ensure we can continue fetching after the incremental update | ||
463 | model->fetchMore(QModelIndex()); | ||
464 | QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); | ||
465 | QCOMPARE(model->rowCount(), 4); | ||
466 | |||
467 | //Ensure we have fetched all | ||
468 | model->fetchMore(QModelIndex()); | ||
469 | QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); | ||
470 | QCOMPARE(model->rowCount(), 4); | ||
452 | } | 471 | } |
453 | 472 | ||
454 | void testReactToNewResource() | 473 | void testReactToNewResource() |
@@ -503,12 +522,13 @@ private slots: | |||
503 | Folder folder2(resource2.identifier()); | 522 | Folder folder2(resource2.identifier()); |
504 | VERIFYEXEC(Sink::Store::create<Folder>(folder2)); | 523 | VERIFYEXEC(Sink::Store::create<Folder>(folder2)); |
505 | } | 524 | } |
525 | VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(QByteArrayList() << resource1.identifier())); | ||
526 | VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(QByteArrayList() << resource2.identifier())); | ||
506 | 527 | ||
507 | // Test | 528 | // Test |
508 | Sink::Query query; | 529 | Sink::Query query; |
509 | query.resourceFilter<SinkResource::Account>(account1); | 530 | query.resourceFilter<SinkResource::Account>(account1); |
510 | 531 | ||
511 | // We fetch before the data is available and rely on the live query mechanism to deliver the actual data | ||
512 | auto folders = Sink::Store::read<Folder>(query); | 532 | auto folders = Sink::Store::read<Folder>(query); |
513 | QCOMPARE(folders.size(), 1); | 533 | QCOMPARE(folders.size(), 1); |
514 | } | 534 | } |
@@ -621,18 +641,50 @@ private slots: | |||
621 | resource2.setResourceType("sink.dummy"); | 641 | resource2.setResourceType("sink.dummy"); |
622 | VERIFYEXEC(Store::create(resource2)); | 642 | VERIFYEXEC(Store::create(resource2)); |
623 | 643 | ||
624 | Folder folder1(resource1.identifier()); | 644 | VERIFYEXEC(Sink::Store::create<Folder>(Folder{resource1.identifier()})); |
625 | VERIFYEXEC(Sink::Store::create<Folder>(folder1)); | 645 | VERIFYEXEC(Sink::Store::create<Folder>(Folder{resource2.identifier()})); |
626 | Folder folder2(resource2.identifier()); | ||
627 | VERIFYEXEC(Sink::Store::create<Folder>(folder2)); | ||
628 | 646 | ||
629 | // Test | 647 | VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(resource1.identifier())); |
630 | Sink::Query query; | 648 | VERIFYEXEC(Sink::ResourceControl::flushMessageQueue(resource2.identifier())); |
631 | query.resourceContainsFilter<SinkResource::Capabilities>("cap1"); | ||
632 | 649 | ||
633 | // We fetch before the data is available and rely on the live query mechanism to deliver the actual data | 650 | // We fetch before the data is available and rely on the live query mechanism to deliver the actual data |
634 | auto folders = Sink::Store::read<Folder>(query); | 651 | auto folders = Sink::Store::read<Folder>(Sink::Query{}.resourceContainsFilter<SinkResource::Capabilities>("cap1")); |
635 | QCOMPARE(folders.size(), 1); | 652 | QCOMPARE(folders.size(), 1); |
653 | |||
654 | //TODO this should be part of the regular cleanup between tests | ||
655 | VERIFYEXEC(Store::remove(resource1)); | ||
656 | VERIFYEXEC(Store::remove(resource2)); | ||
657 | } | ||
658 | |||
659 | void testFilteredLiveResourceSubQuery() | ||
660 | { | ||
661 | using namespace Sink; | ||
662 | using namespace Sink::ApplicationDomain; | ||
663 | |||
664 | //Setup | ||
665 | auto resource1 = ApplicationDomainType::createEntity<SinkResource>(); | ||
666 | resource1.setResourceType("sink.dummy"); | ||
667 | resource1.setCapabilities(QByteArrayList() << "cap1"); | ||
668 | VERIFYEXEC(Store::create(resource1)); | ||
669 | VERIFYEXEC(Store::create<Folder>(Folder{resource1.identifier()})); | ||
670 | VERIFYEXEC(ResourceControl::flushMessageQueue(resource1.identifier())); | ||
671 | |||
672 | auto model = Sink::Store::loadModel<Folder>(Query{Query::LiveQuery}.resourceContainsFilter<SinkResource::Capabilities>("cap1")); | ||
673 | QTRY_COMPARE(model->rowCount(), 1); | ||
674 | |||
675 | auto resource2 = ApplicationDomainType::createEntity<SinkResource>(); | ||
676 | resource2.setCapabilities(QByteArrayList() << "cap2"); | ||
677 | resource2.setResourceType("sink.dummy"); | ||
678 | VERIFYEXEC(Store::create(resource2)); | ||
679 | VERIFYEXEC(Store::create<Folder>(Folder{resource2.identifier()})); | ||
680 | VERIFYEXEC(ResourceControl::flushMessageQueue(resource2.identifier())); | ||
681 | |||
682 | //The new resource should be filtered and thus not make it in here | ||
683 | QCOMPARE(model->rowCount(), 1); | ||
684 | |||
685 | //TODO this should be part of the regular cleanup between tests | ||
686 | VERIFYEXEC(Store::remove(resource1)); | ||
687 | VERIFYEXEC(Store::remove(resource2)); | ||
636 | } | 688 | } |
637 | 689 | ||
638 | void testLivequeryUnmatchInThread() | 690 | void testLivequeryUnmatchInThread() |
@@ -1059,30 +1111,18 @@ private slots: | |||
1059 | QDateTime now{QDate{2017, 2, 3}, QTime{10, 0, 0}}; | 1111 | QDateTime now{QDate{2017, 2, 3}, QTime{10, 0, 0}}; |
1060 | QDateTime later{QDate{2017, 2, 3}, QTime{11, 0, 0}}; | 1112 | QDateTime later{QDate{2017, 2, 3}, QTime{11, 0, 0}}; |
1061 | 1113 | ||
1062 | { | 1114 | auto createMail = [] (const QByteArray &messageid, const Folder &folder, const QDateTime &date, bool important) { |
1063 | auto mail1 = Mail::createEntity<Mail>("sink.dummy.instance1"); | 1115 | auto mail = Mail::createEntity<Mail>("sink.dummy.instance1"); |
1064 | mail1.setExtractedMessageId("mail1"); | 1116 | mail.setExtractedMessageId(messageid); |
1065 | mail1.setFolder(folder1); | 1117 | mail.setFolder(folder); |
1066 | mail1.setExtractedDate(now); | 1118 | mail.setExtractedDate(date); |
1067 | mail1.setImportant(false); | 1119 | mail.setImportant(important); |
1068 | VERIFYEXEC(Sink::Store::create(mail1)); | 1120 | return mail; |
1069 | } | 1121 | }; |
1070 | { | 1122 | |
1071 | auto mail2 = Mail::createEntity<Mail>("sink.dummy.instance1"); | 1123 | VERIFYEXEC(Sink::Store::create(createMail("mail1", folder1, now, false))); |
1072 | mail2.setExtractedMessageId("mail2"); | 1124 | VERIFYEXEC(Sink::Store::create(createMail("mail2", folder1, earlier, false))); |
1073 | mail2.setFolder(folder1); | 1125 | VERIFYEXEC(Sink::Store::create(createMail("mail3", folder1, later, true))); |
1074 | mail2.setExtractedDate(earlier); | ||
1075 | mail2.setImportant(false); | ||
1076 | VERIFYEXEC(Sink::Store::create(mail2)); | ||
1077 | } | ||
1078 | { | ||
1079 | auto mail3 = Mail::createEntity<Mail>("sink.dummy.instance1"); | ||
1080 | mail3.setExtractedMessageId("mail3"); | ||
1081 | mail3.setFolder(folder1); | ||
1082 | mail3.setExtractedDate(later); | ||
1083 | mail3.setImportant(true); | ||
1084 | VERIFYEXEC(Sink::Store::create(mail3)); | ||
1085 | } | ||
1086 | 1126 | ||
1087 | // Ensure all local data is processed | 1127 | // Ensure all local data is processed |
1088 | VERIFYEXEC(Sink::ResourceControl::flushMessageQueue("sink.dummy.instance1")); | 1128 | VERIFYEXEC(Sink::ResourceControl::flushMessageQueue("sink.dummy.instance1")); |