/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_email_message.py

  • Committer: Vincent Ladeuil
  • Date: 2012-01-18 14:09:19 UTC
  • mto: This revision was merged to the branch mainline in revision 6468.
  • Revision ID: v.ladeuil+lp@free.fr-20120118140919-rlvdrhpc0nq1lbwi
Change set/remove to require a lock for the branch config files.

This means that tests (or any plugin for that matter) do not requires an
explicit lock on the branch anymore to change a single option. This also
means the optimisation becomes "opt-in" and as such won't be as
spectacular as it may be and/or harder to get right (nothing fails
anymore).

This reduces the diff by ~300 lines.

Code/tests that were updating more than one config option is still taking
a lock to at least avoid some IOs and demonstrate the benefits through
the decreased number of hpss calls.

The duplication between BranchStack and BranchOnlyStack will be removed
once the same sharing is in place for local config files, at which point
the Stack class itself may be able to host the changes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
 
import sys
18
17
from email.Header import decode_header
19
18
 
20
19
from bzrlib import __version__ as _bzrlib_version
21
20
from bzrlib.email_message import EmailMessage
22
21
from bzrlib.errors import BzrBadParameterNotUnicode
23
22
from bzrlib.smtp_connection import SMTPConnection
24
 
from bzrlib import tests
 
23
from bzrlib.tests import TestCase
25
24
 
26
25
EMPTY_MESSAGE = '''\
27
26
From: from@from.com
66
65
body
67
66
''' %  { 'version': _bzrlib_version, 'boundary': BOUNDARY }
68
67
 
69
 
 
70
 
def final_newline_or_not(msg):
71
 
    if sys.version_info >= (2, 7, 6):
72
 
        # Some internals of python's email module changed in an (minor)
73
 
        # incompatible way: a final newline is appended in 2.7.6...
74
 
       msg += '\n'
75
 
    return msg
76
 
 
77
 
 
78
 
def simple_multipart_message():
79
 
    msg = _MULTIPART_HEAD + '--%s--' % BOUNDARY
80
 
    return final_newline_or_not(msg)
81
 
 
82
 
 
83
 
def complex_multipart_message(typ):
84
 
    msg = _MULTIPART_HEAD + '''\
 
68
SIMPLE_MULTIPART_MESSAGE = _MULTIPART_HEAD + '--%s--' % BOUNDARY
 
69
 
 
70
COMPLEX_MULTIPART_MESSAGE = _MULTIPART_HEAD + '''\
85
71
--%(boundary)s
86
72
MIME-Version: 1.0
87
73
Content-Type: text/%%s; charset="us-ascii"; name="lines.txt"
95
81
e
96
82
 
97
83
--%(boundary)s--''' %  { 'boundary': BOUNDARY }
98
 
    msg = final_newline_or_not(msg)
99
 
    return msg % (typ,)
100
 
 
101
 
 
102
 
class TestEmailMessage(tests.TestCase):
 
84
 
 
85
 
 
86
class TestEmailMessage(TestCase):
103
87
 
104
88
    def test_empty_message(self):
105
89
        msg = EmailMessage('from@from.com', 'to@to.com', 'subject')
116
100
            msg = EmailMessage('from@from.com', 'to@to.com', 'subject', body)
117
101
            self.assertEqualDiff(expected, msg.as_string())
118
102
 
119
 
    def test_multipart_message_simple(self):
 
103
    def test_multipart_message(self):
120
104
        msg = EmailMessage('from@from.com', 'to@to.com', 'subject')
121
105
        msg.add_inline_attachment('body')
122
 
        self.assertEqualDiff(simple_multipart_message(),
123
 
                             msg.as_string(BOUNDARY))
124
 
 
125
 
 
126
 
    def test_multipart_message_complex(self):
 
106
        self.assertEqualDiff(SIMPLE_MULTIPART_MESSAGE, msg.as_string(BOUNDARY))
 
107
 
127
108
        msg = EmailMessage('from@from.com', 'to@to.com', 'subject', 'body')
128
109
        msg.add_inline_attachment(u'a\nb\nc\nd\ne\n', 'lines.txt', 'x-subtype')
129
 
        self.assertEqualDiff(complex_multipart_message('x-subtype'),
130
 
                             msg.as_string(BOUNDARY))
 
110
        self.assertEqualDiff(COMPLEX_MULTIPART_MESSAGE % 'x-subtype',
 
111
                msg.as_string(BOUNDARY))
131
112
 
132
113
    def test_headers_accept_unicode_and_utf8(self):
133
114
        for user in [ u'Pepe P\xe9rez <pperez@ejemplo.com>',
167
148
        self.assertEqual('to2@to.com', msg['To'])
168
149
        self.assertEqual('cc@cc.com', msg['Cc'])
169
150
 
 
151
    def test_send(self):
 
152
        class FakeConfig:
 
153
            def get(self, option):
 
154
                return None
 
155
 
 
156
        messages = []
 
157
 
 
158
        def send_as_append(_self, msg):
 
159
            messages.append(msg.as_string(BOUNDARY))
 
160
 
 
161
        old_send_email = SMTPConnection.send_email
 
162
        try:
 
163
            SMTPConnection.send_email = send_as_append
 
164
 
 
165
            EmailMessage.send(FakeConfig(), 'from@from.com', 'to@to.com',
 
166
                    'subject', 'body', u'a\nb\nc\nd\ne\n', 'lines.txt')
 
167
            self.assertEqualDiff(COMPLEX_MULTIPART_MESSAGE % 'plain',
 
168
                    messages[0])
 
169
            messages[:] = []
 
170
 
 
171
            EmailMessage.send(FakeConfig(), 'from@from.com', 'to@to.com',
 
172
                    'subject', 'body', u'a\nb\nc\nd\ne\n', 'lines.txt',
 
173
                    'x-patch')
 
174
            self.assertEqualDiff(COMPLEX_MULTIPART_MESSAGE % 'x-patch',
 
175
                    messages[0])
 
176
            messages[:] = []
 
177
 
 
178
            EmailMessage.send(FakeConfig(), 'from@from.com', 'to@to.com',
 
179
                    'subject', 'body')
 
180
            self.assertEqualDiff(SIMPLE_MESSAGE_ASCII , messages[0])
 
181
            messages[:] = []
 
182
        finally:
 
183
            SMTPConnection.send_email = old_send_email
 
184
 
170
185
    def test_address_to_encoded_header(self):
171
186
        def decode(s):
172
187
            """Convert a RFC2047-encoded string to a unicode string."""
209
224
        }
210
225
        for string_, pair in pairs.items():
211
226
            self.assertEqual(pair, EmailMessage.string_with_encoding(string_))
212
 
 
213
 
 
214
 
class TestSend(tests.TestCase):
215
 
 
216
 
    def setUp(self):
217
 
        super(TestSend, self).setUp()
218
 
        self.messages = []
219
 
 
220
 
        def send_as_append(_self, msg):
221
 
            self.messages.append(msg.as_string(BOUNDARY))
222
 
 
223
 
        self.overrideAttr(SMTPConnection, 'send_email', send_as_append)
224
 
 
225
 
 
226
 
 
227
 
    def send_email(self, attachment=None, attachment_filename=None,
228
 
                   attachment_mime_subtype='plain'):
229
 
        class FakeConfig:
230
 
            def get(self, option):
231
 
                return None
232
 
 
233
 
        EmailMessage.send(FakeConfig(), 'from@from.com', 'to@to.com',
234
 
                          'subject', 'body',
235
 
                          attachment=attachment,
236
 
                          attachment_filename=attachment_filename,
237
 
                          attachment_mime_subtype=attachment_mime_subtype)
238
 
 
239
 
    def assertMessage(self, expected):
240
 
        self.assertLength(1, self.messages)
241
 
        self.assertEqualDiff(expected, self.messages[0])
242
 
 
243
 
    def test_send_plain(self):
244
 
        self.send_email(u'a\nb\nc\nd\ne\n', 'lines.txt')
245
 
        self.assertMessage(complex_multipart_message('plain'))
246
 
 
247
 
    def test_send_patch(self):
248
 
        self.send_email(u'a\nb\nc\nd\ne\n', 'lines.txt', 'x-patch')
249
 
        self.assertMessage(complex_multipart_message('x-patch'))
250
 
 
251
 
    def test_send_simple(self):
252
 
          self.send_email()
253
 
          self.assertMessage(SIMPLE_MESSAGE_ASCII)
254