6
6
from cStringIO import StringIO
7
from email.Message import Message
8
from email.MIMEMultipart import MIMEMultipart
9
from email.MIMEText import MIMEText
10
from email.Utils import (
7
from email.header import Header
8
from email.message import Message
9
from email.mime.multipart import MIMEMultipart
10
from email.mime.text import MIMEText
11
from email.utils import (
16
16
from sqlobject import SQLObjectNotFound
30
30
from lp.services.job.model.job import Job
31
31
from lp.services.mail.sendmail import MailController
32
from lp.testing import TestCaseWithFactory
32
from lp.testing import (
33
36
from lp.testing.factory import LaunchpadObjectFactory
36
class TestMessageSet(unittest.TestCase):
39
class TestMessageSet(TestCase):
37
40
"""Test the methods of `MessageSet`."""
39
42
layer = LaunchpadFunctionalLayer
44
high_characters = ''.join(chr(c) for c in range(128, 256))
42
unittest.TestCase.setUp(self)
47
super(TestMessageSet, self).setUp()
43
48
# Testing behavior, not permissions here.
44
49
login('foo.bar@canonical.com')
45
50
self.factory = LaunchpadObjectFactory()
149
154
dupe_message = MessageSet().fromEmail(email.as_string())
150
155
self.assertNotEqual(orig_message.id, dupe_message.id)
157
def makeEncodedEmail(self, encoding_name, actual_encoding):
158
email = self.factory.makeEmailMessage(body=self.high_characters)
159
email.set_type('text/plain')
160
email.set_charset(encoding_name)
161
macroman = Header(self.high_characters, actual_encoding).encode()
162
new_subject = macroman.replace(actual_encoding, encoding_name)
163
email.replace_header('Subject', new_subject)
166
def test_fromEmail_decodes_macintosh_encoding(self):
167
""""macintosh encoding is equivalent to MacRoman."""
168
high_decoded = self.high_characters.decode('macroman')
169
email = self.makeEncodedEmail('macintosh', 'macroman')
170
message = MessageSet().fromEmail(email.as_string())
171
self.assertEqual(high_decoded, message.subject)
172
self.assertEqual(high_decoded, message.text_contents)
174
def test_fromEmail_decodes_booga_encoding(self):
175
""""'booga' encoding is decoded as latin-1."""
176
high_decoded = self.high_characters.decode('latin-1')
177
email = self.makeEncodedEmail('booga', 'latin-1')
178
message = MessageSet().fromEmail(email.as_string())
179
self.assertEqual(high_decoded, message.subject)
180
self.assertEqual(high_decoded, message.text_contents)
182
def test_decode_utf8(self):
183
"""Test decode with a known encoding."""
184
result = MessageSet.decode(u'\u1234'.encode('utf-8'), 'utf-8')
185
self.assertEqual(u'\u1234', result)
187
def test_decode_macintosh(self):
188
"""Test decode with macintosh encoding."""
189
result = MessageSet.decode(self.high_characters, 'macintosh')
190
self.assertEqual(self.high_characters.decode('macroman'), result)
192
def test_decode_unknown_ascii(self):
193
"""Test decode with ascii characters in an unknown encoding."""
194
result = MessageSet.decode('abcde', 'booga')
195
self.assertEqual(u'abcde', result)
197
def test_decode_unknown_high_characters(self):
198
"""Test decode with non-ascii characters in an unknown encoding."""
199
with self.expectedLog(
200
'Treating unknown encoding "booga" as latin-1.'):
201
result = MessageSet.decode(self.high_characters, 'booga')
202
self.assertEqual(self.high_characters.decode('latin-1'), result)
153
205
class TestMessageJob(TestCaseWithFactory):
154
206
"""Tests for MessageJob."""