~jcsackett/charmworld/bac-tag-constraints

« back to all changes in this revision

Viewing changes to charmworld/jobs/tests/test_bzr.py

  • Committer: Tarmac
  • Author(s): Aaron Bentley
  • Date: 2013-04-08 19:27:00 UTC
  • mfrom: (187.2.20 revisions-access)
  • Revision ID: tarmac-20130408192700-3w89hqewu4b1cdy9
[r=sinzui][bug=][author=abentley] Include revisions in API

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# Copyright 2012, 2013 Canonical Ltd.  This software is licensed under the
2
2
# GNU Affero General Public License version 3 (see the file LICENSE).
3
3
 
 
4
 
 
5
from contextlib import contextmanager
4
6
import os
5
7
import shutil
 
8
from tempfile import mkdtemp
6
9
 
 
10
from bzrlib.bzrdir import BzrDir
7
11
from mock import patch
8
12
 
9
 
from charmworld.jobs.ingest import BzrIngestJob
10
 
from charmworld.testing import factory
11
 
from charmworld.testing import JobTestBase
 
13
 
 
14
from charmworld.jobs.ingest import (
 
15
    BzrIngestJob,
 
16
    ChangelogIngestJob,
 
17
)
 
18
from charmworld.testing import (
 
19
    factory,
 
20
    JobTestBase,
 
21
    TestCase,
 
22
)
 
23
 
 
24
 
 
25
JRH = 'J. Random Hacker <jrandom@example.com>'
 
26
YRH = 'Y. Random Hacker <yrandom@example.com>'
 
27
ZRH = 'Z. Random Hacker <zrandom@example.com>'
12
28
 
13
29
 
14
30
class TestBzrJob(JobTestBase):
87
103
        job.add_files(charm_data)
88
104
        self.assertIn('files', charm_data)
89
105
        self.assertIn('icon', charm_data)
 
106
 
 
107
 
 
108
@contextmanager
 
109
def bzr_isolation():
 
110
    temp_home = mkdtemp()
 
111
    try:
 
112
        old_cwd = os.getcwd()
 
113
        os.chdir(temp_home)
 
114
        try:
 
115
            with patch.dict(os.environ, values={'HOME': temp_home},
 
116
                            clear=True):
 
117
                yield temp_home
 
118
        finally:
 
119
            os.chdir(old_cwd)
 
120
    finally:
 
121
        shutil.rmtree(temp_home)
 
122
 
 
123
 
 
124
@contextmanager
 
125
def write_locked(lockable):
 
126
    lockable.lock_write()
 
127
    try:
 
128
        yield lockable
 
129
    finally:
 
130
        lockable.unlock()
 
131
 
 
132
 
 
133
class TestChangelogBzrHandling(TestCase):
 
134
 
 
135
    def setUp(self):
 
136
        super(TestChangelogBzrHandling)
 
137
        self.use_context(bzr_isolation())
 
138
 
 
139
    @staticmethod
 
140
    def num_commit(tree, num):
 
141
        return tree.commit("revision %d" % num, committer=JRH)
 
142
 
 
143
    def make_locked_tree(self):
 
144
        tree = BzrDir.create_standalone_workingtree('tree')
 
145
        return self.use_context(write_locked(tree))
 
146
 
 
147
    def test_get_revisions(self):
 
148
        tree = self.make_locked_tree()
 
149
        job = ChangelogIngestJob()
 
150
        revisions = job.get_revisions(tree.branch)
 
151
        self.assertEqual([], revisions)
 
152
        for x in range(9):
 
153
            self.num_commit(tree, x)
 
154
        revisions = job.get_revisions(tree.branch)
 
155
        self.assertEqual(["revision %d" % num for num in range(8, -1, -1)],
 
156
                         [revision.message for revision in revisions])
 
157
        self.num_commit(tree, 9)
 
158
        revisions = job.get_revisions(tree.branch)
 
159
        self.assertEqual(["revision %d" % num for num in range(9, -1, -1)],
 
160
                         [revision.message for revision in revisions])
 
161
        self.num_commit(tree, 10)
 
162
        revisions = job.get_revisions(tree.branch)
 
163
        self.assertEqual(["revision %d" % num for num in range(10, 0, -1)],
 
164
                         [revision.message for revision in revisions])
 
165
        self.num_commit(tree, 11)
 
166
        revisions = job.get_revisions(tree.branch)
 
167
        self.assertEqual(["revision %d" % num for num in range(11, 1, -1)],
 
168
                         [revision.message for revision in revisions])
 
169
 
 
170
    def test_get_revisions_honours_limit(self):
 
171
        tree = self.make_locked_tree()
 
172
        for x in range(15):
 
173
            self.num_commit(tree, x)
 
174
        revisions = ChangelogIngestJob(limit=5).get_revisions(tree.branch)
 
175
        self.assertEqual(5, len(revisions))
 
176
        revisions = ChangelogIngestJob(limit=20).get_revisions(tree.branch)
 
177
        self.assertEqual(15, len(revisions))
 
178
 
 
179
    def test_get_revisions_honours_since(self):
 
180
        tree = self.make_locked_tree()
 
181
        tree.commit('', timestamp=0, committer='')
 
182
        tree.commit('', timestamp=1, committer='')
 
183
        tree.commit('', timestamp=2, committer='')
 
184
        job = ChangelogIngestJob(since=0, limit=0)
 
185
        revisions = job.get_revisions(tree.branch)
 
186
        self.assertEqual(3, len(revisions))
 
187
        job = ChangelogIngestJob(since=1, limit=0)
 
188
        revisions = job.get_revisions(tree.branch)
 
189
        self.assertEqual(2, len(revisions))
 
190
 
 
191
    def test_limit_overrides_since(self):
 
192
        tree = self.make_locked_tree()
 
193
        tree.commit('', timestamp=0, committer='')
 
194
        tree.commit('', timestamp=1, committer='')
 
195
        tree.commit('', timestamp=2, committer='')
 
196
        job = ChangelogIngestJob(since=1, limit=3)
 
197
        revisions = job.get_revisions(tree.branch)
 
198
        self.assertEqual(3, len(revisions))
 
199
 
 
200
    def test_rev_info(self):
 
201
        tree = self.make_locked_tree()
 
202
        revision_id = tree.commit('message1', committer=JRH)
 
203
        rev = tree.branch.repository.get_revision(revision_id)
 
204
        rev.timestamp = 34
 
205
        rev_info = ChangelogIngestJob._rev_info(rev, tree.branch)
 
206
        self.assertEqual({
 
207
            'authors': [JRH],
 
208
            'committer': JRH,
 
209
            'created': 34,
 
210
            'message': 'message1',
 
211
            'revno': 1,
 
212
        }, rev_info)
 
213
 
 
214
    @staticmethod
 
215
    def get_rev_info(branch, revision_id):
 
216
        rev = branch.repository.get_revision(revision_id)
 
217
        return ChangelogIngestJob._rev_info(rev, branch)
 
218
 
 
219
    def test_rev_info_supplied_authors(self):
 
220
        tree = self.make_locked_tree()
 
221
        revision_id = tree.commit(
 
222
            'message1', committer=JRH, authors=[YRH, ZRH])
 
223
        rev_info = self.get_rev_info(tree.branch, revision_id)
 
224
        self.assertEqual([YRH, ZRH], rev_info['authors'])
 
225
        self.assertEqual(JRH, rev_info['committer'])
 
226
 
 
227
    def test_get_changes(self):
 
228
        tree = self.make_locked_tree()
 
229
        first_id = self.num_commit(tree, 1)
 
230
        job = ChangelogIngestJob()
 
231
        charm_data = job.get_changes('tree')
 
232
        self.assertItemsEqual(['changes', 'first_change', 'last_change'],
 
233
                              charm_data.keys())
 
234
        self.assertEqual(charm_data['first_change'], charm_data['last_change'])
 
235
        self.assertEqual([charm_data['first_change']], charm_data['changes'])
 
236
        for num in range(1, 11):
 
237
            self.num_commit(tree, 1)
 
238
        charm_data = job.get_changes('tree')
 
239
        self.assertNotEqual(charm_data['first_change'],
 
240
                            charm_data['last_change'])
 
241
        self.assertEqual(charm_data['last_change'], charm_data['changes'][0])
 
242
        self.assertNotEqual(charm_data['first_change'],
 
243
                            charm_data['changes'][-1])
 
244
        self.assertEqual(self.get_rev_info(tree.branch, first_id),
 
245
                         charm_data['first_change'])
 
246
 
 
247
    def test_get_changes_no_revisions(self):
 
248
        self.make_locked_tree()
 
249
        charm_data = ChangelogIngestJob().get_changes('tree')
 
250
        self.assertEqual([], charm_data['changes'])
 
251
        self.assertIs(None, charm_data['first_change'])
 
252
        self.assertIs(None, charm_data['last_change'])