/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
2376.4.4 by jml at canonical
Beginnings of generic bug-tracker plugin system.
1
# Copyright (C) 2007 Canonical Ltd
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
2376.4.42 by Jonathan Lange
Parametrize URLParametrizedIntegerBugTracker even further so we don't need to
18
from bzrlib import bugtracker, errors, urlutils
2376.4.4 by jml at canonical
Beginnings of generic bug-tracker plugin system.
19
from bzrlib.tests import TestCaseWithMemoryTransport
20
21
2376.4.7 by jml at canonical
- Add docstrings to tests.
22
class TestGetBugURL(TestCaseWithMemoryTransport):
23
    """Tests for bugtracker.get_bug_url"""
24
2376.4.28 by Jonathan Lange
Focus the tests better and clean up some dodgy bits in UnknownBugTrackerAbbreviation
25
    class TransientTracker(object):
26
        """An transient tracker used for testing."""
27
28
        @classmethod
29
        def get(klass, abbreviation, branch):
30
            klass.log.append(('get', abbreviation, branch))
31
            if abbreviation != 'transient':
32
                return None
33
            return klass()
34
35
        def get_bug_url(self, bug_id):
36
            self.log.append(('get_bug_url', bug_id))
37
            return "http://bugs.com/%s" % bug_id
38
39
    def setUp(self):
40
        TestCaseWithMemoryTransport.setUp(self)
41
        self.tracker_type = TestGetBugURL.TransientTracker
42
        self.tracker_type.log = []
43
        bugtracker.tracker_registry.register('transient', self.tracker_type)
44
        self.addCleanup(lambda:
45
                        bugtracker.tracker_registry.remove('transient'))
46
47
    def test_get_bug_url_for_transient_tracker(self):
2376.4.7 by jml at canonical
- Add docstrings to tests.
48
        branch = self.make_branch('some_branch')
2376.4.28 by Jonathan Lange
Focus the tests better and clean up some dodgy bits in UnknownBugTrackerAbbreviation
49
        self.assertEqual('http://bugs.com/1234',
50
                         bugtracker.get_bug_url('transient', branch, '1234'))
2376.4.7 by jml at canonical
- Add docstrings to tests.
51
        self.assertEqual(
2376.4.28 by Jonathan Lange
Focus the tests better and clean up some dodgy bits in UnknownBugTrackerAbbreviation
52
            [('get', 'transient', branch), ('get_bug_url', '1234')],
53
            self.tracker_type.log)
54
55
    def test_unrecognized_abbreviation_raises_error(self):
56
        """If the abbreviation is unrecognized, then raise an error."""
2376.4.7 by jml at canonical
- Add docstrings to tests.
57
        branch = self.make_branch('some_branch')
2376.4.26 by Jonathan Lange
Tests for MalformedBugIdentifier and new error UnknownBugTrackerAbbreviation.
58
        self.assertRaises(errors.UnknownBugTrackerAbbreviation,
2376.4.7 by jml at canonical
- Add docstrings to tests.
59
                          bugtracker.get_bug_url, 'xxx', branch, '1234')
2376.4.28 by Jonathan Lange
Focus the tests better and clean up some dodgy bits in UnknownBugTrackerAbbreviation
60
        self.assertEqual([('get', 'xxx', branch)], self.tracker_type.log)
2376.4.7 by jml at canonical
- Add docstrings to tests.
61
2376.4.4 by jml at canonical
Beginnings of generic bug-tracker plugin system.
62
2376.4.29 by Jonathan Lange
Tests for builtin trackers.
63
class TestBuiltinTrackers(TestCaseWithMemoryTransport):
64
    """Test that the builtin trackers are registered and return sane URLs."""
65
66
    def test_launchpad_registered(self):
67
        """The Launchpad bug tracker should be registered by default and
68
        generate Launchpad bug page URLs.
69
        """
70
        branch = self.make_branch('some_branch')
71
        tracker = bugtracker.tracker_registry.get_tracker('lp', branch)
72
        self.assertEqual('https://launchpad.net/bugs/1234',
73
                         tracker.get_bug_url('1234'))
74
75
    def test_debian_registered(self):
76
        """The Debian bug tracker should be registered by default and generate
77
        bugs.debian.org bug page URLs.
78
        """
79
        branch = self.make_branch('some_branch')
80
        tracker = bugtracker.tracker_registry.get_tracker('deb', branch)
81
        self.assertEqual('http://bugs.debian.org/1234',
82
                         tracker.get_bug_url('1234'))
83
2376.4.40 by Jonathan Lange
Redo the hierarchy of bug trackers to reduce duplication.
84
    def test_trac_registered(self):
85
        """The Trac bug tracker should be registered by default and generate
86
        Trac bug page URLs when the appropriate configuration is present.
87
        """
88
        branch = self.make_branch('some_branch')
89
        config = branch.get_config()
90
        config.set_user_option('trac_foo_url', 'http://bugs.com/trac')
91
        tracker = bugtracker.tracker_registry.get_tracker('foo', branch)
92
        self.assertEqual('http://bugs.com/trac/ticket/1234',
93
                         tracker.get_bug_url('1234'))
94
95
    def test_bugzilla_registered(self):
96
        """The Bugzilla bug tracker should be registered by default and
97
        generate Bugzilla bug page URLs when the appropriate configuration is
98
        present.
99
        """
100
        branch = self.make_branch('some_branch')
101
        config = branch.get_config()
102
        config.set_user_option('bugzilla_foo_url', 'http://bugs.com')
103
        tracker = bugtracker.tracker_registry.get_tracker('foo', branch)
104
        self.assertEqual('http://bugs.com/show_bug.cgi?id=1234',
105
                         tracker.get_bug_url('1234'))
106
3035.3.1 by Lukáš Lalinský
Generic bug tracker configuration.
107
    def test_generic_registered(self):
108
        branch = self.make_branch('some_branch')
109
        config = branch.get_config()
110
        config.set_user_option('bugtracker_foo_url', 'http://bugs.com/{id}/view.html')
111
        tracker = bugtracker.tracker_registry.get_tracker('foo', branch)
112
        self.assertEqual('http://bugs.com/1234/view.html',
113
                         tracker.get_bug_url('1234'))
114
3035.3.2 by Lukáš Lalinský
Add tests for InvalidBugTrackerURL.
115
    def test_generic_incorrect_url(self):
116
        branch = self.make_branch('some_branch')
117
        config = branch.get_config()
118
        config.set_user_option('bugtracker_foo_url', 'http://bugs.com/view.html')
119
        tracker = bugtracker.tracker_registry.get_tracker('foo', branch)
120
        self.assertRaises(errors.InvalidBugTrackerURL, tracker.get_bug_url, '1234')
3035.3.1 by Lukáš Lalinský
Generic bug tracker configuration.
121
2376.4.40 by Jonathan Lange
Redo the hierarchy of bug trackers to reduce duplication.
122
123
class TestUniqueIntegerBugTracker(TestCaseWithMemoryTransport):
2376.4.20 by Jonathan Lange
Direct tests for UniqueBugTracker and UniqueIntegerBugTracker
124
125
    def test_joins_id_to_base_url(self):
126
        """The URL of a bug is the base URL joined to the identifier."""
2376.4.40 by Jonathan Lange
Redo the hierarchy of bug trackers to reduce duplication.
127
        tracker = bugtracker.UniqueIntegerBugTracker('xxx', 'http://bugs.com')
2376.4.20 by Jonathan Lange
Direct tests for UniqueBugTracker and UniqueIntegerBugTracker
128
        self.assertEqual('http://bugs.com/1234', tracker.get_bug_url('1234'))
129
2376.4.23 by Jonathan Lange
Change 'tag' to 'abbreviated_tracker_name'
130
    def test_returns_tracker_if_abbreviation_matches(self):
2376.4.28 by Jonathan Lange
Focus the tests better and clean up some dodgy bits in UnknownBugTrackerAbbreviation
131
        """The get() method should return an instance of the tracker if the
132
        given abbreviation matches the tracker's abbreviated name.
2376.4.20 by Jonathan Lange
Direct tests for UniqueBugTracker and UniqueIntegerBugTracker
133
        """
2376.4.40 by Jonathan Lange
Redo the hierarchy of bug trackers to reduce duplication.
134
        tracker = bugtracker.UniqueIntegerBugTracker('xxx', 'http://bugs.com')
2376.4.20 by Jonathan Lange
Direct tests for UniqueBugTracker and UniqueIntegerBugTracker
135
        branch = self.make_branch('some_branch')
2376.4.25 by Jonathan Lange
Make singleton bug tracker thing work via instances.
136
        self.assertIs(tracker, tracker.get('xxx', branch))
2376.4.20 by Jonathan Lange
Direct tests for UniqueBugTracker and UniqueIntegerBugTracker
137
2376.4.23 by Jonathan Lange
Change 'tag' to 'abbreviated_tracker_name'
138
    def test_returns_none_if_abbreviation_doesnt_match(self):
2376.4.28 by Jonathan Lange
Focus the tests better and clean up some dodgy bits in UnknownBugTrackerAbbreviation
139
        """The get() method should return None if the given abbreviated name
140
        doesn't match the tracker's abbreviation.
2376.4.22 by Jonathan Lange
Variety of whitespace cleanups, tightening of tests and docstring changes in
141
        """
2376.4.40 by Jonathan Lange
Redo the hierarchy of bug trackers to reduce duplication.
142
        tracker = bugtracker.UniqueIntegerBugTracker('xxx', 'http://bugs.com')
2376.4.22 by Jonathan Lange
Variety of whitespace cleanups, tightening of tests and docstring changes in
143
        branch = self.make_branch('some_branch')
2376.4.28 by Jonathan Lange
Focus the tests better and clean up some dodgy bits in UnknownBugTrackerAbbreviation
144
        self.assertIs(None, tracker.get('yyy', branch))
145
146
    def test_doesnt_consult_branch(self):
2376.4.40 by Jonathan Lange
Redo the hierarchy of bug trackers to reduce duplication.
147
        """A UniqueIntegerBugTracker shouldn't consult the branch for tracker
2376.4.28 by Jonathan Lange
Focus the tests better and clean up some dodgy bits in UnknownBugTrackerAbbreviation
148
        information.
149
        """
2376.4.40 by Jonathan Lange
Redo the hierarchy of bug trackers to reduce duplication.
150
        tracker = bugtracker.UniqueIntegerBugTracker('xxx', 'http://bugs.com')
2376.4.28 by Jonathan Lange
Focus the tests better and clean up some dodgy bits in UnknownBugTrackerAbbreviation
151
        self.assertIs(tracker, tracker.get('xxx', None))
152
        self.assertIs(None, tracker.get('yyy', None))
2376.4.22 by Jonathan Lange
Variety of whitespace cleanups, tightening of tests and docstring changes in
153
2376.4.20 by Jonathan Lange
Direct tests for UniqueBugTracker and UniqueIntegerBugTracker
154
    def test_check_bug_id_only_accepts_integers(self):
2376.4.28 by Jonathan Lange
Focus the tests better and clean up some dodgy bits in UnknownBugTrackerAbbreviation
155
        """A UniqueIntegerBugTracker accepts integers as bug IDs."""
156
        tracker = bugtracker.UniqueIntegerBugTracker('xxx', 'http://bugs.com')
157
        tracker.check_bug_id('1234')
158
159
    def test_check_bug_id_doesnt_accept_non_integers(self):
160
        """A UniqueIntegerBugTracker rejects non-integers as bug IDs."""
161
        tracker = bugtracker.UniqueIntegerBugTracker('xxx', 'http://bugs.com')
2376.4.26 by Jonathan Lange
Tests for MalformedBugIdentifier and new error UnknownBugTrackerAbbreviation.
162
        self.assertRaises(
163
            errors.MalformedBugIdentifier, tracker.check_bug_id, 'red')
2376.4.20 by Jonathan Lange
Direct tests for UniqueBugTracker and UniqueIntegerBugTracker
164
2376.4.4 by jml at canonical
Beginnings of generic bug-tracker plugin system.
165
2376.4.40 by Jonathan Lange
Redo the hierarchy of bug trackers to reduce duplication.
166
class TestURLParametrizedIntegerBugTracker(TestCaseWithMemoryTransport):
2376.4.22 by Jonathan Lange
Variety of whitespace cleanups, tightening of tests and docstring changes in
167
    """Tests for TracTracker."""
168
2376.4.4 by jml at canonical
Beginnings of generic bug-tracker plugin system.
169
    def setUp(self):
170
        TestCaseWithMemoryTransport.setUp(self)
2376.4.40 by Jonathan Lange
Redo the hierarchy of bug trackers to reduce duplication.
171
        self.url = 'http://twistedmatrix.com/trac'
2376.4.42 by Jonathan Lange
Parametrize URLParametrizedIntegerBugTracker even further so we don't need to
172
        self.tracker = bugtracker.URLParametrizedIntegerBugTracker('some',
173
                                                                   'ticket/')
2376.4.4 by jml at canonical
Beginnings of generic bug-tracker plugin system.
174
175
    def test_get_with_unsupported_tag(self):
2376.4.7 by jml at canonical
- Add docstrings to tests.
176
        """If asked for an unrecognized or unconfigured tag, return None."""
2376.4.4 by jml at canonical
Beginnings of generic bug-tracker plugin system.
177
        branch = self.make_branch('some_branch')
2376.4.42 by Jonathan Lange
Parametrize URLParametrizedIntegerBugTracker even further so we don't need to
178
        self.assertEqual(None, self.tracker.get('lp', branch))
179
        self.assertEqual(None, self.tracker.get('twisted', branch))
2376.4.4 by jml at canonical
Beginnings of generic bug-tracker plugin system.
180
181
    def test_get_with_supported_tag(self):
2376.4.42 by Jonathan Lange
Parametrize URLParametrizedIntegerBugTracker even further so we don't need to
182
        """If asked for a valid tag, return a tracker instance that can map bug
183
        IDs to <base_url>/<bug_area> + <bug_id>."""
184
        bugtracker.tracker_registry.register('some', self.tracker)
185
        self.addCleanup(lambda: bugtracker.tracker_registry.remove('some'))
2376.4.40 by Jonathan Lange
Redo the hierarchy of bug trackers to reduce duplication.
186
2376.4.4 by jml at canonical
Beginnings of generic bug-tracker plugin system.
187
        branch = self.make_branch('some_branch')
188
        config = branch.get_config()
2376.4.40 by Jonathan Lange
Redo the hierarchy of bug trackers to reduce duplication.
189
        config.set_user_option('some_twisted_url', self.url)
2376.4.42 by Jonathan Lange
Parametrize URLParametrizedIntegerBugTracker even further so we don't need to
190
        tracker = self.tracker.get('twisted', branch)
191
        self.assertEqual(
192
            urlutils.join(self.url, 'ticket/') + '1234',
193
            tracker.get_bug_url('1234'))
2376.4.7 by jml at canonical
- Add docstrings to tests.
194
2376.4.30 by Jonathan Lange
Support for Bugzilla bug trackers.
195
    def test_get_bug_url_for_bad_bug(self):
196
        """When given a bug identifier that is invalid for Trac, get_bug_url
197
        should raise an error.
198
        """
199
        self.assertRaises(
2376.4.42 by Jonathan Lange
Parametrize URLParametrizedIntegerBugTracker even further so we don't need to
200
            errors.MalformedBugIdentifier, self.tracker.get_bug_url, 'bad')