message objects are a sequence so we have to make them a onetuple in msgparams so they get passed to the parameterized test method as a single argument instead of as a list of headers note there will be no custom header objects in the parsed message policypolicy default msgparams created email message messagepolicypolicy default msgparams created 0 date tue 29 may 2012 09 24 26 1000 msgparams created 0 from frodomordor net msgparams created 0 to bilbounderhill org msgparams created 0 subject help msgparams created 0 setpayload i think i forgot the ring def msgasdeepcopyself msg msg2 copy deepcopymsg self assertequalmsg2 asstring msg asstring def msgaspickleself msg for proto in rangepickle highestprotocol 1 p pickle dumpsmsg proto msg2 pickle loadsp self assertequalmsg2 asstring msg asstring if name main unittest main message objects are a sequence so we have to make them a one tuple in msg_params so they get passed to the parameterized test method as a single argument instead of as a list of headers note there will be no custom header objects in the parsed message 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
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, parameterize


@parameterize
class TestPickleCopyHeader(TestEmailBase):

    header_factory = HeaderRegistry()

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

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

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

    def header_as_pickle(self, name, value):
        header = self.header_factory(name, value)
        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
            p = pickle.dumps(header, proto)
            h = pickle.loads(p)
            self.assertEqual(str(h), str(header))


@parameterize
class TestPickleCopyMessage(TestEmailBase):

    
    
    
    msg_params = {}

    
    msg_params['parsed'] = (email.message_from_string(textwrap.dedent(), policy=policy.default),)

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

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

    def msg_as_pickle(self, msg):
        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
            p = pickle.dumps(msg, proto)
            msg2 = pickle.loads(p)
            self.assertEqual(msg2.as_string(), msg.as_string())


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