65
65
Content-Disposition: inline
68
''' % { 'version': _breezy_version, 'boundary': BOUNDARY }
68
''' % {'version': _breezy_version, 'boundary': BOUNDARY}
71
71
def final_newline_or_not(msg):
72
72
if sys.version_info >= (2, 7, 6):
73
73
# Some internals of python's email module changed in an (minor)
74
74
# incompatible way: a final newline is appended in 2.7.6...
123
123
self.assertEqualDiff(simple_multipart_message(),
124
124
msg.as_string(BOUNDARY))
127
126
def test_multipart_message_complex(self):
128
127
msg = EmailMessage('from@from.com', 'to@to.com', 'subject', 'body')
129
128
msg.add_inline_attachment(u'a\nb\nc\nd\ne\n', 'lines.txt', 'x-subtype')
131
130
msg.as_string(BOUNDARY))
133
132
def test_headers_accept_unicode_and_utf8(self):
134
for user in [ u'Pepe P\xe9rez <pperez@ejemplo.com>',
135
'Pepe P\xc3\xa9red <pperez@ejemplo.com>' ]:
136
msg = EmailMessage(user, user, user) # no exception raised
133
for user in [u'Pepe P\xe9rez <pperez@ejemplo.com>',
134
'Pepe P\xc3\xa9red <pperez@ejemplo.com>']:
135
msg = EmailMessage(user, user, user) # no exception raised
138
137
for header in ['From', 'To', 'Subject']:
139
138
value = msg[header]
140
value.encode('ascii') # no UnicodeDecodeError
139
value.encode('ascii') # no UnicodeDecodeError
142
141
def test_headers_reject_8bit(self):
143
for i in range(3): # from_address, to_address, subject
144
x = [ b'"J. Random Developer" <jrandom@example.com>' ] * 3
142
for i in range(3): # from_address, to_address, subject
143
x = [b'"J. Random Developer" <jrandom@example.com>'] * 3
145
144
x[i] = b'Pepe P\xe9rez <pperez@ejemplo.com>'
146
145
self.assertRaises(BzrBadParameterNotUnicode, EmailMessage, *x)
148
147
def test_multiple_destinations(self):
149
to_addresses = [ 'to1@to.com', 'to2@to.com', 'to3@to.com' ]
148
to_addresses = ['to1@to.com', 'to2@to.com', 'to3@to.com']
150
149
msg = EmailMessage('from@from.com', to_addresses, 'subject')
151
self.assertContainsRe(msg.as_string(), 'To: ' +
152
', '.join(to_addresses)) # re.M can't be passed, so no ^$
150
self.assertContainsRe(msg.as_string(), 'To: '
151
+ ', '.join(to_addresses)) # re.M can't be passed, so no ^$
154
153
def test_retrieving_headers(self):
155
154
msg = EmailMessage('from@from.com', 'to@to.com', 'subject')
156
155
for header, value in [('From', 'from@from.com'), ('To', 'to@to.com'),
157
('Subject', 'subject')]:
156
('Subject', 'subject')]:
158
157
self.assertEqual(value, msg.get(header))
159
158
self.assertEqual(value, msg[header])
160
159
self.assertEqual(None, msg.get('Does-Not-Exist'))
192
191
encoded = EmailMessage.address_to_encoded_header(address)
193
192
self.assertEqual(address, encoded)
195
address = u'Pepe P\xe9rez <pperez@ejemplo.com>' # unicode ok
194
address = u'Pepe P\xe9rez <pperez@ejemplo.com>' # unicode ok
196
195
encoded = EmailMessage.address_to_encoded_header(address)
197
self.assertTrue('pperez@ejemplo.com' in encoded) # addr must be unencoded
196
# addr must be unencoded
197
self.assertTrue('pperez@ejemplo.com' in encoded)
198
198
self.assertEqual(address, decode(encoded))
200
address = b'Pepe P\xe9rez <pperez@ejemplo.com>' # ISO-8859-1 not ok
200
address = b'Pepe P\xe9rez <pperez@ejemplo.com>' # ISO-8859-1 not ok
201
201
self.assertRaises(BzrBadParameterNotUnicode,
202
EmailMessage.address_to_encoded_header, address)
202
EmailMessage.address_to_encoded_header, address)
204
204
def test_string_with_encoding(self):
206
u'Pepe': (b'Pepe', 'ascii'),
207
u'P\xe9rez': (b'P\xc3\xa9rez', 'utf-8'),
208
b'P\xc3\xa9rez': (b'P\xc3\xa9rez', 'utf-8'),
209
b'P\xe8rez': (b'P\xe8rez', '8-bit'),
206
u'Pepe': (b'Pepe', 'ascii'),
207
u'P\xe9rez': (b'P\xc3\xa9rez', 'utf-8'),
208
b'P\xc3\xa9rez': (b'P\xc3\xa9rez', 'utf-8'),
209
b'P\xe8rez': (b'P\xe8rez', '8-bit'),
211
211
for string_, pair in pairs.items():
212
212
self.assertEqual(pair, EmailMessage.string_with_encoding(string_))