HTML: rework the HTMLification of the plaintext mails
[trojita.git] / tests / tests / test_Composer_responses / test_Composer_responses.cpp
blobace7e4c898acf8afdd5e9bea4bd91891b2667b9a
1 /* Copyright (C) 2006 - 2013 Jan Kundrát <jkt@flaska.net>
3 This file is part of the Trojita Qt IMAP e-mail client,
4 http://trojita.flaska.net/
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License as
8 published by the Free Software Foundation; either version 2 of
9 the License or (at your option) version 3 or any later version
10 accepted by the membership of KDE e.V. (or its successor approved
11 by the membership of KDE e.V.), which shall act as a proxy
12 defined in Section 14 of version 3 of the license.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include <QtTest>
24 #include <QTextDocument>
25 #include "test_Composer_responses.h"
26 #include "../headless_test.h"
27 #include "Composer/PlainTextFormatter.h"
28 #include "Composer/Recipients.h"
29 #include "Composer/ReplaceSignature.h"
30 #include "Composer/SubjectMangling.h"
32 Q_DECLARE_METATYPE(Composer::RecipientList)
33 Q_DECLARE_METATYPE(QList<QUrl>)
35 QString recipientKindtoString(const Composer::RecipientKind kind)
37 switch (kind) {
38 case Composer::ADDRESS_BCC:
39 return QLatin1String("Bcc:");
40 case Composer::ADDRESS_CC:
41 return QLatin1String("Cc:");
42 case Composer::ADDRESS_FROM:
43 return QLatin1String("From:");
44 case Composer::ADDRESS_REPLY_TO:
45 return QLatin1String("Reply-To:");
46 case Composer::ADDRESS_SENDER:
47 return QLatin1String("Sender:");
48 case Composer::ADDRESS_TO:
49 return QLatin1String("To:");
51 Q_ASSERT(false);
52 return QString();
55 namespace QTest {
57 template <>
58 char *toString(const Composer::RecipientList &list)
60 QString buf;
61 QDebug d(&buf);
62 Q_FOREACH(const Composer::RecipientList::value_type &item, list) {
63 d << recipientKindtoString(item.first).toUtf8().constData() << item.second.asSMTPMailbox().constData() << ",";
65 return qstrdup(buf.toUtf8().constData());
69 /** @short Test that subjects remain sane in replied/forwarded messages */
70 void ComposerResponsesTest::testSubjectMangling()
72 QFETCH(QString, original);
73 QFETCH(QString, replied);
75 QCOMPARE(Composer::Util::replySubject(original), replied);
78 /** @short Data for testSubjectMangling */
79 void ComposerResponsesTest::testSubjectMangling_data()
81 QTest::addColumn<QString>("original");
82 QTest::addColumn<QString>("replied");
84 QTest::newRow("no-subject") << QString() << QString::fromUtf8("Re: ");
85 QTest::newRow("simple") << QString::fromUtf8("ahoj") << QString::fromUtf8("Re: ahoj");
86 QTest::newRow("already-replied") << QString::fromUtf8("Re: ahoj") << QString::fromUtf8("Re: ahoj");
87 QTest::newRow("already-replied-no-space") << QString::fromUtf8("re:ahoj") << QString::fromUtf8("Re: ahoj");
88 QTest::newRow("already-replied-case") << QString::fromUtf8("RE: ahoj") << QString::fromUtf8("Re: ahoj");
89 QTest::newRow("multiple-re") << QString::fromUtf8("Re:RE: re: ahoj") << QString::fromUtf8("Re: ahoj");
90 QTest::newRow("trailing-re") << QString::fromUtf8("ahoj re:") << QString::fromUtf8("Re: ahoj re:");
91 QTest::newRow("leading-trailing-re") << QString::fromUtf8("re: ahoj re:") << QString::fromUtf8("Re: ahoj re:");
93 // mailing list stuff
94 QTest::newRow("ml-empty") << QString::fromUtf8("[foo]") << QString::fromUtf8("[foo] Re: ");
95 QTest::newRow("ml-simple") << QString::fromUtf8("[foo] bar") << QString::fromUtf8("[foo] Re: bar");
96 QTest::newRow("ml-simple-no-space") << QString::fromUtf8("[foo]bar") << QString::fromUtf8("[foo] Re: bar");
97 QTest::newRow("ml-broken") << QString::fromUtf8("[foo bar") << QString::fromUtf8("Re: [foo bar");
98 QTest::newRow("ml-two-words") << QString::fromUtf8("[foo bar] x") << QString::fromUtf8("[foo bar] Re: x");
99 QTest::newRow("ml-re-empty") << QString::fromUtf8("[foo] Re:") << QString::fromUtf8("[foo] Re: ");
100 QTest::newRow("re-ml-re-empty") << QString::fromUtf8("Re: [foo] Re:") << QString::fromUtf8("[foo] Re: ");
101 QTest::newRow("re-ml-re-empty-no-spaces") << QString::fromUtf8("Re:[foo]Re:") << QString::fromUtf8("[foo] Re: ");
102 QTest::newRow("ml-ml") << QString::fromUtf8("[foo] [bar] blah") << QString::fromUtf8("[foo] [bar] Re: blah");
103 QTest::newRow("ml-ml-re") << QString::fromUtf8("[foo] [bar] Re: blah") << QString::fromUtf8("[foo] [bar] Re: blah");
104 QTest::newRow("ml-re-ml") << QString::fromUtf8("[foo] Re: [bar] blah") << QString::fromUtf8("[foo] [bar] Re: blah");
105 QTest::newRow("ml-re-ml-re") << QString::fromUtf8("[foo] Re: [bar] Re: blah") << QString::fromUtf8("[foo] [bar] Re: blah");
106 QTest::newRow("re-ml-ml") << QString::fromUtf8("Re: [foo] [bar] blah") << QString::fromUtf8("[foo] [bar] Re: blah");
107 QTest::newRow("re-ml-ml-re") << QString::fromUtf8("Re: [foo] [bar] Re: blah") << QString::fromUtf8("[foo] [bar] Re: blah");
108 QTest::newRow("re-ml-re-ml") << QString::fromUtf8("Re: [foo] Re: [bar] blah") << QString::fromUtf8("[foo] [bar] Re: blah");
109 QTest::newRow("re-ml-re-ml-re") << QString::fromUtf8("Re: [foo] Re: [bar] Re: blah") << QString::fromUtf8("[foo] [bar] Re: blah");
111 // test removing duplicate items
112 QTest::newRow("M-M") << QString::fromUtf8("[foo] [foo] blah") << QString::fromUtf8("[foo] Re: blah");
113 QTest::newRow("M-M-re") << QString::fromUtf8("[foo] [foo] Re: blah") << QString::fromUtf8("[foo] Re: blah");
114 QTest::newRow("M-M-re-re") << QString::fromUtf8("[foo] [foo] Re: Re: blah") << QString::fromUtf8("[foo] Re: blah");
115 QTest::newRow("M-re-M") << QString::fromUtf8("[foo] Re: [foo] blah") << QString::fromUtf8("[foo] Re: blah");
116 QTest::newRow("re-M-re-M") << QString::fromUtf8("Re: [foo] Re: [foo] blah") << QString::fromUtf8("[foo] Re: blah");
117 QTest::newRow("re-M-re-M-re") << QString::fromUtf8("Re: [foo] Re: [foo] Re: blah") << QString::fromUtf8("[foo] Re: blah");
119 // stuff which should not be subject to subject sanitization
120 QTest::newRow("brackets-end") << QString::fromUtf8("blesmrt [test]") << QString::fromUtf8("Re: blesmrt [test]");
121 QTest::newRow("re-brackets-end") << QString::fromUtf8("Re: blesmrt [test]") << QString::fromUtf8("Re: blesmrt [test]");
122 QTest::newRow("re-brackets-re-end") << QString::fromUtf8("Re: blesmrt Re: [test]") << QString::fromUtf8("Re: blesmrt Re: [test]");
123 QTest::newRow("brackets-re-end") << QString::fromUtf8("blesmrt Re: [test]") << QString::fromUtf8("Re: blesmrt Re: [test]");
126 /** @short Test that conversion of plaintext mail to HTML works reasonably well */
127 void ComposerResponsesTest::testPlainTextFormatting()
129 QFETCH(QString, plaintext);
130 QFETCH(QString, htmlFlowed);
131 QFETCH(QString, htmlNotFlowed);
133 QCOMPARE(Composer::Util::plainTextToHtml(plaintext, Composer::Util::FORMAT_FLOWED).join(QLatin1String("\n")), htmlFlowed);
134 QCOMPARE(Composer::Util::plainTextToHtml(plaintext, Composer::Util::FORMAT_PLAIN).join(QLatin1String("\n")), htmlNotFlowed);
137 /** @short Data for testPlainTextFormatting */
138 void ComposerResponsesTest::testPlainTextFormatting_data()
140 QTest::addColumn<QString>("plaintext");
141 QTest::addColumn<QString>("htmlFlowed");
142 QTest::addColumn<QString>("htmlNotFlowed");
144 QTest::newRow("empty-1") << QString() << QString() << QString();
145 QTest::newRow("empty-2") << QString("") << QString("") << QString("");
146 QTest::newRow("empty-3") << QString("\n") << QString("\n") << QString("\n");
147 QTest::newRow("empty-4") << QString("\n\n") << QString("\n\n") << QString("\n\n");
149 QTest::newRow("minimal") << QString("ahoj") << QString("ahoj") << QString("ahoj");
150 QTest::newRow("containing-html")
151 << QString("<p>ahoj &amp; blesmrt</p>")
152 << QString("&lt;p&gt;ahoj &amp;amp; blesmrt&lt;/p&gt;")
153 << QString("&lt;p&gt;ahoj &amp;amp; blesmrt&lt;/p&gt;");
154 QTest::newRow("basic-formatting-1") << QString("foo bar") << QString("foo bar") << QString("foo bar");
155 QTest::newRow("basic-formatting-2")
156 << QString("ahoj *cau* nazdar")
157 << QString("ahoj <b><span class=\"markup\">*</span>cau<span class=\"markup\">*</span></b> nazdar")
158 << QString("ahoj <b><span class=\"markup\">*</span>cau<span class=\"markup\">*</span></b> nazdar");
159 QTest::newRow("basic-formatting-3")
160 << QString("/ahoj/ *cau*")
161 << QString("<i><span class=\"markup\">/</span>ahoj<span class=\"markup\">/</span></i> <b><span class=\"markup\">*</span>cau<span class=\"markup\">*</span></b>")
162 << QString("<i><span class=\"markup\">/</span>ahoj<span class=\"markup\">/</span></i> <b><span class=\"markup\">*</span>cau<span class=\"markup\">*</span></b>");
163 QTest::newRow("basic-formatting-4")
164 << QString("ahoj *_cau_* nazdar")
165 << QString("ahoj <b><span class=\"markup\">*</span><u><span class=\"markup\">_</span>cau"
166 "<span class=\"markup\">_</span></u><span class=\"markup\">*</span></b> nazdar")
167 << QString("ahoj <b><span class=\"markup\">*</span><u><span class=\"markup\">_</span>cau"
168 "<span class=\"markup\">_</span></u><span class=\"markup\">*</span></b> nazdar");
169 QTest::newRow("basic-formatting-666")
170 << QString("foo *bar* _baz_ /pwn/ yay foo@ @bar @ blesmrt")
171 << QString("foo <b><span class=\"markup\">*</span>bar<span class=\"markup\">*</span></b> "
172 "<u><span class=\"markup\">_</span>baz<span class=\"markup\">_</span></u> "
173 "<i><span class=\"markup\">/</span>pwn<span class=\"markup\">/</span></i> yay foo@ @bar @ blesmrt")
174 << QString("foo <b><span class=\"markup\">*</span>bar<span class=\"markup\">*</span></b> "
175 "<u><span class=\"markup\">_</span>baz<span class=\"markup\">_</span></u> "
176 "<i><span class=\"markup\">/</span>pwn<span class=\"markup\">/</span></i> yay foo@ @bar @ blesmrt");
177 QTest::newRow("formatting-and-newlines")
178 << QString("*blesmrt*\ntrojita")
179 << QString("<b><span class=\"markup\">*</span>blesmrt<span class=\"markup\">*</span></b>\ntrojita")
180 << QString("<b><span class=\"markup\">*</span>blesmrt<span class=\"markup\">*</span></b>\ntrojita");
181 QTest::newRow("links")
182 << QString("ahoj http://pwn:123/foo?bar&baz#nope")
183 << QString("ahoj <a href=\"http://pwn:123/foo?bar&amp;baz#nope\">http://pwn:123/foo?bar&amp;baz#nope</a>")
184 << QString("ahoj <a href=\"http://pwn:123/foo?bar&amp;baz#nope\">http://pwn:123/foo?bar&amp;baz#nope</a>");
185 // Test our escaping
186 QTest::newRow("escaping-1")
187 << QString::fromUtf8("<>&&gt; § §gt; §para;\n")
188 << QString::fromUtf8("&lt;&gt;&amp;&amp;gt; § §gt; §para;\n")
189 << QString::fromUtf8("&lt;&gt;&amp;&amp;gt; § §gt; §para;\n");
191 QTest::newRow("mailto-1")
192 << QString("ble.smrt-1_2+3@example.org")
193 << QString("<a href=\"mailto:ble.smrt-1_2+3@example.org\">ble.smrt-1_2+3@example.org</a>")
194 << QString("<a href=\"mailto:ble.smrt-1_2+3@example.org\">ble.smrt-1_2+3@example.org</a>");
196 // Test how the quoted bits are represented
197 QTest::newRow("quoted-1")
198 << QString::fromUtf8("Foo bar.\n"
199 "> blesmrt\n"
200 ">>trojita\n"
201 "omacka")
202 << QString::fromUtf8("Foo bar.\n"
203 "<blockquote><span class=\"quotemarks\">&gt; </span>blesmrt\n"
204 "<blockquote><span class=\"quotemarks\">&gt;&gt; </span>trojita"
205 "</blockquote></blockquote>\n"
206 "omacka")
207 << QString::fromUtf8("Foo bar.\n"
208 "<blockquote><span class=\"quotemarks\">&gt; </span>blesmrt\n"
209 "<blockquote><span class=\"quotemarks\">&gt;&gt; </span>trojita"
210 "</blockquote></blockquote>\n"
211 "omacka");
213 QTest::newRow("quoted-common")
214 << QString::fromUtf8("On quinta-feira, 4 de outubro de 2012 15.46.57, André Somers wrote:\n"
215 "> If you think that running 21 threads on an 8 core system will run make \n"
216 "> your task go faster, then Thiago is right: you don't understand your \n"
217 "> problem.\n"
218 "If you run 8 threads on an 8-core system and they use the CPU fully, then \n"
219 "you're running as fast as you can.\n"
220 "\n"
221 "If you have more threads than the number of processors and if all threads are \n"
222 "ready to be executed, then the OS will schedule timeslices to each thread. \n"
223 "That means threads get executed and suspended all the time, sometimes \n"
224 "migrating between processors. That adds overhead.\n"
225 // yes, some parts have been removed here.
226 "\n"
227 "-- \n"
228 "Thiago's name goes here.\n")
229 << QString::fromUtf8("On quinta-feira, 4 de outubro de 2012 15.46.57, André Somers wrote:\n"
230 "<blockquote><span class=\"quotemarks\">&gt; </span>If you think that running 21 threads "
231 "on an 8 core system will run make your task go faster, then Thiago is right: you don't understand your problem.</blockquote>\n"
232 "If you run 8 threads on an 8-core system and they use the CPU fully, then you're running as fast as you can.\n"
233 "\n"
234 "If you have more threads than the number of processors and if all threads are ready "
235 "to be executed, then the OS will schedule timeslices to each thread. That means "
236 "threads get executed and suspended all the time, sometimes migrating between "
237 "processors. That adds overhead.\n"
238 "\n"
239 "<span class=\"signature\">-- \n"
240 "Thiago's name goes here.\n</span>")
241 << QString::fromUtf8("On quinta-feira, 4 de outubro de 2012 15.46.57, André Somers wrote:\n"
242 "<blockquote><span class=\"quotemarks\">&gt; </span>If you think that running 21 threads on an 8 core system will run make \n"
243 "your task go faster, then Thiago is right: you don't understand your \n"
244 "problem.</blockquote>\n"
245 "If you run 8 threads on an 8-core system and they use the CPU fully, then \n"
246 "you're running as fast as you can.\n"
247 "\n"
248 "If you have more threads than the number of processors and if all threads are \n"
249 "ready to be executed, then the OS will schedule timeslices to each thread. \n"
250 "That means threads get executed and suspended all the time, sometimes \n"
251 "migrating between processors. That adds overhead.\n"
252 "\n"
253 "<span class=\"signature\">-- \n"
254 "Thiago's name goes here.\n</span>");
256 QTest::newRow("quoted-no-spacing")
257 << QString::fromUtf8("> foo\nbar\n> baz")
258 << QString::fromUtf8("<blockquote><span class=\"quotemarks\">&gt; </span>foo</blockquote>\n"
259 "bar\n"
260 "<blockquote><span class=\"quotemarks\">&gt; </span>baz</blockquote>")
261 << QString::fromUtf8("<blockquote><span class=\"quotemarks\">&gt; </span>foo</blockquote>\n"
262 "bar\n"
263 "<blockquote><span class=\"quotemarks\">&gt; </span>baz</blockquote>");
265 QTest::newRow("bottom-quoting")
266 << QString::fromUtf8("Foo bar.\n"
267 "> blesmrt\n"
268 ">> 333")
269 << QString::fromUtf8("Foo bar.\n"
270 "<blockquote><span class=\"quotemarks\">&gt; </span>blesmrt\n"
271 "<blockquote><span class=\"quotemarks\">&gt;&gt; </span>333</blockquote></blockquote>")
272 << QString::fromUtf8("Foo bar.\n"
273 "<blockquote><span class=\"quotemarks\">&gt; </span>blesmrt\n"
274 "<blockquote><span class=\"quotemarks\">&gt;&gt; </span>333</blockquote></blockquote>");
276 QTest::newRow("different-quote-levels-not-flowed-together")
277 << QString::fromUtf8("Foo bar. \n"
278 "> blesmrt \n"
279 ">> 333")
280 << QString::fromUtf8("Foo bar. \n"
281 "<blockquote><span class=\"quotemarks\">&gt; </span>blesmrt \n"
282 "<blockquote><span class=\"quotemarks\">&gt;&gt; </span>333</blockquote></blockquote>")
283 << QString::fromUtf8("Foo bar. \n"
284 "<blockquote><span class=\"quotemarks\">&gt; </span>blesmrt \n"
285 "<blockquote><span class=\"quotemarks\">&gt;&gt; </span>333</blockquote></blockquote>");
287 QTest::newRow("multiple-links-on-line")
288 << QString::fromUtf8("Hi,\n"
289 "http://meh/ http://pwn/now foo@bar http://wtf\n"
290 "nothing x@y.org\n"
291 "foo@example.org else\n"
292 "test@domain"
294 << QString::fromUtf8("Hi,\n"
295 "<a href=\"http://meh/\">http://meh/</a> <a href=\"http://pwn/now\">http://pwn/now</a> "
296 "<a href=\"mailto:foo@bar\">foo@bar</a> <a href=\"http://wtf\">http://wtf</a>\n"
297 "nothing <a href=\"mailto:x@y.org\">x@y.org</a>\n"
298 "<a href=\"mailto:foo@example.org\">foo@example.org</a> else\n"
299 "<a href=\"mailto:test@domain\">test@domain</a>")
300 << QString::fromUtf8("Hi,\n"
301 "<a href=\"http://meh/\">http://meh/</a> <a href=\"http://pwn/now\">http://pwn/now</a> "
302 "<a href=\"mailto:foo@bar\">foo@bar</a> <a href=\"http://wtf\">http://wtf</a>\n"
303 "nothing <a href=\"mailto:x@y.org\">x@y.org</a>\n"
304 "<a href=\"mailto:foo@example.org\">foo@example.org</a> else\n"
305 "<a href=\"mailto:test@domain\">test@domain</a>");
307 QTest::newRow("http-link-with-nested-mail-and-formatting-chars")
308 << QString::fromUtf8("http://example.org/meh/yay/?foo=test@example.org\n"
309 "http://example.org/(*checkout*)/pwn\n"
310 "*https://domain.org/yay*")
311 << QString::fromUtf8("<a href=\"http://example.org/meh/yay/?foo=test@example.org\">http://example.org/meh/yay/?foo=test@example.org</a>\n"
312 "<a href=\"http://example.org/(*checkout*)/pwn\">http://example.org/(*checkout*)/pwn</a>\n"
313 "<b><span class=\"markup\">*</span><a href=\"https://domain.org/yay\">https://domain.org/yay</a><span class=\"markup\">*</span></b>")
314 << QString::fromUtf8("<a href=\"http://example.org/meh/yay/?foo=test@example.org\">http://example.org/meh/yay/?foo=test@example.org</a>\n"
315 "<a href=\"http://example.org/(*checkout*)/pwn\">http://example.org/(*checkout*)/pwn</a>\n"
316 "<b><span class=\"markup\">*</span><a href=\"https://domain.org/yay\">https://domain.org/yay</a><span class=\"markup\">*</span></b>");
320 /** @short Test that the link recognition in plaintext -> HTML formatting recognizes the interesting links */
321 void ComposerResponsesTest::testLinkRecognition()
323 QFETCH(QString, prefix);
324 QFETCH(QString, link);
325 QFETCH(QString, suffix);
327 QString input = prefix + link + suffix;
328 QString expected = prefix + QString::fromUtf8("<a href=\"%1\">%1</a>").arg(link) + suffix;
330 QCOMPARE(Composer::Util::plainTextToHtml(input, Composer::Util::FORMAT_PLAIN).join(QLatin1String("\n")), expected);
333 /** @short Test data for testLinkRecognition */
334 void ComposerResponsesTest::testLinkRecognition_data()
336 QTest::addColumn<QString>("prefix");
337 QTest::addColumn<QString>("link");
338 QTest::addColumn<QString>("suffix");
340 QString empty;
341 QString space(QLatin1String(" "));
343 QTest::newRow("basic-http") << empty << QString::fromUtf8("http://blesmrt") << empty;
344 QTest::newRow("basic-https") << empty << QString::fromUtf8("https://blesmrt") << empty;
345 QTest::newRow("parentheses") << QString::fromUtf8("(") << QString::fromUtf8("https://blesmrt") << QString::fromUtf8(")");
346 QTest::newRow("url-query") << empty << QString::fromUtf8("https://blesmrt.trojita/?foo=bar") << empty;
347 QTest::newRow("url-fragment") << empty << QString::fromUtf8("https://blesmrt.trojita/#pwn") << empty;
349 QTest::newRow("trailing-dot") << empty << QString::fromUtf8("http://blesmrt") << QString::fromUtf8(".");
350 QTest::newRow("trailing-dot-2") << empty << QString::fromUtf8("http://blesmrt") << QString::fromUtf8(". Foo");
351 QTest::newRow("trailing-comma") << empty << QString::fromUtf8("http://blesmrt") << QString::fromUtf8(",");
352 QTest::newRow("trailing-comma-2") << empty << QString::fromUtf8("http://blesmrt") << QString::fromUtf8(", foo");
353 QTest::newRow("trailing-semicolon") << empty << QString::fromUtf8("http://blesmrt") << QString::fromUtf8(";");
354 QTest::newRow("trailing-semicolon-2") << empty << QString::fromUtf8("http://blesmrt") << QString::fromUtf8("; foo");
355 QTest::newRow("trailing-colon") << empty << QString::fromUtf8("http://blesmrt") << QString::fromUtf8(":");
356 QTest::newRow("trailing-colon-2") << empty << QString::fromUtf8("http://blesmrt") << QString::fromUtf8(": blah");
358 QTest::newRow("trailing-sentence-1") << QString::fromUtf8("meh ") << QString::fromUtf8("http://blesmrt") << QString::fromUtf8("?");
359 QTest::newRow("trailing-sentence-2") << QString::fromUtf8("meh ") << QString::fromUtf8("http://blesmrt") << QString::fromUtf8("!");
360 QTest::newRow("trailing-sentence-3") << QString::fromUtf8("meh ") << QString::fromUtf8("http://blesmrt") << QString::fromUtf8(".");
363 /** @short Test data which should not be recognized as links */
364 void ComposerResponsesTest::testUnrecognizedLinks()
366 QFETCH(QString, input);
368 QCOMPARE(Composer::Util::plainTextToHtml(input, Composer::Util::FORMAT_PLAIN).join(QLatin1String("\n")), input);
371 /** @short Test data for testUnrecognizedLinks */
372 void ComposerResponsesTest::testUnrecognizedLinks_data()
374 QTest::addColumn<QString>("input");
376 QTest::newRow("basic-ftp") << QString::fromUtf8("ftp://blesmrt");
377 QTest::newRow("at-sign-start") << QString::fromUtf8("@foo");
378 QTest::newRow("at-sign-end") << QString::fromUtf8("foo@");
379 QTest::newRow("at-sign-standalone-1") << QString::fromUtf8("@");
380 QTest::newRow("at-sign-standalone-2") << QString::fromUtf8(" @ ");
381 QTest::newRow("http-standalone") << QString::fromUtf8("http://");
382 QTest::newRow("http-standalone-stuff") << QString::fromUtf8("http:// foo");
385 void ComposerResponsesTest::testSignatures()
387 QFETCH(QString, original);
388 QFETCH(QString, signature);
389 QFETCH(QString, result);
391 QTextDocument doc;
392 doc.setPlainText(original);
393 Composer::Util::replaceSignature(&doc, signature);
394 QCOMPARE(doc.toPlainText(), result);
397 void ComposerResponsesTest::testSignatures_data()
399 QTest::addColumn<QString>("original");
400 QTest::addColumn<QString>("signature");
401 QTest::addColumn<QString>("result");
403 QTest::newRow("empty-all") << QString() << QString() << QString();
404 QTest::newRow("empty-signature-1") << QString("foo") << QString() << QString("foo");
405 QTest::newRow("empty-signature-2") << QString("foo\n") << QString() << QString("foo\n");
406 QTest::newRow("empty-signature-3") << QString("foo\n-- ") << QString() << QString("foo");
407 QTest::newRow("empty-signature-4") << QString("foo\n-- \n") << QString() << QString("foo");
408 QTest::newRow("empty-signature-5") << QString("foo\n\n-- \n") << QString() << QString("foo\n");
410 QTest::newRow("no-signature-1") << QString("foo") << QString("meh") << QString("foo\n-- \nmeh");
411 QTest::newRow("no-signature-2") << QString("foo\n") << QString("meh") << QString("foo\n\n-- \nmeh");
412 QTest::newRow("no-signature-3") << QString("foo\n\n") << QString("meh") << QString("foo\n\n\n-- \nmeh");
413 QTest::newRow("no-signature-4") << QString("foo\nbar\nbaz") << QString("meh") << QString("foo\nbar\nbaz\n-- \nmeh");
414 QTest::newRow("no-signature-5") << QString("foo\n--") << QString("meh") << QString("foo\n--\n-- \nmeh");
416 QTest::newRow("replacement") << QString("foo\n-- \njohoho") << QString("sig") << QString("foo\n-- \nsig");
417 QTest::newRow("replacement-of-multiline") << QString("foo\n-- \njohoho\nwtf\nbar") << QString("sig") << QString("foo\n-- \nsig");
420 /** @short Test different means of responding ("private", "to all", "to list") */
421 void ComposerResponsesTest::testResponseAddresses()
423 QFETCH(Composer::RecipientList, original);
424 QFETCH(QList<QUrl>, headerListPost);
425 QFETCH(bool, headerListPostNo);
426 QFETCH(bool, privateOk);
427 QFETCH(Composer::RecipientList, privateRecipients);
428 QFETCH(bool, allOk);
429 QFETCH(Composer::RecipientList, allRecipients);
430 QFETCH(bool, listOk);
431 QFETCH(Composer::RecipientList, listRecipients);
433 Composer::RecipientList canary;
434 canary << qMakePair(Composer::ADDRESS_REPLY_TO,
435 Imap::Message::MailAddress(QString(), QString(), QString(), QLatin1String("fail")));
436 Composer::RecipientList res;
438 res = canary;
439 QCOMPARE(Composer::Util::replyRecipientList(Composer::REPLY_PRIVATE, original, headerListPost, headerListPostNo, res),
440 privateOk);
441 if (!privateOk)
442 QVERIFY(res == canary);
443 else
444 QCOMPARE(res, privateRecipients);
446 res = canary;
447 QCOMPARE(Composer::Util::replyRecipientList(Composer::REPLY_ALL, original, headerListPost, headerListPostNo, res),
448 allOk);
449 if (!allOk)
450 QVERIFY(res == canary);
451 else
452 QCOMPARE(res, allRecipients);
454 res = canary;
455 QCOMPARE(Composer::Util::replyRecipientList(Composer::REPLY_LIST, original, headerListPost, headerListPostNo, res),
456 listOk);
457 if (!listOk)
458 QVERIFY(res == canary);
459 else
460 QCOMPARE(res, listRecipients);
463 Imap::Message::MailAddress mail(const char * addr)
465 QStringList list = QString(QLatin1String(addr)).split(QLatin1Char('@'));
466 Q_ASSERT(list.size() == 2);
467 return Imap::Message::MailAddress(QString(), QString(), list[0], list[1]);
470 QPair<Composer::RecipientKind, Imap::Message::MailAddress> mailFrom(const char * addr)
472 return qMakePair(Composer::ADDRESS_FROM, mail(addr));
475 QPair<Composer::RecipientKind, Imap::Message::MailAddress> mailSender(const char * addr)
477 return qMakePair(Composer::ADDRESS_SENDER, mail(addr));
480 QPair<Composer::RecipientKind, Imap::Message::MailAddress> mailReplyTo(const char * addr)
482 return qMakePair(Composer::ADDRESS_REPLY_TO, mail(addr));
485 QPair<Composer::RecipientKind, Imap::Message::MailAddress> mailTo(const char * addr)
487 return qMakePair(Composer::ADDRESS_TO, mail(addr));
490 QPair<Composer::RecipientKind, Imap::Message::MailAddress> mailCc(const char * addr)
492 return qMakePair(Composer::ADDRESS_CC, mail(addr));
495 QPair<Composer::RecipientKind, Imap::Message::MailAddress> mailBcc(const char * addr)
497 return qMakePair(Composer::ADDRESS_BCC, mail(addr));
500 void ComposerResponsesTest::testResponseAddresses_data()
502 using namespace Composer;
504 QTest::addColumn<RecipientList>("original");
505 QTest::addColumn<QList<QUrl> >("headerListPost");
506 QTest::addColumn<bool>("headerListPostNo");
507 QTest::addColumn<bool>("privateOk");
508 QTest::addColumn<RecipientList>("privateRecipients");
509 QTest::addColumn<bool>("allOk");
510 QTest::addColumn<RecipientList>("allRecipients");
511 QTest::addColumn<bool>("listOk");
512 QTest::addColumn<RecipientList>("listRecipients");
514 RecipientList empty;
515 QList<QUrl> listPost;
517 QTest::newRow("from")
518 << (RecipientList() << mailFrom("a@b"))
519 << listPost << false
520 << true << (RecipientList() << mailTo("a@b"))
521 << true << (RecipientList() << mailTo("a@b"))
522 << false << empty;
524 QTest::newRow("sender")
525 << (RecipientList() << mailSender("a@b"))
526 << listPost << false
527 << false << empty
528 << false << empty
529 << false << empty;
531 QTest::newRow("to")
532 << (RecipientList() << mailTo("a@b"))
533 << listPost << false
534 << false << empty
535 << true << (RecipientList() << mailTo("a@b"))
536 << false << empty;
538 QTest::newRow("cc")
539 << (RecipientList() << mailCc("a@b"))
540 << listPost << false
541 << false << empty
542 << true << (RecipientList() << mailTo("a@b"))
543 << false << empty;
545 QTest::newRow("bcc")
546 << (RecipientList() << mailBcc("a@b"))
547 << listPost << false
548 << false << empty
549 << true << (RecipientList() << mailBcc("a@b"))
550 << false << empty;
552 QTest::newRow("from-to")
553 << (RecipientList() << mailFrom("a@b") << mailTo("c@d"))
554 << listPost << false
555 << true << (RecipientList() << mailTo("a@b"))
556 << true << (RecipientList() << mailTo("a@b") << mailCc("c@d"))
557 << false << empty;
559 QTest::newRow("from-sender-to")
560 << (RecipientList() << mailFrom("a@b") << mailSender("x@y") << mailTo("c@d"))
561 << listPost << false
562 << true << (RecipientList() << mailTo("a@b"))
563 << true << (RecipientList() << mailTo("a@b") << mailCc("c@d"))
564 << false << empty;
566 QTest::newRow("list-munged")
567 << (RecipientList() << mailFrom("jkt@flaska.net") << mailTo("trojita@lists.flaska.net")
568 << mailReplyTo("trojita@lists.flaska.net"))
569 << (QList<QUrl>() << QUrl(QLatin1String("mailto:trojita@lists.flaska.net"))) << false
570 << true << (RecipientList() << mailTo("jkt@flaska.net"))
571 << true << (RecipientList() << mailTo("jkt@flaska.net") << mailCc("trojita@lists.flaska.net"))
572 << true << (RecipientList() << mailTo("trojita@lists.flaska.net"));
574 QTest::newRow("list-munged-sender")
575 << (RecipientList() << mailFrom("jkt@flaska.net") << mailTo("trojita@lists.flaska.net")
576 << mailReplyTo("trojita@lists.flaska.net") << mailSender("trojita+bounces@lists"))
577 << (QList<QUrl>() << QUrl(QLatin1String("mailto:trojita@lists.flaska.net"))) << false
578 << true << (RecipientList() << mailTo("jkt@flaska.net"))
579 << true << (RecipientList() << mailTo("jkt@flaska.net") << mailCc("trojita@lists.flaska.net"))
580 << true << (RecipientList() << mailTo("trojita@lists.flaska.net"));
582 QTest::newRow("list-unmunged")
583 << (RecipientList() << mailFrom("jkt@flaska.net") << mailTo("trojita@lists.flaska.net"))
584 << (QList<QUrl>() << QUrl(QLatin1String("mailto:trojita@lists.flaska.net"))) << false
585 << true << (RecipientList() << mailTo("jkt@flaska.net"))
586 << true << (RecipientList() << mailTo("jkt@flaska.net") << mailCc("trojita@lists.flaska.net"))
587 << true << (RecipientList() << mailTo("trojita@lists.flaska.net"));
589 QTest::newRow("list-munged-bcc")
590 << (RecipientList() << mailBcc("bcc@example.org") << mailFrom("jkt@flaska.net") << mailTo("trojita@lists.flaska.net")
591 << mailReplyTo("trojita@lists.flaska.net"))
592 << (QList<QUrl>() << QUrl(QLatin1String("mailto:trojita@lists.flaska.net"))) << false
593 << true << (RecipientList() << mailTo("jkt@flaska.net"))
594 << true << (RecipientList() << mailTo("jkt@flaska.net") << mailCc("trojita@lists.flaska.net") << mailBcc("bcc@example.org"))
595 << true << (RecipientList() << mailTo("trojita@lists.flaska.net"));
597 QTest::newRow("list-unmunged-bcc")
598 << (RecipientList() << mailBcc("bcc@example.org") << mailFrom("jkt@flaska.net") << mailTo("trojita@lists.flaska.net"))
599 << (QList<QUrl>() << QUrl(QLatin1String("mailto:trojita@lists.flaska.net"))) << false
600 << true << (RecipientList() << mailTo("jkt@flaska.net"))
601 << true << (RecipientList() << mailTo("jkt@flaska.net") << mailCc("trojita@lists.flaska.net") << mailBcc("bcc@example.org"))
602 << true << (RecipientList() << mailTo("trojita@lists.flaska.net"));
604 QTest::newRow("from-list-sender-to-cc")
605 << (RecipientList() << mailFrom("andy@x") << mailSender("list-12345@y") << mailTo("someone@z") << mailCc("list@y"))
606 << (QList<QUrl>() << QUrl(QLatin1String("mailtO:list@Y"))) << false
607 << true << (RecipientList() << mailTo("andy@x"))
608 << true << (RecipientList() << mailTo("andy@x") << mailCc("someone@z") << mailCc("list@y"))
609 << true << (RecipientList() << mailTo("list@Y"));
611 QTest::newRow("from-replyto-to-cc-cc-gerrit")
612 << (RecipientList() << mailFrom("gerrit-noreply@qt-project") << mailReplyTo("j.n@digia")
613 << mailTo("jkt@flaska") << mailCc("j.n@digia") << mailCc("qt_sanity_bot@ovi") << mailCc("s.k@kdab"))
614 << QList<QUrl>() << false
615 << true << (RecipientList() << mailTo("j.n@digia"))
616 // FIXME: this shall be better!
617 << true << (RecipientList() << mailTo("gerrit-noreply@qt-project") << mailCc("j.n@digia") << mailCc("jkt@flaska")
618 << mailCc("qt_sanity_bot@ovi") << mailCc("s.k@kdab"))
619 << false << empty;
621 // FIXME: more tests!
624 QTEST_MAIN(ComposerResponsesTest)