summaryrefslogtreecommitdiffstats
path: root/tests/querytest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/querytest.cpp')
-rw-r--r--tests/querytest.cpp138
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"));