test_mhlib.py revision ab9ba27dc066adc6423ea137b9481cf524d10ffd
10263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum"""
20263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum   Tests for the mhlib module
30263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum   Nick Mathewson
40263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum"""
50263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
60263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum### BUG: This suite doesn't currently test the mime functionality of
70263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum###      mhlib.  It should.
80263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
90263c80b90e9abb312601bc176b8176665953dc7Guido van Rossumimport unittest
10c7ca3ffba3d41f24f6f66d40391a044f199785acTim Petersfrom test_support import run_unittest, TESTFN, TestSkipped
110263c80b90e9abb312601bc176b8176665953dc7Guido van Rossumimport os, StringIO
12c7ca3ffba3d41f24f6f66d40391a044f199785acTim Petersimport sys
130263c80b90e9abb312601bc176b8176665953dc7Guido van Rossumimport mhlib
140263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
15c7ca3ffba3d41f24f6f66d40391a044f199785acTim Petersif sys.platform.startswith("win"):
16c7ca3ffba3d41f24f6f66d40391a044f199785acTim Peters    raise TestSkipped("test_mhlib skipped on Windows -- "
17c7ca3ffba3d41f24f6f66d40391a044f199785acTim Peters                      "too many Unix assumptions")
18c7ca3ffba3d41f24f6f66d40391a044f199785acTim Peters
190263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum_mhroot = TESTFN+"_MH"
200263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum_mhpath = os.path.join(_mhroot, "MH")
210263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum_mhprofile = os.path.join(_mhroot, ".mh_profile")
220263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
230263c80b90e9abb312601bc176b8176665953dc7Guido van Rossumdef normF(f):
240263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    return os.path.join(*f.split('/'))
250263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
260263c80b90e9abb312601bc176b8176665953dc7Guido van Rossumdef writeFile(fname, contents):
270263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    dir = os.path.split(fname)[0]
280263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    if dir and not os.path.exists(dir):
290263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        mkdirs(dir)
300263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    f = open(fname, 'w')
310263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    f.write(contents)
320263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    f.close()
330263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
340263c80b90e9abb312601bc176b8176665953dc7Guido van Rossumdef readFile(fname):
350263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    f = open(fname)
360263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    r = f.read()
370263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    f.close()
380263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    return r
390263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
400263c80b90e9abb312601bc176b8176665953dc7Guido van Rossumdef writeProfile(dict):
410263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    contents = [ "%s: %s\n" % (k, v) for k, v in dict.iteritems() ]
420263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    writeFile(_mhprofile, "".join(contents))
430263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
440263c80b90e9abb312601bc176b8176665953dc7Guido van Rossumdef writeContext(folder):
450263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    folder = normF(folder)
46ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters    writeFile(os.path.join(_mhpath, "context"),
470263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum              "Current-Folder: %s\n" % folder)
480263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
490263c80b90e9abb312601bc176b8176665953dc7Guido van Rossumdef writeCurMessage(folder, cur):
500263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    folder = normF(folder)
510263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    writeFile(os.path.join(_mhpath, folder, ".mh_sequences"),
520263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum              "cur: %s\n"%cur)
530263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
540263c80b90e9abb312601bc176b8176665953dc7Guido van Rossumdef writeMessage(folder, n, headers, body):
550263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    folder = normF(folder)
560263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    headers = "".join([ "%s: %s\n" % (k, v) for k, v in headers.iteritems() ])
570263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    contents = "%s\n%s\n" % (headers,body)
580263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    mkdirs(os.path.join(_mhpath, folder))
590263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    writeFile(os.path.join(_mhpath, folder, str(n)), contents)
600263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
610263c80b90e9abb312601bc176b8176665953dc7Guido van Rossumdef getMH():
620263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    return mhlib.MH(os.path.abspath(_mhpath), _mhprofile)
630263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
640263c80b90e9abb312601bc176b8176665953dc7Guido van Rossumdef sortLines(s):
650263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    lines = s.split("\n")
660263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    lines = [ line.strip() for line in lines if len(line) >= 2 ]
670263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    lines.sort()
680263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    return lines
690263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
700263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum# These next 2 functions are copied from test_glob.py.
710263c80b90e9abb312601bc176b8176665953dc7Guido van Rossumdef mkdirs(fname):
720263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    if os.path.exists(fname) or fname == '':
730263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        return
740263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    base, file = os.path.split(fname)
750263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    mkdirs(base)
760263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    os.mkdir(fname)
770263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
780263c80b90e9abb312601bc176b8176665953dc7Guido van Rossumdef deltree(fname):
790263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    if not os.path.exists(fname):
800263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        return
810263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    for f in os.listdir(fname):
820263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        fullname = os.path.join(fname, f)
830263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        if os.path.isdir(fullname):
840263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum            deltree(fullname)
850263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        else:
860263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum            try:
870263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                os.unlink(fullname)
880263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum            except:
890263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                pass
900263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    try:
910263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        os.rmdir(fname)
920263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    except:
930263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        pass
940263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
950263c80b90e9abb312601bc176b8176665953dc7Guido van Rossumclass MhlibTests(unittest.TestCase):
960263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    def setUp(self):
970263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        deltree(_mhroot)
980263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        mkdirs(_mhpath)
99ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters        writeProfile({'Path' : os.path.abspath(_mhpath),
1000263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                      'Editor': 'emacs',
1010263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                      'ignored-attribute': 'camping holiday'})
1020263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        # Note: These headers aren't really conformant to RFC822, but
1030263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        #  mhlib shouldn't care about that.
1040263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
1050263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        # An inbox with a couple of messages.
106ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters        writeMessage('inbox', 1,
1070263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                     {'From': 'Mrs. Premise',
1080263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                      'To': 'Mrs. Conclusion',
1090263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                      'Date': '18 July 2001'}, "Hullo, Mrs. Conclusion!\n")
110ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters        writeMessage('inbox', 2,
1110263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                     {'From': 'Mrs. Conclusion',
1120263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                      'To': 'Mrs. Premise',
1130263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                      'Date': '29 July 2001'}, "Hullo, Mrs. Premise!\n")
114ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
1150263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        # A folder with many messages
1160263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        for i in range(5, 101)+range(101, 201, 2):
117ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters            writeMessage('wide', i,
1180263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                         {'From': 'nowhere', 'Subject': 'message #%s' % i},
1190263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                         "This is message number %s\n" % i)
120ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
1210263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        # A deeply nested folder
1220263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        def deep(folder, n):
123ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters            writeMessage(folder, n,
1240263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                         {'Subject': 'Message %s/%s' % (folder, n) },
1250263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                         "This is message number %s in %s\n" % (n, folder) )
1260263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        deep('deep/f1', 1)
1270263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        deep('deep/f1', 2)
1280263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        deep('deep/f1', 3)
1290263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        deep('deep/f2', 4)
1300263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        deep('deep/f2', 6)
1310263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        deep('deep', 3)
1320263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        deep('deep/f2/f3', 1)
1330263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        deep('deep/f2/f3', 2)
134ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
1350263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    def tearDown(self):
1360263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        deltree(_mhroot)
137ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
1380263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    def test_basic(self):
1390263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        writeContext('inbox')
1400263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        writeCurMessage('inbox', 2)
1410263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        mh = getMH()
1420263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
1430263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq = self.assertEquals
1440263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(mh.getprofile('Editor'), 'emacs')
1450263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(mh.getprofile('not-set'), None)
1460263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(mh.getpath(), os.path.abspath(_mhpath))
1470263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(mh.getcontext(), 'inbox')
1480263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
1490263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        mh.setcontext('wide')
1500263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(mh.getcontext(), 'wide')
1510263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(readFile(os.path.join(_mhpath, 'context')),
1520263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum           "Current-Folder: wide\n")
1530263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
1540263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        mh.setcontext('inbox')
1550263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
1560263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        inbox = mh.openfolder('inbox')
157ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters        eq(inbox.getfullname(),
1580263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum           os.path.join(os.path.abspath(_mhpath), 'inbox'))
159ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters        eq(inbox.getsequencesfilename(),
1600263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum           os.path.join(os.path.abspath(_mhpath), 'inbox', '.mh_sequences'))
161ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters        eq(inbox.getmessagefilename(1),
1620263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum           os.path.join(os.path.abspath(_mhpath), 'inbox', '1'))
163ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
1640263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    def test_listfolders(self):
1650263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        mh = getMH()
1660263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq = self.assertEquals
1670263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
1680263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        folders = mh.listfolders()
1690263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        folders.sort()
1700263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(folders, ['deep', 'inbox', 'wide'])
171ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
1720263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        folders = mh.listallfolders()
1730263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        folders.sort()
1740263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(folders, map(normF, ['deep', 'deep/f1', 'deep/f2', 'deep/f2/f3',
1750263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                                'inbox', 'wide']))
1760263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
1770263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        folders = mh.listsubfolders('deep')
1780263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        folders.sort()
1790263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(folders, map(normF, ['deep/f1', 'deep/f2']))
180ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
1810263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        folders = mh.listallsubfolders('deep')
1820263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        folders.sort()
1830263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(folders, map(normF, ['deep/f1', 'deep/f2', 'deep/f2/f3']))
1840263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(mh.listsubfolders(normF('deep/f2')), [normF('deep/f2/f3')])
1850263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
1860263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(mh.listsubfolders('inbox'), [])
1870263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(mh.listallsubfolders('inbox'), [])
1880263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
1890263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    def test_sequence(self):
1900263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        mh = getMH()
1910263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq = self.assertEquals
1920263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        writeCurMessage('wide', 55)
193ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
1940263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        f = mh.openfolder('wide')
1950263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        all = f.listmessages()
1960263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(all, range(5, 101)+range(101, 201, 2))
1970263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(f.getcurrent(), 55)
1980263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        f.setcurrent(99)
199ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters        eq(readFile(os.path.join(_mhpath, 'wide', '.mh_sequences')),
2000263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum           'cur: 99\n')
2010263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
2020263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        def seqeq(seq, val):
2030263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum            eq(f.parsesequence(seq), val)
204ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
2050263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqeq('5-55', range(5, 56))
2060263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqeq('90-108', range(90, 101)+range(101, 109, 2))
2070263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqeq('90-108', range(90, 101)+range(101, 109, 2))
208ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
2090263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqeq('10:10', range(10, 20))
2100263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqeq('10:+10', range(10, 20))
2110263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqeq('101:10', range(101, 121, 2))
2120263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
2130263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqeq('cur', [99])
2140263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqeq('.', [99])
2150263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqeq('prev', [98])
2160263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqeq('next', [100])
2170263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqeq('cur:-3', [97, 98, 99])
2180263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqeq('first-cur', range(5, 100))
2190263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqeq('150-last', range(151, 201, 2))
2200263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqeq('prev-next', [98, 99, 100])
2210263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
2220263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        lowprimes = [5, 7, 11, 13, 17, 19, 23, 29]
2230263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        lowcompos = [x for x in range(5, 31) if not x in lowprimes ]
2240263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        f.putsequences({'cur': [5],
2250263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                        'lowprime': lowprimes,
2260263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                        'lowcompos': lowcompos})
2270263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqs = readFile(os.path.join(_mhpath, 'wide', '.mh_sequences'))
2280263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqs = sortLines(seqs)
2290263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(seqs, ["cur: 5",
2300263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                  "lowcompos: 6 8-10 12 14-16 18 20-22 24-28 30",
2310263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                  "lowprime: 5 7 11 13 17 19 23 29"])
2320263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
2330263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqeq('lowprime', lowprimes)
2340263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqeq('lowprime:1', [5])
2350263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqeq('lowprime:2', [5, 7])
2360263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        seqeq('lowprime:-2', [23, 29])
2370263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
2380263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        ## Not supported
2390263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        #seqeq('lowprime:first', [5])
2400263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        #seqeq('lowprime:last', [29])
2410263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        #seqeq('lowprime:prev', [29])
2420263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        #seqeq('lowprime:next', [29])
2430263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
2440263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    def test_modify(self):
2450263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        mh = getMH()
2460263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq = self.assertEquals
2470263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
2480263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        mh.makefolder("dummy1")
2490263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        self.assert_("dummy1" in mh.listfolders())
2500263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        path = os.path.join(_mhpath, "dummy1")
2510263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        self.assert_(os.path.exists(path))
252ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
2530263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        f = mh.openfolder('dummy1')
2540263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        def create(n):
2550263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum            msg = "From: foo\nSubject: %s\n\nDummy Message %s\n" % (n,n)
2560263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum            f.createmessage(n, StringIO.StringIO(msg))
2570263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
2580263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        create(7)
2590263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        create(8)
2600263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        create(9)
261ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
2620263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(readFile(f.getmessagefilename(9)),
2630263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum           "From: foo\nSubject: 9\n\nDummy Message 9\n")
2640263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
2650263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(f.listmessages(), [7, 8, 9])
2660263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        files = os.listdir(path)
2670263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        files.sort()
268ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters        eq(files, ['7', '8', '9'])
2690263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
2700263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        f.removemessages(['7', '8'])
2710263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        files = os.listdir(path)
2720263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        files.sort()
2730263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(files, [',7', ',8', '9'])
2740263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(f.listmessages(), [9])
2750263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        create(10)
2760263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        create(11)
2770263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        create(12)
278ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
2790263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        mh.makefolder("dummy2")
2800263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        f2 = mh.openfolder("dummy2")
2810263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(f2.listmessages(), [])
2820263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        f.movemessage(10, f2, 3)
2830263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        f.movemessage(11, f2, 5)
2840263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(f.listmessages(), [9, 12])
2850263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(f2.listmessages(), [3, 5])
2860263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(readFile(f2.getmessagefilename(3)),
2870263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum           "From: foo\nSubject: 10\n\nDummy Message 10\n")
288ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
2890263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        f.copymessage(9, f2, 4)
2900263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(f.listmessages(), [9, 12])
2910263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(readFile(f2.getmessagefilename(4)),
2920263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum           "From: foo\nSubject: 9\n\nDummy Message 9\n")
293ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
2940263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        f.refilemessages([9, 12], f2)
2950263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(f.listmessages(), [])
2960263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(f2.listmessages(), [3, 4, 5, 6, 7])
2970263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(readFile(f2.getmessagefilename(7)),
2980263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum           "From: foo\nSubject: 12\n\nDummy Message 12\n")
2990263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        # XXX This should check that _copysequences does the right thing.
3000263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
3010263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        mh.deletefolder('dummy1')
3020263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        mh.deletefolder('dummy2')
3030263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        self.assert_('dummy1' not in mh.listfolders())
3040263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        self.assert_(not os.path.exists(path))
3050263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
3060263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum    def test_read(self):
3070263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        mh = getMH()
3080263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq = self.assertEquals
309ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
3100263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        f = mh.openfolder('inbox')
3110263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        msg = f.openmessage(1)
3120263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        # Check some basic stuff from rfc822
3130263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(msg.getheader('From'), "Mrs. Premise")
3140263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(msg.getheader('To'), "Mrs. Conclusion")
3150263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
3160263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        # Okay, we have the right message.  Let's check the stuff from
3170263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        # mhlib.
3180263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        lines = sortLines(msg.getheadertext())
319ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters        eq(lines, ["Date: 18 July 2001",
3200263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                   "From: Mrs. Premise",
3210263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                   "To: Mrs. Conclusion"])
3220263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        lines = sortLines(msg.getheadertext(lambda h: len(h)==4))
323ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters        eq(lines, ["Date: 18 July 2001",
3240263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum                   "From: Mrs. Premise"])
3250263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(msg.getbodytext(), "Hullo, Mrs. Conclusion!\n\n")
3260263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        eq(msg.getbodytext(0), "Hullo, Mrs. Conclusion!\n\n")
327ab9ba27dc066adc6423ea137b9481cf524d10ffdTim Peters
3280263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        # XXXX there should be a better way to reclaim the file handle
3290263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        msg.fp.close()
3300263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum        del msg
3310263c80b90e9abb312601bc176b8176665953dc7Guido van Rossum
3320263c80b90e9abb312601bc176b8176665953dc7Guido van Rossumrun_unittest(MhlibTests)
333