1 # This set of tests exercises the backward-compatibility class 2 # in mailbox.py (the ones without write support). 3 4 import mailbox 5 import os 6 import time 7 import unittest 8 from test import test_support 9 10 # cleanup earlier tests 11 try: 12 os.unlink(test_support.TESTFN) 13 except os.error: 14 pass 15 16 FROM_ = "From some.body (at] dummy.domain Sat Jul 24 13:43:35 2004\n" 17 DUMMY_MESSAGE = """\ 18 From: some.body (at] dummy.domain 19 To: me (at] my.domain 20 Subject: Simple Test 21 22 This is a dummy message. 23 """ 24 25 class MaildirTestCase(unittest.TestCase): 26 27 def setUp(self): 28 # create a new maildir mailbox to work with: 29 self._dir = test_support.TESTFN 30 os.mkdir(self._dir) 31 os.mkdir(os.path.join(self._dir, "cur")) 32 os.mkdir(os.path.join(self._dir, "tmp")) 33 os.mkdir(os.path.join(self._dir, "new")) 34 self._counter = 1 35 self._msgfiles = [] 36 37 def tearDown(self): 38 map(os.unlink, self._msgfiles) 39 os.rmdir(os.path.join(self._dir, "cur")) 40 os.rmdir(os.path.join(self._dir, "tmp")) 41 os.rmdir(os.path.join(self._dir, "new")) 42 os.rmdir(self._dir) 43 44 def createMessage(self, dir, mbox=False): 45 t = int(time.time() % 1000000) 46 pid = self._counter 47 self._counter += 1 48 filename = os.extsep.join((str(t), str(pid), "myhostname", "mydomain")) 49 tmpname = os.path.join(self._dir, "tmp", filename) 50 newname = os.path.join(self._dir, dir, filename) 51 with open(tmpname, "w") as fp: 52 self._msgfiles.append(tmpname) 53 if mbox: 54 fp.write(FROM_) 55 fp.write(DUMMY_MESSAGE) 56 if hasattr(os, "link"): 57 os.link(tmpname, newname) 58 else: 59 with open(newname, "w") as fp: 60 fp.write(DUMMY_MESSAGE) 61 self._msgfiles.append(newname) 62 return tmpname 63 64 def test_empty_maildir(self): 65 """Test an empty maildir mailbox""" 66 # Test for regression on bug #117490: 67 self.mbox = mailbox.Maildir(test_support.TESTFN) 68 self.assertTrue(len(self.mbox) == 0) 69 self.assertTrue(self.mbox.next() is None) 70 self.assertTrue(self.mbox.next() is None) 71 72 def test_nonempty_maildir_cur(self): 73 self.createMessage("cur") 74 self.mbox = mailbox.Maildir(test_support.TESTFN) 75 self.assertTrue(len(self.mbox) == 1) 76 self.assertTrue(self.mbox.next() is not None) 77 self.assertTrue(self.mbox.next() is None) 78 self.assertTrue(self.mbox.next() is None) 79 80 def test_nonempty_maildir_new(self): 81 self.createMessage("new") 82 self.mbox = mailbox.Maildir(test_support.TESTFN) 83 self.assertTrue(len(self.mbox) == 1) 84 self.assertTrue(self.mbox.next() is not None) 85 self.assertTrue(self.mbox.next() is None) 86 self.assertTrue(self.mbox.next() is None) 87 88 def test_nonempty_maildir_both(self): 89 self.createMessage("cur") 90 self.createMessage("new") 91 self.mbox = mailbox.Maildir(test_support.TESTFN) 92 self.assertTrue(len(self.mbox) == 2) 93 self.assertTrue(self.mbox.next() is not None) 94 self.assertTrue(self.mbox.next() is not None) 95 self.assertTrue(self.mbox.next() is None) 96 self.assertTrue(self.mbox.next() is None) 97 98 def test_unix_mbox(self): 99 ### should be better! 100 import email.parser 101 fname = self.createMessage("cur", True) 102 n = 0 103 with open(fname) as f: 104 for msg in mailbox.PortableUnixMailbox(f, 105 email.parser.Parser().parse): 106 n += 1 107 self.assertEqual(msg["subject"], "Simple Test") 108 self.assertEqual(len(str(msg)), len(FROM_)+len(DUMMY_MESSAGE)) 109 self.assertEqual(n, 1) 110 111 class MboxTestCase(unittest.TestCase): 112 def setUp(self): 113 # create a new maildir mailbox to work with: 114 self._path = test_support.TESTFN 115 116 def tearDown(self): 117 os.unlink(self._path) 118 119 def test_from_regex (self): 120 # Testing new regex from bug #1633678 121 with open(self._path, 'w') as f: 122 f.write("""From fred (at] example.com Mon May 31 13:24:50 2004 +0200 123 Subject: message 1 124 125 body1 126 From fred (at] example.com Mon May 31 13:24:50 2004 -0200 127 Subject: message 2 128 129 body2 130 From fred (at] example.com Mon May 31 13:24:50 2004 131 Subject: message 3 132 133 body3 134 From fred (at] example.com Mon May 31 13:24:50 2004 135 Subject: message 4 136 137 body4 138 """) 139 with open(self._path, 'r') as f: 140 box = mailbox.UnixMailbox(f) 141 self.assertTrue(len(list(iter(box))) == 4) 142 143 144 # XXX We still need more tests! 145 146 147 def test_main(): 148 test_support.run_unittest(MaildirTestCase, MboxTestCase) 149 150 151 if __name__ == "__main__": 152 test_main() 153