2 Tests for the mhlib module
6 ### BUG: This suite doesn't currently test the mime functionality of
10 from test_support
import run_unittest
, TESTFN
, TestSkipped
15 if sys
.platform
.startswith("win"):
16 raise TestSkipped("test_mhlib skipped on Windows -- "
17 "too many Unix assumptions")
19 _mhroot
= TESTFN
+"_MH"
20 _mhpath
= os
.path
.join(_mhroot
, "MH")
21 _mhprofile
= os
.path
.join(_mhroot
, ".mh_profile")
24 return os
.path
.join(*f
.split('/'))
26 def writeFile(fname
, contents
):
27 dir = os
.path
.split(fname
)[0]
28 if dir and not os
.path
.exists(dir):
40 def writeProfile(dict):
41 contents
= [ "%s: %s\n" % (k
, v
) for k
, v
in dict.iteritems() ]
42 writeFile(_mhprofile
, "".join(contents
))
44 def writeContext(folder
):
45 folder
= normF(folder
)
46 writeFile(os
.path
.join(_mhpath
, "context"),
47 "Current-Folder: %s\n" % folder
)
49 def writeCurMessage(folder
, cur
):
50 folder
= normF(folder
)
51 writeFile(os
.path
.join(_mhpath
, folder
, ".mh_sequences"),
54 def writeMessage(folder
, n
, headers
, body
):
55 folder
= normF(folder
)
56 headers
= "".join([ "%s: %s\n" % (k
, v
) for k
, v
in headers
.iteritems() ])
57 contents
= "%s\n%s\n" % (headers
,body
)
58 mkdirs(os
.path
.join(_mhpath
, folder
))
59 writeFile(os
.path
.join(_mhpath
, folder
, str(n
)), contents
)
62 return mhlib
.MH(os
.path
.abspath(_mhpath
), _mhprofile
)
66 lines
= [ line
.strip() for line
in lines
if len(line
) >= 2 ]
70 # These next 2 functions are copied from test_glob.py.
72 if os
.path
.exists(fname
) or fname
== '':
74 base
, file = os
.path
.split(fname
)
79 if not os
.path
.exists(fname
):
81 for f
in os
.listdir(fname
):
82 fullname
= os
.path
.join(fname
, f
)
83 if os
.path
.isdir(fullname
):
95 class MhlibTests(unittest
.TestCase
):
99 writeProfile({'Path' : os
.path
.abspath(_mhpath
),
101 'ignored-attribute': 'camping holiday'})
102 # Note: These headers aren't really conformant to RFC822, but
103 # mhlib shouldn't care about that.
105 # An inbox with a couple of messages.
106 writeMessage('inbox', 1,
107 {'From': 'Mrs. Premise',
108 'To': 'Mrs. Conclusion',
109 'Date': '18 July 2001'}, "Hullo, Mrs. Conclusion!\n")
110 writeMessage('inbox', 2,
111 {'From': 'Mrs. Conclusion',
112 'To': 'Mrs. Premise',
113 'Date': '29 July 2001'}, "Hullo, Mrs. Premise!\n")
115 # A folder with many messages
116 for i
in range(5, 101)+range(101, 201, 2):
117 writeMessage('wide', i
,
118 {'From': 'nowhere', 'Subject': 'message #%s' % i
},
119 "This is message number %s\n" % i
)
121 # A deeply nested folder
123 writeMessage(folder
, n
,
124 {'Subject': 'Message %s/%s' % (folder
, n
) },
125 "This is message number %s in %s\n" % (n
, folder
) )
132 deep('deep/f2/f3', 1)
133 deep('deep/f2/f3', 2)
138 def test_basic(self
):
139 writeContext('inbox')
140 writeCurMessage('inbox', 2)
143 eq
= self
.assertEquals
144 eq(mh
.getprofile('Editor'), 'emacs')
145 eq(mh
.getprofile('not-set'), None)
146 eq(mh
.getpath(), os
.path
.abspath(_mhpath
))
147 eq(mh
.getcontext(), 'inbox')
149 mh
.setcontext('wide')
150 eq(mh
.getcontext(), 'wide')
151 eq(readFile(os
.path
.join(_mhpath
, 'context')),
152 "Current-Folder: wide\n")
154 mh
.setcontext('inbox')
156 inbox
= mh
.openfolder('inbox')
157 eq(inbox
.getfullname(),
158 os
.path
.join(os
.path
.abspath(_mhpath
), 'inbox'))
159 eq(inbox
.getsequencesfilename(),
160 os
.path
.join(os
.path
.abspath(_mhpath
), 'inbox', '.mh_sequences'))
161 eq(inbox
.getmessagefilename(1),
162 os
.path
.join(os
.path
.abspath(_mhpath
), 'inbox', '1'))
164 def test_listfolders(self
):
166 eq
= self
.assertEquals
168 folders
= mh
.listfolders()
170 eq(folders
, ['deep', 'inbox', 'wide'])
172 folders
= mh
.listallfolders()
174 tfolders
= map(normF
, ['deep', 'deep/f1', 'deep/f2', 'deep/f2/f3',
177 eq(folders
, tfolders
)
179 folders
= mh
.listsubfolders('deep')
181 eq(folders
, map(normF
, ['deep/f1', 'deep/f2']))
183 folders
= mh
.listallsubfolders('deep')
185 eq(folders
, map(normF
, ['deep/f1', 'deep/f2', 'deep/f2/f3']))
186 eq(mh
.listsubfolders(normF('deep/f2')), [normF('deep/f2/f3')])
188 eq(mh
.listsubfolders('inbox'), [])
189 eq(mh
.listallsubfolders('inbox'), [])
191 def test_sequence(self
):
193 eq
= self
.assertEquals
194 writeCurMessage('wide', 55)
196 f
= mh
.openfolder('wide')
197 all
= f
.listmessages()
198 eq(all
, range(5, 101)+range(101, 201, 2))
199 eq(f
.getcurrent(), 55)
201 eq(readFile(os
.path
.join(_mhpath
, 'wide', '.mh_sequences')),
205 eq(f
.parsesequence(seq
), val
)
207 seqeq('5-55', range(5, 56))
208 seqeq('90-108', range(90, 101)+range(101, 109, 2))
209 seqeq('90-108', range(90, 101)+range(101, 109, 2))
211 seqeq('10:10', range(10, 20))
212 seqeq('10:+10', range(10, 20))
213 seqeq('101:10', range(101, 121, 2))
219 seqeq('cur:-3', [97, 98, 99])
220 seqeq('first-cur', range(5, 100))
221 seqeq('150-last', range(151, 201, 2))
222 seqeq('prev-next', [98, 99, 100])
224 lowprimes
= [5, 7, 11, 13, 17, 19, 23, 29]
225 lowcompos
= [x
for x
in range(5, 31) if not x
in lowprimes
]
226 f
.putsequences({'cur': [5],
227 'lowprime': lowprimes
,
228 'lowcompos': lowcompos
})
229 seqs
= readFile(os
.path
.join(_mhpath
, 'wide', '.mh_sequences'))
230 seqs
= sortLines(seqs
)
232 "lowcompos: 6 8-10 12 14-16 18 20-22 24-28 30",
233 "lowprime: 5 7 11 13 17 19 23 29"])
235 seqeq('lowprime', lowprimes
)
236 seqeq('lowprime:1', [5])
237 seqeq('lowprime:2', [5, 7])
238 seqeq('lowprime:-2', [23, 29])
241 #seqeq('lowprime:first', [5])
242 #seqeq('lowprime:last', [29])
243 #seqeq('lowprime:prev', [29])
244 #seqeq('lowprime:next', [29])
246 def test_modify(self
):
248 eq
= self
.assertEquals
250 mh
.makefolder("dummy1")
251 self
.assert_("dummy1" in mh
.listfolders())
252 path
= os
.path
.join(_mhpath
, "dummy1")
253 self
.assert_(os
.path
.exists(path
))
255 f
= mh
.openfolder('dummy1')
257 msg
= "From: foo\nSubject: %s\n\nDummy Message %s\n" % (n
,n
)
258 f
.createmessage(n
, StringIO
.StringIO(msg
))
264 eq(readFile(f
.getmessagefilename(9)),
265 "From: foo\nSubject: 9\n\nDummy Message 9\n")
267 eq(f
.listmessages(), [7, 8, 9])
268 files
= os
.listdir(path
)
270 eq(files
, ['7', '8', '9'])
272 f
.removemessages(['7', '8'])
273 files
= os
.listdir(path
)
275 eq(files
, [',7', ',8', '9'])
276 eq(f
.listmessages(), [9])
281 mh
.makefolder("dummy2")
282 f2
= mh
.openfolder("dummy2")
283 eq(f2
.listmessages(), [])
284 f
.movemessage(10, f2
, 3)
285 f
.movemessage(11, f2
, 5)
286 eq(f
.listmessages(), [9, 12])
287 eq(f2
.listmessages(), [3, 5])
288 eq(readFile(f2
.getmessagefilename(3)),
289 "From: foo\nSubject: 10\n\nDummy Message 10\n")
291 f
.copymessage(9, f2
, 4)
292 eq(f
.listmessages(), [9, 12])
293 eq(readFile(f2
.getmessagefilename(4)),
294 "From: foo\nSubject: 9\n\nDummy Message 9\n")
296 f
.refilemessages([9, 12], f2
)
297 eq(f
.listmessages(), [])
298 eq(f2
.listmessages(), [3, 4, 5, 6, 7])
299 eq(readFile(f2
.getmessagefilename(7)),
300 "From: foo\nSubject: 12\n\nDummy Message 12\n")
301 # XXX This should check that _copysequences does the right thing.
303 mh
.deletefolder('dummy1')
304 mh
.deletefolder('dummy2')
305 self
.assert_('dummy1' not in mh
.listfolders())
306 self
.assert_(not os
.path
.exists(path
))
310 eq
= self
.assertEquals
312 f
= mh
.openfolder('inbox')
313 msg
= f
.openmessage(1)
314 # Check some basic stuff from rfc822
315 eq(msg
.getheader('From'), "Mrs. Premise")
316 eq(msg
.getheader('To'), "Mrs. Conclusion")
318 # Okay, we have the right message. Let's check the stuff from
320 lines
= sortLines(msg
.getheadertext())
321 eq(lines
, ["Date: 18 July 2001",
322 "From: Mrs. Premise",
323 "To: Mrs. Conclusion"])
324 lines
= sortLines(msg
.getheadertext(lambda h
: len(h
)==4))
325 eq(lines
, ["Date: 18 July 2001",
326 "From: Mrs. Premise"])
327 eq(msg
.getbodytext(), "Hullo, Mrs. Conclusion!\n\n")
328 eq(msg
.getbodytext(0), "Hullo, Mrs. Conclusion!\n\n")
330 # XXXX there should be a better way to reclaim the file handle
336 run_unittest(MhlibTests
)
339 if __name__
== "__main__":