summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_email/test_pickleable.py
blob: 3a5bd11ffc20b135d5511d933a5e0011466746c6 (plain)
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
import unittest
import textwrap
import copy
import pickle
import email
import email.message
from email import policy
from email.headerregistry import HeaderRegistry
from test.test_email import TestEmailBase

class TestPickleCopyHeader(TestEmailBase):

    header_factory = HeaderRegistry()

    unstructured = header_factory('subject', 'this is a test')

    def _test_deepcopy(self, name, value):
        header = self.header_factory(name, value)
        h = copy.deepcopy(header)
        self.assertEqual(str(h), str(header))

    def _test_pickle(self, name, value):
        header = self.header_factory(name, value)
        p = pickle.dumps(header)
        h = pickle.loads(p)
        self.assertEqual(str(h), str(header))

    headers = (
        ('subject', 'this is a test'),
        ('from',    'frodo@mordor.net'),
        ('to',      'a: k@b.com, y@z.com;, j@f.com'),
        ('date',    'Tue, 29 May 2012 09:24:26 +1000'),
        )

    for header in headers:
        locals()['test_deepcopy_'+header[0]] = (
            lambda self, header=header:
                self._test_deepcopy(*header))

    for header in headers:
        locals()['test_pickle_'+header[0]] = (
            lambda self, header=header:
                self._test_pickle(*header))


class TestPickleCopyMessage(TestEmailBase):

    msgs = {}

    # Note: there will be no custom header objects in the parsed message.
    msgs['parsed'] = email.message_from_string(textwrap.dedent("""\
        Date: Tue, 29 May 2012 09:24:26 +1000
        From: frodo@mordor.net
        To: bilbo@underhill.org
        Subject: help

        I think I forgot the ring.
        """), policy=policy.default)

    msgs['created'] = email.message.Message(policy=policy.default)
    msgs['created']['Date'] = 'Tue, 29 May 2012 09:24:26 +1000'
    msgs['created']['From'] = 'frodo@mordor.net'
    msgs['created']['To'] = 'bilbo@underhill.org'
    msgs['created']['Subject'] = 'help'
    msgs['created'].set_payload('I think I forgot the ring.')

    def _test_deepcopy(self, msg):
        msg2 = copy.deepcopy(msg)
        self.assertEqual(msg2.as_string(), msg.as_string())

    def _test_pickle(self, msg):
        p = pickle.dumps(msg)
        msg2 = pickle.loads(p)
        self.assertEqual(msg2.as_string(), msg.as_string())

    for name, msg in msgs.items():
        locals()['test_deepcopy_'+name] = (
            lambda self, msg=msg:
                self._test_deepcopy(msg))

    for name, msg in msgs.items():
        locals()['test_pickle_'+name] = (
            lambda self, msg=msg:
                self._test_pickle(msg))


if __name__ == '__main__':
    unittest.main()