notmuch/test/maildir-sync

154 lines
6.5 KiB
Text
Raw Normal View History

#!/bin/bash
test_description="maildir synchronization"
. ./test-lib.sh
# Much easier to examine differences if the "notmuch show
# --format=json" output includes some newlines. Also, need to avoid
# including the local value of MAIL_DIR in the result.
filter_show_json() {
sed -e 's/, /,\n/g' | sed -e "s|${MAIL_DIR}/|MAIL_DIR/|"
echo
}
cat >> "$NOTMUCH_CONFIG" <<EOF
[maildir]
synchronize_flags=true
EOF
# Create the expected maildir structure
mkdir $MAIL_DIR/cur
mkdir $MAIL_DIR/new
mkdir $MAIL_DIR/tmp
test_begin_subtest "Adding 'S' flag to existing filename removes 'unread' tag"
add_message [subject]='"Adding S flag"' [filename]='adding-s-flag:2,' [dir]=cur
output=$(notmuch search subject:"Adding S flag" | notmuch_search_sanitize)
output+="
"
mv "${gen_msg_filename}" "${gen_msg_filename}S"
increment_mtime "$(dirname "${gen_msg_filename}")"
output+=$(NOTMUCH_NEW)
output+="
"
output+=$(notmuch search subject:"Adding S flag" | notmuch_search_sanitize)
test_expect_equal "$output" "thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; Adding S flag (inbox unread)
No new mail. Detected 1 file rename.
thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; Adding S flag (inbox)"
test_begin_subtest "Adding message with 'S' flag prevents 'unread' tag"
add_message [subject]='"Adding message with S"' [filename]='adding-with-s-flag:2,S' [dir]=cur
output=$(notmuch search subject:"Adding message with S" | notmuch_search_sanitize)
test_expect_equal "$output" "thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; Adding message with S (inbox)"
test_begin_subtest "Adding 'replied' tag adds 'R' flag to filename"
add_message [subject]='"Adding replied tag"' [filename]='adding-replied-tag:2,S' [dir]=cur
notmuch tag +replied subject:"Adding replied tag"
output=$(cd ${MAIL_DIR}/cur; ls -1 adding-replied*)
test_expect_equal "$output" "adding-replied-tag:2,RS"
test_begin_subtest "notmuch show works with renamed file (without notmuch new)"
output=$(notmuch show --format=json id:${gen_msg_id} | filter_show_json)
test_expect_equal "$output" '[[[{"id": "adding-replied-tag@notmuch-test-suite",
"match": true,
"filename": "MAIL_DIR/cur/adding-replied-tag:2,RS",
"timestamp": 978709437,
"date_relative": "2001-01-05",
"tags": ["inbox","replied"],
"headers": {"Subject": "Adding replied tag",
"From": "Notmuch Test Suite <test_suite@notmuchmail.org>",
"To": "Notmuch Test Suite <test_suite@notmuchmail.org>",
"Cc": "",
"Bcc": "",
"Date": "Tue,
05 Jan 2001 15:43:57 -0000"},
"body": [{"id": 1,
"content-type": "text/plain",
"content": "This is just a test message (#3)\n"}]},
[]]]]'
test_expect_success 'notmuch reply works with renamed file (without notmuch new)' 'notmuch reply id:${gen_msg_id}'
test_begin_subtest "notmuch new detects no file rename after tag->flag synchronization"
increment_mtime "$(dirname ${gen_msg_filename})"
output=$(NOTMUCH_NEW)
test_expect_equal "$output" "No new mail."
test_begin_subtest "When read, message moved from new to cur"
add_message [subject]='"Message to move to cur"' [date]='"Sat, 01 Jan 2000 12:00:00 -0000"' [filename]='message-to-move-to-cur' [dir]=new
notmuch tag -unread subject:"Message to move to cur"
output=$(cd "$MAIL_DIR/cur"; ls message-to-move*)
test_expect_equal "$output" "message-to-move-to-cur:2,S"
test_begin_subtest "No rename should be detected by notmuch new"
increment_mtime "$MAIL_DIR/cur"
output=$(NOTMUCH_NEW)
test_expect_equal "$output" "No new mail."
# (*) If notmuch new was not run we've got "Processed 1 file in almost
# no time" here. The reason is that removing unread tag in a previous
# test created directory document in the database but this document
# was not linked as subdirectory of $MAIL_DIR. Therefore notmuch new
# could not reach the cur/ directory and its files in it during
# recurive traversal.
#
# XXX: The above sounds like a bug that should be fixed. If notmuch is
# creating new directories in the mail store, then it should be
# creating all necessary database state for those directories.
test_begin_subtest "Removing info from filename leaves tags unchanged"
add_message [subject]='"Message to lose maildir info"' [filename]='message-to-lose-maildir-info' [dir]=cur
notmuch tag -unread subject:"Message to lose maildir info"
mv "$MAIL_DIR/cur/message-to-lose-maildir-info:2,S" "$MAIL_DIR/cur/message-without-maildir-info"
increment_mtime "$MAIL_DIR/cur"
output=$(NOTMUCH_NEW)
output+="
"
output+=$(notmuch search subject:"Message to lose maildir info" | notmuch_search_sanitize)
test_expect_equal "$output" "No new mail. Detected 1 file rename.
thread:XXX 2001-01-05 [1/1] Notmuch Test Suite; Message to lose maildir info (inbox)"
add_message [subject]='"Non-maildir message"' [dir]=notmaildir/new [filename]='non-maildir-message'
expected=$(notmuch search --output=files subject:"Non-maildir message")
test_expect_success "Can remove unread tag from message in non-maildir directory" 'notmuch tag -unread subject:"Non-maildir message"'
test_begin_subtest "Message in non-maildir directory does not get renamed"
output=$(notmuch search --output=files subject:"Non-maildir message")
test_expect_equal "$output" "$expected"
test_begin_subtest "notmuch dump/restore re-synchronizes maildir tags with flags"
# Capture current filename state
expected=$(ls $MAIL_DIR/cur)
# Add/remove some flags from filenames
mv $MAIL_DIR/cur/adding-replied-tag:2,RS $MAIL_DIR/cur/adding-replied-tag:2,S
mv $MAIL_DIR/cur/adding-s-flag:2,S $MAIL_DIR/cur/adding-s-flag:2,
mv $MAIL_DIR/cur/adding-with-s-flag:2,S $MAIL_DIR/cur/adding-with-s-flag:2,RS
mv $MAIL_DIR/cur/message-to-move-to-cur:2,S $MAIL_DIR/cur/message-to-move-to-cur:2,SD
increment_mtime $MAIL_DIR/cur
notmuch dump dump.txt
NOTMUCH_NEW >/dev/null
notmuch restore dump.txt
output=$(ls $MAIL_DIR/cur)
test_expect_equal "$output" "$expected"
test_begin_subtest 'Duplicated message is tagged according to the duplicate'
cp "$MAIL_DIR/cur/msg-003" "$MAIL_DIR/cur/msg-003-dup:2,RS"
increment_mtime $MAIL_DIR/cur
NOTMUCH_NEW > output
notmuch search id:msg-003@notmuch-test-suite | notmuch_search_sanitize >> output
test_expect_equal "$(< output)" "No new mail.
thread:XXX 2000-01-01 [1/1] Notmuch Test Suite; test message 3 (inbox replied tmp)"
test_begin_subtest 'The original message receives the same flags as the duplicate'
ls $MAIL_DIR/cur > actual
test_expect_equal_failure "$(< actual)" "msg-003:2,RS
msg-003-dup:2,RS"
test_begin_subtest 'Tagging modifies flags of both the original and the duplicate'
notmuch tag -replied id:msg-003@notmuch-test-suite
ls $MAIL_DIR/cur > actual
test_expect_equal_failure "$(< actual)" "msg-003:2,S
msg-003-dup:2,S"
test_done