2 test_description="output of multipart message"
3 . ./test-lib.sh || exit 1
5 cat <<EOF > embedded_message_body
6 Content-Type: multipart/alternative; boundary="==-=-=="
9 Content-Type: text/html
11 <p>This is an embedded message, with a multipart/alternative part.</p>
14 Content-Type: text/plain
16 This is an embedded message, with a multipart/alternative part.
20 cat <<EOF > embedded_message
21 From: Carl Worth <cworth@cworth.org>
24 Date: Fri, 05 Jan 2001 15:42:57 +0000
25 User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)
26 Message-ID: <87liy5ap01.fsf@yoom.home.cworth.org>
30 cat embedded_message_body >> embedded_message
32 cat <<EOF > multipart_body
33 Content-Type: multipart/signed; boundary="==-=-=";
34 micalg=pgp-sha1; protocol="application/pgp-signature"
37 Content-Type: multipart/mixed; boundary="=-=-="
40 Content-Type: message/rfc822
41 Content-Disposition: inline
45 cat embedded_message >> multipart_body
46 cat <<EOF >> multipart_body
49 Content-Disposition: attachment; filename=attachment
51 This is a text attachment.
55 And this message is signed.
62 Content-Type: application/pgp-signature
64 -----BEGIN PGP SIGNATURE-----
65 Version: GnuPG v1.4.11 (GNU/Linux)
67 iEYEARECAAYFAk3SA/gACgkQ6JDdNq8qSWj0sACghqVJEQJUs3yV8zbTzhgnSIcD
68 W6cAmQE4dcYrx/LPLtYLZm1jsGauE5hE
70 -----END PGP SIGNATURE-----
74 cat <<EOF > ${MAIL_DIR}/multipart
75 From: Carl Worth <cworth@cworth.org>
77 Subject: Multipart message
78 Date: Fri, 05 Jan 2001 15:43:57 +0000
79 User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)
80 Message-ID: <87liy5ap00.fsf@yoom.home.cworth.org>
84 cat multipart_body >> ${MAIL_DIR}/multipart
86 cat <<EOF > ${MAIL_DIR}/base64-part-with-crlf
87 From: Carl Worth <cworth@cworth.org>
89 Subject: Test message with a BASE64 encoded binary containing CRLF pair
90 Date: Fri, 05 Jan 2001 15:43:57 +0000
91 User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)
92 Message-ID: <base64-part-with-crlf>
94 Content-Type: multipart/mixed; boundary="==-=-=";
98 The attached BASE64-encoded part expands to a binary containing a CRLF
99 pair (that is one bye of 0x0D followed by one byte of 0x0A). This is
100 designed to ensure that notmuch is not corrupting the output of this
101 part by converting the CRLF pair to an LF only (as would be appropriate
102 for display of a text part on a Linux system, for example).
104 The part should be a 3-byte file with the following sequence of 3
110 Content-Type: application/octet-stream
111 Content-Disposition: attachment; filename=crlf.bin
112 Content-Transfer-Encoding: base64
118 cat <<EOF > content_types
119 From: Todd <todd@example.com>
121 Subject: odd content types
122 Date: Mon, 12 Jan 2014 18:12:32 +0000
123 User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)
124 Message-ID: <KfjfO2WJBw2hrV2p0gjT@example.com>
126 Content-Type: multipart/alternative; boundary="==-=-=="
129 Content-Type: application/unique_identifier
131 <p>This is an embedded message, with a multipart/alternative part.</p>
134 Content-Type: text/some_other_identifier
136 This is an embedded message, with a multipart/alternative part.
140 cat content_types >> ${MAIL_DIR}/odd_content_type
141 notmuch new > /dev/null
143 test_begin_subtest "--format=text --part=0, full message"
144 notmuch show --format=text --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
146 \fmessage{ id:87liy5ap00.fsf@yoom.home.cworth.org depth:0 match:1 excluded:0 filename:${MAIL_DIR}/multipart
148 Carl Worth <cworth@cworth.org> (2001-01-05) (attachment inbox signed unread)
149 Subject: Multipart message
150 From: Carl Worth <cworth@cworth.org>
151 To: cworth@cworth.org
152 Date: Fri, 05 Jan 2001 15:43:57 +0000
155 \fpart{ ID: 1, Content-type: multipart/signed
156 \fpart{ ID: 2, Content-type: multipart/mixed
157 \fpart{ ID: 3, Content-type: message/rfc822
159 Subject: html message
160 From: Carl Worth <cworth@cworth.org>
161 To: cworth@cworth.org
162 Date: Fri, 05 Jan 2001 15:42:57 +0000
165 \fpart{ ID: 4, Content-type: multipart/alternative
166 \fpart{ ID: 5, Content-type: text/html
167 Non-text part: text/html
169 \fpart{ ID: 6, Content-type: text/plain
170 This is an embedded message, with a multipart/alternative part.
175 \fattachment{ ID: 7, Filename: attachment, Content-type: text/plain
176 This is a text attachment.
178 \fpart{ ID: 8, Content-type: text/plain
179 And this message is signed.
184 \fpart{ ID: 9, Content-type: application/pgp-signature
185 Non-text part: application/pgp-signature
191 test_expect_equal_file EXPECTED OUTPUT
193 test_begin_subtest "--format=text --part=1, message body"
194 notmuch show --format=text --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
196 \fpart{ ID: 1, Content-type: multipart/signed
197 \fpart{ ID: 2, Content-type: multipart/mixed
198 \fpart{ ID: 3, Content-type: message/rfc822
200 Subject: html message
201 From: Carl Worth <cworth@cworth.org>
202 To: cworth@cworth.org
203 Date: Fri, 05 Jan 2001 15:42:57 +0000
206 \fpart{ ID: 4, Content-type: multipart/alternative
207 \fpart{ ID: 5, Content-type: text/html
208 Non-text part: text/html
210 \fpart{ ID: 6, Content-type: text/plain
211 This is an embedded message, with a multipart/alternative part.
216 \fattachment{ ID: 7, Filename: attachment, Content-type: text/plain
217 This is a text attachment.
219 \fpart{ ID: 8, Content-type: text/plain
220 And this message is signed.
225 \fpart{ ID: 9, Content-type: application/pgp-signature
226 Non-text part: application/pgp-signature
230 test_expect_equal_file EXPECTED OUTPUT
232 test_begin_subtest "--format=text --part=2, multipart/mixed"
233 notmuch show --format=text --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
235 \fpart{ ID: 2, Content-type: multipart/mixed
236 \fpart{ ID: 3, Content-type: message/rfc822
238 Subject: html message
239 From: Carl Worth <cworth@cworth.org>
240 To: cworth@cworth.org
241 Date: Fri, 05 Jan 2001 15:42:57 +0000
244 \fpart{ ID: 4, Content-type: multipart/alternative
245 \fpart{ ID: 5, Content-type: text/html
246 Non-text part: text/html
248 \fpart{ ID: 6, Content-type: text/plain
249 This is an embedded message, with a multipart/alternative part.
254 \fattachment{ ID: 7, Filename: attachment, Content-type: text/plain
255 This is a text attachment.
257 \fpart{ ID: 8, Content-type: text/plain
258 And this message is signed.
264 test_expect_equal_file EXPECTED OUTPUT
266 test_begin_subtest "--format=text --part=3, rfc822 part"
267 notmuch show --format=text --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
269 \fpart{ ID: 3, Content-type: message/rfc822
271 Subject: html message
272 From: Carl Worth <cworth@cworth.org>
273 To: cworth@cworth.org
274 Date: Fri, 05 Jan 2001 15:42:57 +0000
277 \fpart{ ID: 4, Content-type: multipart/alternative
278 \fpart{ ID: 5, Content-type: text/html
279 Non-text part: text/html
281 \fpart{ ID: 6, Content-type: text/plain
282 This is an embedded message, with a multipart/alternative part.
288 test_expect_equal_file EXPECTED OUTPUT
290 test_begin_subtest "--format=text --part=4, rfc822's multipart"
291 notmuch show --format=text --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
293 \fpart{ ID: 4, Content-type: multipart/alternative
294 \fpart{ ID: 5, Content-type: text/html
295 Non-text part: text/html
297 \fpart{ ID: 6, Content-type: text/plain
298 This is an embedded message, with a multipart/alternative part.
302 test_expect_equal_file EXPECTED OUTPUT
304 test_begin_subtest "--format=text --part=5, rfc822's html part"
305 notmuch show --format=text --part=5 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
307 \fpart{ ID: 5, Content-type: text/html
308 Non-text part: text/html
311 test_expect_equal_file EXPECTED OUTPUT
313 test_begin_subtest "--format=text --part=6, rfc822's text part"
314 notmuch show --format=text --part=6 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
316 \fpart{ ID: 6, Content-type: text/plain
317 This is an embedded message, with a multipart/alternative part.
320 test_expect_equal_file EXPECTED OUTPUT
322 test_begin_subtest "--format=text --part=7, inline attachement"
323 notmuch show --format=text --part=7 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
325 \fattachment{ ID: 7, Filename: attachment, Content-type: text/plain
326 This is a text attachment.
329 test_expect_equal_file EXPECTED OUTPUT
331 test_begin_subtest "--format=text --part=8, plain text part"
332 notmuch show --format=text --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
334 \fpart{ ID: 8, Content-type: text/plain
335 And this message is signed.
340 test_expect_equal_file EXPECTED OUTPUT
342 test_begin_subtest "--format=text --part=9, pgp signature (unverified)"
343 notmuch show --format=text --part=9 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
345 \fpart{ ID: 9, Content-type: application/pgp-signature
346 Non-text part: application/pgp-signature
349 test_expect_equal_file EXPECTED OUTPUT
351 test_begin_subtest "--format=text --part=8, no part, expect error"
352 test_expect_success "notmuch show --format=text --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
354 test_begin_subtest "--format=json --part=0, full message"
355 notmuch show --format=json --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
357 {"id": "87liy5ap00.fsf@yoom.home.cworth.org", "match": true, "excluded": false, "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", "Date": "Fri, 05 Jan 2001 15:43:57 +0000"}, "body": [
358 {"id": 1, "content-type": "multipart/signed", "content": [
359 {"id": 2, "content-type": "multipart/mixed", "content": [
360 {"id": 3, "content-type": "message/rfc822", "content-disposition": "inline", "content": [{"headers": {"Subject": "html message", "From": "Carl Worth <cworth@cworth.org>", "To": "cworth@cworth.org", "Date": "Fri, 05 Jan 2001 15:42:57 +0000"}, "body": [
361 {"id": 4, "content-type": "multipart/alternative", "content": [
362 {"id": 5, "content-type": "text/html", "content-length": 71},
363 {"id": 6, "content-type": "text/plain", "content": "This is an embedded message, with a multipart/alternative part.\n"}]}]}]},
364 {"id": 7, "content-type": "text/plain", "content-disposition": "attachment", "filename": "attachment", "content": "This is a text attachment.\n"},
365 {"id": 8, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}]},
366 {"id": 9, "content-type": "application/pgp-signature", "content-length": 197}]}]}
368 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
370 test_begin_subtest "--format=json --part=1, message body"
371 notmuch show --format=json --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
373 {"id": 1, "content-type": "multipart/signed", "content": [
374 {"id": 2, "content-type": "multipart/mixed", "content": [
375 {"id": 3, "content-type": "message/rfc822", "content-disposition": "inline", "content": [{"headers": {"Subject": "html message", "From": "Carl Worth <cworth@cworth.org>", "To": "cworth@cworth.org", "Date": "Fri, 05 Jan 2001 15:42:57 +0000"}, "body": [
376 {"id": 4, "content-type": "multipart/alternative", "content": [
377 {"id": 5, "content-type": "text/html", "content-length": 71},
378 {"id": 6, "content-type": "text/plain", "content": "This is an embedded message, with a multipart/alternative part.\n"}]}]}]},
379 {"id": 7, "content-type": "text/plain", "content-disposition": "attachment", "filename": "attachment", "content": "This is a text attachment.\n"},
380 {"id": 8, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}]},
381 {"id": 9, "content-type": "application/pgp-signature", "content-length": 197}]}
383 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
385 test_begin_subtest "--format=json --part=2, multipart/mixed"
386 notmuch show --format=json --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
388 {"id": 2, "content-type": "multipart/mixed", "content": [
389 {"id": 3, "content-type": "message/rfc822", "content-disposition": "inline", "content": [{"headers": {"Subject": "html message", "From": "Carl Worth <cworth@cworth.org>", "To": "cworth@cworth.org", "Date": "Fri, 05 Jan 2001 15:42:57 +0000"}, "body": [
390 {"id": 4, "content-type": "multipart/alternative", "content": [
391 {"id": 5, "content-type": "text/html", "content-length": 71},
392 {"id": 6, "content-type": "text/plain", "content": "This is an embedded message, with a multipart/alternative part.\n"}]}]}]},
393 {"id": 7, "content-type": "text/plain", "content-disposition": "attachment", "filename": "attachment", "content": "This is a text attachment.\n"},
394 {"id": 8, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}]}
396 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
398 test_begin_subtest "--format=json --part=3, rfc822 part"
399 notmuch show --format=json --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
401 {"id": 3, "content-type": "message/rfc822", "content-disposition": "inline", "content": [{"headers": {"Subject": "html message", "From": "Carl Worth <cworth@cworth.org>", "To": "cworth@cworth.org", "Date": "Fri, 05 Jan 2001 15:42:57 +0000"}, "body": [
402 {"id": 4, "content-type": "multipart/alternative", "content": [
403 {"id": 5, "content-type": "text/html", "content-length": 71},
404 {"id": 6, "content-type": "text/plain", "content": "This is an embedded message, with a multipart/alternative part.\n"}]}]}]}
406 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
408 test_begin_subtest "--format=json --part=4, rfc822's multipart/alternative"
409 notmuch show --format=json --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
411 {"id": 4, "content-type": "multipart/alternative", "content": [
412 {"id": 5, "content-type": "text/html", "content-length": 71},
413 {"id": 6, "content-type": "text/plain", "content": "This is an embedded message, with a multipart/alternative part.\n"}]}
415 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
417 test_begin_subtest "--format=json --part=5, rfc822's html part"
418 notmuch show --format=json --part=5 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
420 {"id": 5, "content-type": "text/html", "content-length": 71}
422 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
424 test_begin_subtest "--format=json --part=6, rfc822's text part"
425 notmuch show --format=json --part=6 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
427 {"id": 6, "content-type": "text/plain", "content": "This is an embedded message, with a multipart/alternative part.\n"}
429 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
431 test_begin_subtest "--format=json --part=7, inline attachment"
432 notmuch show --format=json --part=7 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
435 "content-type": "text/plain",
436 "filename": "attachment",
437 "content": "This is a text attachment.\n",
438 "content-disposition": "attachment"}
440 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
442 test_begin_subtest "--format=json --part=8, plain text part"
443 notmuch show --format=json --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
445 {"id": 8, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}
447 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
449 test_begin_subtest "--format=json --part=9, pgp signature (unverified)"
450 notmuch show --format=json --part=9 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
452 {"id": 9, "content-type": "application/pgp-signature", "content-length": 197}
454 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
456 test_begin_subtest "--format=json --part=10, no part, expect error"
457 test_expect_success "notmuch show --format=json --part=10 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
459 test_begin_subtest "--format=raw"
460 notmuch show --format=raw 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
461 test_expect_equal_file "${MAIL_DIR}"/multipart OUTPUT
463 test_begin_subtest "--format=raw --part=0, full message"
464 notmuch show --format=raw --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
465 test_expect_equal_file "${MAIL_DIR}"/multipart OUTPUT
467 test_begin_subtest "--format=raw --part=1, message body"
468 test_subtest_broken_gmime_2
469 notmuch show --format=raw --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
470 test_expect_equal_file multipart_body OUTPUT
472 test_begin_subtest "--format=raw --part=2, multipart/mixed"
473 notmuch show --format=raw --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
475 Content-Type: multipart/mixed; boundary="=-=-="
478 Content-Type: message/rfc822
479 Content-Disposition: inline
481 From: Carl Worth <cworth@cworth.org>
482 To: cworth@cworth.org
483 Subject: html message
484 Date: Fri, 05 Jan 2001 15:42:57 +0000
485 User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)
486 Message-ID: <87liy5ap01.fsf@yoom.home.cworth.org>
488 Content-Type: multipart/alternative; boundary="==-=-=="
491 Content-Type: text/html
493 <p>This is an embedded message, with a multipart/alternative part.</p>
496 Content-Type: text/plain
498 This is an embedded message, with a multipart/alternative part.
503 Content-Disposition: attachment; filename=attachment
505 This is a text attachment.
509 And this message is signed.
515 test_expect_equal_file EXPECTED OUTPUT
517 test_begin_subtest "--format=raw --part=3, rfc822 part"
518 notmuch show --format=raw --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
519 test_expect_equal_file embedded_message OUTPUT
521 test_begin_subtest "--format=raw --part=4, rfc822's multipart"
522 test_subtest_broken_gmime_2
523 notmuch show --format=raw --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
524 test_expect_equal_file embedded_message_body OUTPUT
526 test_begin_subtest "--format=raw --part=5, rfc822's html part"
527 notmuch show --format=raw --part=5 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
529 <p>This is an embedded message, with a multipart/alternative part.</p>
531 test_expect_equal_file EXPECTED OUTPUT
533 test_begin_subtest "--format=raw --part=6, rfc822's text part"
534 notmuch show --format=raw --part=6 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
536 This is an embedded message, with a multipart/alternative part.
538 test_expect_equal_file EXPECTED OUTPUT
540 test_begin_subtest "--format=raw --part=7, inline attachment"
541 notmuch show --format=raw --part=7 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
543 This is a text attachment.
545 test_expect_equal_file EXPECTED OUTPUT
547 test_begin_subtest "--format=raw --part=8, plain text part"
548 notmuch show --format=raw --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
550 And this message is signed.
554 test_expect_equal_file EXPECTED OUTPUT
556 test_begin_subtest "--format=raw --part=9, pgp signature (unverified)"
557 notmuch show --format=raw --part=9 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
558 # output should *not* include newline
561 -----BEGIN PGP SIGNATURE-----
562 Version: GnuPG v1.4.11 (GNU/Linux)
564 iEYEARECAAYFAk3SA/gACgkQ6JDdNq8qSWj0sACghqVJEQJUs3yV8zbTzhgnSIcD
565 W6cAmQE4dcYrx/LPLtYLZm1jsGauE5hE
567 -----END PGP SIGNATURE-----
569 test_expect_equal_file EXPECTED OUTPUT
571 test_begin_subtest "--format=raw --part=10, no part, expect error"
572 test_expect_success "notmuch show --format=raw --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
574 test_begin_subtest "--format=mbox"
575 notmuch show --format=mbox 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
576 printf "From cworth@cworth.org Fri Jan 5 15:43:57 2001\n" >EXPECTED
577 cat "${MAIL_DIR}"/multipart >>EXPECTED
578 # mbox output is expected to include a blank line
580 test_expect_equal_file EXPECTED OUTPUT
582 test_begin_subtest "--format=mbox --part=1, incompatible, expect error"
583 test_expect_success "! notmuch show --format=mbox --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
585 test_begin_subtest "'notmuch reply' to a multipart message"
586 notmuch reply 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
588 From: Notmuch Test Suite <test_suite@notmuchmail.org>
589 Subject: Re: Multipart message
590 To: Carl Worth <cworth@cworth.org>, cworth@cworth.org
591 In-Reply-To: <87liy5ap00.fsf@yoom.home.cworth.org>
592 References: <87liy5ap00.fsf@yoom.home.cworth.org>
594 On Fri, 05 Jan 2001 15:43:57 +0000, Carl Worth <cworth@cworth.org> wrote:
595 > From: Carl Worth <cworth@cworth.org>
596 > To: cworth@cworth.org
597 > Subject: html message
598 > Date: Fri, 05 Jan 2001 15:42:57 +0000
600 Non-text part: text/html
601 > This is an embedded message, with a multipart/alternative part.
602 > This is a text attachment.
603 > And this message is signed.
607 test_expect_equal_file EXPECTED OUTPUT
609 test_begin_subtest "'notmuch reply' to a multipart message with json format"
610 notmuch reply --format=json 'id:87liy5ap00.fsf@yoom.home.cworth.org' | notmuch_json_show_sanitize >OUTPUT
611 notmuch_json_show_sanitize <<EOF >EXPECTED
612 {"reply-headers": {"Subject": "Re: Multipart message",
613 "From": "Notmuch Test Suite <test_suite@notmuchmail.org>",
614 "To": "Carl Worth <cworth@cworth.org>, cworth@cworth.org",
615 "In-reply-to": "<87liy5ap00.fsf@yoom.home.cworth.org>",
616 "References": "<87liy5ap00.fsf@yoom.home.cworth.org>"},
617 "original": {"id": "XXXXX",
620 "filename": ["YYYYY"],
621 "timestamp": 978709437,
622 "date_relative": "2001-01-05",
623 "tags": ["attachment","inbox","signed","unread"],
624 "headers": {"Subject": "Multipart message",
625 "From": "Carl Worth <cworth@cworth.org>",
626 "To": "cworth@cworth.org",
627 "Date": "Fri, 05 Jan 2001 15:43:57 +0000"},
629 "content-type": "multipart/signed",
630 "content": [{"id": 2,
631 "content-type": "multipart/mixed",
632 "content": [{"id": 3,
633 "content-type": "message/rfc822",
634 "content-disposition": "inline",
635 "content": [{"headers": {"Subject": "html message",
636 "From": "Carl Worth <cworth@cworth.org>",
637 "To": "cworth@cworth.org",
638 "Date": "Fri, 05 Jan 2001 15:42:57 +0000"},
640 "content-type": "multipart/alternative",
641 "content": [{"id": 5,
642 "content-type": "text/html",
643 "content-length": 71},
645 "content-type": "text/plain",
646 "content": "This is an embedded message, with a multipart/alternative part.\n"}]}]}]},
648 "content-type": "text/plain",
649 "content-disposition": "attachment",
650 "filename": "attachment",
651 "content": "This is a text attachment.\n"},
653 "content-type": "text/plain",
654 "content": "And this message is signed.\n\n-Carl\n"}]},
656 "content-type": "application/pgp-signature",
657 "content-length": 197}]}]}}
659 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
661 test_begin_subtest "'notmuch show --part' does not corrupt a part with CRLF pair"
662 notmuch show --format=raw --part=3 id:base64-part-with-crlf > crlf.out
663 echo -n -e "\xEF\x0D\x0A" > crlf.expected
664 test_expect_equal_file crlf.out crlf.expected
667 # The ISO-8859-1 encoding of U+00BD is a single byte: octal 275
668 # (Portability note: Dollar-Single ($'...', ANSI C-style escape sequences)
669 # quoting works on bash, ksh, zsh, *BSD sh but not on dash, ash nor busybox sh)
670 readonly u_00bd_latin1=$'\275'
672 # The Unicode fraction symbol 1/2 is U+00BD and is encoded
673 # in UTF-8 as two bytes: octal 302 275
674 readonly u_00bd_utf8=$'\302\275'
676 cat <<EOF > ${MAIL_DIR}/include-html
677 From: A <a@example.com>
678 To: B <b@example.com>
679 Subject: html message
680 Date: Sat, 01 January 2000 00:00:00 +0000
681 Message-ID: <htmlmessage>
683 Content-Type: multipart/alternative; boundary="==-=="
686 Content-Type: text/html; charset=UTF-8
688 <p>0.5 equals ${u_00bd_utf8}</p>
691 Content-Type: text/html; charset=ISO-8859-1
693 <p>0.5 equals ${u_00bd_latin1}</p>
696 Content-Type: text/plain; charset=UTF-8
698 0.5 equals ${u_00bd_utf8}
703 notmuch new > /dev/null
708 [[[{"id": "htmlmessage", "match":true, "excluded": false, "date_relative":"2000-01-01",
709 "timestamp": 946684800,
710 "filename": ["${MAIL_DIR}/include-html"],
711 "tags": ["inbox", "unread"],
712 "headers": { "Date": "Sat, 01 Jan 2000 00:00:00 +0000", "From": "A <a@example.com>",
713 "Subject": "html message", "To": "B <b@example.com>"},
715 "content-type": "multipart/alternative", "id": 1,
719 cat_expected_head > EXPECTED.nohtml
720 cat <<EOF >> EXPECTED.nohtml
722 { "id": 2, "content-charset": "UTF-8", "content-length": 21, "content-type": "text/html"},
723 { "id": 3, "content-charset": "ISO-8859-1", "content-length": 20, "content-type": "text/html"},
724 { "id": 4, "content-type": "text/plain", "content": "0.5 equals \\u00bd\\n"}
728 # Both the UTF-8 and ISO-8859-1 part should have U+00BD
729 cat_expected_head > EXPECTED.withhtml
730 cat <<EOF >> EXPECTED.withhtml
732 { "id": 2, "content-type": "text/html", "content": "<p>0.5 equals \\u00bd</p>\\n"},
733 { "id": 3, "content-type": "text/html", "content": "<p>0.5 equals \\u00bd</p>\\n"},
734 { "id": 4, "content-type": "text/plain", "content": "0.5 equals \\u00bd\\n"}
738 test_begin_subtest "html parts excluded by default"
739 notmuch show --format=json id:htmlmessage > OUTPUT
740 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED.nohtml)"
742 test_begin_subtest "html parts included"
743 notmuch show --format=json --include-html id:htmlmessage > OUTPUT
744 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED.withhtml)"
746 test_begin_subtest "indexes mime-type #1"
747 output=$(notmuch search mimetype:application/unique_identifier | notmuch_search_sanitize)
748 test_expect_equal "$output" "thread:XXX 2014-01-12 [1/1] Todd; odd content types (inbox unread)"
750 test_begin_subtest "indexes mime-type #2"
751 output=$(notmuch search mimetype:text/some_other_identifier | notmuch_search_sanitize)
752 test_expect_equal "$output" "thread:XXX 2014-01-12 [1/1] Todd; odd content types (inbox unread)"
754 test_begin_subtest "indexes mime-type #3"
755 output=$(notmuch search from:todd and mimetype:multipart/alternative | notmuch_search_sanitize)
756 test_expect_equal "$output" "thread:XXX 2014-01-12 [1/1] Todd; odd content types (inbox unread)"
758 test_begin_subtest "case of Content-Disposition doesn't matter for indexing"
759 cat <<EOF > ${MAIL_DIR}/content-disposition
760 Return-path: <david@tethera.net>
761 Envelope-to: david@tethera.net
762 Delivery-date: Sun, 04 Oct 2015 09:16:03 -0300
763 Received: from gitolite.debian.net ([87.98.215.224])
764 by yantan.tethera.net with esmtps (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128)
766 (envelope-from <david@tethera.net>)
768 for david@tethera.net; Sun, 04 Oct 2015 09:16:03 -0300
769 Received: from remotemail by gitolite.debian.net with local (Exim 4.80)
770 (envelope-from <david@tethera.net>)
771 id 1ZiiC8-0002Rz-Uf; Sun, 04 Oct 2015 12:15:12 +0000
772 Received: (nullmailer pid 28621 invoked by uid 1000); Sun, 04 Oct 2015
774 From: David Bremner <david@tethera.net>
775 To: David Bremner <david@tethera.net>
776 Subject: test attachment
777 User-Agent: Notmuch/0.20.2+93~g33c8777 (http://notmuchmail.org) Emacs/24.5.1
778 (x86_64-pc-linux-gnu)
779 Date: Sun, 04 Oct 2015 09:14:53 -0300
780 Message-ID: <87io6m96f6.fsf@zancas.localnet>
782 Content-Type: multipart/mixed; boundary="=-=-="
785 Content-Type: text/plain
786 Content-Disposition: ATTACHMENT; filename=hello.txt
787 Content-Description: this is a very exciting file
792 Content-Type: text/plain
808 notmuch search --output=tags id:87io6m96f6.fsf@zancas.localnet > OUTPUT
809 test_expect_equal_file EXPECTED OUTPUT