1# This set of tests exercises the backward-compatibility class
2# in mailbox.py (the ones without write support).
3
4import mailbox
5import os
6import time
7import unittest
8from test import test_support
9
10# cleanup earlier tests
11try:
12    os.unlink(test_support.TESTFN)
13except os.error:
14    pass
15
16FROM_ = "From some.body@dummy.domain  Sat Jul 24 13:43:35 2004\n"
17DUMMY_MESSAGE = """\
18From: some.body@dummy.domain
19To: me@my.domain
20Subject: Simple Test
21
22This is a dummy message.
23"""
24
25class 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        msg = self.mbox.next()
77        self.assertTrue(msg is not None)
78        msg.fp.close()
79        self.assertTrue(self.mbox.next() is None)
80        self.assertTrue(self.mbox.next() is None)
81
82    def test_nonempty_maildir_new(self):
83        self.createMessage("new")
84        self.mbox = mailbox.Maildir(test_support.TESTFN)
85        self.assertTrue(len(self.mbox) == 1)
86        msg = self.mbox.next()
87        self.assertTrue(msg is not None)
88        msg.fp.close()
89        self.assertTrue(self.mbox.next() is None)
90        self.assertTrue(self.mbox.next() is None)
91
92    def test_nonempty_maildir_both(self):
93        self.createMessage("cur")
94        self.createMessage("new")
95        self.mbox = mailbox.Maildir(test_support.TESTFN)
96        self.assertTrue(len(self.mbox) == 2)
97        msg = self.mbox.next()
98        self.assertTrue(msg is not None)
99        msg.fp.close()
100        msg = self.mbox.next()
101        self.assertTrue(msg is not None)
102        msg.fp.close()
103        self.assertTrue(self.mbox.next() is None)
104        self.assertTrue(self.mbox.next() is None)
105
106    def test_unix_mbox(self):
107        ### should be better!
108        import email.parser
109        fname = self.createMessage("cur", True)
110        n = 0
111        with open(fname) as f:
112            for msg in mailbox.PortableUnixMailbox(f,
113                                               email.parser.Parser().parse):
114                n += 1
115                self.assertEqual(msg["subject"], "Simple Test")
116                self.assertEqual(len(str(msg)), len(FROM_)+len(DUMMY_MESSAGE))
117        self.assertEqual(n, 1)
118
119class MboxTestCase(unittest.TestCase):
120    def setUp(self):
121        # create a new maildir mailbox to work with:
122        self._path = test_support.TESTFN
123
124    def tearDown(self):
125        os.unlink(self._path)
126
127    def test_from_regex (self):
128        # Testing new regex from bug #1633678
129        with open(self._path, 'w') as f:
130            f.write("""From fred@example.com Mon May 31 13:24:50 2004 +0200
131Subject: message 1
132
133body1
134From fred@example.com Mon May 31 13:24:50 2004 -0200
135Subject: message 2
136
137body2
138From fred@example.com Mon May 31 13:24:50 2004
139Subject: message 3
140
141body3
142From fred@example.com Mon May 31 13:24:50 2004
143Subject: message 4
144
145body4
146""")
147        with open(self._path, 'r') as f:
148            box = mailbox.UnixMailbox(f)
149            self.assertTrue(len(list(iter(box))) == 4)
150
151
152    # XXX We still need more tests!
153
154
155def test_main():
156    test_support.run_unittest(MaildirTestCase, MboxTestCase)
157
158
159if __name__ == "__main__":
160    test_main()
161