aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/T400-hooks.sh
blob: 77e8569b22a2cfa280791ee149b38e1f7dfb67ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/usr/bin/env bash
test_description='hooks'
. ./test-lib.sh

HOOK_DIR=${MAIL_DIR}/.notmuch/hooks

create_echo_hook () {
    local TOKEN="${RANDOM}"
    mkdir -p ${HOOK_DIR}
    cat <<EOF >"${HOOK_DIR}/${1}"
#!/bin/sh
echo "${TOKEN}" > ${3}
EOF
    chmod +x "${HOOK_DIR}/${1}"
    echo "${TOKEN}" > ${2}
}

create_failing_hook () {
    mkdir -p ${HOOK_DIR}
    cat <<EOF >"${HOOK_DIR}/${1}"
#!/bin/sh
exit 13
EOF
    chmod +x "${HOOK_DIR}/${1}"
}

rm_hooks () {
    rm -rf ${HOOK_DIR}
}

# add a message to generate mail dir and database
add_message

test_begin_subtest "pre-new is run"
rm_hooks
generate_message
create_echo_hook "pre-new" expected output
notmuch new > /dev/null
test_expect_equal_file expected output

test_begin_subtest "post-new is run"
rm_hooks
generate_message
create_echo_hook "post-new" expected output
notmuch new > /dev/null
test_expect_equal_file expected output

test_begin_subtest "pre-new is run before post-new"
rm_hooks
generate_message
create_echo_hook "pre-new" pre-new.expected pre-new.output
create_echo_hook "post-new" post-new.expected post-new.output
notmuch new > /dev/null
test_expect_equal_file post-new.expected post-new.output

test_begin_subtest "pre-new non-zero exit status (hook status)"
rm_hooks
generate_message
create_failing_hook "pre-new"
output=`notmuch new 2>&1`
test_expect_equal "$output" "Error: pre-new hook failed with status 13"

# depends on the previous subtest leaving broken hook behind
test_expect_code 1 "pre-new non-zero exit status (notmuch status)" "notmuch new"

# depends on the previous subtests leaving 1 new message behind
test_begin_subtest "pre-new non-zero exit status aborts new"
rm_hooks
output=$(NOTMUCH_NEW)
test_expect_equal "$output" "Added 1 new message to the database."

test_begin_subtest "post-new non-zero exit status (hook status)"
rm_hooks
generate_message
create_failing_hook "post-new"
NOTMUCH_NEW 2>output.stderr >output
cat output.stderr >> output
echo "Added 1 new message to the database." > expected
echo "Error: post-new hook failed with status 13" >> expected
test_expect_equal_file expected output

# depends on the previous subtest leaving broken hook behind
test_expect_code 1 "post-new non-zero exit status (notmuch status)" "notmuch new"

# test_begin_subtest "hook without executable permissions"
rm_hooks
mkdir -p ${HOOK_DIR}
cat <<EOF >"${HOOK_DIR}/pre-new"
#!/bin/sh
echo foo
EOF
output=`notmuch new 2>&1`
test_expect_code 1 "hook without executable permissions" "notmuch new"

# test_begin_subtest "hook execution failure"
rm_hooks
mkdir -p ${HOOK_DIR}
cat <<EOF >"${HOOK_DIR}/pre-new"
no hashbang, execl fails
EOF
chmod +x "${HOOK_DIR}/pre-new"
test_expect_code 1 "hook execution failure" "notmuch new"

test_done