2 test_description="output of multipart message"
5 cat <<EOF > ${MAIL_DIR}/multipart
6 From: Carl Worth <cworth@cworth.org>
8 Subject: Multipart message
9 Date: Tue, 05 Jan 2001 15:43:57 -0000
10 User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)
11 Message-ID: <87liy5ap00.fsf@yoom.home.cworth.org>
13 Content-Type: multipart/signed; boundary="==-=-=";
14 micalg=pgp-sha1; protocol="application/pgp-signature"
17 Content-Type: multipart/mixed; boundary="=-=-="
20 Content-Type: message/rfc822
21 Content-Disposition: inline
23 From: Carl Worth <cworth@cworth.org>
26 Date: Tue, 05 Jan 2001 15:42:57 -0000
27 User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)
28 Message-ID: <87liy5ap01.fsf@yoom.home.cworth.org>
30 Content-Type: text/html
32 <p>This is an embedded message, with a single html part.</p>
35 Content-Disposition: attachment; filename=attachment
37 This is a text attachment.
41 And this message is signed.
48 Content-Type: application/pgp-signature
50 -----BEGIN PGP SIGNATURE-----
51 Version: GnuPG v1.4.11 (GNU/Linux)
53 iEYEARECAAYFAk3SA/gACgkQ6JDdNq8qSWj0sACghqVJEQJUs3yV8zbTzhgnSIcD
54 W6cAmQE4dcYrx/LPLtYLZm1jsGauE5hE
56 -----END PGP SIGNATURE-----
60 cat <<EOF > ${MAIL_DIR}/base64-part-with-crlf
61 From: Carl Worth <cworth@cworth.org>
63 Subject: Test message with a BASE64 encoded binary containing CRLF pair
64 Date: Tue, 05 Jan 2001 15:43:57 -0000
65 User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)
66 Message-ID: <base64-part-with-crlf>
68 Content-Type: multipart/mixed; boundary="==-=-=";
72 The attached BASE64-encoded part expands to a binary containing a CRLF
73 pair (that is one bye of 0x0D followed by one byte of 0x0A). This is
74 designed to ensure that notmuch is not corrupting the output of this
75 part by converting the CRLF pair to an LF only (as would be appropriate
76 for display of a text part on a Linux system, for example).
78 The part should be a 3-byte file with the following sequence of 3
84 Content-Type: application/octet-stream
85 Content-Disposition: attachment; filename=crlf.bin
86 Content-Transfer-Encoding: base64
91 notmuch new > /dev/null
93 test_begin_subtest "--format=text --part=0, full message"
94 notmuch show --format=text --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
96 \fmessage{ id:87liy5ap00.fsf@yoom.home.cworth.org depth:0 match:1 filename:${MAIL_DIR}/multipart
98 Carl Worth <cworth@cworth.org> (2001-01-05) (attachment inbox signed unread)
99 Subject: Multipart message
100 From: Carl Worth <cworth@cworth.org>
101 To: cworth@cworth.org
102 Date: Tue, 05 Jan 2001 15:43:57 -0000
105 \fpart{ ID: 1, Content-type: multipart/signed
106 \fpart{ ID: 2, Content-type: multipart/mixed
107 \fpart{ ID: 3, Content-type: message/rfc822
108 \fpart{ ID: 4, Content-type: text/html
109 Non-text part: text/html
112 \fattachment{ ID: 5, Filename: attachment, Content-type: text/plain
113 This is a text attachment.
115 \fpart{ ID: 6, Content-type: text/plain
116 And this message is signed.
121 \fpart{ ID: 7, Content-type: application/pgp-signature
122 Non-text part: application/pgp-signature
128 test_expect_equal_file OUTPUT EXPECTED
130 test_begin_subtest "--format=text --part=1, message body"
131 notmuch show --format=text --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
133 \fpart{ ID: 1, Content-type: multipart/signed
134 \fpart{ ID: 2, Content-type: multipart/mixed
135 \fpart{ ID: 3, Content-type: message/rfc822
136 \fpart{ ID: 4, Content-type: text/html
137 Non-text part: text/html
140 \fattachment{ ID: 5, Filename: attachment, Content-type: text/plain
141 This is a text attachment.
143 \fpart{ ID: 6, Content-type: text/plain
144 And this message is signed.
149 \fpart{ ID: 7, Content-type: application/pgp-signature
150 Non-text part: application/pgp-signature
154 test_expect_equal_file OUTPUT EXPECTED
156 test_begin_subtest "--format=text --part=2, multipart/mixed"
157 notmuch show --format=text --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
159 \fpart{ ID: 2, Content-type: multipart/mixed
160 \fpart{ ID: 3, Content-type: message/rfc822
161 \fpart{ ID: 4, Content-type: text/html
162 Non-text part: text/html
165 \fattachment{ ID: 5, Filename: attachment, Content-type: text/plain
166 This is a text attachment.
168 \fpart{ ID: 6, Content-type: text/plain
169 And this message is signed.
175 test_expect_equal_file OUTPUT EXPECTED
177 test_begin_subtest "--format=text --part=3, rfc822 multipart"
178 notmuch show --format=text --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
180 \fpart{ ID: 3, Content-type: message/rfc822
181 \fpart{ ID: 4, Content-type: text/html
182 Non-text part: text/html
186 test_expect_equal_file OUTPUT EXPECTED
188 test_begin_subtest "--format=text --part=4, html part"
189 notmuch show --format=text --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
191 \fpart{ ID: 4, Content-type: text/html
192 Non-text part: text/html
195 test_expect_equal_file OUTPUT EXPECTED
197 test_begin_subtest "--format=text --part=5, inline attachment"
198 notmuch show --format=text --part=5 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
200 \fattachment{ ID: 5, Filename: attachment, Content-type: text/plain
201 This is a text attachment.
204 test_expect_equal_file OUTPUT EXPECTED
206 test_begin_subtest "--format=text --part=6, plain text part"
207 notmuch show --format=text --part=6 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
209 \fpart{ ID: 6, Content-type: text/plain
210 And this message is signed.
215 test_expect_equal_file OUTPUT EXPECTED
217 test_begin_subtest "--format=text --part=7, pgp signature (unverified)"
218 notmuch show --format=text --part=7 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
220 \fpart{ ID: 7, Content-type: application/pgp-signature
221 Non-text part: application/pgp-signature
224 test_expect_equal_file OUTPUT EXPECTED
226 test_expect_success \
227 "--format=text --part=8, no part, expect error" \
228 "notmuch show --format=text --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
230 test_begin_subtest "--format=json --part=0, full message"
231 output=$(notmuch show --format=json --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org')
232 test_expect_equal "$output" \
233 '{"id": "87liy5ap00.fsf@yoom.home.cworth.org", "match": true, "filename": "'"${MAIL_DIR}/multipart"'", "timestamp": 978709437, "date_relative": "2001-01-05", "tags": ["attachment","inbox","signed","unread"], "headers": {"Subject": "Multipart message", "From": "Carl Worth <cworth@cworth.org>", "To": "cworth@cworth.org", "Cc": "", "Bcc": "", "Date": "Tue, 05 Jan 2001 15:43:57 -0000"}, "body": [{"id": 1, "content-type": "multipart/signed", "content": [{"id": 2, "content-type": "multipart/mixed", "content": [{"id": 3, "content-type": "message/rfc822", "content": [{"id": 4, "content-type": "text/html"}]}, {"id": 5, "content-type": "text/plain", "filename": "attachment", "content": "This is a text attachment.\n"}, {"id": 6, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}]}, {"id": 7, "content-type": "application/pgp-signature"}]}]}'
235 test_begin_subtest "--format=json --part=1, message body"
236 output=$(notmuch show --format=json --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org')
237 test_expect_equal "$output" \
238 '{"id": 1, "content-type": "multipart/signed", "content": [{"id": 2, "content-type": "multipart/mixed", "content": [{"id": 3, "content-type": "message/rfc822", "content": [{"id": 4, "content-type": "text/html"}]}, {"id": 5, "content-type": "text/plain", "filename": "attachment", "content": "This is a text attachment.\n"}, {"id": 6, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}]}, {"id": 7, "content-type": "application/pgp-signature"}]}'
240 test_begin_subtest "--format=json --part=2, multipart/mixed"
241 output=$(notmuch show --format=json --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org')
242 test_expect_equal "$output" \
243 '{"id": 2, "content-type": "multipart/mixed", "content": [{"id": 3, "content-type": "message/rfc822", "content": [{"id": 4, "content-type": "text/html"}]}, {"id": 5, "content-type": "text/plain", "filename": "attachment", "content": "This is a text attachment.\n"}, {"id": 6, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}]}'
245 test_begin_subtest "--format=json --part=3, rfc822 multipart"
246 output=$(notmuch show --format=json --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org')
247 test_expect_equal "$output" \
248 '{"id": 3, "content-type": "message/rfc822", "content": [{"id": 4, "content-type": "text/html"}]}'
250 test_begin_subtest "--format=json --part=4, html part"
251 output=$(notmuch show --format=json --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org')
252 test_expect_equal "$output" \
253 '{"id": 4, "content-type": "text/html"}'
255 test_begin_subtest "--format=json --part=5, inline attachment"
256 output=$(notmuch show --format=json --part=5 'id:87liy5ap00.fsf@yoom.home.cworth.org')
257 test_expect_equal "$output" \
258 '{"id": 5, "content-type": "text/plain", "filename": "attachment", "content": "This is a text attachment.\n"}'
260 test_begin_subtest "--format=json --part=6, plain text part"
261 output=$(notmuch show --format=json --part=6 'id:87liy5ap00.fsf@yoom.home.cworth.org')
262 test_expect_equal "$output" \
263 '{"id": 6, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}'
265 test_begin_subtest "--format=json --part=7, pgp signature (unverified)"
266 output=$(notmuch show --format=json --part=7 'id:87liy5ap00.fsf@yoom.home.cworth.org')
267 test_expect_equal "$output" \
268 '{"id": 7, "content-type": "application/pgp-signature"}'
270 test_expect_success \
271 "--format=json --part=8, no part, expect error" \
272 "notmuch show --format=json --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
274 test_begin_subtest "--format=raw"
275 notmuch show --format=raw 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
276 test_expect_equal_file OUTPUT "${MAIL_DIR}"/multipart
278 test_begin_subtest "--format=raw --part=0, full message"
279 notmuch show --format=raw --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
280 test_expect_equal_file OUTPUT "${MAIL_DIR}"/multipart
282 test_begin_subtest "--format=raw --part=1, message body"
283 notmuch show --format=raw --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
284 # output should *not* include newline
287 <p>This is an embedded message, with a single html part.</p>
288 This is a text attachment.
289 And this message is signed.
292 -----BEGIN PGP SIGNATURE-----
293 Version: GnuPG v1.4.11 (GNU/Linux)
295 iEYEARECAAYFAk3SA/gACgkQ6JDdNq8qSWj0sACghqVJEQJUs3yV8zbTzhgnSIcD
296 W6cAmQE4dcYrx/LPLtYLZm1jsGauE5hE
298 -----END PGP SIGNATURE-----
300 test_expect_equal_file OUTPUT EXPECTED
302 test_begin_subtest "--format=raw --part=2, multipart/mixed"
303 notmuch show --format=raw --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
305 <p>This is an embedded message, with a single html part.</p>
306 This is a text attachment.
307 And this message is signed.
311 test_expect_equal_file OUTPUT EXPECTED
313 test_begin_subtest "--format=raw --part=3, rfc822 multipart"
314 notmuch show --format=raw --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
316 <p>This is an embedded message, with a single html part.</p>
318 test_expect_equal_file OUTPUT EXPECTED
320 test_begin_subtest "--format=raw --part=4, html part"
321 notmuch show --format=raw --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
323 <p>This is an embedded message, with a single html part.</p>
325 test_expect_equal_file OUTPUT EXPECTED
327 test_begin_subtest "--format=raw --part=5, inline attachment"
328 notmuch show --format=raw --part=5 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
330 This is a text attachment.
332 test_expect_equal_file OUTPUT EXPECTED
334 test_begin_subtest "--format=raw --part=6, plain text part"
335 notmuch show --format=raw --part=6 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
337 And this message is signed.
341 test_expect_equal_file OUTPUT EXPECTED
343 test_begin_subtest "--format=raw --part=7, pgp signature (unverified)"
344 notmuch show --format=raw --part=7 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
345 # output should *not* include newline
348 -----BEGIN PGP SIGNATURE-----
349 Version: GnuPG v1.4.11 (GNU/Linux)
351 iEYEARECAAYFAk3SA/gACgkQ6JDdNq8qSWj0sACghqVJEQJUs3yV8zbTzhgnSIcD
352 W6cAmQE4dcYrx/LPLtYLZm1jsGauE5hE
354 -----END PGP SIGNATURE-----
356 test_expect_equal_file OUTPUT EXPECTED
358 test_expect_success \
359 "--format=raw --part=8, no part, expect error" \
360 "notmuch show --format=raw --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
362 test_begin_subtest "--format=mbox"
363 notmuch show --format=mbox 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
364 printf "From cworth@cworth.org Fri Jan 5 15:43:57 2001\n" >EXPECTED
365 cat "${MAIL_DIR}"/multipart >>EXPECTED
366 # mbox output is expected to include a blank line
368 test_expect_equal_file OUTPUT EXPECTED
370 test_expect_success \
371 "--format=mbox --part=1, incompatible, expect error" \
372 "! notmuch show --format=mbox --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
374 test_begin_subtest "'notmuch reply' to a multipart message"
375 notmuch reply 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
377 From: Notmuch Test Suite <test_suite@notmuchmail.org>
378 Subject: Re: Multipart message
379 To: Carl Worth <cworth@cworth.org>, cworth@cworth.org
380 In-Reply-To: <87liy5ap00.fsf@yoom.home.cworth.org>
381 References: <87liy5ap00.fsf@yoom.home.cworth.org>
383 On Tue, 05 Jan 2001 15:43:57 -0000, Carl Worth <cworth@cworth.org> wrote:
384 Non-text part: multipart/signed
385 Non-text part: multipart/mixed
386 Non-text part: message/rfc822
387 Non-text part: text/html
388 > This is a text attachment.
389 > And this message is signed.
392 Non-text part: application/pgp-signature
394 test_expect_equal_file OUTPUT EXPECTED
396 test_begin_subtest "'notmuch show --part' does not corrupt a part with CRLF pair"
397 notmuch show --format=raw --part=3 id:base64-part-with-crlf > crlf.out
398 echo -n -e "\xEF\x0D\x0A" > crlf.expected
399 test_expect_equal_file crlf.out crlf.expected