unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
blob 710d25535d3aa653966fd6becd320a3df4fbaf2b 6219 bytes (raw)
name: test/T390-python.sh 	 # note: path name is non-authoritative(*)

  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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
 
#!/usr/bin/env bash
test_description="python bindings"
. $(dirname "$0")/test-lib.sh || exit 1

test_require_external_prereq ${NOTMUCH_PYTHON}

if [[ -n ${NOTMUCH_TEST_INSTALLED} ]]; then
    test_done
fi

add_email_corpus
add_gnupg_home

test_begin_subtest "compare thread ids"
test_python <<EOF
import notmuch
db = notmuch.Database(mode=notmuch.Database.MODE.READ_ONLY)
q_new = notmuch.Query(db, 'tag:inbox')
q_new.set_sort(notmuch.Query.SORT.OLDEST_FIRST)
for t in q_new.search_threads():
    print (t.get_thread_id())
EOF
notmuch search --sort=oldest-first --output=threads tag:inbox | sed s/^thread:// > EXPECTED
test_expect_equal_file EXPECTED OUTPUT

test_begin_subtest "compare message ids"
test_python <<EOF
import notmuch
db = notmuch.Database(mode=notmuch.Database.MODE.READ_ONLY)
q_new = notmuch.Query(db, 'tag:inbox')
q_new.set_sort(notmuch.Query.SORT.OLDEST_FIRST)
for m in q_new.search_messages():
    print (m.get_message_id())
EOF
notmuch search --sort=oldest-first --output=messages tag:inbox | sed s/^id:// > EXPECTED
test_expect_equal_file EXPECTED OUTPUT

test_begin_subtest "get non-existent file"
test_python <<EOF
import notmuch
db = notmuch.Database(mode=notmuch.Database.MODE.READ_ONLY)
print (db.find_message_by_filename("i-dont-exist"))
EOF
test_expect_equal "$(cat OUTPUT)" "None"

test_begin_subtest "get revision"
test_python ${MAIL_DIR} <<'EOF'
import notmuch
db = notmuch.Database(mode=notmuch.Database.MODE.READ_ONLY)
(revision, uuid) = db.get_revision()
print ("%s\t%lu" % (uuid, revision))
EOF
notmuch_uuid_sanitize < OUTPUT > CLEAN
cat <<'EOF' >EXPECTED
UUID	53
EOF
test_expect_equal_file EXPECTED CLEAN

grep '^[0-9a-f]' OUTPUT > INITIAL_OUTPUT

test_begin_subtest "output of count matches test code"
notmuch count --lastmod '*' | cut -f2-3 > OUTPUT
test_expect_equal_file INITIAL_OUTPUT OUTPUT
add_message '[content-type]="text/plain; charset=iso-8859-2"' \
            '[content-transfer-encoding]=8bit' \
            '[subject]="ISO-8859-2 encoded message"' \
            "[body]=$'Czech word tu\350\362\341\350\350\355 means pinguin\'s.'" # ISO-8859-2 characters are generated by shell's escape sequences
test_begin_subtest "Add ISO-8859-2 encoded message, call get_message_parts"
test_python <<EOF
import notmuch
db = notmuch.Database(mode=notmuch.Database.MODE.READ_ONLY)
q_new = notmuch.Query(db, 'ISO-8859-2 encoded message')
for m in q_new.search_messages():
    for mp in m.get_message_parts():
      continue
    print(m.get_message_id())
EOF

notmuch search --sort=oldest-first --output=messages "tučňáččí" | sed s/^id:// > EXPECTED
test_expect_equal_file EXPECTED OUTPUT

# TODO currently these tests for setting and getting config values are
# somewhat interdependent.  This is because the config values stored in the
# database are not cleaned up after each test, so they remain there for the
# next test.  The ./README file states that this can happen so it seems kind
# of ok.

test_begin_subtest "set and get config values"
test_python <<'EOF'
import notmuch
db = notmuch.Database(mode=notmuch.Database.MODE.READ_WRITE)
db.set_config('testkey1', 'testvalue1')
db.set_config('testkey2', 'testvalue2')
v1 = db.get_config('testkey1')
v2 = db.get_config('testkey2')
print('testkey1 = ' + v1)
print('testkey2 = ' + v2)
EOF
cat <<'EOF' >EXPECTED
testkey1 = testvalue1
testkey2 = testvalue2
EOF
test_expect_equal_file EXPECTED OUTPUT

test_begin_subtest "get_configs with no match returns empty generator"
test_python <<'EOF'
import notmuch
db = notmuch.Database()
v = db.get_configs('nonexistent')
print(list(v) == [])
EOF
test_expect_equal "$(cat OUTPUT)" "True"

test_begin_subtest "get_configs with no arguments returns all pairs"
test_python <<'EOF'
import notmuch
db = notmuch.Database(mode=notmuch.Database.MODE.READ_WRITE)
db.set_config("zzzafter", "afterval")
db.set_config("aaabefore", "beforeval")
v = db.get_configs()
for index, keyval in enumerate(v):
    key, val = keyval
    print('{}: {} => {}'.format(index, key, val))
EOF
cat <<'EOF' >EXPECTED
0: aaabefore => beforeval
1: testkey1 => testvalue1
2: testkey2 => testvalue2
3: zzzafter => afterval
EOF
test_expect_equal_file EXPECTED OUTPUT

test_begin_subtest "get_configs prefix is used to match keys"
test_python <<'EOF'
import notmuch
db = notmuch.Database(mode=notmuch.Database.MODE.READ_WRITE)
db.set_config('testkey1', 'testvalue1')
db.set_config('testkey2', 'testvalue2')
v = db.get_configs('testkey')
for index, keyval in enumerate(v):
    key, val = keyval
    print('{}: {} => {}'.format(index, key, val))
EOF
cat <<'EOF' >EXPECTED
0: testkey1 => testvalue1
1: testkey2 => testvalue2
EOF
test_expect_equal_file EXPECTED OUTPUT

test_begin_subtest "set_config with no value will unset config entries"
test_python <<'EOF'
import notmuch
db = notmuch.Database(mode=notmuch.Database.MODE.READ_WRITE)
db.set_config('testkey1', '')
db.set_config('testkey2', '')
db.set_config("zzzafter", '')
db.set_config("aaabefore", '')
v = db.get_configs()
print(list(v) == [])
EOF
test_expect_equal "$(cat OUTPUT)" "True"

mkdir -p "${MAIL_DIR}/cur"
fname="${MAIL_DIR}/cur/simplemsg.eml"
cat <<EOF > "$fname"
From: test_suite@notmuchmail.org
To: test_suite@notmuchmail.org
Subject: encrypted message
Date: Sat, 01 Jan 2000 12:00:00 +0000
Message-ID: <simplemsg@crypto.notmuchmail.org>
MIME-Version: 1.0
Content-Type: multipart/encrypted; boundary="=-=-=";
	protocol="application/pgp-encrypted"

--=-=-=
Content-Type: application/pgp-encrypted

Version: 1

--=-=-=
Content-Type: application/octet-stream

$(printf 'Content-Type: text/plain\n\nThis is the sekrit message\n' | gpg --no-tty --batch --quiet --trust-model=always --encrypt --armor --recipient test_suite@notmuchmail.org)
--=-=-=--
EOF

test_begin_subtest "index message with decryption"
test_python <<EOF
import notmuch
db = notmuch.Database(mode=notmuch.Database.MODE.READ_WRITE)
(m, status) = db.index_file('$fname', decrypt_policy=notmuch.Database.DECRYPTION_POLICY.TRUE)
if status == notmuch.errors.STATUS.DUPLICATE_MESSAGE_ID:
   print("got duplicate message")
q_new = notmuch.Query(db, 'sekrit')
for m in q_new.search_messages():
    print(m.get_filename())
EOF
echo "$fname" > EXPECTED
test_expect_equal_file EXPECTED OUTPUT

test_done

debug log:

solving 710d2553 ...
found 710d2553 in https://yhetil.org/notmuch/20211025145753.3031094-2-david@tethera.net/ ||
	https://yhetil.org/notmuch/20230104124145.2882983-4-david@tethera.net/ ||
	https://yhetil.org/notmuch/20230409142627.2216080-5-david@tethera.net/
found 9f71ce3c in https://yhetil.org/notmuch.git/
preparing index
index prepared:
100755 9f71ce3c414916a65bb20f18273d2635378a8ecb	test/T390-python.sh

applying [1/1] https://yhetil.org/notmuch/20211025145753.3031094-2-david@tethera.net/
diff --git a/test/T390-python.sh b/test/T390-python.sh
index 9f71ce3c..710d2553 100755

Checking patch test/T390-python.sh...
Applied patch test/T390-python.sh cleanly.

skipping https://yhetil.org/notmuch/20230104124145.2882983-4-david@tethera.net/ for 710d2553
skipping https://yhetil.org/notmuch/20230409142627.2216080-5-david@tethera.net/ for 710d2553
index at:
100755 710d25535d3aa653966fd6becd320a3df4fbaf2b	test/T390-python.sh

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).