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