File indexing completed on 2024-05-12 05:26:22

0001 #include <QTest>
0002 
0003 #include <QDebug>
0004 #include <QString>
0005 
0006 #include "common/storage/entitystore.h"
0007 #include "common/datastorequery.h"
0008 #include "common/adaptorfactoryregistry.h"
0009 #include "common/definitions.h"
0010 #include "testimplementations.h"
0011 
0012 class DataStoreQueryTest : public QObject
0013 {
0014     Q_OBJECT
0015 private:
0016     QString resourceInstanceIdentifier{"resourceId"};
0017 
0018     struct Result {
0019         QVector<QByteArray> creations;
0020         QVector<QByteArray> modifications;
0021         QVector<QByteArray> removals;
0022     };
0023 
0024     Result readResult (ResultSet &resultSet) {
0025         Result result;
0026         resultSet.replaySet(0, 0, [&](const ResultSet::Result &r) {
0027             switch (r.operation) {
0028                 case Sink::Operation_Creation:
0029                     result.creations << r.entity.identifier();
0030                     break;
0031                 case Sink::Operation_Modification:
0032                     result.modifications << r.entity.identifier();
0033                     break;
0034                 case Sink::Operation_Removal:
0035                     result.removals << r.entity.identifier();
0036                     break;
0037             }
0038         });
0039         return result;
0040     };
0041 
0042 
0043 private slots:
0044     void initTestCase()
0045     {
0046         Sink::AdaptorFactoryRegistry::instance().registerFactory<Sink::ApplicationDomain::Mail, TestMailAdaptorFactory>("test");
0047     }
0048 
0049     void cleanup()
0050     {
0051         Sink::Storage::DataStore(Sink::storageLocation(), resourceInstanceIdentifier).removeFromDisk();
0052     }
0053 
0054     void testCleanup()
0055     {
0056     }
0057 
0058     void testFullScan()
0059     {
0060         using namespace Sink;
0061         ResourceContext resourceContext{resourceInstanceIdentifier.toUtf8(), "dummy", AdaptorFactoryRegistry::instance().getFactories("test")};
0062         Storage::EntityStore store(resourceContext, {});
0063 
0064         auto mail = ApplicationDomain::ApplicationDomainType::createEntity<ApplicationDomain::Mail>("res1");
0065         mail.setExtractedMessageId("messageid");
0066         mail.setExtractedSubject("boo");
0067         mail.setDraft(false);
0068 
0069         auto mail2 = ApplicationDomain::ApplicationDomainType::createEntity<ApplicationDomain::Mail>("res1");
0070         mail2.setExtractedMessageId("messageid2");
0071         mail2.setExtractedSubject("foo");
0072 
0073         auto mail3 = ApplicationDomain::ApplicationDomainType::createEntity<ApplicationDomain::Mail>("res1");
0074         mail3.setExtractedMessageId("messageid2");
0075         mail3.setExtractedSubject("foo");
0076 
0077         store.startTransaction(Storage::DataStore::ReadWrite);
0078         store.add("mail", mail, false);
0079         store.add("mail", mail2, false);
0080         store.add("mail", mail3, false);
0081 
0082         {
0083             auto query = DataStoreQuery {{}, "mail", store};
0084             auto resultset = query.execute();
0085             const auto result = readResult(resultset);
0086             QCOMPARE(result.creations.size(), 3);
0087         }
0088         //Ensure an incremental query with no changes also yields nothing
0089         {
0090             auto query = DataStoreQuery {{}, "mail", store};
0091             auto resultset = query.update(store.maxRevision() + 1);
0092             const auto result = readResult(resultset);
0093             QCOMPARE(result.creations.size(), 0);
0094             QCOMPARE(result.modifications.size(), 0);
0095         }
0096 
0097         auto revisionBeforeModification = store.maxRevision();
0098 
0099         mail.setExtractedSubject("foo");
0100         store.modify("mail", mail, QByteArrayList{}, false);
0101 
0102         {
0103             auto query = DataStoreQuery {{}, "mail", store};
0104             auto resultset = query.execute();
0105             const auto result = readResult(resultset);
0106             QCOMPARE(result.creations.size(), 3);
0107         }
0108 
0109         {
0110             auto query = DataStoreQuery {{}, "mail", store};
0111             auto resultset = query.update(revisionBeforeModification);
0112             const auto result = readResult(resultset);
0113             QCOMPARE(result.modifications.size(), 1);
0114         }
0115 
0116         store.remove("mail", mail3, false);
0117 
0118         {
0119             auto query = DataStoreQuery {{}, "mail", store};
0120             auto resultset = query.execute();
0121             const auto result = readResult(resultset);
0122             QCOMPARE(result.creations.size(), 2);
0123         }
0124         {
0125             auto query = DataStoreQuery {{}, "mail", store};
0126             auto resultset = query.update(revisionBeforeModification);
0127             const auto result = readResult(resultset);
0128             QCOMPARE(result.modifications.size(), 1);
0129             //FIXME we shouldn't have the same id twice
0130             QCOMPARE(result.removals.size(), 2);
0131         }
0132     }
0133 
0134 
0135 };
0136 
0137 QTEST_MAIN(DataStoreQueryTest)
0138 #include "datastorequerytest.moc"