summaryrefslogtreecommitdiffstats
path: root/tests/mailsynctest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/mailsynctest.cpp')
-rw-r--r--tests/mailsynctest.cpp241
1 files changed, 241 insertions, 0 deletions
diff --git a/tests/mailsynctest.cpp b/tests/mailsynctest.cpp
new file mode 100644
index 0000000..b86fbae
--- /dev/null
+++ b/tests/mailsynctest.cpp
@@ -0,0 +1,241 @@
1/*
2 * Copyright (C) 2016 Christian Mollekopf <chrigi_1@fastmail.fm>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the
16 * Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19#include "mailsynctest.h"
20
21#include <QtTest>
22
23#include <QString>
24#include <KMime/Message>
25
26#include "store.h"
27#include "resourcecontrol.h"
28#include "log.h"
29#include "test.h"
30
31using namespace Sink;
32using namespace Sink::ApplicationDomain;
33
34void MailSyncTest::initTestCase()
35{
36 Test::initTest();
37 Log::setDebugOutputLevel(Sink::Log::Trace);
38 resetTestEnvironment();
39 auto resource = createResource();
40 QVERIFY(!resource.identifier().isEmpty());
41
42 VERIFYEXEC(Store::create(resource));
43
44 mResourceInstanceIdentifier = resource.identifier();
45 mCapabilities = resource.getProperty("capabilities").value<QByteArrayList>();
46}
47
48void MailSyncTest::cleanup()
49{
50 // VERIFYEXEC(ResourceControl::shutdown(mResourceInstanceIdentifier));
51 ResourceControl::shutdown(mResourceInstanceIdentifier).exec().waitForFinished();
52 removeResourceFromDisk(mResourceInstanceIdentifier);
53}
54
55void MailSyncTest::init()
56{
57 qDebug();
58 qDebug() << "-----------------------------------------";
59 qDebug();
60 VERIFYEXEC(ResourceControl::start(mResourceInstanceIdentifier));
61}
62
63void MailSyncTest::testListFolders()
64{
65 Sink::Query query;
66 query.resources << mResourceInstanceIdentifier;
67 query.request<Folder::Name>();
68
69 // Ensure all local data is processed
70 VERIFYEXEC(Store::synchronize(query));
71 ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished();
72
73 auto job = Store::fetchAll<Folder>(query).then<void, QList<Folder::Ptr>>([](const QList<Folder::Ptr> &folders) {
74 QCOMPARE(folders.size(), 2);
75 QStringList names;
76 for (const auto &folder : folders) {
77 names << folder->getName();
78 }
79 QVERIFY(names.contains("INBOX"));
80 QVERIFY(names.contains("test"));
81 });
82 VERIFYEXEC(job);
83}
84
85void MailSyncTest::testListFolderHierarchy()
86{
87 Sink::Query query;
88 query.resources << mResourceInstanceIdentifier;
89 query.request<Folder::Name>().request<Folder::Parent>();
90
91 createFolder(QStringList() << "test" << "sub");
92
93 // Ensure all local data is processed
94 VERIFYEXEC(Store::synchronize(query));
95 ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished();
96
97 auto job = Store::fetchAll<Folder>(query).then<void, QList<Folder::Ptr>>([](const QList<Folder::Ptr> &folders) {
98 QCOMPARE(folders.size(), 3);
99 QHash<QString, Folder::Ptr> map;
100 for (const auto &folder : folders) {
101 map.insert(folder->getName(), folder);
102 }
103 QCOMPARE(map.value("sub")->getParent(), map.value("test")->identifier());
104 });
105 VERIFYEXEC(job);
106}
107
108void MailSyncTest::testListNewFolders()
109{
110 Sink::Query query;
111 query.resources << mResourceInstanceIdentifier;
112 query.request<Folder::Name>();
113
114 createFolder(QStringList() << "test" << "sub1");
115
116 // Ensure all local data is processed
117 VERIFYEXEC(Store::synchronize(query));
118 ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished();
119
120 auto job = Store::fetchAll<Folder>(query).then<void, QList<Folder::Ptr>>([](const QList<Folder::Ptr> &folders) {
121 QStringList names;
122 for (const auto &folder : folders) {
123 names << folder->getName();
124 }
125 QVERIFY(names.contains("sub1"));
126 });
127 VERIFYEXEC(job);
128}
129
130void MailSyncTest::testListRemovedFolders()
131{
132 Sink::Query query;
133 query.resources << mResourceInstanceIdentifier;
134 query.request<Folder::Name>();
135
136 VERIFYEXEC(Store::synchronize(query));
137 ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished();
138
139 removeFolder(QStringList() << "test" << "sub1");
140
141 // Ensure all local data is processed
142 VERIFYEXEC(Store::synchronize(query));
143 ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished();
144
145 auto job = Store::fetchAll<Folder>(query).then<void, QList<Folder::Ptr>>([](const QList<Folder::Ptr> &folders) {
146 QStringList names;
147 for (const auto &folder : folders) {
148 names << folder->getName();
149 }
150 QVERIFY(!names.contains("sub1"));
151 });
152 VERIFYEXEC(job);
153}
154
155void MailSyncTest::testListMails()
156{
157 Sink::Query query;
158 query.resources << mResourceInstanceIdentifier;
159 query.request<Mail::Subject>().request<Mail::MimeMessage>();
160
161 // Ensure all local data is processed
162 VERIFYEXEC(Store::synchronize(query));
163 ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished();
164
165 auto job = Store::fetchAll<Mail>(query).then<void, QList<Mail::Ptr>>([](const QList<Mail::Ptr> &mails) {
166 QCOMPARE(mails.size(), 1);
167 QVERIFY(mails.first()->getSubject().startsWith(QString("[Nepomuk] Jenkins build is still unstable")));
168 const auto data = mails.first()->getMimeMessage();
169 QVERIFY(!data.isEmpty());
170
171 KMime::Message m;
172 m.setContent(data);
173 m.parse();
174 QCOMPARE(mails.first()->getSubject(), m.subject(true)->asUnicodeString());
175 });
176 VERIFYEXEC(job);
177}
178
179void MailSyncTest::testFetchNewMessages()
180{
181 Sink::Query query;
182 query.resources << mResourceInstanceIdentifier;
183 query.request<Mail::Subject>().request<Mail::MimeMessage>();
184
185 // Ensure all local data is processed
186 VERIFYEXEC(Store::synchronize(query));
187 ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished();
188
189 auto msg = KMime::Message::Ptr::create();
190 msg->subject(true)->fromUnicodeString("Foobar", "utf8");
191 msg->assemble();
192 createMessage(QStringList() << "test", msg->encodedContent(true));
193
194 Store::synchronize(query).exec().waitForFinished();
195 ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished();
196
197 auto job = Store::fetchAll<Mail>(query).then<void, QList<Mail::Ptr>>([](const QList<Mail::Ptr> &mails) {
198 QCOMPARE(mails.size(), 2);
199 });
200 VERIFYEXEC(job);
201}
202
203void MailSyncTest::testFetchRemovedMessages()
204{
205 Sink::Query query;
206 query.resources << mResourceInstanceIdentifier;
207 query.request<Mail::Subject>().request<Mail::MimeMessage>();
208
209 // Ensure all local data is processed
210 VERIFYEXEC(Store::synchronize(query));
211 ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished();
212
213 removeMessage(QStringList() << "test", "2:*");
214
215 Store::synchronize(query).exec().waitForFinished();
216 ResourceControl::flushMessageQueue(query.resources).exec().waitForFinished();
217
218 auto job = Store::fetchAll<Mail>(query).then<void, QList<Mail::Ptr>>([](const QList<Mail::Ptr> &mails) {
219 QCOMPARE(mails.size(), 1);
220 });
221 VERIFYEXEC(job);
222}
223
224//TODO test flag sync
225
226void MailSyncTest::testFailingSync()
227{
228 auto resource = createFaultyResource();
229 QVERIFY(!resource.identifier().isEmpty());
230 VERIFYEXEC(Store::create(resource));
231
232 Sink::Query query;
233 query.resources << resource.identifier();
234
235 // Ensure sync fails if resource is misconfigured
236 auto future = Store::synchronize(query).exec();
237 future.waitForFinished();
238 QVERIFY(future.errorCode());
239}
240
241#include "mailsynctest.moc"