From 14d33366f8ed61105f0d10328a03ccb07cf8970a Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 1 Mar 2018 10:30:42 +0100 Subject: Select all folders and emit notification if new mails are available --- examples/imapresource/tests/imapmailsynctest.cpp | 61 ++++++++++++++++++++++++ 1 file changed, 61 insertions(+) (limited to 'examples/imapresource/tests') diff --git a/examples/imapresource/tests/imapmailsynctest.cpp b/examples/imapresource/tests/imapmailsynctest.cpp index 3e975b8..e40aec8 100644 --- a/examples/imapresource/tests/imapmailsynctest.cpp +++ b/examples/imapresource/tests/imapmailsynctest.cpp @@ -26,6 +26,9 @@ #include "common/test.h" #include "common/domain/applicationdomaintype.h" #include "common/secretstore.h" +#include "common/store.h" +#include "common/resourcecontrol.h" +#include "common/notifier.h" using namespace Sink; using namespace Sink::ApplicationDomain; @@ -115,6 +118,64 @@ protected: VERIFYEXEC(imap.select("INBOX." + folderPath.join('.'))); VERIFYEXEC(imap.addFlags(KIMAP2::ImapSet::fromImapSequenceSet(messageIdentifier), QByteArrayList() << Imap::Flags::Flagged)); } + + static QByteArray newMessage(const QString &subject) + { + auto msg = KMime::Message::Ptr::create(); + msg->subject(true)->fromUnicodeString(subject, "utf8"); + msg->date(true)->setDateTime(QDateTime::currentDateTimeUtc()); + msg->assemble(); + return msg->encodedContent(true); + } + +private slots: + void testNewMailNotification() + { + const auto syncFolders = Sink::SyncScope{ApplicationDomain::getTypeName()}.resourceFilter(mResourceInstanceIdentifier); + //Fetch folders initially + VERIFYEXEC(Store::synchronize(syncFolders)); + VERIFYEXEC(ResourceControl::flushMessageQueue(mResourceInstanceIdentifier)); + + auto folder = Store::readOne(Sink::Query{}.resourceFilter(mResourceInstanceIdentifier).filter("test")); + Q_ASSERT(!folder.identifier().isEmpty()); + + const auto syncTestMails = Sink::SyncScope{ApplicationDomain::getTypeName()}.resourceFilter(mResourceInstanceIdentifier).filter(QVariant::fromValue(folder.identifier())); + + bool notificationReceived = false; + auto notifier = QSharedPointer::create(mResourceInstanceIdentifier); + notifier->registerHandler([&](const Notification ¬ification) { + if (notification.type == Sink::Notification::Info && notification.code == ApplicationDomain::NewContentAvailable && notification.entities.contains(folder.identifier())) { + notificationReceived = true; + } + }); + + //Should result in a change notification for test + VERIFYEXEC(Store::synchronize(syncFolders)); + VERIFYEXEC(ResourceControl::flushMessageQueue(mResourceInstanceIdentifier)); + + QTRY_VERIFY(notificationReceived); + + notificationReceived = false; + + //Fetch test mails to skip change notification + VERIFYEXEC(Store::synchronize(syncTestMails)); + VERIFYEXEC(ResourceControl::flushMessageQueue(mResourceInstanceIdentifier)); + + //Should no longer result in change notifications for test + VERIFYEXEC(Store::synchronize(syncFolders)); + VERIFYEXEC(ResourceControl::flushMessageQueue(mResourceInstanceIdentifier)); + + QVERIFY(!notificationReceived); + + //Create message and retry + createMessage(QStringList() << "test", newMessage("This is a Subject.")); + + //Should result in change notification + VERIFYEXEC(Store::synchronize(syncFolders)); + VERIFYEXEC(ResourceControl::flushMessageQueue(mResourceInstanceIdentifier)); + + QTRY_VERIFY(notificationReceived); + } }; QTEST_MAIN(ImapMailSyncTest) -- cgit v1.2.3