~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_bugtracker.py

  • Committer: Robert Collins
  • Date: 2007-11-09 17:50:31 UTC
  • mto: This revision was merged to the branch mainline in revision 2988.
  • Revision ID: robertc@robertcollins.net-20071109175031-agaiy6530rvbprmb
Change (without backwards compatibility) the
iter_lines_added_or_present_in_versions VersionedFile API to yield the
text version that each line is being returned from. This is useful for
reconcile in determining what inventories reference what texts.
(Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
 
18
from bzrlib import bugtracker, errors, urlutils
 
19
from bzrlib.tests import TestCaseWithMemoryTransport
 
20
 
 
21
 
 
22
class TestGetBugURL(TestCaseWithMemoryTransport):
 
23
    """Tests for bugtracker.get_bug_url"""
 
24
 
 
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):
 
48
        branch = self.make_branch('some_branch')
 
49
        self.assertEqual('http://bugs.com/1234',
 
50
                         bugtracker.get_bug_url('transient', branch, '1234'))
 
51
        self.assertEqual(
 
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."""
 
57
        branch = self.make_branch('some_branch')
 
58
        self.assertRaises(errors.UnknownBugTrackerAbbreviation,
 
59
                          bugtracker.get_bug_url, 'xxx', branch, '1234')
 
60
        self.assertEqual([('get', 'xxx', branch)], self.tracker_type.log)
 
61
 
 
62
 
 
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
 
 
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
 
 
107
 
 
108
class TestUniqueIntegerBugTracker(TestCaseWithMemoryTransport):
 
109
 
 
110
    def test_joins_id_to_base_url(self):
 
111
        """The URL of a bug is the base URL joined to the identifier."""
 
112
        tracker = bugtracker.UniqueIntegerBugTracker('xxx', 'http://bugs.com')
 
113
        self.assertEqual('http://bugs.com/1234', tracker.get_bug_url('1234'))
 
114
 
 
115
    def test_returns_tracker_if_abbreviation_matches(self):
 
116
        """The get() method should return an instance of the tracker if the
 
117
        given abbreviation matches the tracker's abbreviated name.
 
118
        """
 
119
        tracker = bugtracker.UniqueIntegerBugTracker('xxx', 'http://bugs.com')
 
120
        branch = self.make_branch('some_branch')
 
121
        self.assertIs(tracker, tracker.get('xxx', branch))
 
122
 
 
123
    def test_returns_none_if_abbreviation_doesnt_match(self):
 
124
        """The get() method should return None if the given abbreviated name
 
125
        doesn't match the tracker's abbreviation.
 
126
        """
 
127
        tracker = bugtracker.UniqueIntegerBugTracker('xxx', 'http://bugs.com')
 
128
        branch = self.make_branch('some_branch')
 
129
        self.assertIs(None, tracker.get('yyy', branch))
 
130
 
 
131
    def test_doesnt_consult_branch(self):
 
132
        """A UniqueIntegerBugTracker shouldn't consult the branch for tracker
 
133
        information.
 
134
        """
 
135
        tracker = bugtracker.UniqueIntegerBugTracker('xxx', 'http://bugs.com')
 
136
        self.assertIs(tracker, tracker.get('xxx', None))
 
137
        self.assertIs(None, tracker.get('yyy', None))
 
138
 
 
139
    def test_check_bug_id_only_accepts_integers(self):
 
140
        """A UniqueIntegerBugTracker accepts integers as bug IDs."""
 
141
        tracker = bugtracker.UniqueIntegerBugTracker('xxx', 'http://bugs.com')
 
142
        tracker.check_bug_id('1234')
 
143
 
 
144
    def test_check_bug_id_doesnt_accept_non_integers(self):
 
145
        """A UniqueIntegerBugTracker rejects non-integers as bug IDs."""
 
146
        tracker = bugtracker.UniqueIntegerBugTracker('xxx', 'http://bugs.com')
 
147
        self.assertRaises(
 
148
            errors.MalformedBugIdentifier, tracker.check_bug_id, 'red')
 
149
 
 
150
 
 
151
class TestURLParametrizedIntegerBugTracker(TestCaseWithMemoryTransport):
 
152
    """Tests for TracTracker."""
 
153
 
 
154
    def setUp(self):
 
155
        TestCaseWithMemoryTransport.setUp(self)
 
156
        self.url = 'http://twistedmatrix.com/trac'
 
157
        self.tracker = bugtracker.URLParametrizedIntegerBugTracker('some',
 
158
                                                                   'ticket/')
 
159
 
 
160
    def test_get_with_unsupported_tag(self):
 
161
        """If asked for an unrecognized or unconfigured tag, return None."""
 
162
        branch = self.make_branch('some_branch')
 
163
        self.assertEqual(None, self.tracker.get('lp', branch))
 
164
        self.assertEqual(None, self.tracker.get('twisted', branch))
 
165
 
 
166
    def test_get_with_supported_tag(self):
 
167
        """If asked for a valid tag, return a tracker instance that can map bug
 
168
        IDs to <base_url>/<bug_area> + <bug_id>."""
 
169
        bugtracker.tracker_registry.register('some', self.tracker)
 
170
        self.addCleanup(lambda: bugtracker.tracker_registry.remove('some'))
 
171
 
 
172
        branch = self.make_branch('some_branch')
 
173
        config = branch.get_config()
 
174
        config.set_user_option('some_twisted_url', self.url)
 
175
        tracker = self.tracker.get('twisted', branch)
 
176
        self.assertEqual(
 
177
            urlutils.join(self.url, 'ticket/') + '1234',
 
178
            tracker.get_bug_url('1234'))
 
179
 
 
180
    def test_get_bug_url_for_bad_bug(self):
 
181
        """When given a bug identifier that is invalid for Trac, get_bug_url
 
182
        should raise an error.
 
183
        """
 
184
        self.assertRaises(
 
185
            errors.MalformedBugIdentifier, self.tracker.get_bug_url, 'bad')