/* * Copyright (C) 2016 Christian Mollekopf * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "mailtest.h" #include #include #include #include "store.h" #include "resourcecontrol.h" #include "log.h" #include "test.h" using namespace Sink; using namespace Sink::ApplicationDomain; void MailTest::initTestCase() { Test::initTest(); Log::setDebugOutputLevel(Sink::Log::Trace); resetTestEnvironment(); auto resource = createResource(); QVERIFY(!resource.identifier().isEmpty()); VERIFYEXEC(Store::create(resource)); mResourceInstanceIdentifier = resource.identifier(); } void MailTest::cleanup() { VERIFYEXEC(ResourceControl::shutdown(mResourceInstanceIdentifier)); removeResourceFromDisk(mResourceInstanceIdentifier); } void MailTest::init() { qDebug(); qDebug() << "-----------------------------------------"; qDebug(); VERIFYEXEC(ResourceControl::start(mResourceInstanceIdentifier)); } void MailTest::testCreateModifyDeleteFolder() { int baseCount = 0; //First figure out how many folders we have by default { auto job = Store::fetchAll(Query()) .then>([&](const QList &folders) { baseCount = folders.size(); }); VERIFYEXEC(job); } QString name = "name"; QByteArray icon = "icon"; auto folder = Folder::create(mResourceInstanceIdentifier); folder.setName(name); folder.setIcon(icon); VERIFYEXEC(Store::create(folder)); VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier)); { auto job = Store::fetchAll(Query::RequestedProperties(QByteArrayList() << Folder::Name::name << Folder::Icon::name)) .then>([=](const QList &folders) { QCOMPARE(folders.size(), baseCount + 1); QHash foldersByName; for (const auto &folder : folders) { foldersByName.insert(folder->getName(), folder); } QVERIFY(foldersByName.contains(name)); auto folder = *foldersByName.value(name); QCOMPARE(folder.getName(), name); QCOMPARE(folder.getIcon(), icon); }); VERIFYEXEC(job); } QString name2 = "name2"; QByteArray icon2 = "icon2"; folder.setName(name2); folder.setIcon(icon2); VERIFYEXEC(Store::modify(folder)); VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier)); { auto job = Store::fetchAll(Query::RequestedProperties(QByteArrayList() << Folder::Name::name << Folder::Icon::name)) .then>([=](const QList &folders) { QCOMPARE(folders.size(), baseCount + 1); QHash foldersByName; for (const auto &folder : folders) { foldersByName.insert(folder->getName(), folder); } QVERIFY(foldersByName.contains(name2)); auto folder = *foldersByName.value(name2); QCOMPARE(folder.getName(), name2); QCOMPARE(folder.getIcon(), icon2); }); VERIFYEXEC(job); } VERIFYEXEC(Store::remove(folder)); VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier)); { auto job = Store::fetchAll(Query::RequestedProperties(QByteArrayList() << Folder::Name::name << Folder::Icon::name)) .then>([=](const QList &folders) { QCOMPARE(folders.size(), baseCount); }); VERIFYEXEC(job); } } void MailTest::testCreateModifyDeleteMail() { const auto subject = QString::fromLatin1("Foobar"); Query query; query.resources << mResourceInstanceIdentifier; query.request().request(); auto folder = Folder::create(mResourceInstanceIdentifier); folder.setName("folder"); VERIFYEXEC(Store::create(folder)); auto message = KMime::Message::Ptr::create(); message->subject(true)->fromUnicodeString(subject, "utf8"); message->assemble(); auto mail = Mail::create(mResourceInstanceIdentifier); mail.setMimeMessage(message->encodedContent()); mail.setFolder(folder); VERIFYEXEC(Store::create(mail)); VERIFYEXEC(ResourceControl::flushMessageQueue(query.resources)); { auto job = Store::fetchAll(Query::RequestedProperties(QByteArrayList() << Mail::Folder::name << Mail::Subject::name << Mail::MimeMessage::name)) .then>([=](const QList &mails) { QCOMPARE(mails.size(), 1); auto mail = *mails.first(); QCOMPARE(mail.getSubject(), subject); QCOMPARE(mail.getFolder(), folder.identifier()); QVERIFY(QFile(mail.getMimeMessagePath()).exists()); // return Store::remove(*mail) // .then(ResourceControl::flushReplayQueue(query.resources)) // The change needs to be replayed already // .then(ResourceControl::inspect(ResourceControl::Inspection::ExistenceInspection(*mail, false))); }); VERIFYEXEC(job); } const auto subject2 = QString::fromLatin1("Foobar2"); auto message2 = KMime::Message::Ptr::create(); message2->subject(true)->fromUnicodeString(subject2, "utf8"); message2->assemble(); mail.setMimeMessage(message2->encodedContent()); VERIFYEXEC(Store::modify(mail)); VERIFYEXEC(ResourceControl::flushMessageQueue(query.resources)); { auto job = Store::fetchAll(Query::RequestedProperties(QByteArrayList() << Mail::Folder::name << Mail::Subject::name)) .then>([=](const QList &mails) { QCOMPARE(mails.size(), 1); auto mail = *mails.first(); QCOMPARE(mail.getFolder(), folder.identifier()); // QCOMPARE(mail.getSubject(), subject); // TODO test access to modified mime message }); VERIFYEXEC(job); } VERIFYEXEC(Store::remove(mail)); VERIFYEXEC(ResourceControl::flushMessageQueue(query.resources)); { auto job = Store::fetchAll(Query::RequestedProperties(QByteArrayList() << Mail::Folder::name << Mail::Subject::name)) .then>([=](const QList &mails) { QCOMPARE(mails.size(), 0); }); VERIFYEXEC(job); } } #include "mailtest.moc"