1 /*
2   SPDX-FileCopyrightText: 2009 Constantin Berzan <exit3219@gmail.com>
3 
4   SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "singlepartjobtest.h"
8 
9 #include <QDebug>
10 #include <QTest>
11 
12 #include <KMime/Content>
13 using namespace KMime;
14 
15 #include <MessageComposer/Composer>
16 #include <MessageComposer/GlobalPart>
17 #include <MessageComposer/SinglepartJob>
18 using namespace MessageComposer;
19 
QTEST_MAIN(SinglepartJobTest)20 QTEST_MAIN(SinglepartJobTest)
21 
22 void SinglepartJobTest::testContent()
23 {
24     auto composer = new Composer;
25     auto cjob = new SinglepartJob(composer);
26     QByteArray data("birds came flying from the underground");
27     cjob->setData(data);
28     QVERIFY(cjob->exec());
29     Content *result = cjob->content();
30     result->assemble();
31     qDebug() << result->encodedContent();
32     QCOMPARE(result->body(), data);
33     QVERIFY(result->contentDisposition(false) == nullptr); // Not created unless demanded.
34     QVERIFY(result->contentType(false) == nullptr); // Not created unless demanded.
35     QVERIFY(result->contentTransferEncoding(false)); // KMime gives it a default one (7bit).
36     delete cjob;
37     delete composer;
38 }
39 
testContentDisposition()40 void SinglepartJobTest::testContentDisposition()
41 {
42     auto composer = new Composer;
43     auto cjob = new SinglepartJob(composer);
44     QByteArray data("birds came flying from the underground");
45     cjob->setData(data);
46     QString filename = QStringLiteral("test_ăîşţâ.txt");
47     cjob->contentDisposition()->setDisposition(Headers::CDattachment);
48     cjob->contentDisposition()->setFilename(filename);
49     QVERIFY(cjob->exec());
50     Content *result = cjob->content();
51     result->assemble();
52     qDebug() << result->encodedContent();
53     QCOMPARE(result->body(), data);
54     QVERIFY(result->contentDisposition(false));
55     QCOMPARE(result->contentDisposition()->disposition(), Headers::CDattachment);
56     QCOMPARE(result->contentDisposition()->filename(), filename);
57     delete cjob;
58     delete composer;
59 }
60 
testContentID()61 void SinglepartJobTest::testContentID()
62 {
63     auto composer = new Composer;
64     auto cjob = new SinglepartJob(composer);
65     QByteArray data("birds came flying from the underground");
66     QByteArray id("play@cold");
67     cjob->setData(data);
68     cjob->contentID()->setIdentifier(id);
69     QVERIFY(cjob->exec());
70     Content *result = cjob->content();
71     result->assemble();
72     qDebug() << result->encodedContent();
73     QCOMPARE(result->body(), data);
74     QVERIFY(result->header<Headers::ContentID>());
75     QCOMPARE(result->header<Headers::ContentID>()->identifier(), id);
76     delete cjob;
77 
78     delete composer;
79 }
80 
testContentType()81 void SinglepartJobTest::testContentType()
82 {
83     auto composer = new Composer;
84     auto cjob = new SinglepartJob(composer);
85     QByteArray data("birds came flying from the underground");
86     cjob->setData(data);
87     QByteArray mimeType("text/plain");
88     QByteArray charset("utf-8");
89     cjob->contentType()->setMimeType(mimeType);
90     cjob->contentType()->setCharset(charset);
91     QVERIFY(cjob->exec());
92     Content *result = cjob->content();
93     result->assemble();
94     qDebug() << result->encodedContent();
95     QCOMPARE(result->body(), data);
96     QVERIFY(result->contentType(false));
97     QCOMPARE(result->contentType()->mimeType(), mimeType);
98     QCOMPARE(result->contentType()->charset(), charset);
99     delete cjob;
100 
101     delete composer;
102 }
103 
testContentTransferEncoding()104 void SinglepartJobTest::testContentTransferEncoding()
105 {
106     auto composer = new Composer;
107     QVERIFY(!composer->globalPart()->is8BitAllowed());
108     composer->globalPart()->setFallbackCharsetEnabled(true);
109 
110     // 7bit if possible.
111     {
112         auto cjob = new SinglepartJob(composer);
113         QByteArray data("and the sun will set for you...");
114         cjob->setData(data);
115         QVERIFY(cjob->exec());
116         Content *result = cjob->content();
117         result->assemble();
118         qDebug() << result->encodedContent();
119         QVERIFY(result->contentTransferEncoding(false));
120         QCOMPARE(result->contentTransferEncoding()->encoding(), Headers::CE7Bit);
121         QCOMPARE(result->body(), data);
122         delete cjob;
123     }
124 
125     // quoted-printable if text doesn't fit in 7bit.
126     {
127         auto cjob = new SinglepartJob(composer);
128         QByteArray data("some long text to make qupr more compact than base64 [ăîşţâ]"); // utf-8
129         cjob->setData(data);
130         QVERIFY(cjob->exec());
131         Content *result = cjob->content();
132         result->assemble();
133         qDebug() << result->encodedContent();
134         QVERIFY(result->contentTransferEncoding(false));
135         QCOMPARE(result->contentTransferEncoding()->encoding(), Headers::CEquPr);
136         QCOMPARE(result->body(), data);
137         delete cjob;
138     }
139 
140     // base64 if it's shorter than quoted-printable
141     {
142         auto cjob = new SinglepartJob(composer);
143         QByteArray data("[ăîşţâ]"); // utf-8
144         cjob->setData(data);
145         QVERIFY(cjob->exec());
146         Content *result = cjob->content();
147         result->assemble();
148         qDebug() << result->encodedContent();
149         QVERIFY(result->contentTransferEncoding(false));
150         QCOMPARE(result->contentTransferEncoding()->encoding(), Headers::CEbase64);
151         QCOMPARE(result->body(), data);
152         delete cjob;
153     }
154 
155     // 8bit if asked for and allowed.
156     {
157         composer->globalPart()->set8BitAllowed(true);
158         QByteArray data("[ăîşţâ]"); // utf-8
159         auto cjob = new SinglepartJob(composer);
160         cjob->setData(data);
161         QVERIFY(cjob->exec());
162         Content *result = cjob->content();
163         result->assemble();
164         qDebug() << result->encodedContent();
165         QVERIFY(result->contentTransferEncoding(false));
166         QCOMPARE(result->contentTransferEncoding()->encoding(), Headers::CE8Bit);
167         QCOMPARE(result->body(), data);
168         delete cjob;
169     }
170     delete composer;
171 }
172