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

0001 /*
0002  *   Copyright (C) 2016 Christian Mollekopf <chrigi_1@fastmail.fm>
0003  *
0004  *   This program is free software; you can redistribute it and/or modify
0005  *   it under the terms of the GNU General Public License as published by
0006  *   the Free Software Foundation; either version 2 of the License, or
0007  *   (at your option) any later version.
0008  *
0009  *   This program is distributed in the hope that it will be useful,
0010  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
0011  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0012  *   GNU General Public License for more details.
0013  *
0014  *   You should have received a copy of the GNU General Public License
0015  *   along with this program; if not, write to the
0016  *   Free Software Foundation, Inc.,
0017  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
0018  */
0019 #include "mailtest.h"
0020 
0021 #include <QTest>
0022 
0023 #include <QString>
0024 #include <KMime/Message>
0025 
0026 #include "store.h"
0027 #include "resourcecontrol.h"
0028 #include "log.h"
0029 #include "test.h"
0030 
0031 using namespace Sink;
0032 using namespace Sink::ApplicationDomain;
0033 
0034 void MailTest::initTestCase()
0035 {
0036     Test::initTest();
0037     QVERIFY(isBackendAvailable());
0038     resetTestEnvironment();
0039     auto resource = createResource();
0040     QVERIFY(!resource.getResourceType().isEmpty());
0041     QVERIFY(!resource.identifier().isEmpty());
0042 
0043     VERIFYEXEC(Store::create(resource));
0044 
0045     mResourceInstanceIdentifier = resource.identifier();
0046 
0047     //Load the capabilities
0048     resource = Store::readOne<Sink::ApplicationDomain::SinkResource>(Sink::Query{resource});
0049     mCapabilities = resource.getCapabilities();
0050 }
0051 
0052 void MailTest::cleanup()
0053 {
0054     VERIFYEXEC(Store::removeDataFromDisk(mResourceInstanceIdentifier));
0055 }
0056 
0057 void MailTest::init()
0058 {
0059     VERIFYEXEC(ResourceControl::start(mResourceInstanceIdentifier));
0060 }
0061 
0062 void MailTest::testCreateModifyDeleteFolder()
0063 {
0064     int baseCount = 0;
0065     //First figure out how many folders we have by default
0066     {
0067         auto job = Store::fetchAll<Folder>(Query())
0068             .then([&](const QList<Folder::Ptr> &folders) {
0069                 baseCount = folders.size();
0070             });
0071         VERIFYEXEC(job);
0072     }
0073 
0074     QString name = "name";
0075     QByteArray icon = "icon";
0076 
0077     auto folder = Folder::create(mResourceInstanceIdentifier);
0078     folder.setName(name);
0079     folder.setIcon(icon);
0080 
0081     VERIFYEXEC(Store::create(folder));
0082     VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier));
0083     {
0084         auto job = Store::fetchAll<Folder>(Query().request<Folder::Name>().request<Folder::Icon>())
0085             .then([=](const QList<Folder::Ptr> &folders) {
0086                 QCOMPARE(folders.size(), baseCount + 1);
0087                 QHash<QString, Folder::Ptr> foldersByName;
0088                 for (const auto &folder : folders) {
0089                     foldersByName.insert(folder->getName(), folder);
0090                 }
0091                 QVERIFY(foldersByName.contains(name));
0092                 auto folder = *foldersByName.value(name);
0093                 QCOMPARE(folder.getName(), name);
0094                 QCOMPARE(folder.getIcon(), icon);
0095             });
0096         VERIFYEXEC(job);
0097     }
0098     VERIFYEXEC(ResourceControl::flushReplayQueue(QByteArrayList() << mResourceInstanceIdentifier));
0099     VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Folder>(ResourceControl::Inspection::ExistenceInspection(folder, true)));
0100 
0101     if (!mCapabilities.contains("-folder.rename")) {
0102         QString name2 = "name2";
0103         QByteArray icon2 = "icon2";
0104         folder.setName(name2);
0105         folder.setIcon(icon2);
0106 
0107         VERIFYEXEC(Store::modify(folder));
0108         VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier));
0109         {
0110             auto job = Store::fetchAll<Folder>(Query().request<Folder::Name>().request<Folder::Icon>())
0111                 .then([=](const QList<Folder::Ptr> &folders) {
0112                     QCOMPARE(folders.size(), baseCount + 1);
0113                     QHash<QString, Folder::Ptr> foldersByName;
0114                     for (const auto &folder : folders) {
0115                         foldersByName.insert(folder->getName(), folder);
0116                     }
0117                     QVERIFY(foldersByName.contains(name2));
0118                     auto folder = *foldersByName.value(name2);
0119                     QCOMPARE(folder.getName(), name2);
0120                     QCOMPARE(folder.getIcon(), icon2);
0121                 });
0122             VERIFYEXEC(job);
0123         }
0124         VERIFYEXEC(ResourceControl::flushReplayQueue(QByteArrayList() << mResourceInstanceIdentifier));
0125         VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Folder>(ResourceControl::Inspection::ExistenceInspection(folder, true)));
0126     }
0127 
0128     VERIFYEXEC(Store::remove(folder));
0129     VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier));
0130     {
0131         auto job = Store::fetchAll<Folder>(Query().request<Folder::Name>().request<Folder::Icon>())
0132             .then([=](const QList<Folder::Ptr> &folders) {
0133                 QCOMPARE(folders.size(), baseCount);
0134             });
0135         VERIFYEXEC(job);
0136     }
0137     VERIFYEXEC(ResourceControl::flushReplayQueue(QByteArrayList() << mResourceInstanceIdentifier));
0138     //This is not currently possible to check. The local folder and mapping has already been removed.
0139     // VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Folder>(ResourceControl::Inspection::ExistenceInspection(folder, false)));
0140 }
0141 
0142 void MailTest::testCreateModifyDeleteMail()
0143 {
0144     const auto subject = QString::fromUtf8("äéiöü");
0145     const auto from = QString::fromUtf8("äéiöü <example@example.org>");
0146 
0147     auto folder = Folder::create(mResourceInstanceIdentifier);
0148     folder.setName("folder");
0149     VERIFYEXEC(Store::create(folder));
0150 
0151     auto message = KMime::Message::Ptr::create();
0152     message->subject(true)->fromUnicodeString(subject, "utf8");
0153     message->from(true)->fromUnicodeString(from, "utf8");
0154     message->assemble();
0155 
0156     auto mail = Mail::create(mResourceInstanceIdentifier);
0157     mail.setMimeMessage(message->encodedContent(true));
0158     mail.setFolder(folder);
0159 
0160     VERIFYEXEC(Store::create(mail));
0161     VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier));
0162     {
0163         auto job = Store::fetchAll<Mail>(Query().request<Mail::Folder>().request<Mail::Subject>().request<Mail::MimeMessage>().request<Mail::Sender>())
0164             .then([=](const QList<Mail::Ptr> &mails) {
0165                 QCOMPARE(mails.size(), 1);
0166                 auto mail = *mails.first();
0167                 QCOMPARE(mail.getSubject(), subject);
0168                 QCOMPARE(mail.getSender().name, QString::fromUtf8("äéiöü"));
0169                 QCOMPARE(mail.getSender().emailAddress, QString::fromUtf8("example@example.org"));
0170                 QCOMPARE(mail.getFolder(), folder.identifier());
0171                 KMime::Message m;
0172                 m.setContent(KMime::CRLFtoLF(mail.getMimeMessage()));
0173                 m.parse();
0174                 QCOMPARE(m.subject(true)->asUnicodeString(), subject);
0175             });
0176         VERIFYEXEC(job);
0177     }
0178 
0179     VERIFYEXEC(ResourceControl::flushReplayQueue(QByteArrayList() << mResourceInstanceIdentifier));
0180     VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Mail>(ResourceControl::Inspection::ExistenceInspection(mail, true)));
0181     VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Mail>(ResourceControl::Inspection::PropertyInspection(mail, Mail::Subject::name, subject)));
0182     VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Folder>(ResourceControl::Inspection::CacheIntegrityInspection(folder)));
0183 
0184     const auto subject2 = QString::fromLatin1("Foobar2");
0185     auto message2 = KMime::Message::Ptr::create();
0186     message2->subject(true)->fromUnicodeString(subject2, "utf8");
0187     message2->assemble();
0188     mail.setMimeMessage(message2->encodedContent(true));
0189 
0190     VERIFYEXEC(Store::modify(mail));
0191     VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier));
0192     {
0193         auto job = Store::fetchAll<Mail>(Query().request<Mail::Folder>().request<Mail::Subject>().request<Mail::MimeMessage>())
0194             .then([=](const QList<Mail::Ptr> &mails) {
0195                 QCOMPARE(mails.size(), 1);
0196                 auto mail = *mails.first();
0197                 QCOMPARE(mail.getSubject(), subject2);
0198                 QCOMPARE(mail.getFolder(), folder.identifier());
0199                 KMime::Message m;
0200                 m.setContent(KMime::CRLFtoLF(mail.getMimeMessage()));
0201                 m.parse();
0202                 QCOMPARE(m.subject(true)->asUnicodeString(), subject2);
0203             });
0204         VERIFYEXEC(job);
0205     }
0206     VERIFYEXEC(ResourceControl::flushReplayQueue(QByteArrayList() << mResourceInstanceIdentifier));
0207     VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Mail>(ResourceControl::Inspection::ExistenceInspection(mail, true)));
0208     VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Mail>(ResourceControl::Inspection::PropertyInspection(mail, Mail::Subject::name, subject2)));
0209     VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Folder>(ResourceControl::Inspection::CacheIntegrityInspection(folder)));
0210 
0211     VERIFYEXEC(Store::remove(mail));
0212     VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier));
0213     {
0214         auto job = Store::fetchAll<Mail>(Query().request<Mail::Folder>().request<Mail::Subject>())
0215             .then([=](const QList<Mail::Ptr> &mails) {
0216                 QCOMPARE(mails.size(), 0);
0217             });
0218         VERIFYEXEC(job);
0219     }
0220     VERIFYEXEC(ResourceControl::flushReplayQueue(QByteArrayList() << mResourceInstanceIdentifier));
0221     // VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Mail>(ResourceControl::Inspection::ExistenceInspection(mail, false)));
0222     VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Folder>(ResourceControl::Inspection::CacheIntegrityInspection(folder)));
0223 }
0224 
0225 void MailTest::testMoveMail()
0226 {
0227     const auto subject = QString::fromLatin1("Foobar");
0228 
0229     auto folder = Folder::create(mResourceInstanceIdentifier);
0230     folder.setName("folder2");
0231     VERIFYEXEC(Store::create(folder));
0232 
0233     auto folder1 = Folder::create(mResourceInstanceIdentifier);
0234     folder1.setName("folder3");
0235     VERIFYEXEC(Store::create(folder1));
0236 
0237     auto message = KMime::Message::Ptr::create();
0238     message->subject(true)->fromUnicodeString(subject, "utf8");
0239     message->assemble();
0240 
0241     auto mail = Mail::create(mResourceInstanceIdentifier);
0242     mail.setMimeMessage(message->encodedContent(true));
0243     mail.setFolder(folder);
0244 
0245     VERIFYEXEC(Store::create(mail));
0246     VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier));
0247 
0248     Mail modifiedMail;
0249     {
0250         auto job = Store::fetchAll<Mail>(Query().request<Mail::Folder>().request<Mail::Subject>().request<Mail::MimeMessage>())
0251             .then([=, &modifiedMail](const QList<Mail::Ptr> &mails) {
0252                 QCOMPARE(mails.size(), 1);
0253                 auto mail = *mails.first();
0254                 modifiedMail = mail;
0255                 QCOMPARE(mail.getFolder(), folder.identifier());
0256                 QVERIFY(!mail.getMimeMessage().isEmpty());
0257             });
0258         VERIFYEXEC(job);
0259     }
0260 
0261     VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Folder>(ResourceControl::Inspection::CacheIntegrityInspection(folder)));
0262 
0263     modifiedMail.setFolder(folder1);
0264 
0265     VERIFYEXEC(Store::modify(modifiedMail));
0266     VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier));
0267     {
0268         auto job = Store::fetchAll<Mail>(Query().request<Mail::Folder>().request<Mail::Subject>().request<Mail::MimeMessage>())
0269             .then([=](const QList<Mail::Ptr> &mails) {
0270                 QCOMPARE(mails.size(), 1);
0271                 auto mail = *mails.first();
0272                 QCOMPARE(mail.getFolder(), folder1.identifier());
0273                 QVERIFY(!mail.getMimeMessage().isEmpty());
0274             });
0275         VERIFYEXEC(job);
0276     }
0277     VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Folder>(ResourceControl::Inspection::CacheIntegrityInspection(folder)));
0278     VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Folder>(ResourceControl::Inspection::CacheIntegrityInspection(folder1)));
0279 }
0280 
0281 void MailTest::testMarkMailAsRead()
0282 {
0283     auto folder = Folder::create(mResourceInstanceIdentifier);
0284     folder.setName("anotherfolder");
0285     VERIFYEXEC(Store::create(folder));
0286 
0287     auto message = KMime::Message::Ptr::create();
0288     message->subject(true)->fromUnicodeString("subject", "utf8");
0289     message->assemble();
0290 
0291     auto mail = Mail::create(mResourceInstanceIdentifier);
0292     mail.setMimeMessage(message->encodedContent(true));
0293     mail.setFolder(folder);
0294     mail.setUnread(true);
0295     VERIFYEXEC(Store::create(mail));
0296     VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier));
0297 
0298     auto job = Store::fetchAll<Mail>(Query()
0299                                         .resourceFilter(mResourceInstanceIdentifier)
0300                                         .request<Mail::Folder>()
0301                                         .request<Mail::Subject>()
0302                                     )
0303         .then<void, QList<Mail::Ptr>>([this](const QList<Mail::Ptr> &mails) {
0304             ASYNCCOMPARE(mails.size(), 1);
0305             auto mail = mails.first();
0306             mail->setUnread(false);
0307             return Store::modify(*mail)
0308                 .then<void>(ResourceControl::flushReplayQueue(QByteArrayList() << mResourceInstanceIdentifier)) // The change needs to be replayed already
0309                 .then(ResourceControl::inspect<Mail>(ResourceControl::Inspection::PropertyInspection(*mail, Mail::Unread::name, false)))
0310                 .then(ResourceControl::inspect<Mail>(ResourceControl::Inspection::PropertyInspection(*mail, Mail::Subject::name, mail->getSubject())));
0311         });
0312     VERIFYEXEC(job);
0313 
0314     // Verify that we can still query for all relevant information
0315     auto job2 = Store::fetchAll<Mail>(Query()
0316                                         .resourceFilter(mResourceInstanceIdentifier)
0317                                         .request<Mail::Folder>()
0318                                         .request<Mail::Subject>()
0319                                         .request<Mail::MimeMessage>()
0320                                         .request<Mail::Unread>()
0321                                     )
0322         .then<void, QList<Mail::Ptr>>([](const QList<Mail::Ptr> &mails) {
0323             ASYNCCOMPARE(mails.size(), 1);
0324             auto mail = mails.first();
0325             ASYNCVERIFY(!mail->getSubject().isEmpty());
0326             ASYNCCOMPARE(mail->getUnread(), false);
0327             ASYNCVERIFY(!mail->getMimeMessage().isEmpty());
0328             return KAsync::null<void>();
0329         });
0330     VERIFYEXEC(job2);
0331 
0332     //Verify we can mark the mail as unread again
0333     {
0334         auto readMail = Store::readOne<Mail>(Query{mail});
0335         readMail.setUnread(true);
0336         VERIFYEXEC(Store::modify(readMail));
0337         VERIFYEXEC(ResourceControl::flushReplayQueue(mResourceInstanceIdentifier));
0338         VERIFYEXEC(ResourceControl::inspect<Mail>(ResourceControl::Inspection::PropertyInspection(readMail, Mail::Unread::name, true)));
0339     }
0340 }
0341 
0342 void MailTest::testCreateDraft()
0343 {
0344     if (!mCapabilities.contains(ResourceCapabilities::Mail::drafts)) {
0345         QSKIP("Resource doesn't have the drafts capability");
0346     }
0347 
0348     auto message = KMime::Message::Ptr::create();
0349     message->subject(true)->fromUnicodeString(QString::fromLatin1("Foobar"), "utf8");
0350     message->assemble();
0351 
0352     auto mail = ApplicationDomain::Mail::create(mResourceInstanceIdentifier);
0353     mail.setMimeMessage(message->encodedContent(true));
0354     mail.setDraft(true);
0355 
0356     VERIFYEXEC(Store::create(mail));
0357     VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier));
0358 
0359     QByteArray folderIdentifier;
0360 
0361     auto createdDraft = Store::readOne<ApplicationDomain::Mail>(Query(mail).request<Mail::Folder>());
0362     folderIdentifier = createdDraft.getFolder();
0363     QVERIFY(!folderIdentifier.isEmpty());
0364 
0365     //Ensure we can also query by folder
0366     {
0367         auto mails = Store::read<ApplicationDomain::Mail>(Query().filter<Mail::Folder>(folderIdentifier));
0368         bool found = false;
0369         for (const auto &m : mails) {
0370             if (m.identifier() == mail.identifier()) {
0371                 found = true;
0372             }
0373         }
0374         QVERIFY(found);
0375     }
0376 
0377     //Ensure the folder is also existing
0378     {
0379         ApplicationDomain::Folder folder;
0380         auto folders = Store::read<ApplicationDomain::Folder>(Query().filter(folderIdentifier));
0381         QCOMPARE(folders.size(), 1);
0382         folder = folders.first();
0383         VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Folder>(ResourceControl::Inspection::ExistenceInspection(folder, true)));
0384     }
0385     VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Mail>(ResourceControl::Inspection::ExistenceInspection(mail, true)));
0386 }
0387 
0388 void MailTest::testModifyMailToDraft()
0389 {
0390     if (!mCapabilities.contains(ResourceCapabilities::Mail::drafts)) {
0391         QSKIP("Resource doesn't have the drafts capability");
0392     }
0393 
0394     auto folder = Folder::create(mResourceInstanceIdentifier);
0395     folder.setName("sdljldskjf");
0396     VERIFYEXEC(Store::create(folder));
0397 
0398     auto message = KMime::Message::Ptr::create();
0399     message->subject(true)->fromUnicodeString(QString::fromLatin1("Foobar"), "utf8");
0400     message->assemble();
0401 
0402     auto mail = ApplicationDomain::Mail::create(mResourceInstanceIdentifier);
0403     mail.setMimeMessage(message->encodedContent(true));
0404     mail.setDraft(false);
0405     mail.setFolder(folder);
0406 
0407     VERIFYEXEC(Store::create(mail));
0408     VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier));
0409 
0410     auto modifiedMail = Store::readOne<ApplicationDomain::Mail>(Query(mail));
0411     modifiedMail.setDraft(true);
0412     VERIFYEXEC(Store::modify(modifiedMail));
0413     VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier));
0414     VERIFYEXEC(ResourceControl::flushReplayQueue(QByteArrayList() << mResourceInstanceIdentifier));
0415 
0416     QByteArray folderIdentifier;
0417     {
0418         auto createdDraft = Store::readOne<ApplicationDomain::Mail>(Query(mail).request<Mail::Folder>());
0419         folderIdentifier = createdDraft.getFolder();
0420         QVERIFY(!folderIdentifier.isEmpty());
0421     }
0422 
0423     //Ensure the folder is also existing
0424     {
0425         ApplicationDomain::Folder folder;
0426         auto folders = Store::read<ApplicationDomain::Folder>(Query().filter(folderIdentifier).request<Folder::SpecialPurpose>());
0427         QCOMPARE(folders.size(), 1);
0428         folder = folders.first();
0429         QVERIFY(folder.getSpecialPurpose().contains("drafts"));
0430         VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Folder>(ResourceControl::Inspection::ExistenceInspection(folder, true)));
0431     }
0432     VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Mail>(ResourceControl::Inspection::ExistenceInspection(mail, true)));
0433 }
0434 
0435 void MailTest::testModifyMailToTrash()
0436 {
0437     if (!mCapabilities.contains(ResourceCapabilities::Mail::trash)) {
0438         QSKIP("Resource doesn't have the trash capability");
0439     }
0440 
0441     auto folder = Folder::create(mResourceInstanceIdentifier);
0442     folder.setName("sdljldskjf2");
0443     VERIFYEXEC(Store::create(folder));
0444 
0445     auto message = KMime::Message::Ptr::create();
0446     message->subject(true)->fromUnicodeString(QString::fromLatin1("Foobar"), "utf8");
0447     message->assemble();
0448 
0449     auto mail = ApplicationDomain::Mail::create(mResourceInstanceIdentifier);
0450     mail.setMimeMessage(message->encodedContent(true));
0451     mail.setTrash(false);
0452     mail.setFolder(folder);
0453 
0454     VERIFYEXEC(Store::create(mail));
0455     VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier));
0456 
0457     auto modifiedMail = Store::readOne<ApplicationDomain::Mail>(Query(mail));
0458     modifiedMail.setTrash(true);
0459     VERIFYEXEC(Store::modify(modifiedMail));
0460     VERIFYEXEC(ResourceControl::flushMessageQueue(QByteArrayList() << mResourceInstanceIdentifier));
0461     VERIFYEXEC(ResourceControl::flushReplayQueue(QByteArrayList() << mResourceInstanceIdentifier));
0462 
0463     QByteArray folderIdentifier;
0464     {
0465         auto createdMail = Store::readOne<ApplicationDomain::Mail>(Query(mail).request<Mail::Folder>());
0466         folderIdentifier = createdMail.getFolder();
0467         QVERIFY(!folderIdentifier.isEmpty());
0468     }
0469 
0470     //Ensure the folder is also existing
0471     {
0472         ApplicationDomain::Folder folder;
0473         auto folders = Store::read<ApplicationDomain::Folder>(Query().filter(folderIdentifier).request<Folder::SpecialPurpose>());
0474         QCOMPARE(folders.size(), 1);
0475         folder = folders.first();
0476         QVERIFY(folder.getSpecialPurpose().contains("trash"));
0477         VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Folder>(ResourceControl::Inspection::ExistenceInspection(folder, true)));
0478     }
0479     VERIFYEXEC(ResourceControl::inspect<ApplicationDomain::Mail>(ResourceControl::Inspection::ExistenceInspection(mail, true)));
0480 }
0481