/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.171.45 by Vincent Ladeuil
Fix test failures, _get_parser() is deprecated
1
# Copyright (C) 2005-2008, 2010 by Canonical Ltd
0.171.1 by Robert Collins
Start working toward publish - get a publishing_root option
2
#   Authors: Robert Collins <robert.collins@canonical.com>
3
#
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
18
from unittest import TestLoader
19
6649.1.1 by Jelmer Vernooij
Merge bzr-email plugin.
20
from .... import (
0.175.5 by John Arbash Meinel
Update the email process to give email addresses that work better with SMTP servers.
21
    config,
0.171.24 by John Arbash Meinel
Switch to using a local repository if available,
22
    tests,
0.175.5 by John Arbash Meinel
Update the email process to give email addresses that work better with SMTP servers.
23
    )
6670.4.1 by Jelmer Vernooij
Update imports.
24
from ....bzr.bzrdir import BzrDir
6649.1.1 by Jelmer Vernooij
Merge bzr-email plugin.
25
from ....tests import TestCaseInTempDir
26
from ..emailer import EmailSender
0.171.1 by Robert Collins
Start working toward publish - get a publishing_root option
27
28
29
def test_suite():
30
    return TestLoader().loadTestsFromName(__name__)
31
32
7027.3.3 by Jelmer Vernooij
Add some more bees; support writing both bytes and unicode strings in build_tree_contents.
33
sample_config=(b"[DEFAULT]\n"
34
               b"post_commit_to=demo@example.com\n"
35
               b"post_commit_sender=Sample <foo@example.com>\n"
36
               b"revision_mail_headers=X-Cheese: to the rescue!\n")
37
38
unconfigured_config=(b"[DEFAULT]\n"
39
                     b"email=Robert <foo@example.com>\n")
40
41
sender_configured_config=(b"[DEFAULT]\n"
42
                          b"post_commit_sender=Sample <foo@example.com>\n")
43
44
to_configured_config=(b"[DEFAULT]\n"
45
                      b"post_commit_to=Sample <foo@example.com>\n")
46
47
multiple_to_configured_config=(b"[DEFAULT]\n"
48
              b"post_commit_sender=Sender <from@example.com>\n"
49
              b"post_commit_to=Sample <foo@example.com>, Other <baz@bar.com>\n")
50
51
customized_mail_config=(b"[DEFAULT]\n"
52
                        b"post_commit_to=demo@example.com\n"
53
                        b"post_commit_sender=Sample <foo@example.com>\n"
54
                        b"post_commit_subject=[commit] $message\n"
55
                        b"post_commit_body='''$committer has committed "
56
                            b"revision 1 at $url.\n\n'''\n")
57
58
push_config=(b"[DEFAULT]\n"
59
    b"post_commit_to=demo@example.com\n"
60
    b"post_commit_push_pull=True\n")
61
62
with_url_config=(b"[DEFAULT]\n"
63
                 b"post_commit_url=http://some.fake/url/\n"
64
                 b"post_commit_to=demo@example.com\n"
65
                 b"post_commit_sender=Sample <foo@example.com>\n")
0.173.4 by Matthieu Moy
More tests
66
6649.1.1 by Jelmer Vernooij
Merge bzr-email plugin.
67
# FIXME: this should not use a literal log, rather grab one from breezy.log
0.186.2 by Renato Silva
Added tests for body and subject customizations.
68
sample_log=('------------------------------------------------------------\n'
0.171.4 by Robert Collins
basics are all there
69
            'revno: 1\n'
70
            'revision-id: A\n'
71
            'committer: Sample <john@example.com>\n'
0.171.13 by Robert Collins
0.11 compatability.
72
            'branch nick: work\n'
0.171.4 by Robert Collins
basics are all there
73
            'timestamp: Thu 1970-01-01 00:00:01 +0000\n'
74
            'message:\n'
75
            '  foo bar baz\n'
76
            '  fuzzy\n'
0.186.2 by Renato Silva
Added tests for body and subject customizations.
77
            '  wuzzy\n')
78
79
80
class TestGetTo(TestCaseInTempDir):
81
82
    def test_body(self):
0.171.51 by Jelmer Vernooij
Avoid double lookup of revision, remove some unnecessary whitespace.
83
        sender = self.get_sender()
84
        self.assertEqual('At %s\n\n%s' % (sender.url(), sample_log),
0.186.2 by Renato Silva
Added tests for body and subject customizations.
85
                         sender.body())
86
0.171.51 by Jelmer Vernooij
Avoid double lookup of revision, remove some unnecessary whitespace.
87
    def test_custom_body(self):
0.186.2 by Renato Silva
Added tests for body and subject customizations.
88
        sender = self.get_sender(customized_mail_config)
0.171.51 by Jelmer Vernooij
Avoid double lookup of revision, remove some unnecessary whitespace.
89
        self.assertEqual('%s has committed revision 1 at %s.\n\n%s' %
0.171.52 by Jelmer Vernooij
Fix test.
90
            (sender.revision.committer, sender.url(), sample_log),
91
             sender.body())
0.171.4 by Robert Collins
basics are all there
92
0.171.5 by Robert Collins
Working plugin!
93
    def test_command_line(self):
94
        sender = self.get_sender()
0.175.12 by John Arbash Meinel
Remove trailing whitespace.
95
        self.assertEqual(['mail', '-s', sender.subject(), '-a',
0.171.55 by Jelmer Vernooij
Use config stacks.
96
                          'From: ' + sender.from_address()] + sender.to(),
0.171.5 by Robert Collins
Working plugin!
97
                         sender._command_line())
98
0.171.3 by Robert Collins
convert the switch basics to an email plugin
99
    def test_to(self):
100
        sender = self.get_sender()
0.171.55 by Jelmer Vernooij
Use config stacks.
101
        self.assertEqual(['demo@example.com'], sender.to())
0.171.3 by Robert Collins
convert the switch basics to an email plugin
102
103
    def test_from(self):
104
        sender = self.get_sender()
105
        self.assertEqual('Sample <foo@example.com>', sender.from_address())
106
0.171.5 by Robert Collins
Working plugin!
107
    def test_from_default(self):
108
        sender = self.get_sender(unconfigured_config)
109
        self.assertEqual('Robert <foo@example.com>', sender.from_address())
110
0.171.3 by Robert Collins
convert the switch basics to an email plugin
111
    def test_should_send(self):
112
        sender = self.get_sender()
0.177.2 by Vincent Ladeuil
Fixed as per Robert's review.
113
        self.assertEqual(True, sender.should_send())
0.171.3 by Robert Collins
convert the switch basics to an email plugin
114
115
    def test_should_not_send(self):
0.171.5 by Robert Collins
Working plugin!
116
        sender = self.get_sender(unconfigured_config)
0.177.2 by Vincent Ladeuil
Fixed as per Robert's review.
117
        self.assertEqual(False, sender.should_send())
0.171.3 by Robert Collins
convert the switch basics to an email plugin
118
0.173.4 by Matthieu Moy
More tests
119
    def test_should_not_send_sender_configured(self):
120
        sender = self.get_sender(sender_configured_config)
0.177.2 by Vincent Ladeuil
Fixed as per Robert's review.
121
        self.assertEqual(False, sender.should_send())
0.173.4 by Matthieu Moy
More tests
122
123
    def test_should_not_send_to_configured(self):
124
        sender = self.get_sender(to_configured_config)
0.177.2 by Vincent Ladeuil
Fixed as per Robert's review.
125
        self.assertEqual(True, sender.should_send())
0.173.4 by Matthieu Moy
More tests
126
0.175.7 by John Arbash Meinel
split out SMTPConnection to its own file.
127
    def test_send_to_multiple(self):
128
        sender = self.get_sender(multiple_to_configured_config)
129
        self.assertEqual([u'Sample <foo@example.com>', u'Other <baz@bar.com>'],
130
                         sender.to())
131
        self.assertEqual([u'Sample <foo@example.com>', u'Other <baz@bar.com>'],
132
                         sender._command_line()[-2:])
133
0.173.4 by Matthieu Moy
More tests
134
    def test_url_set(self):
135
        sender = self.get_sender(with_url_config)
136
        self.assertEqual(sender.url(), 'http://some.fake/url/')
137
0.171.17 by Jelmer Vernooij
Look at 'public_branch' as well for URL to report.
138
    def test_public_url_set(self):
7045.1.1 by Jelmer Vernooij
Fix another 300 tests.
139
        config=(b"[DEFAULT]\n"
140
                b"public_branch=http://the.publication/location/\n")
0.171.17 by Jelmer Vernooij
Look at 'public_branch' as well for URL to report.
141
        sender = self.get_sender(config)
142
        self.assertEqual(sender.url(), 'http://the.publication/location/')
143
144
    def test_url_precedence(self):
7045.1.1 by Jelmer Vernooij
Fix another 300 tests.
145
        config=(b"[DEFAULT]\n"
146
                b"post_commit_url=http://some.fake/url/\n"
147
                b"public_branch=http://the.publication/location/\n")
0.171.17 by Jelmer Vernooij
Look at 'public_branch' as well for URL to report.
148
        sender = self.get_sender(config)
149
        self.assertEqual(sender.url(), 'http://some.fake/url/')
150
0.173.4 by Matthieu Moy
More tests
151
    def test_url_unset(self):
152
        sender = self.get_sender()
153
        self.assertEqual(sender.url(), sender.branch.base)
154
0.171.4 by Robert Collins
basics are all there
155
    def test_subject(self):
156
        sender = self.get_sender()
0.175.12 by John Arbash Meinel
Remove trailing whitespace.
157
        self.assertEqual("Rev 1: foo bar baz in %s" %
0.171.4 by Robert Collins
basics are all there
158
                            sender.branch.base,
159
                         sender.subject())
160
0.186.2 by Renato Silva
Added tests for body and subject customizations.
161
    def test_custom_subject(self):
162
        sender = self.get_sender(customized_mail_config)
163
        self.assertEqual("[commit] %s" %
164
                            sender.revision.get_summary(),
165
                         sender.subject())
166
0.175.7 by John Arbash Meinel
split out SMTPConnection to its own file.
167
    def test_diff_filename(self):
168
        sender = self.get_sender()
169
        self.assertEqual('patch-1.diff', sender.diff_filename())
170
0.178.6 by Steve Langasek
add a test case for revision_mail_headers
171
    def test_headers(self):
172
        sender = self.get_sender()
0.171.42 by Robert Collins
Merge patch from Steve Langasek adding support for arbitrary headers on revision notification emails.
173
        self.assertEqual({'X-Cheese': 'to the rescue!'}, sender.extra_headers())
0.178.6 by Steve Langasek
add a test case for revision_mail_headers
174
0.171.3 by Robert Collins
convert the switch basics to an email plugin
175
    def get_sender(self, text=sample_config):
0.171.55 by Jelmer Vernooij
Use config stacks.
176
        my_config = config.MemoryStack(text)
0.171.11 by Robert Collins
Update tests to use non deprecated API's.
177
        self.branch = BzrDir.create_branch_convenience('.')
6653.6.6 by Jelmer Vernooij
Fix remaining tests.
178
        tree = self.branch.controldir.open_workingtree()
6855.4.1 by Jelmer Vernooij
Yet more bees.
179
        tree.commit('foo bar baz\nfuzzy\nwuzzy', rev_id=b'A',
0.171.11 by Robert Collins
Update tests to use non deprecated API's.
180
            allow_pointless=True,
181
            timestamp=1,
182
            timezone=0,
183
            committer="Sample <john@example.com>",
184
            )
7045.1.1 by Jelmer Vernooij
Fix another 300 tests.
185
        sender = EmailSender(self.branch, b'A', my_config)
0.171.24 by John Arbash Meinel
Switch to using a local repository if available,
186
        # This is usually only done after the EmailSender has locked the branch
187
        # and repository during send(), however, for testing, we need to do it
188
        # earlier, since send() is not called.
189
        sender._setup_revision_and_revno()
190
        return sender
191
192
193
class TestEmailerWithLocal(tests.TestCaseWithTransport):
194
    """Test that Emailer will use a local branch if supplied."""
195
196
    def test_local_has_revision(self):
197
        master_tree = self.make_branch_and_tree('master')
198
        self.build_tree(['master/a'])
199
        master_tree.add('a')
200
        master_tree.commit('a')
201
6653.6.6 by Jelmer Vernooij
Fix remaining tests.
202
        child_tree = master_tree.controldir.sprout('child').open_workingtree()
0.171.24 by John Arbash Meinel
Switch to using a local repository if available,
203
        child_tree.branch.bind(master_tree.branch)
204
205
        self.build_tree(['child/b'])
206
        child_tree.add(['b'])
207
        revision_id = child_tree.commit('b')
208
209
        sender = EmailSender(master_tree.branch, revision_id,
210
                             master_tree.branch.get_config(),
211
                             local_branch=child_tree.branch)
212
213
        # Make sure we are using the 'local_branch' repository, and not the
214
        # remote one.
215
        self.assertIs(child_tree.branch.repository, sender.repository)
216
217
    def test_local_missing_revision(self):
218
        master_tree = self.make_branch_and_tree('master')
219
        self.build_tree(['master/a'])
220
        master_tree.add('a')
221
        master_tree.commit('a')
222
6653.6.6 by Jelmer Vernooij
Fix remaining tests.
223
        child_tree = master_tree.controldir.sprout('child').open_workingtree()
0.171.24 by John Arbash Meinel
Switch to using a local repository if available,
224
        child_tree.branch.bind(master_tree.branch)
225
226
        self.build_tree(['master/c'])
227
        master_tree.add(['c'])
228
        revision_id = master_tree.commit('c')
229
6649.1.2 by Jelmer Vernooij
Fix remaining tests.
230
        self.assertFalse(
231
            child_tree.branch.repository.has_revision(revision_id))
0.171.24 by John Arbash Meinel
Switch to using a local repository if available,
232
        sender = EmailSender(master_tree.branch, revision_id,
233
                             master_tree.branch.get_config(),
234
                             local_branch=child_tree.branch)
235
        # We should be using the master repository here, because the child
236
        # repository doesn't contain the revision.
237
        self.assertIs(master_tree.branch.repository, sender.repository)