]> git.notmuchmail.org Git - notmuch/blob - test/T190-multipart.sh
lib: content disposition values are not case-sensitive
[notmuch] / test / T190-multipart.sh
1 #!/usr/bin/env bash
2 test_description="output of multipart message"
3 . ./test-lib.sh || exit 1
4
5 cat <<EOF > embedded_message
6 From: Carl Worth <cworth@cworth.org>
7 To: cworth@cworth.org
8 Subject: html message
9 Date: Fri, 05 Jan 2001 15:42:57 +0000
10 User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)
11 Message-ID: <87liy5ap01.fsf@yoom.home.cworth.org>
12 MIME-Version: 1.0
13 Content-Type: multipart/alternative; boundary="==-=-=="
14
15 --==-=-==
16 Content-Type: text/html
17
18 <p>This is an embedded message, with a multipart/alternative part.</p>
19
20 --==-=-==
21 Content-Type: text/plain
22
23 This is an embedded message, with a multipart/alternative part.
24
25 --==-=-==--
26 EOF
27
28 cat <<EOF > ${MAIL_DIR}/multipart
29 From: Carl Worth <cworth@cworth.org>
30 To: cworth@cworth.org
31 Subject: Multipart message
32 Date: Fri, 05 Jan 2001 15:43:57 +0000
33 User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)
34 Message-ID: <87liy5ap00.fsf@yoom.home.cworth.org>
35 MIME-Version: 1.0
36 Content-Type: multipart/signed; boundary="==-=-=";
37         micalg=pgp-sha1; protocol="application/pgp-signature"
38
39 --==-=-=
40 Content-Type: multipart/mixed; boundary="=-=-="
41
42 --=-=-=
43 Content-Type: message/rfc822
44 Content-Disposition: inline
45
46 EOF
47 cat embedded_message >> ${MAIL_DIR}/multipart
48 cat <<EOF >> ${MAIL_DIR}/multipart
49
50 --=-=-=
51 Content-Disposition: attachment; filename=attachment
52
53 This is a text attachment.
54
55 --=-=-=
56
57 And this message is signed.
58
59 -Carl
60
61 --=-=-=--
62
63 --==-=-=
64 Content-Type: application/pgp-signature
65
66 -----BEGIN PGP SIGNATURE-----
67 Version: GnuPG v1.4.11 (GNU/Linux)
68
69 iEYEARECAAYFAk3SA/gACgkQ6JDdNq8qSWj0sACghqVJEQJUs3yV8zbTzhgnSIcD
70 W6cAmQE4dcYrx/LPLtYLZm1jsGauE5hE
71 =zkga
72 -----END PGP SIGNATURE-----
73 --==-=-=--
74 EOF
75
76 cat <<EOF > ${MAIL_DIR}/base64-part-with-crlf
77 From: Carl Worth <cworth@cworth.org>
78 To: cworth@cworth.org
79 Subject: Test message with a BASE64 encoded binary containing CRLF pair
80 Date: Fri, 05 Jan 2001 15:43:57 +0000
81 User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)
82 Message-ID: <base64-part-with-crlf>
83 MIME-Version: 1.0
84 Content-Type: multipart/mixed; boundary="==-=-=";
85
86 --==-=-=
87
88 The attached BASE64-encoded part expands to a binary containing a CRLF
89 pair (that is one bye of 0x0D followed by one byte of 0x0A). This is
90 designed to ensure that notmuch is not corrupting the output of this
91 part by converting the CRLF pair to an LF only (as would be appropriate
92 for display of a text part on a Linux system, for example).
93
94 The part should be a 3-byte file with the following sequence of 3
95 hexadecimal bytes:
96
97         EF 0D 0A
98
99 --==-=-=
100 Content-Type: application/octet-stream
101 Content-Disposition: attachment; filename=crlf.bin
102 Content-Transfer-Encoding: base64
103
104 7w0K
105 --==-=-=--
106 EOF
107
108 cat <<EOF > content_types
109 From: Todd <todd@example.com>
110 To: todd@example.com
111 Subject: odd content types
112 Date: Mon, 12 Jan 2014 18:12:32 +0000
113 User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)
114 Message-ID: <KfjfO2WJBw2hrV2p0gjT@example.com>
115 MIME-Version: 1.0
116 Content-Type: multipart/alternative; boundary="==-=-=="
117
118 --==-=-==
119 Content-Type: application/unique_identifier
120
121 <p>This is an embedded message, with a multipart/alternative part.</p>
122
123 --==-=-==
124 Content-Type: text/some_other_identifier
125
126 This is an embedded message, with a multipart/alternative part.
127
128 --==-=-==--
129 EOF
130 cat content_types >> ${MAIL_DIR}/odd_content_type
131 notmuch new > /dev/null
132
133 test_begin_subtest "--format=text --part=0, full message"
134 notmuch show --format=text --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
135 cat <<EOF >EXPECTED
136 \fmessage{ id:87liy5ap00.fsf@yoom.home.cworth.org depth:0 match:1 excluded:0 filename:${MAIL_DIR}/multipart
137 \fheader{
138 Carl Worth <cworth@cworth.org> (2001-01-05) (attachment inbox signed unread)
139 Subject: Multipart message
140 From: Carl Worth <cworth@cworth.org>
141 To: cworth@cworth.org
142 Date: Fri, 05 Jan 2001 15:43:57 +0000
143 \fheader}
144 \fbody{
145 \fpart{ ID: 1, Content-type: multipart/signed
146 \fpart{ ID: 2, Content-type: multipart/mixed
147 \fpart{ ID: 3, Content-type: message/rfc822
148 \fheader{
149 Subject: html message
150 From: Carl Worth <cworth@cworth.org>
151 To: cworth@cworth.org
152 Date: Fri, 05 Jan 2001 15:42:57 +0000
153 \fheader}
154 \fbody{
155 \fpart{ ID: 4, Content-type: multipart/alternative
156 \fpart{ ID: 5, Content-type: text/html
157 Non-text part: text/html
158 \fpart}
159 \fpart{ ID: 6, Content-type: text/plain
160 This is an embedded message, with a multipart/alternative part.
161 \fpart}
162 \fpart}
163 \fbody}
164 \fpart}
165 \fattachment{ ID: 7, Filename: attachment, Content-type: text/plain
166 This is a text attachment.
167 \fattachment}
168 \fpart{ ID: 8, Content-type: text/plain
169 And this message is signed.
170
171 -Carl
172 \fpart}
173 \fpart}
174 \fpart{ ID: 9, Content-type: application/pgp-signature
175 Non-text part: application/pgp-signature
176 \fpart}
177 \fpart}
178 \fbody}
179 \fmessage}
180 EOF
181 test_expect_equal_file OUTPUT EXPECTED
182
183 test_begin_subtest "--format=text --part=1, message body"
184 notmuch show --format=text --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
185 cat <<EOF >EXPECTED
186 \fpart{ ID: 1, Content-type: multipart/signed
187 \fpart{ ID: 2, Content-type: multipart/mixed
188 \fpart{ ID: 3, Content-type: message/rfc822
189 \fheader{
190 Subject: html message
191 From: Carl Worth <cworth@cworth.org>
192 To: cworth@cworth.org
193 Date: Fri, 05 Jan 2001 15:42:57 +0000
194 \fheader}
195 \fbody{
196 \fpart{ ID: 4, Content-type: multipart/alternative
197 \fpart{ ID: 5, Content-type: text/html
198 Non-text part: text/html
199 \fpart}
200 \fpart{ ID: 6, Content-type: text/plain
201 This is an embedded message, with a multipart/alternative part.
202 \fpart}
203 \fpart}
204 \fbody}
205 \fpart}
206 \fattachment{ ID: 7, Filename: attachment, Content-type: text/plain
207 This is a text attachment.
208 \fattachment}
209 \fpart{ ID: 8, Content-type: text/plain
210 And this message is signed.
211
212 -Carl
213 \fpart}
214 \fpart}
215 \fpart{ ID: 9, Content-type: application/pgp-signature
216 Non-text part: application/pgp-signature
217 \fpart}
218 \fpart}
219 EOF
220 test_expect_equal_file OUTPUT EXPECTED
221
222 test_begin_subtest "--format=text --part=2, multipart/mixed"
223 notmuch show --format=text --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
224 cat <<EOF >EXPECTED
225 \fpart{ ID: 2, Content-type: multipart/mixed
226 \fpart{ ID: 3, Content-type: message/rfc822
227 \fheader{
228 Subject: html message
229 From: Carl Worth <cworth@cworth.org>
230 To: cworth@cworth.org
231 Date: Fri, 05 Jan 2001 15:42:57 +0000
232 \fheader}
233 \fbody{
234 \fpart{ ID: 4, Content-type: multipart/alternative
235 \fpart{ ID: 5, Content-type: text/html
236 Non-text part: text/html
237 \fpart}
238 \fpart{ ID: 6, Content-type: text/plain
239 This is an embedded message, with a multipart/alternative part.
240 \fpart}
241 \fpart}
242 \fbody}
243 \fpart}
244 \fattachment{ ID: 7, Filename: attachment, Content-type: text/plain
245 This is a text attachment.
246 \fattachment}
247 \fpart{ ID: 8, Content-type: text/plain
248 And this message is signed.
249
250 -Carl
251 \fpart}
252 \fpart}
253 EOF
254 test_expect_equal_file OUTPUT EXPECTED
255
256 test_begin_subtest "--format=text --part=3, rfc822 part"
257 notmuch show --format=text --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
258 cat <<EOF >EXPECTED
259 \fpart{ ID: 3, Content-type: message/rfc822
260 \fheader{
261 Subject: html message
262 From: Carl Worth <cworth@cworth.org>
263 To: cworth@cworth.org
264 Date: Fri, 05 Jan 2001 15:42:57 +0000
265 \fheader}
266 \fbody{
267 \fpart{ ID: 4, Content-type: multipart/alternative
268 \fpart{ ID: 5, Content-type: text/html
269 Non-text part: text/html
270 \fpart}
271 \fpart{ ID: 6, Content-type: text/plain
272 This is an embedded message, with a multipart/alternative part.
273 \fpart}
274 \fpart}
275 \fbody}
276 \fpart}
277 EOF
278 test_expect_equal_file OUTPUT EXPECTED
279
280 test_begin_subtest "--format=text --part=4, rfc822's multipart"
281 notmuch show --format=text --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
282 cat <<EOF >EXPECTED
283 \fpart{ ID: 4, Content-type: multipart/alternative
284 \fpart{ ID: 5, Content-type: text/html
285 Non-text part: text/html
286 \fpart}
287 \fpart{ ID: 6, Content-type: text/plain
288 This is an embedded message, with a multipart/alternative part.
289 \fpart}
290 \fpart}
291 EOF
292 test_expect_equal_file OUTPUT EXPECTED
293
294 test_begin_subtest "--format=text --part=5, rfc822's html part"
295 notmuch show --format=text --part=5 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
296 cat <<EOF >EXPECTED
297 \fpart{ ID: 5, Content-type: text/html
298 Non-text part: text/html
299 \fpart}
300 EOF
301 test_expect_equal_file OUTPUT EXPECTED
302
303 test_begin_subtest "--format=text --part=6, rfc822's text part"
304 notmuch show --format=text --part=6 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
305 cat <<EOF >EXPECTED
306 \fpart{ ID: 6, Content-type: text/plain
307 This is an embedded message, with a multipart/alternative part.
308 \fpart}
309 EOF
310 test_expect_equal_file OUTPUT EXPECTED
311
312 test_begin_subtest "--format=text --part=7, inline attachement"
313 notmuch show --format=text --part=7 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
314 cat <<EOF >EXPECTED
315 \fattachment{ ID: 7, Filename: attachment, Content-type: text/plain
316 This is a text attachment.
317 \fattachment}
318 EOF
319 test_expect_equal_file OUTPUT EXPECTED
320
321 test_begin_subtest "--format=text --part=8, plain text part"
322 notmuch show --format=text --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
323 cat <<EOF >EXPECTED
324 \fpart{ ID: 8, Content-type: text/plain
325 And this message is signed.
326
327 -Carl
328 \fpart}
329 EOF
330 test_expect_equal_file OUTPUT EXPECTED
331
332 test_begin_subtest "--format=text --part=9, pgp signature (unverified)"
333 notmuch show --format=text --part=9 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
334 cat <<EOF >EXPECTED
335 \fpart{ ID: 9, Content-type: application/pgp-signature
336 Non-text part: application/pgp-signature
337 \fpart}
338 EOF
339 test_expect_equal_file OUTPUT EXPECTED
340
341 test_expect_success \
342     "--format=text --part=8, no part, expect error" \
343     "notmuch show --format=text --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
344
345 test_begin_subtest "--format=json --part=0, full message"
346 notmuch show --format=json --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
347 cat <<EOF >EXPECTED
348 {"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": [
349 {"id": 1, "content-type": "multipart/signed", "content": [
350 {"id": 2, "content-type": "multipart/mixed", "content": [
351 {"id": 3, "content-type": "message/rfc822", "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": [
352 {"id": 4, "content-type": "multipart/alternative", "content": [
353 {"id": 5, "content-type": "text/html", "content-length": 71},
354 {"id": 6, "content-type": "text/plain", "content": "This is an embedded message, with a multipart/alternative part.\n"}]}]}]}, 
355 {"id": 7, "content-type": "text/plain", "filename": "attachment", "content": "This is a text attachment.\n"}, 
356 {"id": 8, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}]}, 
357 {"id": 9, "content-type": "application/pgp-signature", "content-length": 197}]}]}
358 EOF
359 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
360
361 test_begin_subtest "--format=json --part=1, message body"
362 notmuch show --format=json --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
363 cat <<EOF >EXPECTED
364 {"id": 1, "content-type": "multipart/signed", "content": [
365 {"id": 2, "content-type": "multipart/mixed", "content": [
366 {"id": 3, "content-type": "message/rfc822", "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": [
367 {"id": 4, "content-type": "multipart/alternative", "content": [
368 {"id": 5, "content-type": "text/html", "content-length": 71},
369 {"id": 6, "content-type": "text/plain", "content": "This is an embedded message, with a multipart/alternative part.\n"}]}]}]}, 
370 {"id": 7, "content-type": "text/plain", "filename": "attachment", "content": "This is a text attachment.\n"}, 
371 {"id": 8, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}]}, 
372 {"id": 9, "content-type": "application/pgp-signature", "content-length": 197}]}
373 EOF
374 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
375
376 test_begin_subtest "--format=json --part=2, multipart/mixed"
377 notmuch show --format=json --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
378 cat <<EOF >EXPECTED
379 {"id": 2, "content-type": "multipart/mixed", "content": [
380 {"id": 3, "content-type": "message/rfc822", "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": [
381 {"id": 4, "content-type": "multipart/alternative", "content": [
382 {"id": 5, "content-type": "text/html", "content-length": 71},
383 {"id": 6, "content-type": "text/plain", "content": "This is an embedded message, with a multipart/alternative part.\n"}]}]}]}, 
384 {"id": 7, "content-type": "text/plain", "filename": "attachment", "content": "This is a text attachment.\n"}, 
385 {"id": 8, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}]}
386 EOF
387 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
388
389 test_begin_subtest "--format=json --part=3, rfc822 part"
390 notmuch show --format=json --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
391 cat <<EOF >EXPECTED
392 {"id": 3, "content-type": "message/rfc822", "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": [
393 {"id": 4, "content-type": "multipart/alternative", "content": [
394 {"id": 5, "content-type": "text/html", "content-length": 71},
395 {"id": 6, "content-type": "text/plain", "content": "This is an embedded message, with a multipart/alternative part.\n"}]}]}]}
396 EOF
397 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
398
399 test_begin_subtest "--format=json --part=4, rfc822's multipart/alternative"
400 notmuch show --format=json --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
401 cat <<EOF >EXPECTED
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"}]}
405 EOF
406 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
407
408 test_begin_subtest "--format=json --part=5, rfc822's html part"
409 notmuch show --format=json --part=5 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
410 cat <<EOF >EXPECTED
411 {"id": 5, "content-type": "text/html", "content-length": 71}
412 EOF
413 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
414
415 test_begin_subtest "--format=json --part=6, rfc822's text part"
416 notmuch show --format=json --part=6 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
417 cat <<EOF >EXPECTED
418 {"id": 6, "content-type": "text/plain", "content": "This is an embedded message, with a multipart/alternative part.\n"}
419 EOF
420 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
421
422 test_begin_subtest "--format=json --part=7, inline attachment"
423 notmuch show --format=json --part=7 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
424 cat <<EOF >EXPECTED
425 {"id": 7, "content-type": "text/plain", "filename": "attachment", "content": "This is a text attachment.\n"}
426 EOF
427 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
428
429 test_begin_subtest "--format=json --part=8, plain text part"
430 notmuch show --format=json --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
431 cat <<EOF >EXPECTED
432 {"id": 8, "content-type": "text/plain", "content": "And this message is signed.\n\n-Carl\n"}
433 EOF
434 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
435
436 test_begin_subtest "--format=json --part=9, pgp signature (unverified)"
437 notmuch show --format=json --part=9 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
438 cat <<EOF >EXPECTED
439 {"id": 9, "content-type": "application/pgp-signature", "content-length": 197}
440 EOF
441 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
442
443 test_expect_success \
444     "--format=json --part=10, no part, expect error" \
445     "notmuch show --format=json --part=10 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
446
447 test_begin_subtest "--format=raw"
448 notmuch show --format=raw 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
449 test_expect_equal_file OUTPUT "${MAIL_DIR}"/multipart
450
451 test_begin_subtest "--format=raw --part=0, full message"
452 notmuch show --format=raw --part=0 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
453 test_expect_equal_file OUTPUT "${MAIL_DIR}"/multipart
454
455 test_begin_subtest "--format=raw --part=1, message body"
456 notmuch show --format=raw --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
457 test_expect_equal_file OUTPUT "${MAIL_DIR}"/multipart
458
459 test_begin_subtest "--format=raw --part=2, multipart/mixed"
460 notmuch show --format=raw --part=2 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
461 cat <<EOF >EXPECTED
462 Content-Type: multipart/mixed; boundary="=-=-="
463
464 --=-=-=
465 Content-Type: message/rfc822
466 Content-Disposition: inline
467
468 From: Carl Worth <cworth@cworth.org>
469 To: cworth@cworth.org
470 Subject: html message
471 Date: Fri, 05 Jan 2001 15:42:57 +0000
472 User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)
473 Message-ID: <87liy5ap01.fsf@yoom.home.cworth.org>
474 MIME-Version: 1.0
475 Content-Type: multipart/alternative; boundary="==-=-=="
476
477 --==-=-==
478 Content-Type: text/html
479
480 <p>This is an embedded message, with a multipart/alternative part.</p>
481
482 --==-=-==
483 Content-Type: text/plain
484
485 This is an embedded message, with a multipart/alternative part.
486
487 --==-=-==--
488
489 --=-=-=
490 Content-Disposition: attachment; filename=attachment
491
492 This is a text attachment.
493
494 --=-=-=
495
496 And this message is signed.
497
498 -Carl
499
500 --=-=-=--
501 EOF
502 test_expect_equal_file OUTPUT EXPECTED
503
504 test_begin_subtest "--format=raw --part=3, rfc822 part"
505 notmuch show --format=raw --part=3 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
506 test_expect_equal_file OUTPUT embedded_message
507
508 test_begin_subtest "--format=raw --part=4, rfc822's multipart"
509 notmuch show --format=raw --part=4 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
510 cat <<EOF >EXPECTED
511 From: Carl Worth <cworth@cworth.org>
512 To: cworth@cworth.org
513 Subject: html message
514 Date: Fri, 05 Jan 2001 15:42:57 +0000
515 User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.3.1 (i486-pc-linux-gnu)
516 Message-ID: <87liy5ap01.fsf@yoom.home.cworth.org>
517 MIME-Version: 1.0
518 Content-Type: multipart/alternative; boundary="==-=-=="
519
520 --==-=-==
521 Content-Type: text/html
522
523 <p>This is an embedded message, with a multipart/alternative part.</p>
524
525 --==-=-==
526 Content-Type: text/plain
527
528 This is an embedded message, with a multipart/alternative part.
529
530 --==-=-==--
531 EOF
532 test_expect_equal_file OUTPUT EXPECTED
533
534 test_begin_subtest "--format=raw --part=5, rfc822's html part"
535 notmuch show --format=raw --part=5 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
536 cat <<EOF >EXPECTED
537 <p>This is an embedded message, with a multipart/alternative part.</p>
538 EOF
539 test_expect_equal_file OUTPUT EXPECTED
540
541 test_begin_subtest "--format=raw --part=6, rfc822's text part"
542 notmuch show --format=raw --part=6 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
543 cat <<EOF >EXPECTED
544 This is an embedded message, with a multipart/alternative part.
545 EOF
546 test_expect_equal_file OUTPUT EXPECTED
547
548 test_begin_subtest "--format=raw --part=7, inline attachment"
549 notmuch show --format=raw --part=7 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
550 cat <<EOF >EXPECTED
551 This is a text attachment.
552 EOF
553 test_expect_equal_file OUTPUT EXPECTED
554
555 test_begin_subtest "--format=raw --part=8, plain text part"
556 notmuch show --format=raw --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
557 cat <<EOF >EXPECTED
558 And this message is signed.
559
560 -Carl
561 EOF
562 test_expect_equal_file OUTPUT EXPECTED
563
564 test_begin_subtest "--format=raw --part=9, pgp signature (unverified)"
565 notmuch show --format=raw --part=9 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
566 # output should *not* include newline
567 echo >>OUTPUT
568 cat <<EOF >EXPECTED
569 -----BEGIN PGP SIGNATURE-----
570 Version: GnuPG v1.4.11 (GNU/Linux)
571
572 iEYEARECAAYFAk3SA/gACgkQ6JDdNq8qSWj0sACghqVJEQJUs3yV8zbTzhgnSIcD
573 W6cAmQE4dcYrx/LPLtYLZm1jsGauE5hE
574 =zkga
575 -----END PGP SIGNATURE-----
576 EOF
577 test_expect_equal_file OUTPUT EXPECTED
578
579 test_expect_success \
580     "--format=raw --part=10, no part, expect error" \
581     "notmuch show --format=raw --part=8 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
582
583 test_begin_subtest "--format=mbox"
584 notmuch show --format=mbox 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
585 printf "From cworth@cworth.org Fri Jan  5 15:43:57 2001\n" >EXPECTED
586 cat "${MAIL_DIR}"/multipart >>EXPECTED
587 # mbox output is expected to include a blank line
588 echo >>EXPECTED
589 test_expect_equal_file OUTPUT EXPECTED
590
591 test_expect_success \
592     "--format=mbox --part=1, incompatible, expect error" \
593     "! notmuch show --format=mbox --part=1 'id:87liy5ap00.fsf@yoom.home.cworth.org'"
594
595 test_begin_subtest "'notmuch reply' to a multipart message"
596 notmuch reply 'id:87liy5ap00.fsf@yoom.home.cworth.org' >OUTPUT
597 cat <<EOF >EXPECTED
598 From: Notmuch Test Suite <test_suite@notmuchmail.org>
599 Subject: Re: Multipart message
600 To: Carl Worth <cworth@cworth.org>, cworth@cworth.org
601 In-Reply-To: <87liy5ap00.fsf@yoom.home.cworth.org>
602 References: <87liy5ap00.fsf@yoom.home.cworth.org>
603
604 On Fri, 05 Jan 2001 15:43:57 +0000, Carl Worth <cworth@cworth.org> wrote:
605 > From: Carl Worth <cworth@cworth.org>
606 > To: cworth@cworth.org
607 > Subject: html message
608 > Date: Fri, 05 Jan 2001 15:42:57 +0000
609 >
610 Non-text part: text/html
611 > This is an embedded message, with a multipart/alternative part.
612 > This is a text attachment.
613 > And this message is signed.
614
615 > -Carl
616 EOF
617 test_expect_equal_file OUTPUT EXPECTED
618
619 test_begin_subtest "'notmuch reply' to a multipart message with json format"
620 notmuch reply --format=json 'id:87liy5ap00.fsf@yoom.home.cworth.org' | notmuch_json_show_sanitize >OUTPUT
621 notmuch_json_show_sanitize <<EOF >EXPECTED
622 {"reply-headers": {"Subject": "Re: Multipart message",
623  "From": "Notmuch Test Suite <test_suite@notmuchmail.org>",
624  "To": "Carl Worth <cworth@cworth.org>, cworth@cworth.org",
625  "In-reply-to": "<87liy5ap00.fsf@yoom.home.cworth.org>",
626  "References": "<87liy5ap00.fsf@yoom.home.cworth.org>"},
627  "original": {"id": "XXXXX",
628  "match": false,
629  "excluded": false,
630  "filename": "YYYYY",
631  "timestamp": 978709437,
632  "date_relative": "2001-01-05",
633  "tags": ["attachment","inbox","signed","unread"],
634  "headers": {"Subject": "Multipart message",
635  "From": "Carl Worth <cworth@cworth.org>",
636  "To": "cworth@cworth.org",
637  "Date": "Fri, 05 Jan 2001 15:43:57 +0000"},
638  "body": [{"id": 1,
639  "content-type": "multipart/signed",
640  "content": [{"id": 2,
641  "content-type": "multipart/mixed",
642  "content": [{"id": 3,
643  "content-type": "message/rfc822",
644  "content": [{"headers": {"Subject": "html message",
645  "From": "Carl Worth <cworth@cworth.org>",
646  "To": "cworth@cworth.org",
647  "Date": "Fri, 05 Jan 2001 15:42:57 +0000"},
648  "body": [{"id": 4,
649  "content-type": "multipart/alternative",
650  "content": [{"id": 5,
651  "content-type": "text/html",
652  "content-length": 71},
653  {"id": 6,
654  "content-type": "text/plain",
655  "content": "This is an embedded message, with a multipart/alternative part.\n"}]}]}]},
656  {"id": 7,
657  "content-type": "text/plain",
658  "filename": "attachment",
659  "content": "This is a text attachment.\n"},
660  {"id": 8,
661  "content-type": "text/plain",
662  "content": "And this message is signed.\n\n-Carl\n"}]},
663  {"id": 9,
664  "content-type": "application/pgp-signature",
665  "content-length": 197}]}]}}
666 EOF
667 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED)"
668
669 test_begin_subtest "'notmuch show --part' does not corrupt a part with CRLF pair"
670 notmuch show --format=raw --part=3 id:base64-part-with-crlf > crlf.out
671 echo -n -e "\xEF\x0D\x0A" > crlf.expected
672 test_expect_equal_file crlf.out crlf.expected
673
674
675 # The ISO-8859-1 encoding of U+00BD is a single byte: octal 275
676 # (Portability note: Dollar-Single ($'...', ANSI C-style escape sequences)
677 # quoting works on bash, ksh, zsh, *BSD sh but not on dash, ash nor busybox sh)
678 readonly u_00bd_latin1=$'\275'
679
680 # The Unicode fraction symbol 1/2 is U+00BD and is encoded
681 # in UTF-8 as two bytes: octal 302 275
682 readonly u_00bd_utf8=$'\302\275'
683
684 cat <<EOF > ${MAIL_DIR}/include-html
685 From: A <a@example.com>
686 To: B <b@example.com>
687 Subject: html message
688 Date: Sat, 01 January 2000 00:00:00 +0000
689 Message-ID: <htmlmessage>
690 MIME-Version: 1.0
691 Content-Type: multipart/alternative; boundary="==-=="
692
693 --==-==
694 Content-Type: text/html; charset=UTF-8
695
696 <p>0.5 equals ${u_00bd_utf8}</p>
697
698 --==-==
699 Content-Type: text/html; charset=ISO-8859-1
700
701 <p>0.5 equals ${u_00bd_latin1}</p>
702
703 --==-==
704 Content-Type: text/plain; charset=UTF-8
705
706 0.5 equals ${u_00bd_utf8}
707
708 --==-==--
709 EOF
710
711 notmuch new > /dev/null
712
713 cat_expected_head ()
714 {
715         cat <<EOF
716 [[[{"id": "htmlmessage", "match":true, "excluded": false, "date_relative":"2000-01-01",
717    "timestamp": 946684800,
718    "filename": "${MAIL_DIR}/include-html",
719    "tags": ["inbox", "unread"],
720    "headers": { "Date": "Sat, 01 Jan 2000 00:00:00 +0000", "From": "A <a@example.com>",
721                 "Subject": "html message", "To": "B <b@example.com>"},
722    "body": [{
723      "content-type": "multipart/alternative", "id": 1,
724 EOF
725 }
726
727 cat_expected_head > EXPECTED.nohtml
728 cat <<EOF >> EXPECTED.nohtml
729 "content": [
730   { "id": 2, "content-charset": "UTF-8", "content-length": 21, "content-type": "text/html"},
731   { "id": 3, "content-charset": "ISO-8859-1", "content-length": 20, "content-type": "text/html"},
732   { "id": 4, "content-type": "text/plain", "content": "0.5 equals \\u00bd\\n"}
733 ]}]},[]]]]
734 EOF
735
736 # Both the UTF-8 and ISO-8859-1 part should have U+00BD
737 cat_expected_head > EXPECTED.withhtml
738 cat <<EOF >> EXPECTED.withhtml
739 "content": [
740   { "id": 2, "content-type": "text/html", "content": "<p>0.5 equals \\u00bd</p>\\n"},
741   { "id": 3, "content-type": "text/html", "content": "<p>0.5 equals \\u00bd</p>\\n"},
742   { "id": 4, "content-type": "text/plain", "content": "0.5 equals \\u00bd\\n"}
743 ]}]},[]]]]
744 EOF
745
746 test_begin_subtest "html parts excluded by default"
747 notmuch show --format=json id:htmlmessage > OUTPUT
748 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED.nohtml)"
749
750 test_begin_subtest "html parts included"
751 notmuch show --format=json --include-html id:htmlmessage > OUTPUT
752 test_expect_equal_json "$(cat OUTPUT)" "$(cat EXPECTED.withhtml)"
753
754 test_begin_subtest "indexes mime-type #1"
755 output=$(notmuch search mimetype:application/unique_identifier | notmuch_search_sanitize)
756 test_expect_equal "$output" "thread:XXX   2014-01-12 [1/1] Todd; odd content types (inbox unread)"
757
758 test_begin_subtest "indexes mime-type #2"
759 output=$(notmuch search mimetype:text/some_other_identifier | notmuch_search_sanitize)
760 test_expect_equal "$output" "thread:XXX   2014-01-12 [1/1] Todd; odd content types (inbox unread)"
761
762 test_begin_subtest "indexes mime-type #3"
763 output=$(notmuch search from:todd and mimetype:multipart/alternative | notmuch_search_sanitize)
764 test_expect_equal "$output" "thread:XXX   2014-01-12 [1/1] Todd; odd content types (inbox unread)"
765
766 test_begin_subtest "case of Content-Disposition doesn't matter for indexing"
767 cat <<EOF > ${MAIL_DIR}/content-disposition
768 Return-path: <david@tethera.net>
769 Envelope-to: david@tethera.net
770 Delivery-date: Sun, 04 Oct 2015 09:16:03 -0300
771 Received: from gitolite.debian.net ([87.98.215.224])
772         by yantan.tethera.net with esmtps (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128)
773         (Exim 4.80)
774         (envelope-from <david@tethera.net>)
775         id 1ZiiCx-0007iz-RK
776         for david@tethera.net; Sun, 04 Oct 2015 09:16:03 -0300
777 Received: from remotemail by gitolite.debian.net with local (Exim 4.80)
778         (envelope-from <david@tethera.net>)
779         id 1ZiiC8-0002Rz-Uf; Sun, 04 Oct 2015 12:15:12 +0000
780 Received: (nullmailer pid 28621 invoked by uid 1000); Sun, 04 Oct 2015
781  12:14:53 -0000
782 From: David Bremner <david@tethera.net>
783 To: David Bremner <david@tethera.net>
784 Subject: test attachment
785 User-Agent: Notmuch/0.20.2+93~g33c8777 (http://notmuchmail.org) Emacs/24.5.1
786  (x86_64-pc-linux-gnu)
787 Date: Sun, 04 Oct 2015 09:14:53 -0300
788 Message-ID: <87io6m96f6.fsf@zancas.localnet>
789 MIME-Version: 1.0
790 Content-Type: multipart/mixed; boundary="=-=-="
791
792 --=-=-=
793 Content-Type: text/plain
794 Content-Disposition: ATTACHMENT; filename=hello.txt
795 Content-Description: this is a very exciting file
796
797 hello
798
799 --=-=-=
800 Content-Type: text/plain
801
802
803 world
804
805 --=-=-=--
806
807 EOF
808 NOTMUCH_NEW
809
810 cat <<EOF > EXPECTED
811 attachment
812 inbox
813 unread
814 EOF
815
816 notmuch search --output=tags id:87io6m96f6.fsf@zancas.localnet > OUTPUT
817 test_expect_equal_file EXPECTED OUTPUT
818 test_done