##// END OF EJS Templates
tests: api: add test for pulling from a custom remote...
Thomas De Schampheleire -
r7065:30209433 default
parent child Browse files
Show More
@@ -1,2628 +1,2645 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 # This program is free software: you can redistribute it and/or modify
2 # This program is free software: you can redistribute it and/or modify
3 # it under the terms of the GNU General Public License as published by
3 # it under the terms of the GNU General Public License as published by
4 # the Free Software Foundation, either version 3 of the License, or
4 # the Free Software Foundation, either version 3 of the License, or
5 # (at your option) any later version.
5 # (at your option) any later version.
6 #
6 #
7 # This program is distributed in the hope that it will be useful,
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
10 # GNU General Public License for more details.
11 #
11 #
12 # You should have received a copy of the GNU General Public License
12 # You should have received a copy of the GNU General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14
14
15 """
15 """
16 Tests for the JSON-RPC web api.
16 Tests for the JSON-RPC web api.
17 """
17 """
18
18
19 import os
19 import os
20 import random
20 import random
21 import mock
21 import mock
22 import re
22 import re
23
23
24 from kallithea.tests.base import *
24 from kallithea.tests.base import *
25 from kallithea.tests.fixture import Fixture
25 from kallithea.tests.fixture import Fixture
26 from kallithea.lib.compat import json
26 from kallithea.lib.compat import json
27 from kallithea.lib.auth import AuthUser
27 from kallithea.lib.auth import AuthUser
28 from kallithea.model.user import UserModel
28 from kallithea.model.user import UserModel
29 from kallithea.model.user_group import UserGroupModel
29 from kallithea.model.user_group import UserGroupModel
30 from kallithea.model.repo import RepoModel
30 from kallithea.model.repo import RepoModel
31 from kallithea.model.repo_group import RepoGroupModel
31 from kallithea.model.repo_group import RepoGroupModel
32 from kallithea.model.meta import Session
32 from kallithea.model.meta import Session
33 from kallithea.model.scm import ScmModel
33 from kallithea.model.scm import ScmModel
34 from kallithea.model.gist import GistModel
34 from kallithea.model.gist import GistModel
35 from kallithea.model.changeset_status import ChangesetStatusModel
35 from kallithea.model.changeset_status import ChangesetStatusModel
36 from kallithea.model.db import Repository, User, Setting, Ui, PullRequest, ChangesetStatus
36 from kallithea.model.db import Repository, User, Setting, Ui, PullRequest, ChangesetStatus
37 from kallithea.lib.utils2 import time_to_datetime
37 from kallithea.lib.utils2 import time_to_datetime
38
38
39
39
40 API_URL = '/_admin/api'
40 API_URL = '/_admin/api'
41 TEST_USER_GROUP = u'test_user_group'
41 TEST_USER_GROUP = u'test_user_group'
42 TEST_REPO_GROUP = u'test_repo_group'
42 TEST_REPO_GROUP = u'test_repo_group'
43
43
44 fixture = Fixture()
44 fixture = Fixture()
45
45
46
46
47 def _build_data(apikey, method, **kw):
47 def _build_data(apikey, method, **kw):
48 """
48 """
49 Builds API data with given random ID
49 Builds API data with given random ID
50
50
51 :param random_id:
51 :param random_id:
52 """
52 """
53 random_id = random.randrange(1, 9999)
53 random_id = random.randrange(1, 9999)
54 return random_id, json.dumps({
54 return random_id, json.dumps({
55 "id": random_id,
55 "id": random_id,
56 "api_key": apikey,
56 "api_key": apikey,
57 "method": method,
57 "method": method,
58 "args": kw
58 "args": kw
59 })
59 })
60
60
61
61
62 jsonify = lambda obj: json.loads(json.dumps(obj))
62 jsonify = lambda obj: json.loads(json.dumps(obj))
63
63
64
64
65 def crash(*args, **kwargs):
65 def crash(*args, **kwargs):
66 raise Exception('Total Crash !')
66 raise Exception('Total Crash !')
67
67
68
68
69 def api_call(test_obj, params):
69 def api_call(test_obj, params):
70 response = test_obj.app.post(API_URL, content_type='application/json',
70 response = test_obj.app.post(API_URL, content_type='application/json',
71 params=params)
71 params=params)
72 return response
72 return response
73
73
74
74
75 ## helpers
75 ## helpers
76 def make_user_group(name=TEST_USER_GROUP):
76 def make_user_group(name=TEST_USER_GROUP):
77 gr = fixture.create_user_group(name, cur_user=TEST_USER_ADMIN_LOGIN)
77 gr = fixture.create_user_group(name, cur_user=TEST_USER_ADMIN_LOGIN)
78 UserGroupModel().add_user_to_group(user_group=gr,
78 UserGroupModel().add_user_to_group(user_group=gr,
79 user=TEST_USER_ADMIN_LOGIN)
79 user=TEST_USER_ADMIN_LOGIN)
80 Session().commit()
80 Session().commit()
81 return gr
81 return gr
82
82
83
83
84 def make_repo_group(name=TEST_REPO_GROUP):
84 def make_repo_group(name=TEST_REPO_GROUP):
85 gr = fixture.create_repo_group(name, cur_user=TEST_USER_ADMIN_LOGIN)
85 gr = fixture.create_repo_group(name, cur_user=TEST_USER_ADMIN_LOGIN)
86 Session().commit()
86 Session().commit()
87 return gr
87 return gr
88
88
89
89
90 class _BaseTestApi(object):
90 class _BaseTestApi(object):
91 REPO = None
91 REPO = None
92 REPO_TYPE = None
92 REPO_TYPE = None
93
93
94 @classmethod
94 @classmethod
95 def setup_class(cls):
95 def setup_class(cls):
96 cls.usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
96 cls.usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
97 cls.apikey = cls.usr.api_key
97 cls.apikey = cls.usr.api_key
98 cls.test_user = UserModel().create_or_update(
98 cls.test_user = UserModel().create_or_update(
99 username='test-api',
99 username='test-api',
100 password='test',
100 password='test',
101 email='test@example.com',
101 email='test@example.com',
102 firstname=u'first',
102 firstname=u'first',
103 lastname=u'last'
103 lastname=u'last'
104 )
104 )
105 Session().commit()
105 Session().commit()
106 cls.TEST_USER_LOGIN = cls.test_user.username
106 cls.TEST_USER_LOGIN = cls.test_user.username
107 cls.apikey_regular = cls.test_user.api_key
107 cls.apikey_regular = cls.test_user.api_key
108
108
109 @classmethod
109 @classmethod
110 def teardown_class(cls):
110 def teardown_class(cls):
111 pass
111 pass
112
112
113 def setup_method(self, method):
113 def setup_method(self, method):
114 make_user_group()
114 make_user_group()
115 make_repo_group()
115 make_repo_group()
116
116
117 def teardown_method(self, method):
117 def teardown_method(self, method):
118 fixture.destroy_user_group(TEST_USER_GROUP)
118 fixture.destroy_user_group(TEST_USER_GROUP)
119 fixture.destroy_gists()
119 fixture.destroy_gists()
120 fixture.destroy_repo_group(TEST_REPO_GROUP)
120 fixture.destroy_repo_group(TEST_REPO_GROUP)
121
121
122 def _compare_ok(self, id_, expected, given):
122 def _compare_ok(self, id_, expected, given):
123 expected = jsonify({
123 expected = jsonify({
124 'id': id_,
124 'id': id_,
125 'error': None,
125 'error': None,
126 'result': expected
126 'result': expected
127 })
127 })
128 given = json.loads(given)
128 given = json.loads(given)
129 assert expected == given
129 assert expected == given
130
130
131 def _compare_error(self, id_, expected, given):
131 def _compare_error(self, id_, expected, given):
132 expected = jsonify({
132 expected = jsonify({
133 'id': id_,
133 'id': id_,
134 'error': expected,
134 'error': expected,
135 'result': None
135 'result': None
136 })
136 })
137 given = json.loads(given)
137 given = json.loads(given)
138 assert expected == given
138 assert expected == given
139
139
140 def test_Optional_object(self):
140 def test_Optional_object(self):
141 from kallithea.controllers.api.api import Optional
141 from kallithea.controllers.api.api import Optional
142
142
143 option1 = Optional(None)
143 option1 = Optional(None)
144 assert '<Optional:%s>' % None == repr(option1)
144 assert '<Optional:%s>' % None == repr(option1)
145 assert option1() is None
145 assert option1() is None
146
146
147 assert 1 == Optional.extract(Optional(1))
147 assert 1 == Optional.extract(Optional(1))
148 assert 'trololo' == Optional.extract('trololo')
148 assert 'trololo' == Optional.extract('trololo')
149
149
150 def test_Optional_OAttr(self):
150 def test_Optional_OAttr(self):
151 from kallithea.controllers.api.api import Optional, OAttr
151 from kallithea.controllers.api.api import Optional, OAttr
152
152
153 option1 = Optional(OAttr('apiuser'))
153 option1 = Optional(OAttr('apiuser'))
154 assert 'apiuser' == Optional.extract(option1)
154 assert 'apiuser' == Optional.extract(option1)
155
155
156 def test_OAttr_object(self):
156 def test_OAttr_object(self):
157 from kallithea.controllers.api.api import OAttr
157 from kallithea.controllers.api.api import OAttr
158
158
159 oattr1 = OAttr('apiuser')
159 oattr1 = OAttr('apiuser')
160 assert '<OptionalAttr:apiuser>' == repr(oattr1)
160 assert '<OptionalAttr:apiuser>' == repr(oattr1)
161 assert oattr1() == oattr1
161 assert oattr1() == oattr1
162
162
163 def test_api_wrong_key(self):
163 def test_api_wrong_key(self):
164 id_, params = _build_data('trololo', 'get_user')
164 id_, params = _build_data('trololo', 'get_user')
165 response = api_call(self, params)
165 response = api_call(self, params)
166
166
167 expected = 'Invalid API key'
167 expected = 'Invalid API key'
168 self._compare_error(id_, expected, given=response.body)
168 self._compare_error(id_, expected, given=response.body)
169
169
170 def test_api_missing_non_optional_param(self):
170 def test_api_missing_non_optional_param(self):
171 id_, params = _build_data(self.apikey, 'get_repo')
171 id_, params = _build_data(self.apikey, 'get_repo')
172 response = api_call(self, params)
172 response = api_call(self, params)
173
173
174 expected = 'Missing non optional `repoid` arg in JSON DATA'
174 expected = 'Missing non optional `repoid` arg in JSON DATA'
175 self._compare_error(id_, expected, given=response.body)
175 self._compare_error(id_, expected, given=response.body)
176
176
177 def test_api_missing_non_optional_param_args_null(self):
177 def test_api_missing_non_optional_param_args_null(self):
178 id_, params = _build_data(self.apikey, 'get_repo')
178 id_, params = _build_data(self.apikey, 'get_repo')
179 params = params.replace('"args": {}', '"args": null')
179 params = params.replace('"args": {}', '"args": null')
180 response = api_call(self, params)
180 response = api_call(self, params)
181
181
182 expected = 'Missing non optional `repoid` arg in JSON DATA'
182 expected = 'Missing non optional `repoid` arg in JSON DATA'
183 self._compare_error(id_, expected, given=response.body)
183 self._compare_error(id_, expected, given=response.body)
184
184
185 def test_api_missing_non_optional_param_args_bad(self):
185 def test_api_missing_non_optional_param_args_bad(self):
186 id_, params = _build_data(self.apikey, 'get_repo')
186 id_, params = _build_data(self.apikey, 'get_repo')
187 params = params.replace('"args": {}', '"args": 1')
187 params = params.replace('"args": {}', '"args": 1')
188 response = api_call(self, params)
188 response = api_call(self, params)
189
189
190 expected = 'Missing non optional `repoid` arg in JSON DATA'
190 expected = 'Missing non optional `repoid` arg in JSON DATA'
191 self._compare_error(id_, expected, given=response.body)
191 self._compare_error(id_, expected, given=response.body)
192
192
193 def test_api_args_is_null(self):
193 def test_api_args_is_null(self):
194 id_, params = _build_data(self.apikey, 'get_users', )
194 id_, params = _build_data(self.apikey, 'get_users', )
195 params = params.replace('"args": {}', '"args": null')
195 params = params.replace('"args": {}', '"args": null')
196 response = api_call(self, params)
196 response = api_call(self, params)
197 assert response.status == '200 OK'
197 assert response.status == '200 OK'
198
198
199 def test_api_args_is_bad(self):
199 def test_api_args_is_bad(self):
200 id_, params = _build_data(self.apikey, 'get_users', )
200 id_, params = _build_data(self.apikey, 'get_users', )
201 params = params.replace('"args": {}', '"args": 1')
201 params = params.replace('"args": {}', '"args": 1')
202 response = api_call(self, params)
202 response = api_call(self, params)
203 assert response.status == '200 OK'
203 assert response.status == '200 OK'
204
204
205 def test_api_args_different_args(self):
205 def test_api_args_different_args(self):
206 import string
206 import string
207 expected = {
207 expected = {
208 'ascii_letters': string.ascii_letters,
208 'ascii_letters': string.ascii_letters,
209 'ws': string.whitespace,
209 'ws': string.whitespace,
210 'printables': string.printable
210 'printables': string.printable
211 }
211 }
212 id_, params = _build_data(self.apikey, 'test', args=expected)
212 id_, params = _build_data(self.apikey, 'test', args=expected)
213 response = api_call(self, params)
213 response = api_call(self, params)
214 assert response.status == '200 OK'
214 assert response.status == '200 OK'
215 self._compare_ok(id_, expected, response.body)
215 self._compare_ok(id_, expected, response.body)
216
216
217 def test_api_get_users(self):
217 def test_api_get_users(self):
218 id_, params = _build_data(self.apikey, 'get_users', )
218 id_, params = _build_data(self.apikey, 'get_users', )
219 response = api_call(self, params)
219 response = api_call(self, params)
220 ret_all = []
220 ret_all = []
221 _users = User.query().filter_by(is_default_user=False) \
221 _users = User.query().filter_by(is_default_user=False) \
222 .order_by(User.username).all()
222 .order_by(User.username).all()
223 for usr in _users:
223 for usr in _users:
224 ret = usr.get_api_data()
224 ret = usr.get_api_data()
225 ret_all.append(jsonify(ret))
225 ret_all.append(jsonify(ret))
226 expected = ret_all
226 expected = ret_all
227 self._compare_ok(id_, expected, given=response.body)
227 self._compare_ok(id_, expected, given=response.body)
228
228
229 def test_api_get_user(self):
229 def test_api_get_user(self):
230 id_, params = _build_data(self.apikey, 'get_user',
230 id_, params = _build_data(self.apikey, 'get_user',
231 userid=TEST_USER_ADMIN_LOGIN)
231 userid=TEST_USER_ADMIN_LOGIN)
232 response = api_call(self, params)
232 response = api_call(self, params)
233
233
234 usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
234 usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
235 ret = usr.get_api_data()
235 ret = usr.get_api_data()
236 ret['permissions'] = AuthUser(dbuser=usr).permissions
236 ret['permissions'] = AuthUser(dbuser=usr).permissions
237
237
238 expected = ret
238 expected = ret
239 self._compare_ok(id_, expected, given=response.body)
239 self._compare_ok(id_, expected, given=response.body)
240
240
241 def test_api_get_user_that_does_not_exist(self):
241 def test_api_get_user_that_does_not_exist(self):
242 id_, params = _build_data(self.apikey, 'get_user',
242 id_, params = _build_data(self.apikey, 'get_user',
243 userid='trololo')
243 userid='trololo')
244 response = api_call(self, params)
244 response = api_call(self, params)
245
245
246 expected = "user `%s` does not exist" % 'trololo'
246 expected = "user `%s` does not exist" % 'trololo'
247 self._compare_error(id_, expected, given=response.body)
247 self._compare_error(id_, expected, given=response.body)
248
248
249 def test_api_get_user_without_giving_userid(self):
249 def test_api_get_user_without_giving_userid(self):
250 id_, params = _build_data(self.apikey, 'get_user')
250 id_, params = _build_data(self.apikey, 'get_user')
251 response = api_call(self, params)
251 response = api_call(self, params)
252
252
253 usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
253 usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
254 ret = usr.get_api_data()
254 ret = usr.get_api_data()
255 ret['permissions'] = AuthUser(dbuser=usr).permissions
255 ret['permissions'] = AuthUser(dbuser=usr).permissions
256
256
257 expected = ret
257 expected = ret
258 self._compare_ok(id_, expected, given=response.body)
258 self._compare_ok(id_, expected, given=response.body)
259
259
260 def test_api_get_user_without_giving_userid_non_admin(self):
260 def test_api_get_user_without_giving_userid_non_admin(self):
261 id_, params = _build_data(self.apikey_regular, 'get_user')
261 id_, params = _build_data(self.apikey_regular, 'get_user')
262 response = api_call(self, params)
262 response = api_call(self, params)
263
263
264 usr = User.get_by_username(self.TEST_USER_LOGIN)
264 usr = User.get_by_username(self.TEST_USER_LOGIN)
265 ret = usr.get_api_data()
265 ret = usr.get_api_data()
266 ret['permissions'] = AuthUser(dbuser=usr).permissions
266 ret['permissions'] = AuthUser(dbuser=usr).permissions
267
267
268 expected = ret
268 expected = ret
269 self._compare_ok(id_, expected, given=response.body)
269 self._compare_ok(id_, expected, given=response.body)
270
270
271 def test_api_get_user_with_giving_userid_non_admin(self):
271 def test_api_get_user_with_giving_userid_non_admin(self):
272 id_, params = _build_data(self.apikey_regular, 'get_user',
272 id_, params = _build_data(self.apikey_regular, 'get_user',
273 userid=self.TEST_USER_LOGIN)
273 userid=self.TEST_USER_LOGIN)
274 response = api_call(self, params)
274 response = api_call(self, params)
275
275
276 expected = 'userid is not the same as your user'
276 expected = 'userid is not the same as your user'
277 self._compare_error(id_, expected, given=response.body)
277 self._compare_error(id_, expected, given=response.body)
278
278
279 def test_api_pull_remote(self):
279 def test_api_pull_remote(self):
280 repo_name = u'test_pull'
280 repo_name = u'test_pull'
281 r = fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
281 r = fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
282 r.clone_uri = os.path.join(Ui.get_by_key('paths', '/').ui_value, self.REPO)
282 r.clone_uri = os.path.join(Ui.get_by_key('paths', '/').ui_value, self.REPO)
283 Session().commit()
283 Session().commit()
284
284
285 id_, params = _build_data(self.apikey, 'pull',
285 id_, params = _build_data(self.apikey, 'pull',
286 repoid=repo_name,)
286 repoid=repo_name,)
287 response = api_call(self, params)
287 response = api_call(self, params)
288
288
289 expected = {'msg': 'Pulled from `%s`' % repo_name,
289 expected = {'msg': 'Pulled from `%s`' % repo_name,
290 'repository': repo_name}
290 'repository': repo_name}
291 self._compare_ok(id_, expected, given=response.body)
291 self._compare_ok(id_, expected, given=response.body)
292
292
293 fixture.destroy_repo(repo_name)
293 fixture.destroy_repo(repo_name)
294
294
295 def test_api_pull_fork(self):
295 def test_api_pull_fork(self):
296 fork_name = u'fork'
296 fork_name = u'fork'
297 fixture.create_fork(self.REPO, fork_name)
297 fixture.create_fork(self.REPO, fork_name)
298 id_, params = _build_data(self.apikey, 'pull',
298 id_, params = _build_data(self.apikey, 'pull',
299 repoid=fork_name,)
299 repoid=fork_name,)
300 response = api_call(self, params)
300 response = api_call(self, params)
301
301
302 expected = {'msg': 'Pulled from `%s`' % fork_name,
302 expected = {'msg': 'Pulled from `%s`' % fork_name,
303 'repository': fork_name}
303 'repository': fork_name}
304 self._compare_ok(id_, expected, given=response.body)
304 self._compare_ok(id_, expected, given=response.body)
305
305
306 fixture.destroy_repo(fork_name)
306 fixture.destroy_repo(fork_name)
307
307
308 def test_api_pull_error_no_remote_no_fork(self):
308 def test_api_pull_error_no_remote_no_fork(self):
309 # should fail because no clone_uri is set
309 # should fail because no clone_uri is set
310 id_, params = _build_data(self.apikey, 'pull',
310 id_, params = _build_data(self.apikey, 'pull',
311 repoid=self.REPO, )
311 repoid=self.REPO, )
312 response = api_call(self, params)
312 response = api_call(self, params)
313
313
314 expected = 'Unable to pull changes from `%s`' % self.REPO
314 expected = 'Unable to pull changes from `%s`' % self.REPO
315 self._compare_error(id_, expected, given=response.body)
315 self._compare_error(id_, expected, given=response.body)
316
316
317 def test_api_pull_custom_remote(self):
318 repo_name = u'test_pull_custom_remote'
319 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
320
321 custom_remote_path = os.path.join(Ui.get_by_key('paths', '/').ui_value, self.REPO)
322
323 id_, params = _build_data(self.apikey, 'pull',
324 repoid=repo_name,
325 clone_uri=custom_remote_path)
326 response = api_call(self, params)
327
328 expected = {'msg': 'Pulled from `%s`' % repo_name,
329 'repository': repo_name}
330 self._compare_ok(id_, expected, given=response.body)
331
332 fixture.destroy_repo(repo_name)
333
317 def test_api_rescan_repos(self):
334 def test_api_rescan_repos(self):
318 id_, params = _build_data(self.apikey, 'rescan_repos')
335 id_, params = _build_data(self.apikey, 'rescan_repos')
319 response = api_call(self, params)
336 response = api_call(self, params)
320
337
321 expected = {'added': [], 'removed': []}
338 expected = {'added': [], 'removed': []}
322 self._compare_ok(id_, expected, given=response.body)
339 self._compare_ok(id_, expected, given=response.body)
323
340
324 @mock.patch.object(ScmModel, 'repo_scan', crash)
341 @mock.patch.object(ScmModel, 'repo_scan', crash)
325 def test_api_rescann_error(self):
342 def test_api_rescann_error(self):
326 id_, params = _build_data(self.apikey, 'rescan_repos', )
343 id_, params = _build_data(self.apikey, 'rescan_repos', )
327 response = api_call(self, params)
344 response = api_call(self, params)
328
345
329 expected = 'Error occurred during rescan repositories action'
346 expected = 'Error occurred during rescan repositories action'
330 self._compare_error(id_, expected, given=response.body)
347 self._compare_error(id_, expected, given=response.body)
331
348
332 def test_api_invalidate_cache(self):
349 def test_api_invalidate_cache(self):
333 repo = RepoModel().get_by_repo_name(self.REPO)
350 repo = RepoModel().get_by_repo_name(self.REPO)
334 repo.scm_instance_cached() # seed cache
351 repo.scm_instance_cached() # seed cache
335
352
336 id_, params = _build_data(self.apikey, 'invalidate_cache',
353 id_, params = _build_data(self.apikey, 'invalidate_cache',
337 repoid=self.REPO)
354 repoid=self.REPO)
338 response = api_call(self, params)
355 response = api_call(self, params)
339
356
340 expected = {
357 expected = {
341 'msg': "Cache for repository `%s` was invalidated" % (self.REPO,),
358 'msg': "Cache for repository `%s` was invalidated" % (self.REPO,),
342 'repository': self.REPO
359 'repository': self.REPO
343 }
360 }
344 self._compare_ok(id_, expected, given=response.body)
361 self._compare_ok(id_, expected, given=response.body)
345
362
346 @mock.patch.object(ScmModel, 'mark_for_invalidation', crash)
363 @mock.patch.object(ScmModel, 'mark_for_invalidation', crash)
347 def test_api_invalidate_cache_error(self):
364 def test_api_invalidate_cache_error(self):
348 id_, params = _build_data(self.apikey, 'invalidate_cache',
365 id_, params = _build_data(self.apikey, 'invalidate_cache',
349 repoid=self.REPO)
366 repoid=self.REPO)
350 response = api_call(self, params)
367 response = api_call(self, params)
351
368
352 expected = 'Error occurred during cache invalidation action'
369 expected = 'Error occurred during cache invalidation action'
353 self._compare_error(id_, expected, given=response.body)
370 self._compare_error(id_, expected, given=response.body)
354
371
355 def test_api_invalidate_cache_regular_user_no_permission(self):
372 def test_api_invalidate_cache_regular_user_no_permission(self):
356 repo = RepoModel().get_by_repo_name(self.REPO)
373 repo = RepoModel().get_by_repo_name(self.REPO)
357 repo.scm_instance_cached() # seed cache
374 repo.scm_instance_cached() # seed cache
358
375
359 id_, params = _build_data(self.apikey_regular, 'invalidate_cache',
376 id_, params = _build_data(self.apikey_regular, 'invalidate_cache',
360 repoid=self.REPO)
377 repoid=self.REPO)
361 response = api_call(self, params)
378 response = api_call(self, params)
362
379
363 expected = "repository `%s` does not exist" % (self.REPO,)
380 expected = "repository `%s` does not exist" % (self.REPO,)
364 self._compare_error(id_, expected, given=response.body)
381 self._compare_error(id_, expected, given=response.body)
365
382
366 def test_api_lock_repo_lock_acquire(self):
383 def test_api_lock_repo_lock_acquire(self):
367 id_, params = _build_data(self.apikey, 'lock',
384 id_, params = _build_data(self.apikey, 'lock',
368 userid=TEST_USER_ADMIN_LOGIN,
385 userid=TEST_USER_ADMIN_LOGIN,
369 repoid=self.REPO,
386 repoid=self.REPO,
370 locked=True)
387 locked=True)
371 response = api_call(self, params)
388 response = api_call(self, params)
372 expected = {
389 expected = {
373 'repo': self.REPO, 'locked': True,
390 'repo': self.REPO, 'locked': True,
374 'locked_since': response.json['result']['locked_since'],
391 'locked_since': response.json['result']['locked_since'],
375 'locked_by': TEST_USER_ADMIN_LOGIN,
392 'locked_by': TEST_USER_ADMIN_LOGIN,
376 'lock_state_changed': True,
393 'lock_state_changed': True,
377 'msg': ('User `%s` set lock state for repo `%s` to `%s`'
394 'msg': ('User `%s` set lock state for repo `%s` to `%s`'
378 % (TEST_USER_ADMIN_LOGIN, self.REPO, True))
395 % (TEST_USER_ADMIN_LOGIN, self.REPO, True))
379 }
396 }
380 self._compare_ok(id_, expected, given=response.body)
397 self._compare_ok(id_, expected, given=response.body)
381
398
382 def test_api_lock_repo_lock_acquire_by_non_admin(self):
399 def test_api_lock_repo_lock_acquire_by_non_admin(self):
383 repo_name = u'api_delete_me'
400 repo_name = u'api_delete_me'
384 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE,
401 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE,
385 cur_user=self.TEST_USER_LOGIN)
402 cur_user=self.TEST_USER_LOGIN)
386 try:
403 try:
387 id_, params = _build_data(self.apikey_regular, 'lock',
404 id_, params = _build_data(self.apikey_regular, 'lock',
388 repoid=repo_name,
405 repoid=repo_name,
389 locked=True)
406 locked=True)
390 response = api_call(self, params)
407 response = api_call(self, params)
391 expected = {
408 expected = {
392 'repo': repo_name,
409 'repo': repo_name,
393 'locked': True,
410 'locked': True,
394 'locked_since': response.json['result']['locked_since'],
411 'locked_since': response.json['result']['locked_since'],
395 'locked_by': self.TEST_USER_LOGIN,
412 'locked_by': self.TEST_USER_LOGIN,
396 'lock_state_changed': True,
413 'lock_state_changed': True,
397 'msg': ('User `%s` set lock state for repo `%s` to `%s`'
414 'msg': ('User `%s` set lock state for repo `%s` to `%s`'
398 % (self.TEST_USER_LOGIN, repo_name, True))
415 % (self.TEST_USER_LOGIN, repo_name, True))
399 }
416 }
400 self._compare_ok(id_, expected, given=response.body)
417 self._compare_ok(id_, expected, given=response.body)
401 finally:
418 finally:
402 fixture.destroy_repo(repo_name)
419 fixture.destroy_repo(repo_name)
403
420
404 def test_api_lock_repo_lock_acquire_non_admin_with_userid(self):
421 def test_api_lock_repo_lock_acquire_non_admin_with_userid(self):
405 repo_name = u'api_delete_me'
422 repo_name = u'api_delete_me'
406 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE,
423 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE,
407 cur_user=self.TEST_USER_LOGIN)
424 cur_user=self.TEST_USER_LOGIN)
408 try:
425 try:
409 id_, params = _build_data(self.apikey_regular, 'lock',
426 id_, params = _build_data(self.apikey_regular, 'lock',
410 userid=TEST_USER_ADMIN_LOGIN,
427 userid=TEST_USER_ADMIN_LOGIN,
411 repoid=repo_name,
428 repoid=repo_name,
412 locked=True)
429 locked=True)
413 response = api_call(self, params)
430 response = api_call(self, params)
414 expected = 'userid is not the same as your user'
431 expected = 'userid is not the same as your user'
415 self._compare_error(id_, expected, given=response.body)
432 self._compare_error(id_, expected, given=response.body)
416 finally:
433 finally:
417 fixture.destroy_repo(repo_name)
434 fixture.destroy_repo(repo_name)
418
435
419 def test_api_lock_repo_lock_acquire_non_admin_not_his_repo(self):
436 def test_api_lock_repo_lock_acquire_non_admin_not_his_repo(self):
420 id_, params = _build_data(self.apikey_regular, 'lock',
437 id_, params = _build_data(self.apikey_regular, 'lock',
421 repoid=self.REPO,
438 repoid=self.REPO,
422 locked=True)
439 locked=True)
423 response = api_call(self, params)
440 response = api_call(self, params)
424 expected = 'repository `%s` does not exist' % (self.REPO)
441 expected = 'repository `%s` does not exist' % (self.REPO)
425 self._compare_error(id_, expected, given=response.body)
442 self._compare_error(id_, expected, given=response.body)
426
443
427 def test_api_lock_repo_lock_release(self):
444 def test_api_lock_repo_lock_release(self):
428 id_, params = _build_data(self.apikey, 'lock',
445 id_, params = _build_data(self.apikey, 'lock',
429 userid=TEST_USER_ADMIN_LOGIN,
446 userid=TEST_USER_ADMIN_LOGIN,
430 repoid=self.REPO,
447 repoid=self.REPO,
431 locked=False)
448 locked=False)
432 response = api_call(self, params)
449 response = api_call(self, params)
433 expected = {
450 expected = {
434 'repo': self.REPO,
451 'repo': self.REPO,
435 'locked': False,
452 'locked': False,
436 'locked_since': None,
453 'locked_since': None,
437 'locked_by': TEST_USER_ADMIN_LOGIN,
454 'locked_by': TEST_USER_ADMIN_LOGIN,
438 'lock_state_changed': True,
455 'lock_state_changed': True,
439 'msg': ('User `%s` set lock state for repo `%s` to `%s`'
456 'msg': ('User `%s` set lock state for repo `%s` to `%s`'
440 % (TEST_USER_ADMIN_LOGIN, self.REPO, False))
457 % (TEST_USER_ADMIN_LOGIN, self.REPO, False))
441 }
458 }
442 self._compare_ok(id_, expected, given=response.body)
459 self._compare_ok(id_, expected, given=response.body)
443
460
444 def test_api_lock_repo_lock_acquire_optional_userid(self):
461 def test_api_lock_repo_lock_acquire_optional_userid(self):
445 id_, params = _build_data(self.apikey, 'lock',
462 id_, params = _build_data(self.apikey, 'lock',
446 repoid=self.REPO,
463 repoid=self.REPO,
447 locked=True)
464 locked=True)
448 response = api_call(self, params)
465 response = api_call(self, params)
449 time_ = response.json['result']['locked_since']
466 time_ = response.json['result']['locked_since']
450 expected = {
467 expected = {
451 'repo': self.REPO,
468 'repo': self.REPO,
452 'locked': True,
469 'locked': True,
453 'locked_since': time_,
470 'locked_since': time_,
454 'locked_by': TEST_USER_ADMIN_LOGIN,
471 'locked_by': TEST_USER_ADMIN_LOGIN,
455 'lock_state_changed': True,
472 'lock_state_changed': True,
456 'msg': ('User `%s` set lock state for repo `%s` to `%s`'
473 'msg': ('User `%s` set lock state for repo `%s` to `%s`'
457 % (TEST_USER_ADMIN_LOGIN, self.REPO, True))
474 % (TEST_USER_ADMIN_LOGIN, self.REPO, True))
458 }
475 }
459
476
460 self._compare_ok(id_, expected, given=response.body)
477 self._compare_ok(id_, expected, given=response.body)
461
478
462 def test_api_lock_repo_lock_optional_locked(self):
479 def test_api_lock_repo_lock_optional_locked(self):
463 try:
480 try:
464 id_, params = _build_data(self.apikey, 'lock',
481 id_, params = _build_data(self.apikey, 'lock',
465 repoid=self.REPO)
482 repoid=self.REPO)
466 response = api_call(self, params)
483 response = api_call(self, params)
467 time_ = response.json['result']['locked_since']
484 time_ = response.json['result']['locked_since']
468 expected = {
485 expected = {
469 'repo': self.REPO,
486 'repo': self.REPO,
470 'locked': True,
487 'locked': True,
471 'locked_since': time_,
488 'locked_since': time_,
472 'locked_by': TEST_USER_ADMIN_LOGIN,
489 'locked_by': TEST_USER_ADMIN_LOGIN,
473 'lock_state_changed': False,
490 'lock_state_changed': False,
474 'msg': ('Repo `%s` locked by `%s` on `%s`.'
491 'msg': ('Repo `%s` locked by `%s` on `%s`.'
475 % (self.REPO, TEST_USER_ADMIN_LOGIN,
492 % (self.REPO, TEST_USER_ADMIN_LOGIN,
476 json.dumps(time_to_datetime(time_))))
493 json.dumps(time_to_datetime(time_))))
477 }
494 }
478 self._compare_ok(id_, expected, given=response.body)
495 self._compare_ok(id_, expected, given=response.body)
479 finally:
496 finally:
480 # cleanup
497 # cleanup
481 Repository.unlock(RepoModel().get_by_repo_name(self.REPO))
498 Repository.unlock(RepoModel().get_by_repo_name(self.REPO))
482
499
483 def test_api_lock_repo_lock_optional_not_locked(self):
500 def test_api_lock_repo_lock_optional_not_locked(self):
484 repo_name = u'api_not_locked'
501 repo_name = u'api_not_locked'
485 repo = fixture.create_repo(repo_name, repo_type=self.REPO_TYPE,
502 repo = fixture.create_repo(repo_name, repo_type=self.REPO_TYPE,
486 cur_user=self.TEST_USER_LOGIN)
503 cur_user=self.TEST_USER_LOGIN)
487 assert repo.locked == [None, None]
504 assert repo.locked == [None, None]
488 try:
505 try:
489 id_, params = _build_data(self.apikey, 'lock',
506 id_, params = _build_data(self.apikey, 'lock',
490 repoid=repo.repo_id)
507 repoid=repo.repo_id)
491 response = api_call(self, params)
508 response = api_call(self, params)
492 expected = {
509 expected = {
493 'repo': repo_name,
510 'repo': repo_name,
494 'locked': False,
511 'locked': False,
495 'locked_since': None,
512 'locked_since': None,
496 'locked_by': None,
513 'locked_by': None,
497 'lock_state_changed': False,
514 'lock_state_changed': False,
498 'msg': ('Repo `%s` not locked.' % (repo_name,))
515 'msg': ('Repo `%s` not locked.' % (repo_name,))
499 }
516 }
500 self._compare_ok(id_, expected, given=response.body)
517 self._compare_ok(id_, expected, given=response.body)
501 finally:
518 finally:
502 fixture.destroy_repo(repo_name)
519 fixture.destroy_repo(repo_name)
503
520
504 @mock.patch.object(Repository, 'lock', crash)
521 @mock.patch.object(Repository, 'lock', crash)
505 def test_api_lock_error(self):
522 def test_api_lock_error(self):
506 id_, params = _build_data(self.apikey, 'lock',
523 id_, params = _build_data(self.apikey, 'lock',
507 userid=TEST_USER_ADMIN_LOGIN,
524 userid=TEST_USER_ADMIN_LOGIN,
508 repoid=self.REPO,
525 repoid=self.REPO,
509 locked=True)
526 locked=True)
510 response = api_call(self, params)
527 response = api_call(self, params)
511
528
512 expected = 'Error occurred locking repository `%s`' % self.REPO
529 expected = 'Error occurred locking repository `%s`' % self.REPO
513 self._compare_error(id_, expected, given=response.body)
530 self._compare_error(id_, expected, given=response.body)
514
531
515 def test_api_get_locks_regular_user(self):
532 def test_api_get_locks_regular_user(self):
516 id_, params = _build_data(self.apikey_regular, 'get_locks')
533 id_, params = _build_data(self.apikey_regular, 'get_locks')
517 response = api_call(self, params)
534 response = api_call(self, params)
518 expected = []
535 expected = []
519 self._compare_ok(id_, expected, given=response.body)
536 self._compare_ok(id_, expected, given=response.body)
520
537
521 def test_api_get_locks_with_userid_regular_user(self):
538 def test_api_get_locks_with_userid_regular_user(self):
522 id_, params = _build_data(self.apikey_regular, 'get_locks',
539 id_, params = _build_data(self.apikey_regular, 'get_locks',
523 userid=TEST_USER_ADMIN_LOGIN)
540 userid=TEST_USER_ADMIN_LOGIN)
524 response = api_call(self, params)
541 response = api_call(self, params)
525 expected = 'userid is not the same as your user'
542 expected = 'userid is not the same as your user'
526 self._compare_error(id_, expected, given=response.body)
543 self._compare_error(id_, expected, given=response.body)
527
544
528 def test_api_get_locks(self):
545 def test_api_get_locks(self):
529 id_, params = _build_data(self.apikey, 'get_locks')
546 id_, params = _build_data(self.apikey, 'get_locks')
530 response = api_call(self, params)
547 response = api_call(self, params)
531 expected = []
548 expected = []
532 self._compare_ok(id_, expected, given=response.body)
549 self._compare_ok(id_, expected, given=response.body)
533
550
534 def test_api_get_locks_with_one_locked_repo(self):
551 def test_api_get_locks_with_one_locked_repo(self):
535 repo_name = u'api_delete_me'
552 repo_name = u'api_delete_me'
536 repo = fixture.create_repo(repo_name, repo_type=self.REPO_TYPE,
553 repo = fixture.create_repo(repo_name, repo_type=self.REPO_TYPE,
537 cur_user=self.TEST_USER_LOGIN)
554 cur_user=self.TEST_USER_LOGIN)
538 Repository.lock(repo, User.get_by_username(self.TEST_USER_LOGIN).user_id)
555 Repository.lock(repo, User.get_by_username(self.TEST_USER_LOGIN).user_id)
539 try:
556 try:
540 id_, params = _build_data(self.apikey, 'get_locks')
557 id_, params = _build_data(self.apikey, 'get_locks')
541 response = api_call(self, params)
558 response = api_call(self, params)
542 expected = [repo.get_api_data()]
559 expected = [repo.get_api_data()]
543 self._compare_ok(id_, expected, given=response.body)
560 self._compare_ok(id_, expected, given=response.body)
544 finally:
561 finally:
545 fixture.destroy_repo(repo_name)
562 fixture.destroy_repo(repo_name)
546
563
547 def test_api_get_locks_with_one_locked_repo_for_specific_user(self):
564 def test_api_get_locks_with_one_locked_repo_for_specific_user(self):
548 repo_name = u'api_delete_me'
565 repo_name = u'api_delete_me'
549 repo = fixture.create_repo(repo_name, repo_type=self.REPO_TYPE,
566 repo = fixture.create_repo(repo_name, repo_type=self.REPO_TYPE,
550 cur_user=self.TEST_USER_LOGIN)
567 cur_user=self.TEST_USER_LOGIN)
551 Repository.lock(repo, User.get_by_username(self.TEST_USER_LOGIN).user_id)
568 Repository.lock(repo, User.get_by_username(self.TEST_USER_LOGIN).user_id)
552 try:
569 try:
553 id_, params = _build_data(self.apikey, 'get_locks',
570 id_, params = _build_data(self.apikey, 'get_locks',
554 userid=self.TEST_USER_LOGIN)
571 userid=self.TEST_USER_LOGIN)
555 response = api_call(self, params)
572 response = api_call(self, params)
556 expected = [repo.get_api_data()]
573 expected = [repo.get_api_data()]
557 self._compare_ok(id_, expected, given=response.body)
574 self._compare_ok(id_, expected, given=response.body)
558 finally:
575 finally:
559 fixture.destroy_repo(repo_name)
576 fixture.destroy_repo(repo_name)
560
577
561 def test_api_get_locks_with_userid(self):
578 def test_api_get_locks_with_userid(self):
562 id_, params = _build_data(self.apikey, 'get_locks',
579 id_, params = _build_data(self.apikey, 'get_locks',
563 userid=TEST_USER_REGULAR_LOGIN)
580 userid=TEST_USER_REGULAR_LOGIN)
564 response = api_call(self, params)
581 response = api_call(self, params)
565 expected = []
582 expected = []
566 self._compare_ok(id_, expected, given=response.body)
583 self._compare_ok(id_, expected, given=response.body)
567
584
568 def test_api_create_existing_user(self):
585 def test_api_create_existing_user(self):
569 id_, params = _build_data(self.apikey, 'create_user',
586 id_, params = _build_data(self.apikey, 'create_user',
570 username=TEST_USER_ADMIN_LOGIN,
587 username=TEST_USER_ADMIN_LOGIN,
571 email='test@example.com',
588 email='test@example.com',
572 password='trololo')
589 password='trololo')
573 response = api_call(self, params)
590 response = api_call(self, params)
574
591
575 expected = "user `%s` already exist" % TEST_USER_ADMIN_LOGIN
592 expected = "user `%s` already exist" % TEST_USER_ADMIN_LOGIN
576 self._compare_error(id_, expected, given=response.body)
593 self._compare_error(id_, expected, given=response.body)
577
594
578 def test_api_create_user_with_existing_email(self):
595 def test_api_create_user_with_existing_email(self):
579 id_, params = _build_data(self.apikey, 'create_user',
596 id_, params = _build_data(self.apikey, 'create_user',
580 username=TEST_USER_ADMIN_LOGIN + 'new',
597 username=TEST_USER_ADMIN_LOGIN + 'new',
581 email=TEST_USER_REGULAR_EMAIL,
598 email=TEST_USER_REGULAR_EMAIL,
582 password='trololo')
599 password='trololo')
583 response = api_call(self, params)
600 response = api_call(self, params)
584
601
585 expected = "email `%s` already exist" % TEST_USER_REGULAR_EMAIL
602 expected = "email `%s` already exist" % TEST_USER_REGULAR_EMAIL
586 self._compare_error(id_, expected, given=response.body)
603 self._compare_error(id_, expected, given=response.body)
587
604
588 def test_api_create_user(self):
605 def test_api_create_user(self):
589 username = 'test_new_api_user'
606 username = 'test_new_api_user'
590 email = username + "@example.com"
607 email = username + "@example.com"
591
608
592 id_, params = _build_data(self.apikey, 'create_user',
609 id_, params = _build_data(self.apikey, 'create_user',
593 username=username,
610 username=username,
594 email=email,
611 email=email,
595 password='trololo')
612 password='trololo')
596 response = api_call(self, params)
613 response = api_call(self, params)
597
614
598 usr = User.get_by_username(username)
615 usr = User.get_by_username(username)
599 ret = dict(
616 ret = dict(
600 msg='created new user `%s`' % username,
617 msg='created new user `%s`' % username,
601 user=jsonify(usr.get_api_data())
618 user=jsonify(usr.get_api_data())
602 )
619 )
603
620
604 try:
621 try:
605 expected = ret
622 expected = ret
606 self._compare_ok(id_, expected, given=response.body)
623 self._compare_ok(id_, expected, given=response.body)
607 finally:
624 finally:
608 fixture.destroy_user(usr.user_id)
625 fixture.destroy_user(usr.user_id)
609
626
610 def test_api_create_user_without_password(self):
627 def test_api_create_user_without_password(self):
611 username = 'test_new_api_user_passwordless'
628 username = 'test_new_api_user_passwordless'
612 email = username + "@example.com"
629 email = username + "@example.com"
613
630
614 id_, params = _build_data(self.apikey, 'create_user',
631 id_, params = _build_data(self.apikey, 'create_user',
615 username=username,
632 username=username,
616 email=email)
633 email=email)
617 response = api_call(self, params)
634 response = api_call(self, params)
618
635
619 usr = User.get_by_username(username)
636 usr = User.get_by_username(username)
620 ret = dict(
637 ret = dict(
621 msg='created new user `%s`' % username,
638 msg='created new user `%s`' % username,
622 user=jsonify(usr.get_api_data())
639 user=jsonify(usr.get_api_data())
623 )
640 )
624 try:
641 try:
625 expected = ret
642 expected = ret
626 self._compare_ok(id_, expected, given=response.body)
643 self._compare_ok(id_, expected, given=response.body)
627 finally:
644 finally:
628 fixture.destroy_user(usr.user_id)
645 fixture.destroy_user(usr.user_id)
629
646
630 def test_api_create_user_with_extern_name(self):
647 def test_api_create_user_with_extern_name(self):
631 username = 'test_new_api_user_passwordless'
648 username = 'test_new_api_user_passwordless'
632 email = username + "@example.com"
649 email = username + "@example.com"
633
650
634 id_, params = _build_data(self.apikey, 'create_user',
651 id_, params = _build_data(self.apikey, 'create_user',
635 username=username,
652 username=username,
636 email=email, extern_name='internal')
653 email=email, extern_name='internal')
637 response = api_call(self, params)
654 response = api_call(self, params)
638
655
639 usr = User.get_by_username(username)
656 usr = User.get_by_username(username)
640 ret = dict(
657 ret = dict(
641 msg='created new user `%s`' % username,
658 msg='created new user `%s`' % username,
642 user=jsonify(usr.get_api_data())
659 user=jsonify(usr.get_api_data())
643 )
660 )
644 try:
661 try:
645 expected = ret
662 expected = ret
646 self._compare_ok(id_, expected, given=response.body)
663 self._compare_ok(id_, expected, given=response.body)
647 finally:
664 finally:
648 fixture.destroy_user(usr.user_id)
665 fixture.destroy_user(usr.user_id)
649
666
650 @mock.patch.object(UserModel, 'create_or_update', crash)
667 @mock.patch.object(UserModel, 'create_or_update', crash)
651 def test_api_create_user_when_exception_happened(self):
668 def test_api_create_user_when_exception_happened(self):
652
669
653 username = 'test_new_api_user'
670 username = 'test_new_api_user'
654 email = username + "@example.com"
671 email = username + "@example.com"
655
672
656 id_, params = _build_data(self.apikey, 'create_user',
673 id_, params = _build_data(self.apikey, 'create_user',
657 username=username,
674 username=username,
658 email=email,
675 email=email,
659 password='trololo')
676 password='trololo')
660 response = api_call(self, params)
677 response = api_call(self, params)
661 expected = 'failed to create user `%s`' % username
678 expected = 'failed to create user `%s`' % username
662 self._compare_error(id_, expected, given=response.body)
679 self._compare_error(id_, expected, given=response.body)
663
680
664 def test_api_delete_user(self):
681 def test_api_delete_user(self):
665 usr = UserModel().create_or_update(username=u'test_user',
682 usr = UserModel().create_or_update(username=u'test_user',
666 password=u'qweqwe',
683 password=u'qweqwe',
667 email=u'u232@example.com',
684 email=u'u232@example.com',
668 firstname=u'u1', lastname=u'u1')
685 firstname=u'u1', lastname=u'u1')
669 Session().commit()
686 Session().commit()
670 username = usr.username
687 username = usr.username
671 email = usr.email
688 email = usr.email
672 usr_id = usr.user_id
689 usr_id = usr.user_id
673 ## DELETE THIS USER NOW
690 ## DELETE THIS USER NOW
674
691
675 id_, params = _build_data(self.apikey, 'delete_user',
692 id_, params = _build_data(self.apikey, 'delete_user',
676 userid=username, )
693 userid=username, )
677 response = api_call(self, params)
694 response = api_call(self, params)
678
695
679 ret = {'msg': 'deleted user ID:%s %s' % (usr_id, username),
696 ret = {'msg': 'deleted user ID:%s %s' % (usr_id, username),
680 'user': None}
697 'user': None}
681 expected = ret
698 expected = ret
682 self._compare_ok(id_, expected, given=response.body)
699 self._compare_ok(id_, expected, given=response.body)
683
700
684 @mock.patch.object(UserModel, 'delete', crash)
701 @mock.patch.object(UserModel, 'delete', crash)
685 def test_api_delete_user_when_exception_happened(self):
702 def test_api_delete_user_when_exception_happened(self):
686 usr = UserModel().create_or_update(username=u'test_user',
703 usr = UserModel().create_or_update(username=u'test_user',
687 password=u'qweqwe',
704 password=u'qweqwe',
688 email=u'u232@example.com',
705 email=u'u232@example.com',
689 firstname=u'u1', lastname=u'u1')
706 firstname=u'u1', lastname=u'u1')
690 Session().commit()
707 Session().commit()
691 username = usr.username
708 username = usr.username
692
709
693 id_, params = _build_data(self.apikey, 'delete_user',
710 id_, params = _build_data(self.apikey, 'delete_user',
694 userid=username, )
711 userid=username, )
695 response = api_call(self, params)
712 response = api_call(self, params)
696 ret = 'failed to delete user ID:%s %s' % (usr.user_id,
713 ret = 'failed to delete user ID:%s %s' % (usr.user_id,
697 usr.username)
714 usr.username)
698 expected = ret
715 expected = ret
699 self._compare_error(id_, expected, given=response.body)
716 self._compare_error(id_, expected, given=response.body)
700
717
701 @parametrize('name,expected', [
718 @parametrize('name,expected', [
702 ('firstname', 'new_username'),
719 ('firstname', 'new_username'),
703 ('lastname', 'new_username'),
720 ('lastname', 'new_username'),
704 ('email', 'new_username'),
721 ('email', 'new_username'),
705 ('admin', True),
722 ('admin', True),
706 ('admin', False),
723 ('admin', False),
707 ('extern_type', 'ldap'),
724 ('extern_type', 'ldap'),
708 ('extern_type', None),
725 ('extern_type', None),
709 ('extern_name', 'test'),
726 ('extern_name', 'test'),
710 ('extern_name', None),
727 ('extern_name', None),
711 ('active', False),
728 ('active', False),
712 ('active', True),
729 ('active', True),
713 ('password', 'newpass'),
730 ('password', 'newpass'),
714 ])
731 ])
715 def test_api_update_user(self, name, expected):
732 def test_api_update_user(self, name, expected):
716 usr = User.get_by_username(self.TEST_USER_LOGIN)
733 usr = User.get_by_username(self.TEST_USER_LOGIN)
717 kw = {name: expected,
734 kw = {name: expected,
718 'userid': usr.user_id}
735 'userid': usr.user_id}
719 id_, params = _build_data(self.apikey, 'update_user', **kw)
736 id_, params = _build_data(self.apikey, 'update_user', **kw)
720 response = api_call(self, params)
737 response = api_call(self, params)
721
738
722 ret = {
739 ret = {
723 'msg': 'updated user ID:%s %s' % (
740 'msg': 'updated user ID:%s %s' % (
724 usr.user_id, self.TEST_USER_LOGIN),
741 usr.user_id, self.TEST_USER_LOGIN),
725 'user': jsonify(User \
742 'user': jsonify(User \
726 .get_by_username(self.TEST_USER_LOGIN) \
743 .get_by_username(self.TEST_USER_LOGIN) \
727 .get_api_data())
744 .get_api_data())
728 }
745 }
729
746
730 expected = ret
747 expected = ret
731 self._compare_ok(id_, expected, given=response.body)
748 self._compare_ok(id_, expected, given=response.body)
732
749
733 def test_api_update_user_no_changed_params(self):
750 def test_api_update_user_no_changed_params(self):
734 usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
751 usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
735 ret = jsonify(usr.get_api_data())
752 ret = jsonify(usr.get_api_data())
736 id_, params = _build_data(self.apikey, 'update_user',
753 id_, params = _build_data(self.apikey, 'update_user',
737 userid=TEST_USER_ADMIN_LOGIN)
754 userid=TEST_USER_ADMIN_LOGIN)
738
755
739 response = api_call(self, params)
756 response = api_call(self, params)
740 ret = {
757 ret = {
741 'msg': 'updated user ID:%s %s' % (
758 'msg': 'updated user ID:%s %s' % (
742 usr.user_id, TEST_USER_ADMIN_LOGIN),
759 usr.user_id, TEST_USER_ADMIN_LOGIN),
743 'user': ret
760 'user': ret
744 }
761 }
745 expected = ret
762 expected = ret
746 self._compare_ok(id_, expected, given=response.body)
763 self._compare_ok(id_, expected, given=response.body)
747
764
748 def test_api_update_user_by_user_id(self):
765 def test_api_update_user_by_user_id(self):
749 usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
766 usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
750 ret = jsonify(usr.get_api_data())
767 ret = jsonify(usr.get_api_data())
751 id_, params = _build_data(self.apikey, 'update_user',
768 id_, params = _build_data(self.apikey, 'update_user',
752 userid=usr.user_id)
769 userid=usr.user_id)
753
770
754 response = api_call(self, params)
771 response = api_call(self, params)
755 ret = {
772 ret = {
756 'msg': 'updated user ID:%s %s' % (
773 'msg': 'updated user ID:%s %s' % (
757 usr.user_id, TEST_USER_ADMIN_LOGIN),
774 usr.user_id, TEST_USER_ADMIN_LOGIN),
758 'user': ret
775 'user': ret
759 }
776 }
760 expected = ret
777 expected = ret
761 self._compare_ok(id_, expected, given=response.body)
778 self._compare_ok(id_, expected, given=response.body)
762
779
763 def test_api_update_user_default_user(self):
780 def test_api_update_user_default_user(self):
764 usr = User.get_default_user()
781 usr = User.get_default_user()
765 id_, params = _build_data(self.apikey, 'update_user',
782 id_, params = _build_data(self.apikey, 'update_user',
766 userid=usr.user_id)
783 userid=usr.user_id)
767
784
768 response = api_call(self, params)
785 response = api_call(self, params)
769 expected = 'editing default user is forbidden'
786 expected = 'editing default user is forbidden'
770 self._compare_error(id_, expected, given=response.body)
787 self._compare_error(id_, expected, given=response.body)
771
788
772 @mock.patch.object(UserModel, 'update_user', crash)
789 @mock.patch.object(UserModel, 'update_user', crash)
773 def test_api_update_user_when_exception_happens(self):
790 def test_api_update_user_when_exception_happens(self):
774 usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
791 usr = User.get_by_username(TEST_USER_ADMIN_LOGIN)
775 ret = jsonify(usr.get_api_data())
792 ret = jsonify(usr.get_api_data())
776 id_, params = _build_data(self.apikey, 'update_user',
793 id_, params = _build_data(self.apikey, 'update_user',
777 userid=usr.user_id)
794 userid=usr.user_id)
778
795
779 response = api_call(self, params)
796 response = api_call(self, params)
780 ret = 'failed to update user `%s`' % usr.user_id
797 ret = 'failed to update user `%s`' % usr.user_id
781
798
782 expected = ret
799 expected = ret
783 self._compare_error(id_, expected, given=response.body)
800 self._compare_error(id_, expected, given=response.body)
784
801
785 def test_api_get_repo(self):
802 def test_api_get_repo(self):
786 new_group = u'some_new_group'
803 new_group = u'some_new_group'
787 make_user_group(new_group)
804 make_user_group(new_group)
788 RepoModel().grant_user_group_permission(repo=self.REPO,
805 RepoModel().grant_user_group_permission(repo=self.REPO,
789 group_name=new_group,
806 group_name=new_group,
790 perm='repository.read')
807 perm='repository.read')
791 Session().commit()
808 Session().commit()
792 id_, params = _build_data(self.apikey, 'get_repo',
809 id_, params = _build_data(self.apikey, 'get_repo',
793 repoid=self.REPO)
810 repoid=self.REPO)
794 response = api_call(self, params)
811 response = api_call(self, params)
795 assert u"tags" not in response.json[u'result']
812 assert u"tags" not in response.json[u'result']
796 assert u'pull_requests' not in response.json[u'result']
813 assert u'pull_requests' not in response.json[u'result']
797
814
798 repo = RepoModel().get_by_repo_name(self.REPO)
815 repo = RepoModel().get_by_repo_name(self.REPO)
799 ret = repo.get_api_data()
816 ret = repo.get_api_data()
800
817
801 members = []
818 members = []
802 followers = []
819 followers = []
803 for user in repo.repo_to_perm:
820 for user in repo.repo_to_perm:
804 perm = user.permission.permission_name
821 perm = user.permission.permission_name
805 user = user.user
822 user = user.user
806 user_data = {'name': user.username, 'type': "user",
823 user_data = {'name': user.username, 'type': "user",
807 'permission': perm}
824 'permission': perm}
808 members.append(user_data)
825 members.append(user_data)
809
826
810 for user_group in repo.users_group_to_perm:
827 for user_group in repo.users_group_to_perm:
811 perm = user_group.permission.permission_name
828 perm = user_group.permission.permission_name
812 user_group = user_group.users_group
829 user_group = user_group.users_group
813 user_group_data = {'name': user_group.users_group_name,
830 user_group_data = {'name': user_group.users_group_name,
814 'type': "user_group", 'permission': perm}
831 'type': "user_group", 'permission': perm}
815 members.append(user_group_data)
832 members.append(user_group_data)
816
833
817 for user in repo.followers:
834 for user in repo.followers:
818 followers.append(user.user.get_api_data())
835 followers.append(user.user.get_api_data())
819
836
820 ret['members'] = members
837 ret['members'] = members
821 ret['followers'] = followers
838 ret['followers'] = followers
822
839
823 expected = ret
840 expected = ret
824 self._compare_ok(id_, expected, given=response.body)
841 self._compare_ok(id_, expected, given=response.body)
825 fixture.destroy_user_group(new_group)
842 fixture.destroy_user_group(new_group)
826
843
827 id_, params = _build_data(self.apikey, 'get_repo', repoid=self.REPO,
844 id_, params = _build_data(self.apikey, 'get_repo', repoid=self.REPO,
828 with_revision_names=True,
845 with_revision_names=True,
829 with_pullrequests=True)
846 with_pullrequests=True)
830 response = api_call(self, params)
847 response = api_call(self, params)
831 assert u"v0.2.0" in response.json[u'result'][u'tags']
848 assert u"v0.2.0" in response.json[u'result'][u'tags']
832 assert u'pull_requests' in response.json[u'result']
849 assert u'pull_requests' in response.json[u'result']
833
850
834 @parametrize('grant_perm', [
851 @parametrize('grant_perm', [
835 ('repository.admin'),
852 ('repository.admin'),
836 ('repository.write'),
853 ('repository.write'),
837 ('repository.read'),
854 ('repository.read'),
838 ])
855 ])
839 def test_api_get_repo_by_non_admin(self, grant_perm):
856 def test_api_get_repo_by_non_admin(self, grant_perm):
840 RepoModel().grant_user_permission(repo=self.REPO,
857 RepoModel().grant_user_permission(repo=self.REPO,
841 user=self.TEST_USER_LOGIN,
858 user=self.TEST_USER_LOGIN,
842 perm=grant_perm)
859 perm=grant_perm)
843 Session().commit()
860 Session().commit()
844 id_, params = _build_data(self.apikey_regular, 'get_repo',
861 id_, params = _build_data(self.apikey_regular, 'get_repo',
845 repoid=self.REPO)
862 repoid=self.REPO)
846 response = api_call(self, params)
863 response = api_call(self, params)
847
864
848 repo = RepoModel().get_by_repo_name(self.REPO)
865 repo = RepoModel().get_by_repo_name(self.REPO)
849 ret = repo.get_api_data()
866 ret = repo.get_api_data()
850
867
851 members = []
868 members = []
852 followers = []
869 followers = []
853 assert 2 == len(repo.repo_to_perm)
870 assert 2 == len(repo.repo_to_perm)
854 for user in repo.repo_to_perm:
871 for user in repo.repo_to_perm:
855 perm = user.permission.permission_name
872 perm = user.permission.permission_name
856 user_obj = user.user
873 user_obj = user.user
857 user_data = {'name': user_obj.username, 'type': "user",
874 user_data = {'name': user_obj.username, 'type': "user",
858 'permission': perm}
875 'permission': perm}
859 members.append(user_data)
876 members.append(user_data)
860
877
861 for user_group in repo.users_group_to_perm:
878 for user_group in repo.users_group_to_perm:
862 perm = user_group.permission.permission_name
879 perm = user_group.permission.permission_name
863 user_group_obj = user_group.users_group
880 user_group_obj = user_group.users_group
864 user_group_data = {'name': user_group_obj.users_group_name,
881 user_group_data = {'name': user_group_obj.users_group_name,
865 'type': "user_group", 'permission': perm}
882 'type': "user_group", 'permission': perm}
866 members.append(user_group_data)
883 members.append(user_group_data)
867
884
868 for user in repo.followers:
885 for user in repo.followers:
869 followers.append(user.user.get_api_data())
886 followers.append(user.user.get_api_data())
870
887
871 ret['members'] = members
888 ret['members'] = members
872 ret['followers'] = followers
889 ret['followers'] = followers
873
890
874 expected = ret
891 expected = ret
875 try:
892 try:
876 self._compare_ok(id_, expected, given=response.body)
893 self._compare_ok(id_, expected, given=response.body)
877 finally:
894 finally:
878 RepoModel().revoke_user_permission(self.REPO, self.TEST_USER_LOGIN)
895 RepoModel().revoke_user_permission(self.REPO, self.TEST_USER_LOGIN)
879
896
880 def test_api_get_repo_by_non_admin_no_permission_to_repo(self):
897 def test_api_get_repo_by_non_admin_no_permission_to_repo(self):
881 RepoModel().grant_user_permission(repo=self.REPO,
898 RepoModel().grant_user_permission(repo=self.REPO,
882 user=self.TEST_USER_LOGIN,
899 user=self.TEST_USER_LOGIN,
883 perm='repository.none')
900 perm='repository.none')
884
901
885 id_, params = _build_data(self.apikey_regular, 'get_repo',
902 id_, params = _build_data(self.apikey_regular, 'get_repo',
886 repoid=self.REPO)
903 repoid=self.REPO)
887 response = api_call(self, params)
904 response = api_call(self, params)
888
905
889 expected = 'repository `%s` does not exist' % (self.REPO)
906 expected = 'repository `%s` does not exist' % (self.REPO)
890 self._compare_error(id_, expected, given=response.body)
907 self._compare_error(id_, expected, given=response.body)
891
908
892 def test_api_get_repo_that_doesn_not_exist(self):
909 def test_api_get_repo_that_doesn_not_exist(self):
893 id_, params = _build_data(self.apikey, 'get_repo',
910 id_, params = _build_data(self.apikey, 'get_repo',
894 repoid='no-such-repo')
911 repoid='no-such-repo')
895 response = api_call(self, params)
912 response = api_call(self, params)
896
913
897 ret = 'repository `%s` does not exist' % 'no-such-repo'
914 ret = 'repository `%s` does not exist' % 'no-such-repo'
898 expected = ret
915 expected = ret
899 self._compare_error(id_, expected, given=response.body)
916 self._compare_error(id_, expected, given=response.body)
900
917
901 def test_api_get_repos(self):
918 def test_api_get_repos(self):
902 id_, params = _build_data(self.apikey, 'get_repos')
919 id_, params = _build_data(self.apikey, 'get_repos')
903 response = api_call(self, params)
920 response = api_call(self, params)
904
921
905 expected = jsonify([
922 expected = jsonify([
906 repo.get_api_data()
923 repo.get_api_data()
907 for repo in Repository.query()
924 for repo in Repository.query()
908 ])
925 ])
909
926
910 self._compare_ok(id_, expected, given=response.body)
927 self._compare_ok(id_, expected, given=response.body)
911
928
912 def test_api_get_repos_non_admin(self):
929 def test_api_get_repos_non_admin(self):
913 id_, params = _build_data(self.apikey_regular, 'get_repos')
930 id_, params = _build_data(self.apikey_regular, 'get_repos')
914 response = api_call(self, params)
931 response = api_call(self, params)
915
932
916 expected = jsonify([
933 expected = jsonify([
917 repo.get_api_data()
934 repo.get_api_data()
918 for repo in RepoModel().get_all_user_repos(self.TEST_USER_LOGIN)
935 for repo in RepoModel().get_all_user_repos(self.TEST_USER_LOGIN)
919 ])
936 ])
920
937
921 self._compare_ok(id_, expected, given=response.body)
938 self._compare_ok(id_, expected, given=response.body)
922
939
923 @parametrize('name,ret_type', [
940 @parametrize('name,ret_type', [
924 ('all', 'all'),
941 ('all', 'all'),
925 ('dirs', 'dirs'),
942 ('dirs', 'dirs'),
926 ('files', 'files'),
943 ('files', 'files'),
927 ])
944 ])
928 def test_api_get_repo_nodes(self, name, ret_type):
945 def test_api_get_repo_nodes(self, name, ret_type):
929 rev = 'tip'
946 rev = 'tip'
930 path = '/'
947 path = '/'
931 id_, params = _build_data(self.apikey, 'get_repo_nodes',
948 id_, params = _build_data(self.apikey, 'get_repo_nodes',
932 repoid=self.REPO, revision=rev,
949 repoid=self.REPO, revision=rev,
933 root_path=path,
950 root_path=path,
934 ret_type=ret_type)
951 ret_type=ret_type)
935 response = api_call(self, params)
952 response = api_call(self, params)
936
953
937 # we don't the actual return types here since it's tested somewhere
954 # we don't the actual return types here since it's tested somewhere
938 # else
955 # else
939 expected = response.json['result']
956 expected = response.json['result']
940 self._compare_ok(id_, expected, given=response.body)
957 self._compare_ok(id_, expected, given=response.body)
941
958
942 def test_api_get_repo_nodes_bad_revisions(self):
959 def test_api_get_repo_nodes_bad_revisions(self):
943 rev = 'i-dont-exist'
960 rev = 'i-dont-exist'
944 path = '/'
961 path = '/'
945 id_, params = _build_data(self.apikey, 'get_repo_nodes',
962 id_, params = _build_data(self.apikey, 'get_repo_nodes',
946 repoid=self.REPO, revision=rev,
963 repoid=self.REPO, revision=rev,
947 root_path=path, )
964 root_path=path, )
948 response = api_call(self, params)
965 response = api_call(self, params)
949
966
950 expected = 'failed to get repo: `%s` nodes' % self.REPO
967 expected = 'failed to get repo: `%s` nodes' % self.REPO
951 self._compare_error(id_, expected, given=response.body)
968 self._compare_error(id_, expected, given=response.body)
952
969
953 def test_api_get_repo_nodes_bad_path(self):
970 def test_api_get_repo_nodes_bad_path(self):
954 rev = 'tip'
971 rev = 'tip'
955 path = '/idontexits'
972 path = '/idontexits'
956 id_, params = _build_data(self.apikey, 'get_repo_nodes',
973 id_, params = _build_data(self.apikey, 'get_repo_nodes',
957 repoid=self.REPO, revision=rev,
974 repoid=self.REPO, revision=rev,
958 root_path=path, )
975 root_path=path, )
959 response = api_call(self, params)
976 response = api_call(self, params)
960
977
961 expected = 'failed to get repo: `%s` nodes' % self.REPO
978 expected = 'failed to get repo: `%s` nodes' % self.REPO
962 self._compare_error(id_, expected, given=response.body)
979 self._compare_error(id_, expected, given=response.body)
963
980
964 def test_api_get_repo_nodes_bad_ret_type(self):
981 def test_api_get_repo_nodes_bad_ret_type(self):
965 rev = 'tip'
982 rev = 'tip'
966 path = '/'
983 path = '/'
967 ret_type = 'error'
984 ret_type = 'error'
968 id_, params = _build_data(self.apikey, 'get_repo_nodes',
985 id_, params = _build_data(self.apikey, 'get_repo_nodes',
969 repoid=self.REPO, revision=rev,
986 repoid=self.REPO, revision=rev,
970 root_path=path,
987 root_path=path,
971 ret_type=ret_type)
988 ret_type=ret_type)
972 response = api_call(self, params)
989 response = api_call(self, params)
973
990
974 expected = ('ret_type must be one of %s'
991 expected = ('ret_type must be one of %s'
975 % (','.join(['files', 'dirs', 'all'])))
992 % (','.join(['files', 'dirs', 'all'])))
976 self._compare_error(id_, expected, given=response.body)
993 self._compare_error(id_, expected, given=response.body)
977
994
978 @parametrize('name,ret_type,grant_perm', [
995 @parametrize('name,ret_type,grant_perm', [
979 ('all', 'all', 'repository.write'),
996 ('all', 'all', 'repository.write'),
980 ('dirs', 'dirs', 'repository.admin'),
997 ('dirs', 'dirs', 'repository.admin'),
981 ('files', 'files', 'repository.read'),
998 ('files', 'files', 'repository.read'),
982 ])
999 ])
983 def test_api_get_repo_nodes_by_regular_user(self, name, ret_type, grant_perm):
1000 def test_api_get_repo_nodes_by_regular_user(self, name, ret_type, grant_perm):
984 RepoModel().grant_user_permission(repo=self.REPO,
1001 RepoModel().grant_user_permission(repo=self.REPO,
985 user=self.TEST_USER_LOGIN,
1002 user=self.TEST_USER_LOGIN,
986 perm=grant_perm)
1003 perm=grant_perm)
987 Session().commit()
1004 Session().commit()
988
1005
989 rev = 'tip'
1006 rev = 'tip'
990 path = '/'
1007 path = '/'
991 id_, params = _build_data(self.apikey_regular, 'get_repo_nodes',
1008 id_, params = _build_data(self.apikey_regular, 'get_repo_nodes',
992 repoid=self.REPO, revision=rev,
1009 repoid=self.REPO, revision=rev,
993 root_path=path,
1010 root_path=path,
994 ret_type=ret_type)
1011 ret_type=ret_type)
995 response = api_call(self, params)
1012 response = api_call(self, params)
996
1013
997 # we don't the actual return types here since it's tested somewhere
1014 # we don't the actual return types here since it's tested somewhere
998 # else
1015 # else
999 expected = response.json['result']
1016 expected = response.json['result']
1000 try:
1017 try:
1001 self._compare_ok(id_, expected, given=response.body)
1018 self._compare_ok(id_, expected, given=response.body)
1002 finally:
1019 finally:
1003 RepoModel().revoke_user_permission(self.REPO, self.TEST_USER_LOGIN)
1020 RepoModel().revoke_user_permission(self.REPO, self.TEST_USER_LOGIN)
1004
1021
1005 def test_api_create_repo(self):
1022 def test_api_create_repo(self):
1006 repo_name = u'api-repo'
1023 repo_name = u'api-repo'
1007 id_, params = _build_data(self.apikey, 'create_repo',
1024 id_, params = _build_data(self.apikey, 'create_repo',
1008 repo_name=repo_name,
1025 repo_name=repo_name,
1009 owner=TEST_USER_ADMIN_LOGIN,
1026 owner=TEST_USER_ADMIN_LOGIN,
1010 repo_type=self.REPO_TYPE,
1027 repo_type=self.REPO_TYPE,
1011 )
1028 )
1012 response = api_call(self, params)
1029 response = api_call(self, params)
1013
1030
1014 repo = RepoModel().get_by_repo_name(repo_name)
1031 repo = RepoModel().get_by_repo_name(repo_name)
1015 assert repo is not None
1032 assert repo is not None
1016 ret = {
1033 ret = {
1017 'msg': 'Created new repository `%s`' % repo_name,
1034 'msg': 'Created new repository `%s`' % repo_name,
1018 'success': True,
1035 'success': True,
1019 'task': None,
1036 'task': None,
1020 }
1037 }
1021 expected = ret
1038 expected = ret
1022 self._compare_ok(id_, expected, given=response.body)
1039 self._compare_ok(id_, expected, given=response.body)
1023 fixture.destroy_repo(repo_name)
1040 fixture.destroy_repo(repo_name)
1024
1041
1025 def test_api_create_repo_and_repo_group(self):
1042 def test_api_create_repo_and_repo_group(self):
1026 repo_name = u'my_gr/api-repo'
1043 repo_name = u'my_gr/api-repo'
1027 id_, params = _build_data(self.apikey, 'create_repo',
1044 id_, params = _build_data(self.apikey, 'create_repo',
1028 repo_name=repo_name,
1045 repo_name=repo_name,
1029 owner=TEST_USER_ADMIN_LOGIN,
1046 owner=TEST_USER_ADMIN_LOGIN,
1030 repo_type=self.REPO_TYPE,)
1047 repo_type=self.REPO_TYPE,)
1031 response = api_call(self, params)
1048 response = api_call(self, params)
1032 print params
1049 print params
1033 repo = RepoModel().get_by_repo_name(repo_name)
1050 repo = RepoModel().get_by_repo_name(repo_name)
1034 assert repo is not None
1051 assert repo is not None
1035 ret = {
1052 ret = {
1036 'msg': 'Created new repository `%s`' % repo_name,
1053 'msg': 'Created new repository `%s`' % repo_name,
1037 'success': True,
1054 'success': True,
1038 'task': None,
1055 'task': None,
1039 }
1056 }
1040 expected = ret
1057 expected = ret
1041 self._compare_ok(id_, expected, given=response.body)
1058 self._compare_ok(id_, expected, given=response.body)
1042 fixture.destroy_repo(repo_name)
1059 fixture.destroy_repo(repo_name)
1043 fixture.destroy_repo_group(u'my_gr')
1060 fixture.destroy_repo_group(u'my_gr')
1044
1061
1045 def test_api_create_repo_in_repo_group_without_permission(self):
1062 def test_api_create_repo_in_repo_group_without_permission(self):
1046 repo_group_name = u'%s/api-repo-repo' % TEST_REPO_GROUP
1063 repo_group_name = u'%s/api-repo-repo' % TEST_REPO_GROUP
1047 repo_name = u'%s/api-repo' % repo_group_name
1064 repo_name = u'%s/api-repo' % repo_group_name
1048
1065
1049 rg = fixture.create_repo_group(repo_group_name)
1066 rg = fixture.create_repo_group(repo_group_name)
1050 Session().commit()
1067 Session().commit()
1051 RepoGroupModel().grant_user_permission(repo_group_name,
1068 RepoGroupModel().grant_user_permission(repo_group_name,
1052 self.TEST_USER_LOGIN,
1069 self.TEST_USER_LOGIN,
1053 'group.none')
1070 'group.none')
1054 Session().commit()
1071 Session().commit()
1055
1072
1056 id_, params = _build_data(self.apikey_regular, 'create_repo',
1073 id_, params = _build_data(self.apikey_regular, 'create_repo',
1057 repo_name=repo_name,
1074 repo_name=repo_name,
1058 repo_type=self.REPO_TYPE,
1075 repo_type=self.REPO_TYPE,
1059 )
1076 )
1060 response = api_call(self, params)
1077 response = api_call(self, params)
1061
1078
1062 # Current result when API access control is different from Web:
1079 # Current result when API access control is different from Web:
1063 ret = {
1080 ret = {
1064 'msg': 'Created new repository `%s`' % repo_name,
1081 'msg': 'Created new repository `%s`' % repo_name,
1065 'success': True,
1082 'success': True,
1066 'task': None,
1083 'task': None,
1067 }
1084 }
1068 expected = ret
1085 expected = ret
1069 self._compare_ok(id_, expected, given=response.body)
1086 self._compare_ok(id_, expected, given=response.body)
1070 fixture.destroy_repo(repo_name)
1087 fixture.destroy_repo(repo_name)
1071
1088
1072 # Expected and arguably more correct result:
1089 # Expected and arguably more correct result:
1073 #expected = 'failed to create repository `%s`' % repo_name
1090 #expected = 'failed to create repository `%s`' % repo_name
1074 #self._compare_error(id_, expected, given=response.body)
1091 #self._compare_error(id_, expected, given=response.body)
1075
1092
1076 fixture.destroy_repo_group(repo_group_name)
1093 fixture.destroy_repo_group(repo_group_name)
1077
1094
1078 def test_api_create_repo_unknown_owner(self):
1095 def test_api_create_repo_unknown_owner(self):
1079 repo_name = u'api-repo'
1096 repo_name = u'api-repo'
1080 owner = 'i-dont-exist'
1097 owner = 'i-dont-exist'
1081 id_, params = _build_data(self.apikey, 'create_repo',
1098 id_, params = _build_data(self.apikey, 'create_repo',
1082 repo_name=repo_name,
1099 repo_name=repo_name,
1083 owner=owner,
1100 owner=owner,
1084 repo_type=self.REPO_TYPE,
1101 repo_type=self.REPO_TYPE,
1085 )
1102 )
1086 response = api_call(self, params)
1103 response = api_call(self, params)
1087 expected = 'user `%s` does not exist' % owner
1104 expected = 'user `%s` does not exist' % owner
1088 self._compare_error(id_, expected, given=response.body)
1105 self._compare_error(id_, expected, given=response.body)
1089
1106
1090 def test_api_create_repo_dont_specify_owner(self):
1107 def test_api_create_repo_dont_specify_owner(self):
1091 repo_name = u'api-repo'
1108 repo_name = u'api-repo'
1092 owner = 'i-dont-exist'
1109 owner = 'i-dont-exist'
1093 id_, params = _build_data(self.apikey, 'create_repo',
1110 id_, params = _build_data(self.apikey, 'create_repo',
1094 repo_name=repo_name,
1111 repo_name=repo_name,
1095 repo_type=self.REPO_TYPE,
1112 repo_type=self.REPO_TYPE,
1096 )
1113 )
1097 response = api_call(self, params)
1114 response = api_call(self, params)
1098
1115
1099 repo = RepoModel().get_by_repo_name(repo_name)
1116 repo = RepoModel().get_by_repo_name(repo_name)
1100 assert repo is not None
1117 assert repo is not None
1101 ret = {
1118 ret = {
1102 'msg': 'Created new repository `%s`' % repo_name,
1119 'msg': 'Created new repository `%s`' % repo_name,
1103 'success': True,
1120 'success': True,
1104 'task': None,
1121 'task': None,
1105 }
1122 }
1106 expected = ret
1123 expected = ret
1107 self._compare_ok(id_, expected, given=response.body)
1124 self._compare_ok(id_, expected, given=response.body)
1108 fixture.destroy_repo(repo_name)
1125 fixture.destroy_repo(repo_name)
1109
1126
1110 def test_api_create_repo_by_non_admin(self):
1127 def test_api_create_repo_by_non_admin(self):
1111 repo_name = u'api-repo'
1128 repo_name = u'api-repo'
1112 owner = 'i-dont-exist'
1129 owner = 'i-dont-exist'
1113 id_, params = _build_data(self.apikey_regular, 'create_repo',
1130 id_, params = _build_data(self.apikey_regular, 'create_repo',
1114 repo_name=repo_name,
1131 repo_name=repo_name,
1115 repo_type=self.REPO_TYPE,
1132 repo_type=self.REPO_TYPE,
1116 )
1133 )
1117 response = api_call(self, params)
1134 response = api_call(self, params)
1118
1135
1119 repo = RepoModel().get_by_repo_name(repo_name)
1136 repo = RepoModel().get_by_repo_name(repo_name)
1120 assert repo is not None
1137 assert repo is not None
1121 ret = {
1138 ret = {
1122 'msg': 'Created new repository `%s`' % repo_name,
1139 'msg': 'Created new repository `%s`' % repo_name,
1123 'success': True,
1140 'success': True,
1124 'task': None,
1141 'task': None,
1125 }
1142 }
1126 expected = ret
1143 expected = ret
1127 self._compare_ok(id_, expected, given=response.body)
1144 self._compare_ok(id_, expected, given=response.body)
1128 fixture.destroy_repo(repo_name)
1145 fixture.destroy_repo(repo_name)
1129
1146
1130 def test_api_create_repo_by_non_admin_specify_owner(self):
1147 def test_api_create_repo_by_non_admin_specify_owner(self):
1131 repo_name = u'api-repo'
1148 repo_name = u'api-repo'
1132 owner = 'i-dont-exist'
1149 owner = 'i-dont-exist'
1133 id_, params = _build_data(self.apikey_regular, 'create_repo',
1150 id_, params = _build_data(self.apikey_regular, 'create_repo',
1134 repo_name=repo_name,
1151 repo_name=repo_name,
1135 repo_type=self.REPO_TYPE,
1152 repo_type=self.REPO_TYPE,
1136 owner=owner)
1153 owner=owner)
1137 response = api_call(self, params)
1154 response = api_call(self, params)
1138
1155
1139 expected = 'Only Kallithea admin can specify `owner` param'
1156 expected = 'Only Kallithea admin can specify `owner` param'
1140 self._compare_error(id_, expected, given=response.body)
1157 self._compare_error(id_, expected, given=response.body)
1141 fixture.destroy_repo(repo_name)
1158 fixture.destroy_repo(repo_name)
1142
1159
1143 def test_api_create_repo_exists(self):
1160 def test_api_create_repo_exists(self):
1144 repo_name = self.REPO
1161 repo_name = self.REPO
1145 id_, params = _build_data(self.apikey, 'create_repo',
1162 id_, params = _build_data(self.apikey, 'create_repo',
1146 repo_name=repo_name,
1163 repo_name=repo_name,
1147 owner=TEST_USER_ADMIN_LOGIN,
1164 owner=TEST_USER_ADMIN_LOGIN,
1148 repo_type=self.REPO_TYPE,)
1165 repo_type=self.REPO_TYPE,)
1149 response = api_call(self, params)
1166 response = api_call(self, params)
1150 expected = "repo `%s` already exist" % repo_name
1167 expected = "repo `%s` already exist" % repo_name
1151 self._compare_error(id_, expected, given=response.body)
1168 self._compare_error(id_, expected, given=response.body)
1152
1169
1153 @mock.patch.object(RepoModel, 'create', crash)
1170 @mock.patch.object(RepoModel, 'create', crash)
1154 def test_api_create_repo_exception_occurred(self):
1171 def test_api_create_repo_exception_occurred(self):
1155 repo_name = u'api-repo'
1172 repo_name = u'api-repo'
1156 id_, params = _build_data(self.apikey, 'create_repo',
1173 id_, params = _build_data(self.apikey, 'create_repo',
1157 repo_name=repo_name,
1174 repo_name=repo_name,
1158 owner=TEST_USER_ADMIN_LOGIN,
1175 owner=TEST_USER_ADMIN_LOGIN,
1159 repo_type=self.REPO_TYPE,)
1176 repo_type=self.REPO_TYPE,)
1160 response = api_call(self, params)
1177 response = api_call(self, params)
1161 expected = 'failed to create repository `%s`' % repo_name
1178 expected = 'failed to create repository `%s`' % repo_name
1162 self._compare_error(id_, expected, given=response.body)
1179 self._compare_error(id_, expected, given=response.body)
1163
1180
1164 @parametrize('changing_attr,updates', [
1181 @parametrize('changing_attr,updates', [
1165 ('owner', {'owner': TEST_USER_REGULAR_LOGIN}),
1182 ('owner', {'owner': TEST_USER_REGULAR_LOGIN}),
1166 ('description', {'description': u'new description'}),
1183 ('description', {'description': u'new description'}),
1167 ('clone_uri', {'clone_uri': 'http://example.com/repo'}),
1184 ('clone_uri', {'clone_uri': 'http://example.com/repo'}),
1168 ('clone_uri', {'clone_uri': None}),
1185 ('clone_uri', {'clone_uri': None}),
1169 ('landing_rev', {'landing_rev': 'branch:master'}),
1186 ('landing_rev', {'landing_rev': 'branch:master'}),
1170 ('enable_statistics', {'enable_statistics': True}),
1187 ('enable_statistics', {'enable_statistics': True}),
1171 ('enable_locking', {'enable_locking': True}),
1188 ('enable_locking', {'enable_locking': True}),
1172 ('enable_downloads', {'enable_downloads': True}),
1189 ('enable_downloads', {'enable_downloads': True}),
1173 ('name', {'name': u'new_repo_name'}),
1190 ('name', {'name': u'new_repo_name'}),
1174 ('repo_group', {'group': u'test_group_for_update'}),
1191 ('repo_group', {'group': u'test_group_for_update'}),
1175 ])
1192 ])
1176 def test_api_update_repo(self, changing_attr, updates):
1193 def test_api_update_repo(self, changing_attr, updates):
1177 repo_name = u'api_update_me'
1194 repo_name = u'api_update_me'
1178 repo = fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
1195 repo = fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
1179 if changing_attr == 'repo_group':
1196 if changing_attr == 'repo_group':
1180 fixture.create_repo_group(updates['group'])
1197 fixture.create_repo_group(updates['group'])
1181
1198
1182 id_, params = _build_data(self.apikey, 'update_repo',
1199 id_, params = _build_data(self.apikey, 'update_repo',
1183 repoid=repo_name, **updates)
1200 repoid=repo_name, **updates)
1184 response = api_call(self, params)
1201 response = api_call(self, params)
1185 if changing_attr == 'name':
1202 if changing_attr == 'name':
1186 repo_name = updates['name']
1203 repo_name = updates['name']
1187 if changing_attr == 'repo_group':
1204 if changing_attr == 'repo_group':
1188 repo_name = u'/'.join([updates['group'], repo_name])
1205 repo_name = u'/'.join([updates['group'], repo_name])
1189 try:
1206 try:
1190 expected = {
1207 expected = {
1191 'msg': 'updated repo ID:%s %s' % (repo.repo_id, repo_name),
1208 'msg': 'updated repo ID:%s %s' % (repo.repo_id, repo_name),
1192 'repository': repo.get_api_data()
1209 'repository': repo.get_api_data()
1193 }
1210 }
1194 self._compare_ok(id_, expected, given=response.body)
1211 self._compare_ok(id_, expected, given=response.body)
1195 finally:
1212 finally:
1196 fixture.destroy_repo(repo_name)
1213 fixture.destroy_repo(repo_name)
1197 if changing_attr == 'repo_group':
1214 if changing_attr == 'repo_group':
1198 fixture.destroy_repo_group(updates['group'])
1215 fixture.destroy_repo_group(updates['group'])
1199
1216
1200 @parametrize('changing_attr,updates', [
1217 @parametrize('changing_attr,updates', [
1201 ('owner', {'owner': TEST_USER_REGULAR_LOGIN}),
1218 ('owner', {'owner': TEST_USER_REGULAR_LOGIN}),
1202 ('description', {'description': u'new description'}),
1219 ('description', {'description': u'new description'}),
1203 ('clone_uri', {'clone_uri': 'http://example.com/repo'}),
1220 ('clone_uri', {'clone_uri': 'http://example.com/repo'}),
1204 ('clone_uri', {'clone_uri': None}),
1221 ('clone_uri', {'clone_uri': None}),
1205 ('landing_rev', {'landing_rev': 'branch:master'}),
1222 ('landing_rev', {'landing_rev': 'branch:master'}),
1206 ('enable_statistics', {'enable_statistics': True}),
1223 ('enable_statistics', {'enable_statistics': True}),
1207 ('enable_locking', {'enable_locking': True}),
1224 ('enable_locking', {'enable_locking': True}),
1208 ('enable_downloads', {'enable_downloads': True}),
1225 ('enable_downloads', {'enable_downloads': True}),
1209 ('name', {'name': u'new_repo_name'}),
1226 ('name', {'name': u'new_repo_name'}),
1210 ('repo_group', {'group': u'test_group_for_update'}),
1227 ('repo_group', {'group': u'test_group_for_update'}),
1211 ])
1228 ])
1212 def test_api_update_group_repo(self, changing_attr, updates):
1229 def test_api_update_group_repo(self, changing_attr, updates):
1213 group_name = u'lololo'
1230 group_name = u'lololo'
1214 fixture.create_repo_group(group_name)
1231 fixture.create_repo_group(group_name)
1215 repo_name = u'%s/api_update_me' % group_name
1232 repo_name = u'%s/api_update_me' % group_name
1216 repo = fixture.create_repo(repo_name, repo_group=group_name, repo_type=self.REPO_TYPE)
1233 repo = fixture.create_repo(repo_name, repo_group=group_name, repo_type=self.REPO_TYPE)
1217 if changing_attr == 'repo_group':
1234 if changing_attr == 'repo_group':
1218 fixture.create_repo_group(updates['group'])
1235 fixture.create_repo_group(updates['group'])
1219
1236
1220 id_, params = _build_data(self.apikey, 'update_repo',
1237 id_, params = _build_data(self.apikey, 'update_repo',
1221 repoid=repo_name, **updates)
1238 repoid=repo_name, **updates)
1222 response = api_call(self, params)
1239 response = api_call(self, params)
1223 if changing_attr == 'name':
1240 if changing_attr == 'name':
1224 repo_name = u'%s/%s' % (group_name, updates['name'])
1241 repo_name = u'%s/%s' % (group_name, updates['name'])
1225 if changing_attr == 'repo_group':
1242 if changing_attr == 'repo_group':
1226 repo_name = u'/'.join([updates['group'], repo_name.rsplit('/', 1)[-1]])
1243 repo_name = u'/'.join([updates['group'], repo_name.rsplit('/', 1)[-1]])
1227 try:
1244 try:
1228 expected = {
1245 expected = {
1229 'msg': 'updated repo ID:%s %s' % (repo.repo_id, repo_name),
1246 'msg': 'updated repo ID:%s %s' % (repo.repo_id, repo_name),
1230 'repository': repo.get_api_data()
1247 'repository': repo.get_api_data()
1231 }
1248 }
1232 self._compare_ok(id_, expected, given=response.body)
1249 self._compare_ok(id_, expected, given=response.body)
1233 finally:
1250 finally:
1234 fixture.destroy_repo(repo_name)
1251 fixture.destroy_repo(repo_name)
1235 if changing_attr == 'repo_group':
1252 if changing_attr == 'repo_group':
1236 fixture.destroy_repo_group(updates['group'])
1253 fixture.destroy_repo_group(updates['group'])
1237 fixture.destroy_repo_group(group_name)
1254 fixture.destroy_repo_group(group_name)
1238
1255
1239 def test_api_update_repo_repo_group_does_not_exist(self):
1256 def test_api_update_repo_repo_group_does_not_exist(self):
1240 repo_name = u'admin_owned'
1257 repo_name = u'admin_owned'
1241 fixture.create_repo(repo_name)
1258 fixture.create_repo(repo_name)
1242 updates = {'group': 'test_group_for_update'}
1259 updates = {'group': 'test_group_for_update'}
1243 id_, params = _build_data(self.apikey, 'update_repo',
1260 id_, params = _build_data(self.apikey, 'update_repo',
1244 repoid=repo_name, **updates)
1261 repoid=repo_name, **updates)
1245 response = api_call(self, params)
1262 response = api_call(self, params)
1246 try:
1263 try:
1247 expected = 'repository group `%s` does not exist' % updates['group']
1264 expected = 'repository group `%s` does not exist' % updates['group']
1248 self._compare_error(id_, expected, given=response.body)
1265 self._compare_error(id_, expected, given=response.body)
1249 finally:
1266 finally:
1250 fixture.destroy_repo(repo_name)
1267 fixture.destroy_repo(repo_name)
1251
1268
1252 def test_api_update_repo_regular_user_not_allowed(self):
1269 def test_api_update_repo_regular_user_not_allowed(self):
1253 repo_name = u'admin_owned'
1270 repo_name = u'admin_owned'
1254 fixture.create_repo(repo_name)
1271 fixture.create_repo(repo_name)
1255 updates = {'description': 'something else'}
1272 updates = {'description': 'something else'}
1256 id_, params = _build_data(self.apikey_regular, 'update_repo',
1273 id_, params = _build_data(self.apikey_regular, 'update_repo',
1257 repoid=repo_name, **updates)
1274 repoid=repo_name, **updates)
1258 response = api_call(self, params)
1275 response = api_call(self, params)
1259 try:
1276 try:
1260 expected = 'repository `%s` does not exist' % repo_name
1277 expected = 'repository `%s` does not exist' % repo_name
1261 self._compare_error(id_, expected, given=response.body)
1278 self._compare_error(id_, expected, given=response.body)
1262 finally:
1279 finally:
1263 fixture.destroy_repo(repo_name)
1280 fixture.destroy_repo(repo_name)
1264
1281
1265 @mock.patch.object(RepoModel, 'update', crash)
1282 @mock.patch.object(RepoModel, 'update', crash)
1266 def test_api_update_repo_exception_occurred(self):
1283 def test_api_update_repo_exception_occurred(self):
1267 repo_name = u'api_update_me'
1284 repo_name = u'api_update_me'
1268 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
1285 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
1269 id_, params = _build_data(self.apikey, 'update_repo',
1286 id_, params = _build_data(self.apikey, 'update_repo',
1270 repoid=repo_name, owner=TEST_USER_ADMIN_LOGIN,)
1287 repoid=repo_name, owner=TEST_USER_ADMIN_LOGIN,)
1271 response = api_call(self, params)
1288 response = api_call(self, params)
1272 try:
1289 try:
1273 expected = 'failed to update repo `%s`' % repo_name
1290 expected = 'failed to update repo `%s`' % repo_name
1274 self._compare_error(id_, expected, given=response.body)
1291 self._compare_error(id_, expected, given=response.body)
1275 finally:
1292 finally:
1276 fixture.destroy_repo(repo_name)
1293 fixture.destroy_repo(repo_name)
1277
1294
1278 def test_api_update_repo_regular_user_change_repo_name(self):
1295 def test_api_update_repo_regular_user_change_repo_name(self):
1279 repo_name = u'admin_owned'
1296 repo_name = u'admin_owned'
1280 new_repo_name = u'new_repo_name'
1297 new_repo_name = u'new_repo_name'
1281 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
1298 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
1282 RepoModel().grant_user_permission(repo=repo_name,
1299 RepoModel().grant_user_permission(repo=repo_name,
1283 user=self.TEST_USER_LOGIN,
1300 user=self.TEST_USER_LOGIN,
1284 perm='repository.admin')
1301 perm='repository.admin')
1285 UserModel().revoke_perm('default', 'hg.create.repository')
1302 UserModel().revoke_perm('default', 'hg.create.repository')
1286 UserModel().grant_perm('default', 'hg.create.none')
1303 UserModel().grant_perm('default', 'hg.create.none')
1287 updates = {'name': new_repo_name}
1304 updates = {'name': new_repo_name}
1288 id_, params = _build_data(self.apikey_regular, 'update_repo',
1305 id_, params = _build_data(self.apikey_regular, 'update_repo',
1289 repoid=repo_name, **updates)
1306 repoid=repo_name, **updates)
1290 response = api_call(self, params)
1307 response = api_call(self, params)
1291 try:
1308 try:
1292 expected = 'no permission to create (or move) repositories'
1309 expected = 'no permission to create (or move) repositories'
1293 self._compare_error(id_, expected, given=response.body)
1310 self._compare_error(id_, expected, given=response.body)
1294 finally:
1311 finally:
1295 fixture.destroy_repo(repo_name)
1312 fixture.destroy_repo(repo_name)
1296 fixture.destroy_repo(new_repo_name)
1313 fixture.destroy_repo(new_repo_name)
1297
1314
1298 def test_api_update_repo_regular_user_change_repo_name_allowed(self):
1315 def test_api_update_repo_regular_user_change_repo_name_allowed(self):
1299 repo_name = u'admin_owned'
1316 repo_name = u'admin_owned'
1300 new_repo_name = u'new_repo_name'
1317 new_repo_name = u'new_repo_name'
1301 repo = fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
1318 repo = fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
1302 RepoModel().grant_user_permission(repo=repo_name,
1319 RepoModel().grant_user_permission(repo=repo_name,
1303 user=self.TEST_USER_LOGIN,
1320 user=self.TEST_USER_LOGIN,
1304 perm='repository.admin')
1321 perm='repository.admin')
1305 UserModel().revoke_perm('default', 'hg.create.none')
1322 UserModel().revoke_perm('default', 'hg.create.none')
1306 UserModel().grant_perm('default', 'hg.create.repository')
1323 UserModel().grant_perm('default', 'hg.create.repository')
1307 updates = {'name': new_repo_name}
1324 updates = {'name': new_repo_name}
1308 id_, params = _build_data(self.apikey_regular, 'update_repo',
1325 id_, params = _build_data(self.apikey_regular, 'update_repo',
1309 repoid=repo_name, **updates)
1326 repoid=repo_name, **updates)
1310 response = api_call(self, params)
1327 response = api_call(self, params)
1311 try:
1328 try:
1312 expected = {
1329 expected = {
1313 'msg': 'updated repo ID:%s %s' % (repo.repo_id, new_repo_name),
1330 'msg': 'updated repo ID:%s %s' % (repo.repo_id, new_repo_name),
1314 'repository': repo.get_api_data()
1331 'repository': repo.get_api_data()
1315 }
1332 }
1316 self._compare_ok(id_, expected, given=response.body)
1333 self._compare_ok(id_, expected, given=response.body)
1317 finally:
1334 finally:
1318 fixture.destroy_repo(repo_name)
1335 fixture.destroy_repo(repo_name)
1319 fixture.destroy_repo(new_repo_name)
1336 fixture.destroy_repo(new_repo_name)
1320
1337
1321 def test_api_update_repo_regular_user_change_owner(self):
1338 def test_api_update_repo_regular_user_change_owner(self):
1322 repo_name = u'admin_owned'
1339 repo_name = u'admin_owned'
1323 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
1340 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
1324 RepoModel().grant_user_permission(repo=repo_name,
1341 RepoModel().grant_user_permission(repo=repo_name,
1325 user=self.TEST_USER_LOGIN,
1342 user=self.TEST_USER_LOGIN,
1326 perm='repository.admin')
1343 perm='repository.admin')
1327 updates = {'owner': TEST_USER_ADMIN_LOGIN}
1344 updates = {'owner': TEST_USER_ADMIN_LOGIN}
1328 id_, params = _build_data(self.apikey_regular, 'update_repo',
1345 id_, params = _build_data(self.apikey_regular, 'update_repo',
1329 repoid=repo_name, **updates)
1346 repoid=repo_name, **updates)
1330 response = api_call(self, params)
1347 response = api_call(self, params)
1331 try:
1348 try:
1332 expected = 'Only Kallithea admin can specify `owner` param'
1349 expected = 'Only Kallithea admin can specify `owner` param'
1333 self._compare_error(id_, expected, given=response.body)
1350 self._compare_error(id_, expected, given=response.body)
1334 finally:
1351 finally:
1335 fixture.destroy_repo(repo_name)
1352 fixture.destroy_repo(repo_name)
1336
1353
1337 def test_api_delete_repo(self):
1354 def test_api_delete_repo(self):
1338 repo_name = u'api_delete_me'
1355 repo_name = u'api_delete_me'
1339 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
1356 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
1340
1357
1341 id_, params = _build_data(self.apikey, 'delete_repo',
1358 id_, params = _build_data(self.apikey, 'delete_repo',
1342 repoid=repo_name, )
1359 repoid=repo_name, )
1343 response = api_call(self, params)
1360 response = api_call(self, params)
1344
1361
1345 ret = {
1362 ret = {
1346 'msg': 'Deleted repository `%s`' % repo_name,
1363 'msg': 'Deleted repository `%s`' % repo_name,
1347 'success': True
1364 'success': True
1348 }
1365 }
1349 try:
1366 try:
1350 expected = ret
1367 expected = ret
1351 self._compare_ok(id_, expected, given=response.body)
1368 self._compare_ok(id_, expected, given=response.body)
1352 finally:
1369 finally:
1353 fixture.destroy_repo(repo_name)
1370 fixture.destroy_repo(repo_name)
1354
1371
1355 def test_api_delete_repo_by_non_admin(self):
1372 def test_api_delete_repo_by_non_admin(self):
1356 repo_name = u'api_delete_me'
1373 repo_name = u'api_delete_me'
1357 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE,
1374 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE,
1358 cur_user=self.TEST_USER_LOGIN)
1375 cur_user=self.TEST_USER_LOGIN)
1359 id_, params = _build_data(self.apikey_regular, 'delete_repo',
1376 id_, params = _build_data(self.apikey_regular, 'delete_repo',
1360 repoid=repo_name, )
1377 repoid=repo_name, )
1361 response = api_call(self, params)
1378 response = api_call(self, params)
1362
1379
1363 ret = {
1380 ret = {
1364 'msg': 'Deleted repository `%s`' % repo_name,
1381 'msg': 'Deleted repository `%s`' % repo_name,
1365 'success': True
1382 'success': True
1366 }
1383 }
1367 try:
1384 try:
1368 expected = ret
1385 expected = ret
1369 self._compare_ok(id_, expected, given=response.body)
1386 self._compare_ok(id_, expected, given=response.body)
1370 finally:
1387 finally:
1371 fixture.destroy_repo(repo_name)
1388 fixture.destroy_repo(repo_name)
1372
1389
1373 def test_api_delete_repo_by_non_admin_no_permission(self):
1390 def test_api_delete_repo_by_non_admin_no_permission(self):
1374 repo_name = u'api_delete_me'
1391 repo_name = u'api_delete_me'
1375 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
1392 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
1376 try:
1393 try:
1377 id_, params = _build_data(self.apikey_regular, 'delete_repo',
1394 id_, params = _build_data(self.apikey_regular, 'delete_repo',
1378 repoid=repo_name, )
1395 repoid=repo_name, )
1379 response = api_call(self, params)
1396 response = api_call(self, params)
1380 expected = 'repository `%s` does not exist' % (repo_name)
1397 expected = 'repository `%s` does not exist' % (repo_name)
1381 self._compare_error(id_, expected, given=response.body)
1398 self._compare_error(id_, expected, given=response.body)
1382 finally:
1399 finally:
1383 fixture.destroy_repo(repo_name)
1400 fixture.destroy_repo(repo_name)
1384
1401
1385 def test_api_delete_repo_exception_occurred(self):
1402 def test_api_delete_repo_exception_occurred(self):
1386 repo_name = u'api_delete_me'
1403 repo_name = u'api_delete_me'
1387 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
1404 fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
1388 try:
1405 try:
1389 with mock.patch.object(RepoModel, 'delete', crash):
1406 with mock.patch.object(RepoModel, 'delete', crash):
1390 id_, params = _build_data(self.apikey, 'delete_repo',
1407 id_, params = _build_data(self.apikey, 'delete_repo',
1391 repoid=repo_name, )
1408 repoid=repo_name, )
1392 response = api_call(self, params)
1409 response = api_call(self, params)
1393
1410
1394 expected = 'failed to delete repository `%s`' % repo_name
1411 expected = 'failed to delete repository `%s`' % repo_name
1395 self._compare_error(id_, expected, given=response.body)
1412 self._compare_error(id_, expected, given=response.body)
1396 finally:
1413 finally:
1397 fixture.destroy_repo(repo_name)
1414 fixture.destroy_repo(repo_name)
1398
1415
1399 def test_api_fork_repo(self):
1416 def test_api_fork_repo(self):
1400 fork_name = u'api-repo-fork'
1417 fork_name = u'api-repo-fork'
1401 id_, params = _build_data(self.apikey, 'fork_repo',
1418 id_, params = _build_data(self.apikey, 'fork_repo',
1402 repoid=self.REPO,
1419 repoid=self.REPO,
1403 fork_name=fork_name,
1420 fork_name=fork_name,
1404 owner=TEST_USER_ADMIN_LOGIN,
1421 owner=TEST_USER_ADMIN_LOGIN,
1405 )
1422 )
1406 response = api_call(self, params)
1423 response = api_call(self, params)
1407
1424
1408 ret = {
1425 ret = {
1409 'msg': 'Created fork of `%s` as `%s`' % (self.REPO,
1426 'msg': 'Created fork of `%s` as `%s`' % (self.REPO,
1410 fork_name),
1427 fork_name),
1411 'success': True,
1428 'success': True,
1412 'task': None,
1429 'task': None,
1413 }
1430 }
1414 expected = ret
1431 expected = ret
1415 self._compare_ok(id_, expected, given=response.body)
1432 self._compare_ok(id_, expected, given=response.body)
1416 fixture.destroy_repo(fork_name)
1433 fixture.destroy_repo(fork_name)
1417
1434
1418 @parametrize('fork_name', [
1435 @parametrize('fork_name', [
1419 u'api-repo-fork',
1436 u'api-repo-fork',
1420 u'%s/api-repo-fork' % TEST_REPO_GROUP,
1437 u'%s/api-repo-fork' % TEST_REPO_GROUP,
1421 ])
1438 ])
1422 def test_api_fork_repo_non_admin(self, fork_name):
1439 def test_api_fork_repo_non_admin(self, fork_name):
1423 id_, params = _build_data(self.apikey_regular, 'fork_repo',
1440 id_, params = _build_data(self.apikey_regular, 'fork_repo',
1424 repoid=self.REPO,
1441 repoid=self.REPO,
1425 fork_name=fork_name,
1442 fork_name=fork_name,
1426 )
1443 )
1427 response = api_call(self, params)
1444 response = api_call(self, params)
1428
1445
1429 ret = {
1446 ret = {
1430 'msg': 'Created fork of `%s` as `%s`' % (self.REPO,
1447 'msg': 'Created fork of `%s` as `%s`' % (self.REPO,
1431 fork_name),
1448 fork_name),
1432 'success': True,
1449 'success': True,
1433 'task': None,
1450 'task': None,
1434 }
1451 }
1435 expected = ret
1452 expected = ret
1436 self._compare_ok(id_, expected, given=response.body)
1453 self._compare_ok(id_, expected, given=response.body)
1437 fixture.destroy_repo(fork_name)
1454 fixture.destroy_repo(fork_name)
1438
1455
1439 def test_api_fork_repo_non_admin_specify_owner(self):
1456 def test_api_fork_repo_non_admin_specify_owner(self):
1440 fork_name = u'api-repo-fork'
1457 fork_name = u'api-repo-fork'
1441 id_, params = _build_data(self.apikey_regular, 'fork_repo',
1458 id_, params = _build_data(self.apikey_regular, 'fork_repo',
1442 repoid=self.REPO,
1459 repoid=self.REPO,
1443 fork_name=fork_name,
1460 fork_name=fork_name,
1444 owner=TEST_USER_ADMIN_LOGIN,
1461 owner=TEST_USER_ADMIN_LOGIN,
1445 )
1462 )
1446 response = api_call(self, params)
1463 response = api_call(self, params)
1447 expected = 'Only Kallithea admin can specify `owner` param'
1464 expected = 'Only Kallithea admin can specify `owner` param'
1448 self._compare_error(id_, expected, given=response.body)
1465 self._compare_error(id_, expected, given=response.body)
1449 fixture.destroy_repo(fork_name)
1466 fixture.destroy_repo(fork_name)
1450
1467
1451 def test_api_fork_repo_non_admin_no_permission_to_fork(self):
1468 def test_api_fork_repo_non_admin_no_permission_to_fork(self):
1452 RepoModel().grant_user_permission(repo=self.REPO,
1469 RepoModel().grant_user_permission(repo=self.REPO,
1453 user=self.TEST_USER_LOGIN,
1470 user=self.TEST_USER_LOGIN,
1454 perm='repository.none')
1471 perm='repository.none')
1455 fork_name = u'api-repo-fork'
1472 fork_name = u'api-repo-fork'
1456 id_, params = _build_data(self.apikey_regular, 'fork_repo',
1473 id_, params = _build_data(self.apikey_regular, 'fork_repo',
1457 repoid=self.REPO,
1474 repoid=self.REPO,
1458 fork_name=fork_name,
1475 fork_name=fork_name,
1459 )
1476 )
1460 response = api_call(self, params)
1477 response = api_call(self, params)
1461 expected = 'repository `%s` does not exist' % (self.REPO)
1478 expected = 'repository `%s` does not exist' % (self.REPO)
1462 self._compare_error(id_, expected, given=response.body)
1479 self._compare_error(id_, expected, given=response.body)
1463 fixture.destroy_repo(fork_name)
1480 fixture.destroy_repo(fork_name)
1464
1481
1465 @parametrize('name,perm', [
1482 @parametrize('name,perm', [
1466 ('read', 'repository.read'),
1483 ('read', 'repository.read'),
1467 ('write', 'repository.write'),
1484 ('write', 'repository.write'),
1468 ('admin', 'repository.admin'),
1485 ('admin', 'repository.admin'),
1469 ])
1486 ])
1470 def test_api_fork_repo_non_admin_no_create_repo_permission(self, name, perm):
1487 def test_api_fork_repo_non_admin_no_create_repo_permission(self, name, perm):
1471 fork_name = u'api-repo-fork'
1488 fork_name = u'api-repo-fork'
1472 # regardless of base repository permission, forking is disallowed
1489 # regardless of base repository permission, forking is disallowed
1473 # when repository creation is disabled
1490 # when repository creation is disabled
1474 RepoModel().grant_user_permission(repo=self.REPO,
1491 RepoModel().grant_user_permission(repo=self.REPO,
1475 user=self.TEST_USER_LOGIN,
1492 user=self.TEST_USER_LOGIN,
1476 perm=perm)
1493 perm=perm)
1477 UserModel().revoke_perm('default', 'hg.create.repository')
1494 UserModel().revoke_perm('default', 'hg.create.repository')
1478 UserModel().grant_perm('default', 'hg.create.none')
1495 UserModel().grant_perm('default', 'hg.create.none')
1479 id_, params = _build_data(self.apikey_regular, 'fork_repo',
1496 id_, params = _build_data(self.apikey_regular, 'fork_repo',
1480 repoid=self.REPO,
1497 repoid=self.REPO,
1481 fork_name=fork_name,
1498 fork_name=fork_name,
1482 )
1499 )
1483 response = api_call(self, params)
1500 response = api_call(self, params)
1484 expected = 'no permission to create repositories'
1501 expected = 'no permission to create repositories'
1485 self._compare_error(id_, expected, given=response.body)
1502 self._compare_error(id_, expected, given=response.body)
1486 fixture.destroy_repo(fork_name)
1503 fixture.destroy_repo(fork_name)
1487
1504
1488 def test_api_fork_repo_unknown_owner(self):
1505 def test_api_fork_repo_unknown_owner(self):
1489 fork_name = u'api-repo-fork'
1506 fork_name = u'api-repo-fork'
1490 owner = 'i-dont-exist'
1507 owner = 'i-dont-exist'
1491 id_, params = _build_data(self.apikey, 'fork_repo',
1508 id_, params = _build_data(self.apikey, 'fork_repo',
1492 repoid=self.REPO,
1509 repoid=self.REPO,
1493 fork_name=fork_name,
1510 fork_name=fork_name,
1494 owner=owner,
1511 owner=owner,
1495 )
1512 )
1496 response = api_call(self, params)
1513 response = api_call(self, params)
1497 expected = 'user `%s` does not exist' % owner
1514 expected = 'user `%s` does not exist' % owner
1498 self._compare_error(id_, expected, given=response.body)
1515 self._compare_error(id_, expected, given=response.body)
1499
1516
1500 def test_api_fork_repo_fork_exists(self):
1517 def test_api_fork_repo_fork_exists(self):
1501 fork_name = u'api-repo-fork'
1518 fork_name = u'api-repo-fork'
1502 fixture.create_fork(self.REPO, fork_name)
1519 fixture.create_fork(self.REPO, fork_name)
1503
1520
1504 try:
1521 try:
1505 fork_name = u'api-repo-fork'
1522 fork_name = u'api-repo-fork'
1506
1523
1507 id_, params = _build_data(self.apikey, 'fork_repo',
1524 id_, params = _build_data(self.apikey, 'fork_repo',
1508 repoid=self.REPO,
1525 repoid=self.REPO,
1509 fork_name=fork_name,
1526 fork_name=fork_name,
1510 owner=TEST_USER_ADMIN_LOGIN,
1527 owner=TEST_USER_ADMIN_LOGIN,
1511 )
1528 )
1512 response = api_call(self, params)
1529 response = api_call(self, params)
1513
1530
1514 expected = "fork `%s` already exist" % fork_name
1531 expected = "fork `%s` already exist" % fork_name
1515 self._compare_error(id_, expected, given=response.body)
1532 self._compare_error(id_, expected, given=response.body)
1516 finally:
1533 finally:
1517 fixture.destroy_repo(fork_name)
1534 fixture.destroy_repo(fork_name)
1518
1535
1519 def test_api_fork_repo_repo_exists(self):
1536 def test_api_fork_repo_repo_exists(self):
1520 fork_name = self.REPO
1537 fork_name = self.REPO
1521
1538
1522 id_, params = _build_data(self.apikey, 'fork_repo',
1539 id_, params = _build_data(self.apikey, 'fork_repo',
1523 repoid=self.REPO,
1540 repoid=self.REPO,
1524 fork_name=fork_name,
1541 fork_name=fork_name,
1525 owner=TEST_USER_ADMIN_LOGIN,
1542 owner=TEST_USER_ADMIN_LOGIN,
1526 )
1543 )
1527 response = api_call(self, params)
1544 response = api_call(self, params)
1528
1545
1529 expected = "repo `%s` already exist" % fork_name
1546 expected = "repo `%s` already exist" % fork_name
1530 self._compare_error(id_, expected, given=response.body)
1547 self._compare_error(id_, expected, given=response.body)
1531
1548
1532 @mock.patch.object(RepoModel, 'create_fork', crash)
1549 @mock.patch.object(RepoModel, 'create_fork', crash)
1533 def test_api_fork_repo_exception_occurred(self):
1550 def test_api_fork_repo_exception_occurred(self):
1534 fork_name = u'api-repo-fork'
1551 fork_name = u'api-repo-fork'
1535 id_, params = _build_data(self.apikey, 'fork_repo',
1552 id_, params = _build_data(self.apikey, 'fork_repo',
1536 repoid=self.REPO,
1553 repoid=self.REPO,
1537 fork_name=fork_name,
1554 fork_name=fork_name,
1538 owner=TEST_USER_ADMIN_LOGIN,
1555 owner=TEST_USER_ADMIN_LOGIN,
1539 )
1556 )
1540 response = api_call(self, params)
1557 response = api_call(self, params)
1541
1558
1542 expected = 'failed to fork repository `%s` as `%s`' % (self.REPO,
1559 expected = 'failed to fork repository `%s` as `%s`' % (self.REPO,
1543 fork_name)
1560 fork_name)
1544 self._compare_error(id_, expected, given=response.body)
1561 self._compare_error(id_, expected, given=response.body)
1545
1562
1546 def test_api_get_user_group(self):
1563 def test_api_get_user_group(self):
1547 id_, params = _build_data(self.apikey, 'get_user_group',
1564 id_, params = _build_data(self.apikey, 'get_user_group',
1548 usergroupid=TEST_USER_GROUP)
1565 usergroupid=TEST_USER_GROUP)
1549 response = api_call(self, params)
1566 response = api_call(self, params)
1550
1567
1551 user_group = UserGroupModel().get_group(TEST_USER_GROUP)
1568 user_group = UserGroupModel().get_group(TEST_USER_GROUP)
1552 members = []
1569 members = []
1553 for user in user_group.members:
1570 for user in user_group.members:
1554 user = user.user
1571 user = user.user
1555 members.append(user.get_api_data())
1572 members.append(user.get_api_data())
1556
1573
1557 ret = user_group.get_api_data()
1574 ret = user_group.get_api_data()
1558 ret['members'] = members
1575 ret['members'] = members
1559 expected = ret
1576 expected = ret
1560 self._compare_ok(id_, expected, given=response.body)
1577 self._compare_ok(id_, expected, given=response.body)
1561
1578
1562 def test_api_get_user_groups(self):
1579 def test_api_get_user_groups(self):
1563 gr_name = u'test_user_group2'
1580 gr_name = u'test_user_group2'
1564 make_user_group(gr_name)
1581 make_user_group(gr_name)
1565
1582
1566 try:
1583 try:
1567 id_, params = _build_data(self.apikey, 'get_user_groups', )
1584 id_, params = _build_data(self.apikey, 'get_user_groups', )
1568 response = api_call(self, params)
1585 response = api_call(self, params)
1569
1586
1570 expected = []
1587 expected = []
1571 for gr_name in [TEST_USER_GROUP, u'test_user_group2']:
1588 for gr_name in [TEST_USER_GROUP, u'test_user_group2']:
1572 user_group = UserGroupModel().get_group(gr_name)
1589 user_group = UserGroupModel().get_group(gr_name)
1573 ret = user_group.get_api_data()
1590 ret = user_group.get_api_data()
1574 expected.append(ret)
1591 expected.append(ret)
1575 self._compare_ok(id_, expected, given=response.body)
1592 self._compare_ok(id_, expected, given=response.body)
1576 finally:
1593 finally:
1577 fixture.destroy_user_group(gr_name)
1594 fixture.destroy_user_group(gr_name)
1578
1595
1579 def test_api_create_user_group(self):
1596 def test_api_create_user_group(self):
1580 group_name = u'some_new_group'
1597 group_name = u'some_new_group'
1581 id_, params = _build_data(self.apikey, 'create_user_group',
1598 id_, params = _build_data(self.apikey, 'create_user_group',
1582 group_name=group_name)
1599 group_name=group_name)
1583 response = api_call(self, params)
1600 response = api_call(self, params)
1584
1601
1585 ret = {
1602 ret = {
1586 'msg': 'created new user group `%s`' % group_name,
1603 'msg': 'created new user group `%s`' % group_name,
1587 'user_group': jsonify(UserGroupModel() \
1604 'user_group': jsonify(UserGroupModel() \
1588 .get_by_name(group_name) \
1605 .get_by_name(group_name) \
1589 .get_api_data())
1606 .get_api_data())
1590 }
1607 }
1591 expected = ret
1608 expected = ret
1592 self._compare_ok(id_, expected, given=response.body)
1609 self._compare_ok(id_, expected, given=response.body)
1593
1610
1594 fixture.destroy_user_group(group_name)
1611 fixture.destroy_user_group(group_name)
1595
1612
1596 def test_api_get_user_group_that_exist(self):
1613 def test_api_get_user_group_that_exist(self):
1597 id_, params = _build_data(self.apikey, 'create_user_group',
1614 id_, params = _build_data(self.apikey, 'create_user_group',
1598 group_name=TEST_USER_GROUP)
1615 group_name=TEST_USER_GROUP)
1599 response = api_call(self, params)
1616 response = api_call(self, params)
1600
1617
1601 expected = "user group `%s` already exist" % TEST_USER_GROUP
1618 expected = "user group `%s` already exist" % TEST_USER_GROUP
1602 self._compare_error(id_, expected, given=response.body)
1619 self._compare_error(id_, expected, given=response.body)
1603
1620
1604 @mock.patch.object(UserGroupModel, 'create', crash)
1621 @mock.patch.object(UserGroupModel, 'create', crash)
1605 def test_api_get_user_group_exception_occurred(self):
1622 def test_api_get_user_group_exception_occurred(self):
1606 group_name = u'exception_happens'
1623 group_name = u'exception_happens'
1607 id_, params = _build_data(self.apikey, 'create_user_group',
1624 id_, params = _build_data(self.apikey, 'create_user_group',
1608 group_name=group_name)
1625 group_name=group_name)
1609 response = api_call(self, params)
1626 response = api_call(self, params)
1610
1627
1611 expected = 'failed to create group `%s`' % group_name
1628 expected = 'failed to create group `%s`' % group_name
1612 self._compare_error(id_, expected, given=response.body)
1629 self._compare_error(id_, expected, given=response.body)
1613
1630
1614 @parametrize('changing_attr,updates', [
1631 @parametrize('changing_attr,updates', [
1615 ('group_name', {'group_name': u'new_group_name'}),
1632 ('group_name', {'group_name': u'new_group_name'}),
1616 ('group_name', {'group_name': u'test_group_for_update'}),
1633 ('group_name', {'group_name': u'test_group_for_update'}),
1617 ('owner', {'owner': TEST_USER_REGULAR_LOGIN}),
1634 ('owner', {'owner': TEST_USER_REGULAR_LOGIN}),
1618 ('active', {'active': False}),
1635 ('active', {'active': False}),
1619 ('active', {'active': True}),
1636 ('active', {'active': True}),
1620 ])
1637 ])
1621 def test_api_update_user_group(self, changing_attr, updates):
1638 def test_api_update_user_group(self, changing_attr, updates):
1622 gr_name = u'test_group_for_update'
1639 gr_name = u'test_group_for_update'
1623 user_group = fixture.create_user_group(gr_name)
1640 user_group = fixture.create_user_group(gr_name)
1624 try:
1641 try:
1625 id_, params = _build_data(self.apikey, 'update_user_group',
1642 id_, params = _build_data(self.apikey, 'update_user_group',
1626 usergroupid=gr_name, **updates)
1643 usergroupid=gr_name, **updates)
1627 response = api_call(self, params)
1644 response = api_call(self, params)
1628 expected = {
1645 expected = {
1629 'msg': 'updated user group ID:%s %s' % (user_group.users_group_id,
1646 'msg': 'updated user group ID:%s %s' % (user_group.users_group_id,
1630 user_group.users_group_name),
1647 user_group.users_group_name),
1631 'user_group': user_group.get_api_data()
1648 'user_group': user_group.get_api_data()
1632 }
1649 }
1633 self._compare_ok(id_, expected, given=response.body)
1650 self._compare_ok(id_, expected, given=response.body)
1634 finally:
1651 finally:
1635 if changing_attr == 'group_name':
1652 if changing_attr == 'group_name':
1636 # switch to updated name for proper cleanup
1653 # switch to updated name for proper cleanup
1637 gr_name = updates['group_name']
1654 gr_name = updates['group_name']
1638 fixture.destroy_user_group(gr_name)
1655 fixture.destroy_user_group(gr_name)
1639
1656
1640 @mock.patch.object(UserGroupModel, 'update', crash)
1657 @mock.patch.object(UserGroupModel, 'update', crash)
1641 def test_api_update_user_group_exception_occurred(self):
1658 def test_api_update_user_group_exception_occurred(self):
1642 gr_name = u'test_group'
1659 gr_name = u'test_group'
1643 fixture.create_user_group(gr_name)
1660 fixture.create_user_group(gr_name)
1644 try:
1661 try:
1645 id_, params = _build_data(self.apikey, 'update_user_group',
1662 id_, params = _build_data(self.apikey, 'update_user_group',
1646 usergroupid=gr_name)
1663 usergroupid=gr_name)
1647 response = api_call(self, params)
1664 response = api_call(self, params)
1648 expected = 'failed to update user group `%s`' % gr_name
1665 expected = 'failed to update user group `%s`' % gr_name
1649 self._compare_error(id_, expected, given=response.body)
1666 self._compare_error(id_, expected, given=response.body)
1650 finally:
1667 finally:
1651 fixture.destroy_user_group(gr_name)
1668 fixture.destroy_user_group(gr_name)
1652
1669
1653 def test_api_add_user_to_user_group(self):
1670 def test_api_add_user_to_user_group(self):
1654 gr_name = u'test_group'
1671 gr_name = u'test_group'
1655 fixture.create_user_group(gr_name)
1672 fixture.create_user_group(gr_name)
1656 try:
1673 try:
1657 id_, params = _build_data(self.apikey, 'add_user_to_user_group',
1674 id_, params = _build_data(self.apikey, 'add_user_to_user_group',
1658 usergroupid=gr_name,
1675 usergroupid=gr_name,
1659 userid=TEST_USER_ADMIN_LOGIN)
1676 userid=TEST_USER_ADMIN_LOGIN)
1660 response = api_call(self, params)
1677 response = api_call(self, params)
1661 expected = {
1678 expected = {
1662 'msg': 'added member `%s` to user group `%s`' % (
1679 'msg': 'added member `%s` to user group `%s`' % (
1663 TEST_USER_ADMIN_LOGIN, gr_name),
1680 TEST_USER_ADMIN_LOGIN, gr_name),
1664 'success': True
1681 'success': True
1665 }
1682 }
1666 self._compare_ok(id_, expected, given=response.body)
1683 self._compare_ok(id_, expected, given=response.body)
1667 finally:
1684 finally:
1668 fixture.destroy_user_group(gr_name)
1685 fixture.destroy_user_group(gr_name)
1669
1686
1670 def test_api_add_user_to_user_group_that_doesnt_exist(self):
1687 def test_api_add_user_to_user_group_that_doesnt_exist(self):
1671 id_, params = _build_data(self.apikey, 'add_user_to_user_group',
1688 id_, params = _build_data(self.apikey, 'add_user_to_user_group',
1672 usergroupid='false-group',
1689 usergroupid='false-group',
1673 userid=TEST_USER_ADMIN_LOGIN)
1690 userid=TEST_USER_ADMIN_LOGIN)
1674 response = api_call(self, params)
1691 response = api_call(self, params)
1675
1692
1676 expected = 'user group `%s` does not exist' % 'false-group'
1693 expected = 'user group `%s` does not exist' % 'false-group'
1677 self._compare_error(id_, expected, given=response.body)
1694 self._compare_error(id_, expected, given=response.body)
1678
1695
1679 @mock.patch.object(UserGroupModel, 'add_user_to_group', crash)
1696 @mock.patch.object(UserGroupModel, 'add_user_to_group', crash)
1680 def test_api_add_user_to_user_group_exception_occurred(self):
1697 def test_api_add_user_to_user_group_exception_occurred(self):
1681 gr_name = u'test_group'
1698 gr_name = u'test_group'
1682 fixture.create_user_group(gr_name)
1699 fixture.create_user_group(gr_name)
1683 try:
1700 try:
1684 id_, params = _build_data(self.apikey, 'add_user_to_user_group',
1701 id_, params = _build_data(self.apikey, 'add_user_to_user_group',
1685 usergroupid=gr_name,
1702 usergroupid=gr_name,
1686 userid=TEST_USER_ADMIN_LOGIN)
1703 userid=TEST_USER_ADMIN_LOGIN)
1687 response = api_call(self, params)
1704 response = api_call(self, params)
1688 expected = 'failed to add member to user group `%s`' % gr_name
1705 expected = 'failed to add member to user group `%s`' % gr_name
1689 self._compare_error(id_, expected, given=response.body)
1706 self._compare_error(id_, expected, given=response.body)
1690 finally:
1707 finally:
1691 fixture.destroy_user_group(gr_name)
1708 fixture.destroy_user_group(gr_name)
1692
1709
1693 def test_api_remove_user_from_user_group(self):
1710 def test_api_remove_user_from_user_group(self):
1694 gr_name = u'test_group_3'
1711 gr_name = u'test_group_3'
1695 gr = fixture.create_user_group(gr_name)
1712 gr = fixture.create_user_group(gr_name)
1696 UserGroupModel().add_user_to_group(gr, user=TEST_USER_ADMIN_LOGIN)
1713 UserGroupModel().add_user_to_group(gr, user=TEST_USER_ADMIN_LOGIN)
1697 Session().commit()
1714 Session().commit()
1698 try:
1715 try:
1699 id_, params = _build_data(self.apikey, 'remove_user_from_user_group',
1716 id_, params = _build_data(self.apikey, 'remove_user_from_user_group',
1700 usergroupid=gr_name,
1717 usergroupid=gr_name,
1701 userid=TEST_USER_ADMIN_LOGIN)
1718 userid=TEST_USER_ADMIN_LOGIN)
1702 response = api_call(self, params)
1719 response = api_call(self, params)
1703 expected = {
1720 expected = {
1704 'msg': 'removed member `%s` from user group `%s`' % (
1721 'msg': 'removed member `%s` from user group `%s`' % (
1705 TEST_USER_ADMIN_LOGIN, gr_name
1722 TEST_USER_ADMIN_LOGIN, gr_name
1706 ),
1723 ),
1707 'success': True}
1724 'success': True}
1708 self._compare_ok(id_, expected, given=response.body)
1725 self._compare_ok(id_, expected, given=response.body)
1709 finally:
1726 finally:
1710 fixture.destroy_user_group(gr_name)
1727 fixture.destroy_user_group(gr_name)
1711
1728
1712 @mock.patch.object(UserGroupModel, 'remove_user_from_group', crash)
1729 @mock.patch.object(UserGroupModel, 'remove_user_from_group', crash)
1713 def test_api_remove_user_from_user_group_exception_occurred(self):
1730 def test_api_remove_user_from_user_group_exception_occurred(self):
1714 gr_name = u'test_group_3'
1731 gr_name = u'test_group_3'
1715 gr = fixture.create_user_group(gr_name)
1732 gr = fixture.create_user_group(gr_name)
1716 UserGroupModel().add_user_to_group(gr, user=TEST_USER_ADMIN_LOGIN)
1733 UserGroupModel().add_user_to_group(gr, user=TEST_USER_ADMIN_LOGIN)
1717 Session().commit()
1734 Session().commit()
1718 try:
1735 try:
1719 id_, params = _build_data(self.apikey, 'remove_user_from_user_group',
1736 id_, params = _build_data(self.apikey, 'remove_user_from_user_group',
1720 usergroupid=gr_name,
1737 usergroupid=gr_name,
1721 userid=TEST_USER_ADMIN_LOGIN)
1738 userid=TEST_USER_ADMIN_LOGIN)
1722 response = api_call(self, params)
1739 response = api_call(self, params)
1723 expected = 'failed to remove member from user group `%s`' % gr_name
1740 expected = 'failed to remove member from user group `%s`' % gr_name
1724 self._compare_error(id_, expected, given=response.body)
1741 self._compare_error(id_, expected, given=response.body)
1725 finally:
1742 finally:
1726 fixture.destroy_user_group(gr_name)
1743 fixture.destroy_user_group(gr_name)
1727
1744
1728 def test_api_delete_user_group(self):
1745 def test_api_delete_user_group(self):
1729 gr_name = u'test_group'
1746 gr_name = u'test_group'
1730 ugroup = fixture.create_user_group(gr_name)
1747 ugroup = fixture.create_user_group(gr_name)
1731 gr_id = ugroup.users_group_id
1748 gr_id = ugroup.users_group_id
1732 try:
1749 try:
1733 id_, params = _build_data(self.apikey, 'delete_user_group',
1750 id_, params = _build_data(self.apikey, 'delete_user_group',
1734 usergroupid=gr_name)
1751 usergroupid=gr_name)
1735 response = api_call(self, params)
1752 response = api_call(self, params)
1736 expected = {
1753 expected = {
1737 'user_group': None,
1754 'user_group': None,
1738 'msg': 'deleted user group ID:%s %s' % (gr_id, gr_name)
1755 'msg': 'deleted user group ID:%s %s' % (gr_id, gr_name)
1739 }
1756 }
1740 self._compare_ok(id_, expected, given=response.body)
1757 self._compare_ok(id_, expected, given=response.body)
1741 finally:
1758 finally:
1742 if UserGroupModel().get_by_name(gr_name):
1759 if UserGroupModel().get_by_name(gr_name):
1743 fixture.destroy_user_group(gr_name)
1760 fixture.destroy_user_group(gr_name)
1744
1761
1745 def test_api_delete_user_group_that_is_assigned(self):
1762 def test_api_delete_user_group_that_is_assigned(self):
1746 gr_name = u'test_group'
1763 gr_name = u'test_group'
1747 ugroup = fixture.create_user_group(gr_name)
1764 ugroup = fixture.create_user_group(gr_name)
1748 gr_id = ugroup.users_group_id
1765 gr_id = ugroup.users_group_id
1749
1766
1750 ugr_to_perm = RepoModel().grant_user_group_permission(self.REPO, gr_name, 'repository.write')
1767 ugr_to_perm = RepoModel().grant_user_group_permission(self.REPO, gr_name, 'repository.write')
1751 msg = 'User Group assigned to %s' % ugr_to_perm.repository.repo_name
1768 msg = 'User Group assigned to %s' % ugr_to_perm.repository.repo_name
1752
1769
1753 try:
1770 try:
1754 id_, params = _build_data(self.apikey, 'delete_user_group',
1771 id_, params = _build_data(self.apikey, 'delete_user_group',
1755 usergroupid=gr_name)
1772 usergroupid=gr_name)
1756 response = api_call(self, params)
1773 response = api_call(self, params)
1757 expected = msg
1774 expected = msg
1758 self._compare_error(id_, expected, given=response.body)
1775 self._compare_error(id_, expected, given=response.body)
1759 finally:
1776 finally:
1760 if UserGroupModel().get_by_name(gr_name):
1777 if UserGroupModel().get_by_name(gr_name):
1761 fixture.destroy_user_group(gr_name)
1778 fixture.destroy_user_group(gr_name)
1762
1779
1763 def test_api_delete_user_group_exception_occurred(self):
1780 def test_api_delete_user_group_exception_occurred(self):
1764 gr_name = u'test_group'
1781 gr_name = u'test_group'
1765 ugroup = fixture.create_user_group(gr_name)
1782 ugroup = fixture.create_user_group(gr_name)
1766 gr_id = ugroup.users_group_id
1783 gr_id = ugroup.users_group_id
1767 id_, params = _build_data(self.apikey, 'delete_user_group',
1784 id_, params = _build_data(self.apikey, 'delete_user_group',
1768 usergroupid=gr_name)
1785 usergroupid=gr_name)
1769
1786
1770 try:
1787 try:
1771 with mock.patch.object(UserGroupModel, 'delete', crash):
1788 with mock.patch.object(UserGroupModel, 'delete', crash):
1772 response = api_call(self, params)
1789 response = api_call(self, params)
1773 expected = 'failed to delete user group ID:%s %s' % (gr_id, gr_name)
1790 expected = 'failed to delete user group ID:%s %s' % (gr_id, gr_name)
1774 self._compare_error(id_, expected, given=response.body)
1791 self._compare_error(id_, expected, given=response.body)
1775 finally:
1792 finally:
1776 fixture.destroy_user_group(gr_name)
1793 fixture.destroy_user_group(gr_name)
1777
1794
1778 @parametrize('name,perm', [
1795 @parametrize('name,perm', [
1779 ('none', 'repository.none'),
1796 ('none', 'repository.none'),
1780 ('read', 'repository.read'),
1797 ('read', 'repository.read'),
1781 ('write', 'repository.write'),
1798 ('write', 'repository.write'),
1782 ('admin', 'repository.admin'),
1799 ('admin', 'repository.admin'),
1783 ])
1800 ])
1784 def test_api_grant_user_permission(self, name, perm):
1801 def test_api_grant_user_permission(self, name, perm):
1785 id_, params = _build_data(self.apikey,
1802 id_, params = _build_data(self.apikey,
1786 'grant_user_permission',
1803 'grant_user_permission',
1787 repoid=self.REPO,
1804 repoid=self.REPO,
1788 userid=TEST_USER_ADMIN_LOGIN,
1805 userid=TEST_USER_ADMIN_LOGIN,
1789 perm=perm)
1806 perm=perm)
1790 response = api_call(self, params)
1807 response = api_call(self, params)
1791
1808
1792 ret = {
1809 ret = {
1793 'msg': 'Granted perm: `%s` for user: `%s` in repo: `%s`' % (
1810 'msg': 'Granted perm: `%s` for user: `%s` in repo: `%s`' % (
1794 perm, TEST_USER_ADMIN_LOGIN, self.REPO
1811 perm, TEST_USER_ADMIN_LOGIN, self.REPO
1795 ),
1812 ),
1796 'success': True
1813 'success': True
1797 }
1814 }
1798 expected = ret
1815 expected = ret
1799 self._compare_ok(id_, expected, given=response.body)
1816 self._compare_ok(id_, expected, given=response.body)
1800
1817
1801 def test_api_grant_user_permission_wrong_permission(self):
1818 def test_api_grant_user_permission_wrong_permission(self):
1802 perm = 'haha.no.permission'
1819 perm = 'haha.no.permission'
1803 id_, params = _build_data(self.apikey,
1820 id_, params = _build_data(self.apikey,
1804 'grant_user_permission',
1821 'grant_user_permission',
1805 repoid=self.REPO,
1822 repoid=self.REPO,
1806 userid=TEST_USER_ADMIN_LOGIN,
1823 userid=TEST_USER_ADMIN_LOGIN,
1807 perm=perm)
1824 perm=perm)
1808 response = api_call(self, params)
1825 response = api_call(self, params)
1809
1826
1810 expected = 'permission `%s` does not exist' % perm
1827 expected = 'permission `%s` does not exist' % perm
1811 self._compare_error(id_, expected, given=response.body)
1828 self._compare_error(id_, expected, given=response.body)
1812
1829
1813 @mock.patch.object(RepoModel, 'grant_user_permission', crash)
1830 @mock.patch.object(RepoModel, 'grant_user_permission', crash)
1814 def test_api_grant_user_permission_exception_when_adding(self):
1831 def test_api_grant_user_permission_exception_when_adding(self):
1815 perm = 'repository.read'
1832 perm = 'repository.read'
1816 id_, params = _build_data(self.apikey,
1833 id_, params = _build_data(self.apikey,
1817 'grant_user_permission',
1834 'grant_user_permission',
1818 repoid=self.REPO,
1835 repoid=self.REPO,
1819 userid=TEST_USER_ADMIN_LOGIN,
1836 userid=TEST_USER_ADMIN_LOGIN,
1820 perm=perm)
1837 perm=perm)
1821 response = api_call(self, params)
1838 response = api_call(self, params)
1822
1839
1823 expected = 'failed to edit permission for user: `%s` in repo: `%s`' % (
1840 expected = 'failed to edit permission for user: `%s` in repo: `%s`' % (
1824 TEST_USER_ADMIN_LOGIN, self.REPO
1841 TEST_USER_ADMIN_LOGIN, self.REPO
1825 )
1842 )
1826 self._compare_error(id_, expected, given=response.body)
1843 self._compare_error(id_, expected, given=response.body)
1827
1844
1828 def test_api_revoke_user_permission(self):
1845 def test_api_revoke_user_permission(self):
1829 id_, params = _build_data(self.apikey,
1846 id_, params = _build_data(self.apikey,
1830 'revoke_user_permission',
1847 'revoke_user_permission',
1831 repoid=self.REPO,
1848 repoid=self.REPO,
1832 userid=TEST_USER_ADMIN_LOGIN, )
1849 userid=TEST_USER_ADMIN_LOGIN, )
1833 response = api_call(self, params)
1850 response = api_call(self, params)
1834
1851
1835 expected = {
1852 expected = {
1836 'msg': 'Revoked perm for user: `%s` in repo: `%s`' % (
1853 'msg': 'Revoked perm for user: `%s` in repo: `%s`' % (
1837 TEST_USER_ADMIN_LOGIN, self.REPO
1854 TEST_USER_ADMIN_LOGIN, self.REPO
1838 ),
1855 ),
1839 'success': True
1856 'success': True
1840 }
1857 }
1841 self._compare_ok(id_, expected, given=response.body)
1858 self._compare_ok(id_, expected, given=response.body)
1842
1859
1843 @mock.patch.object(RepoModel, 'revoke_user_permission', crash)
1860 @mock.patch.object(RepoModel, 'revoke_user_permission', crash)
1844 def test_api_revoke_user_permission_exception_when_adding(self):
1861 def test_api_revoke_user_permission_exception_when_adding(self):
1845 id_, params = _build_data(self.apikey,
1862 id_, params = _build_data(self.apikey,
1846 'revoke_user_permission',
1863 'revoke_user_permission',
1847 repoid=self.REPO,
1864 repoid=self.REPO,
1848 userid=TEST_USER_ADMIN_LOGIN, )
1865 userid=TEST_USER_ADMIN_LOGIN, )
1849 response = api_call(self, params)
1866 response = api_call(self, params)
1850
1867
1851 expected = 'failed to edit permission for user: `%s` in repo: `%s`' % (
1868 expected = 'failed to edit permission for user: `%s` in repo: `%s`' % (
1852 TEST_USER_ADMIN_LOGIN, self.REPO
1869 TEST_USER_ADMIN_LOGIN, self.REPO
1853 )
1870 )
1854 self._compare_error(id_, expected, given=response.body)
1871 self._compare_error(id_, expected, given=response.body)
1855
1872
1856 @parametrize('name,perm', [
1873 @parametrize('name,perm', [
1857 ('none', 'repository.none'),
1874 ('none', 'repository.none'),
1858 ('read', 'repository.read'),
1875 ('read', 'repository.read'),
1859 ('write', 'repository.write'),
1876 ('write', 'repository.write'),
1860 ('admin', 'repository.admin'),
1877 ('admin', 'repository.admin'),
1861 ])
1878 ])
1862 def test_api_grant_user_group_permission(self, name, perm):
1879 def test_api_grant_user_group_permission(self, name, perm):
1863 id_, params = _build_data(self.apikey,
1880 id_, params = _build_data(self.apikey,
1864 'grant_user_group_permission',
1881 'grant_user_group_permission',
1865 repoid=self.REPO,
1882 repoid=self.REPO,
1866 usergroupid=TEST_USER_GROUP,
1883 usergroupid=TEST_USER_GROUP,
1867 perm=perm)
1884 perm=perm)
1868 response = api_call(self, params)
1885 response = api_call(self, params)
1869
1886
1870 ret = {
1887 ret = {
1871 'msg': 'Granted perm: `%s` for user group: `%s` in repo: `%s`' % (
1888 'msg': 'Granted perm: `%s` for user group: `%s` in repo: `%s`' % (
1872 perm, TEST_USER_GROUP, self.REPO
1889 perm, TEST_USER_GROUP, self.REPO
1873 ),
1890 ),
1874 'success': True
1891 'success': True
1875 }
1892 }
1876 expected = ret
1893 expected = ret
1877 self._compare_ok(id_, expected, given=response.body)
1894 self._compare_ok(id_, expected, given=response.body)
1878
1895
1879 def test_api_grant_user_group_permission_wrong_permission(self):
1896 def test_api_grant_user_group_permission_wrong_permission(self):
1880 perm = 'haha.no.permission'
1897 perm = 'haha.no.permission'
1881 id_, params = _build_data(self.apikey,
1898 id_, params = _build_data(self.apikey,
1882 'grant_user_group_permission',
1899 'grant_user_group_permission',
1883 repoid=self.REPO,
1900 repoid=self.REPO,
1884 usergroupid=TEST_USER_GROUP,
1901 usergroupid=TEST_USER_GROUP,
1885 perm=perm)
1902 perm=perm)
1886 response = api_call(self, params)
1903 response = api_call(self, params)
1887
1904
1888 expected = 'permission `%s` does not exist' % perm
1905 expected = 'permission `%s` does not exist' % perm
1889 self._compare_error(id_, expected, given=response.body)
1906 self._compare_error(id_, expected, given=response.body)
1890
1907
1891 @mock.patch.object(RepoModel, 'grant_user_group_permission', crash)
1908 @mock.patch.object(RepoModel, 'grant_user_group_permission', crash)
1892 def test_api_grant_user_group_permission_exception_when_adding(self):
1909 def test_api_grant_user_group_permission_exception_when_adding(self):
1893 perm = 'repository.read'
1910 perm = 'repository.read'
1894 id_, params = _build_data(self.apikey,
1911 id_, params = _build_data(self.apikey,
1895 'grant_user_group_permission',
1912 'grant_user_group_permission',
1896 repoid=self.REPO,
1913 repoid=self.REPO,
1897 usergroupid=TEST_USER_GROUP,
1914 usergroupid=TEST_USER_GROUP,
1898 perm=perm)
1915 perm=perm)
1899 response = api_call(self, params)
1916 response = api_call(self, params)
1900
1917
1901 expected = 'failed to edit permission for user group: `%s` in repo: `%s`' % (
1918 expected = 'failed to edit permission for user group: `%s` in repo: `%s`' % (
1902 TEST_USER_GROUP, self.REPO
1919 TEST_USER_GROUP, self.REPO
1903 )
1920 )
1904 self._compare_error(id_, expected, given=response.body)
1921 self._compare_error(id_, expected, given=response.body)
1905
1922
1906 def test_api_revoke_user_group_permission(self):
1923 def test_api_revoke_user_group_permission(self):
1907 RepoModel().grant_user_group_permission(repo=self.REPO,
1924 RepoModel().grant_user_group_permission(repo=self.REPO,
1908 group_name=TEST_USER_GROUP,
1925 group_name=TEST_USER_GROUP,
1909 perm='repository.read')
1926 perm='repository.read')
1910 Session().commit()
1927 Session().commit()
1911 id_, params = _build_data(self.apikey,
1928 id_, params = _build_data(self.apikey,
1912 'revoke_user_group_permission',
1929 'revoke_user_group_permission',
1913 repoid=self.REPO,
1930 repoid=self.REPO,
1914 usergroupid=TEST_USER_GROUP, )
1931 usergroupid=TEST_USER_GROUP, )
1915 response = api_call(self, params)
1932 response = api_call(self, params)
1916
1933
1917 expected = {
1934 expected = {
1918 'msg': 'Revoked perm for user group: `%s` in repo: `%s`' % (
1935 'msg': 'Revoked perm for user group: `%s` in repo: `%s`' % (
1919 TEST_USER_GROUP, self.REPO
1936 TEST_USER_GROUP, self.REPO
1920 ),
1937 ),
1921 'success': True
1938 'success': True
1922 }
1939 }
1923 self._compare_ok(id_, expected, given=response.body)
1940 self._compare_ok(id_, expected, given=response.body)
1924
1941
1925 @mock.patch.object(RepoModel, 'revoke_user_group_permission', crash)
1942 @mock.patch.object(RepoModel, 'revoke_user_group_permission', crash)
1926 def test_api_revoke_user_group_permission_exception_when_adding(self):
1943 def test_api_revoke_user_group_permission_exception_when_adding(self):
1927 id_, params = _build_data(self.apikey,
1944 id_, params = _build_data(self.apikey,
1928 'revoke_user_group_permission',
1945 'revoke_user_group_permission',
1929 repoid=self.REPO,
1946 repoid=self.REPO,
1930 usergroupid=TEST_USER_GROUP, )
1947 usergroupid=TEST_USER_GROUP, )
1931 response = api_call(self, params)
1948 response = api_call(self, params)
1932
1949
1933 expected = 'failed to edit permission for user group: `%s` in repo: `%s`' % (
1950 expected = 'failed to edit permission for user group: `%s` in repo: `%s`' % (
1934 TEST_USER_GROUP, self.REPO
1951 TEST_USER_GROUP, self.REPO
1935 )
1952 )
1936 self._compare_error(id_, expected, given=response.body)
1953 self._compare_error(id_, expected, given=response.body)
1937
1954
1938 @parametrize('name,perm,apply_to_children', [
1955 @parametrize('name,perm,apply_to_children', [
1939 ('none', 'group.none', 'none'),
1956 ('none', 'group.none', 'none'),
1940 ('read', 'group.read', 'none'),
1957 ('read', 'group.read', 'none'),
1941 ('write', 'group.write', 'none'),
1958 ('write', 'group.write', 'none'),
1942 ('admin', 'group.admin', 'none'),
1959 ('admin', 'group.admin', 'none'),
1943
1960
1944 ('none', 'group.none', 'all'),
1961 ('none', 'group.none', 'all'),
1945 ('read', 'group.read', 'all'),
1962 ('read', 'group.read', 'all'),
1946 ('write', 'group.write', 'all'),
1963 ('write', 'group.write', 'all'),
1947 ('admin', 'group.admin', 'all'),
1964 ('admin', 'group.admin', 'all'),
1948
1965
1949 ('none', 'group.none', 'repos'),
1966 ('none', 'group.none', 'repos'),
1950 ('read', 'group.read', 'repos'),
1967 ('read', 'group.read', 'repos'),
1951 ('write', 'group.write', 'repos'),
1968 ('write', 'group.write', 'repos'),
1952 ('admin', 'group.admin', 'repos'),
1969 ('admin', 'group.admin', 'repos'),
1953
1970
1954 ('none', 'group.none', 'groups'),
1971 ('none', 'group.none', 'groups'),
1955 ('read', 'group.read', 'groups'),
1972 ('read', 'group.read', 'groups'),
1956 ('write', 'group.write', 'groups'),
1973 ('write', 'group.write', 'groups'),
1957 ('admin', 'group.admin', 'groups'),
1974 ('admin', 'group.admin', 'groups'),
1958 ])
1975 ])
1959 def test_api_grant_user_permission_to_repo_group(self, name, perm, apply_to_children):
1976 def test_api_grant_user_permission_to_repo_group(self, name, perm, apply_to_children):
1960 id_, params = _build_data(self.apikey,
1977 id_, params = _build_data(self.apikey,
1961 'grant_user_permission_to_repo_group',
1978 'grant_user_permission_to_repo_group',
1962 repogroupid=TEST_REPO_GROUP,
1979 repogroupid=TEST_REPO_GROUP,
1963 userid=TEST_USER_ADMIN_LOGIN,
1980 userid=TEST_USER_ADMIN_LOGIN,
1964 perm=perm, apply_to_children=apply_to_children)
1981 perm=perm, apply_to_children=apply_to_children)
1965 response = api_call(self, params)
1982 response = api_call(self, params)
1966
1983
1967 ret = {
1984 ret = {
1968 'msg': 'Granted perm: `%s` (recursive:%s) for user: `%s` in repo group: `%s`' % (
1985 'msg': 'Granted perm: `%s` (recursive:%s) for user: `%s` in repo group: `%s`' % (
1969 perm, apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
1986 perm, apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
1970 ),
1987 ),
1971 'success': True
1988 'success': True
1972 }
1989 }
1973 expected = ret
1990 expected = ret
1974 self._compare_ok(id_, expected, given=response.body)
1991 self._compare_ok(id_, expected, given=response.body)
1975
1992
1976 @parametrize('name,perm,apply_to_children,grant_admin,access_ok', [
1993 @parametrize('name,perm,apply_to_children,grant_admin,access_ok', [
1977 ('none_fails', 'group.none', 'none', False, False),
1994 ('none_fails', 'group.none', 'none', False, False),
1978 ('read_fails', 'group.read', 'none', False, False),
1995 ('read_fails', 'group.read', 'none', False, False),
1979 ('write_fails', 'group.write', 'none', False, False),
1996 ('write_fails', 'group.write', 'none', False, False),
1980 ('admin_fails', 'group.admin', 'none', False, False),
1997 ('admin_fails', 'group.admin', 'none', False, False),
1981
1998
1982 # with granted perms
1999 # with granted perms
1983 ('none_ok', 'group.none', 'none', True, True),
2000 ('none_ok', 'group.none', 'none', True, True),
1984 ('read_ok', 'group.read', 'none', True, True),
2001 ('read_ok', 'group.read', 'none', True, True),
1985 ('write_ok', 'group.write', 'none', True, True),
2002 ('write_ok', 'group.write', 'none', True, True),
1986 ('admin_ok', 'group.admin', 'none', True, True),
2003 ('admin_ok', 'group.admin', 'none', True, True),
1987 ])
2004 ])
1988 def test_api_grant_user_permission_to_repo_group_by_regular_user(
2005 def test_api_grant_user_permission_to_repo_group_by_regular_user(
1989 self, name, perm, apply_to_children, grant_admin, access_ok):
2006 self, name, perm, apply_to_children, grant_admin, access_ok):
1990 if grant_admin:
2007 if grant_admin:
1991 RepoGroupModel().grant_user_permission(TEST_REPO_GROUP,
2008 RepoGroupModel().grant_user_permission(TEST_REPO_GROUP,
1992 self.TEST_USER_LOGIN,
2009 self.TEST_USER_LOGIN,
1993 'group.admin')
2010 'group.admin')
1994 Session().commit()
2011 Session().commit()
1995
2012
1996 id_, params = _build_data(self.apikey_regular,
2013 id_, params = _build_data(self.apikey_regular,
1997 'grant_user_permission_to_repo_group',
2014 'grant_user_permission_to_repo_group',
1998 repogroupid=TEST_REPO_GROUP,
2015 repogroupid=TEST_REPO_GROUP,
1999 userid=TEST_USER_ADMIN_LOGIN,
2016 userid=TEST_USER_ADMIN_LOGIN,
2000 perm=perm, apply_to_children=apply_to_children)
2017 perm=perm, apply_to_children=apply_to_children)
2001 response = api_call(self, params)
2018 response = api_call(self, params)
2002 if access_ok:
2019 if access_ok:
2003 ret = {
2020 ret = {
2004 'msg': 'Granted perm: `%s` (recursive:%s) for user: `%s` in repo group: `%s`' % (
2021 'msg': 'Granted perm: `%s` (recursive:%s) for user: `%s` in repo group: `%s`' % (
2005 perm, apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
2022 perm, apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
2006 ),
2023 ),
2007 'success': True
2024 'success': True
2008 }
2025 }
2009 expected = ret
2026 expected = ret
2010 self._compare_ok(id_, expected, given=response.body)
2027 self._compare_ok(id_, expected, given=response.body)
2011 else:
2028 else:
2012 expected = 'repository group `%s` does not exist' % TEST_REPO_GROUP
2029 expected = 'repository group `%s` does not exist' % TEST_REPO_GROUP
2013 self._compare_error(id_, expected, given=response.body)
2030 self._compare_error(id_, expected, given=response.body)
2014
2031
2015 def test_api_grant_user_permission_to_repo_group_wrong_permission(self):
2032 def test_api_grant_user_permission_to_repo_group_wrong_permission(self):
2016 perm = 'haha.no.permission'
2033 perm = 'haha.no.permission'
2017 id_, params = _build_data(self.apikey,
2034 id_, params = _build_data(self.apikey,
2018 'grant_user_permission_to_repo_group',
2035 'grant_user_permission_to_repo_group',
2019 repogroupid=TEST_REPO_GROUP,
2036 repogroupid=TEST_REPO_GROUP,
2020 userid=TEST_USER_ADMIN_LOGIN,
2037 userid=TEST_USER_ADMIN_LOGIN,
2021 perm=perm)
2038 perm=perm)
2022 response = api_call(self, params)
2039 response = api_call(self, params)
2023
2040
2024 expected = 'permission `%s` does not exist' % perm
2041 expected = 'permission `%s` does not exist' % perm
2025 self._compare_error(id_, expected, given=response.body)
2042 self._compare_error(id_, expected, given=response.body)
2026
2043
2027 @mock.patch.object(RepoGroupModel, 'grant_user_permission', crash)
2044 @mock.patch.object(RepoGroupModel, 'grant_user_permission', crash)
2028 def test_api_grant_user_permission_to_repo_group_exception_when_adding(self):
2045 def test_api_grant_user_permission_to_repo_group_exception_when_adding(self):
2029 perm = 'group.read'
2046 perm = 'group.read'
2030 id_, params = _build_data(self.apikey,
2047 id_, params = _build_data(self.apikey,
2031 'grant_user_permission_to_repo_group',
2048 'grant_user_permission_to_repo_group',
2032 repogroupid=TEST_REPO_GROUP,
2049 repogroupid=TEST_REPO_GROUP,
2033 userid=TEST_USER_ADMIN_LOGIN,
2050 userid=TEST_USER_ADMIN_LOGIN,
2034 perm=perm)
2051 perm=perm)
2035 response = api_call(self, params)
2052 response = api_call(self, params)
2036
2053
2037 expected = 'failed to edit permission for user: `%s` in repo group: `%s`' % (
2054 expected = 'failed to edit permission for user: `%s` in repo group: `%s`' % (
2038 TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
2055 TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
2039 )
2056 )
2040 self._compare_error(id_, expected, given=response.body)
2057 self._compare_error(id_, expected, given=response.body)
2041
2058
2042 @parametrize('name,apply_to_children', [
2059 @parametrize('name,apply_to_children', [
2043 ('none', 'none'),
2060 ('none', 'none'),
2044 ('all', 'all'),
2061 ('all', 'all'),
2045 ('repos', 'repos'),
2062 ('repos', 'repos'),
2046 ('groups', 'groups'),
2063 ('groups', 'groups'),
2047 ])
2064 ])
2048 def test_api_revoke_user_permission_from_repo_group(self, name, apply_to_children):
2065 def test_api_revoke_user_permission_from_repo_group(self, name, apply_to_children):
2049 RepoGroupModel().grant_user_permission(repo_group=TEST_REPO_GROUP,
2066 RepoGroupModel().grant_user_permission(repo_group=TEST_REPO_GROUP,
2050 user=TEST_USER_ADMIN_LOGIN,
2067 user=TEST_USER_ADMIN_LOGIN,
2051 perm='group.read',)
2068 perm='group.read',)
2052 Session().commit()
2069 Session().commit()
2053
2070
2054 id_, params = _build_data(self.apikey,
2071 id_, params = _build_data(self.apikey,
2055 'revoke_user_permission_from_repo_group',
2072 'revoke_user_permission_from_repo_group',
2056 repogroupid=TEST_REPO_GROUP,
2073 repogroupid=TEST_REPO_GROUP,
2057 userid=TEST_USER_ADMIN_LOGIN,
2074 userid=TEST_USER_ADMIN_LOGIN,
2058 apply_to_children=apply_to_children,)
2075 apply_to_children=apply_to_children,)
2059 response = api_call(self, params)
2076 response = api_call(self, params)
2060
2077
2061 expected = {
2078 expected = {
2062 'msg': 'Revoked perm (recursive:%s) for user: `%s` in repo group: `%s`' % (
2079 'msg': 'Revoked perm (recursive:%s) for user: `%s` in repo group: `%s`' % (
2063 apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
2080 apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
2064 ),
2081 ),
2065 'success': True
2082 'success': True
2066 }
2083 }
2067 self._compare_ok(id_, expected, given=response.body)
2084 self._compare_ok(id_, expected, given=response.body)
2068
2085
2069 @parametrize('name,apply_to_children,grant_admin,access_ok', [
2086 @parametrize('name,apply_to_children,grant_admin,access_ok', [
2070 ('none', 'none', False, False),
2087 ('none', 'none', False, False),
2071 ('all', 'all', False, False),
2088 ('all', 'all', False, False),
2072 ('repos', 'repos', False, False),
2089 ('repos', 'repos', False, False),
2073 ('groups', 'groups', False, False),
2090 ('groups', 'groups', False, False),
2074
2091
2075 # after granting admin rights
2092 # after granting admin rights
2076 ('none', 'none', False, False),
2093 ('none', 'none', False, False),
2077 ('all', 'all', False, False),
2094 ('all', 'all', False, False),
2078 ('repos', 'repos', False, False),
2095 ('repos', 'repos', False, False),
2079 ('groups', 'groups', False, False),
2096 ('groups', 'groups', False, False),
2080 ])
2097 ])
2081 def test_api_revoke_user_permission_from_repo_group_by_regular_user(
2098 def test_api_revoke_user_permission_from_repo_group_by_regular_user(
2082 self, name, apply_to_children, grant_admin, access_ok):
2099 self, name, apply_to_children, grant_admin, access_ok):
2083 RepoGroupModel().grant_user_permission(repo_group=TEST_REPO_GROUP,
2100 RepoGroupModel().grant_user_permission(repo_group=TEST_REPO_GROUP,
2084 user=TEST_USER_ADMIN_LOGIN,
2101 user=TEST_USER_ADMIN_LOGIN,
2085 perm='group.read',)
2102 perm='group.read',)
2086 Session().commit()
2103 Session().commit()
2087
2104
2088 if grant_admin:
2105 if grant_admin:
2089 RepoGroupModel().grant_user_permission(TEST_REPO_GROUP,
2106 RepoGroupModel().grant_user_permission(TEST_REPO_GROUP,
2090 self.TEST_USER_LOGIN,
2107 self.TEST_USER_LOGIN,
2091 'group.admin')
2108 'group.admin')
2092 Session().commit()
2109 Session().commit()
2093
2110
2094 id_, params = _build_data(self.apikey_regular,
2111 id_, params = _build_data(self.apikey_regular,
2095 'revoke_user_permission_from_repo_group',
2112 'revoke_user_permission_from_repo_group',
2096 repogroupid=TEST_REPO_GROUP,
2113 repogroupid=TEST_REPO_GROUP,
2097 userid=TEST_USER_ADMIN_LOGIN,
2114 userid=TEST_USER_ADMIN_LOGIN,
2098 apply_to_children=apply_to_children,)
2115 apply_to_children=apply_to_children,)
2099 response = api_call(self, params)
2116 response = api_call(self, params)
2100 if access_ok:
2117 if access_ok:
2101 expected = {
2118 expected = {
2102 'msg': 'Revoked perm (recursive:%s) for user: `%s` in repo group: `%s`' % (
2119 'msg': 'Revoked perm (recursive:%s) for user: `%s` in repo group: `%s`' % (
2103 apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
2120 apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
2104 ),
2121 ),
2105 'success': True
2122 'success': True
2106 }
2123 }
2107 self._compare_ok(id_, expected, given=response.body)
2124 self._compare_ok(id_, expected, given=response.body)
2108 else:
2125 else:
2109 expected = 'repository group `%s` does not exist' % TEST_REPO_GROUP
2126 expected = 'repository group `%s` does not exist' % TEST_REPO_GROUP
2110 self._compare_error(id_, expected, given=response.body)
2127 self._compare_error(id_, expected, given=response.body)
2111
2128
2112 @mock.patch.object(RepoGroupModel, 'revoke_user_permission', crash)
2129 @mock.patch.object(RepoGroupModel, 'revoke_user_permission', crash)
2113 def test_api_revoke_user_permission_from_repo_group_exception_when_adding(self):
2130 def test_api_revoke_user_permission_from_repo_group_exception_when_adding(self):
2114 id_, params = _build_data(self.apikey,
2131 id_, params = _build_data(self.apikey,
2115 'revoke_user_permission_from_repo_group',
2132 'revoke_user_permission_from_repo_group',
2116 repogroupid=TEST_REPO_GROUP,
2133 repogroupid=TEST_REPO_GROUP,
2117 userid=TEST_USER_ADMIN_LOGIN, )
2134 userid=TEST_USER_ADMIN_LOGIN, )
2118 response = api_call(self, params)
2135 response = api_call(self, params)
2119
2136
2120 expected = 'failed to edit permission for user: `%s` in repo group: `%s`' % (
2137 expected = 'failed to edit permission for user: `%s` in repo group: `%s`' % (
2121 TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
2138 TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
2122 )
2139 )
2123 self._compare_error(id_, expected, given=response.body)
2140 self._compare_error(id_, expected, given=response.body)
2124
2141
2125 @parametrize('name,perm,apply_to_children', [
2142 @parametrize('name,perm,apply_to_children', [
2126 ('none', 'group.none', 'none'),
2143 ('none', 'group.none', 'none'),
2127 ('read', 'group.read', 'none'),
2144 ('read', 'group.read', 'none'),
2128 ('write', 'group.write', 'none'),
2145 ('write', 'group.write', 'none'),
2129 ('admin', 'group.admin', 'none'),
2146 ('admin', 'group.admin', 'none'),
2130
2147
2131 ('none', 'group.none', 'all'),
2148 ('none', 'group.none', 'all'),
2132 ('read', 'group.read', 'all'),
2149 ('read', 'group.read', 'all'),
2133 ('write', 'group.write', 'all'),
2150 ('write', 'group.write', 'all'),
2134 ('admin', 'group.admin', 'all'),
2151 ('admin', 'group.admin', 'all'),
2135
2152
2136 ('none', 'group.none', 'repos'),
2153 ('none', 'group.none', 'repos'),
2137 ('read', 'group.read', 'repos'),
2154 ('read', 'group.read', 'repos'),
2138 ('write', 'group.write', 'repos'),
2155 ('write', 'group.write', 'repos'),
2139 ('admin', 'group.admin', 'repos'),
2156 ('admin', 'group.admin', 'repos'),
2140
2157
2141 ('none', 'group.none', 'groups'),
2158 ('none', 'group.none', 'groups'),
2142 ('read', 'group.read', 'groups'),
2159 ('read', 'group.read', 'groups'),
2143 ('write', 'group.write', 'groups'),
2160 ('write', 'group.write', 'groups'),
2144 ('admin', 'group.admin', 'groups'),
2161 ('admin', 'group.admin', 'groups'),
2145 ])
2162 ])
2146 def test_api_grant_user_group_permission_to_repo_group(self, name, perm, apply_to_children):
2163 def test_api_grant_user_group_permission_to_repo_group(self, name, perm, apply_to_children):
2147 id_, params = _build_data(self.apikey,
2164 id_, params = _build_data(self.apikey,
2148 'grant_user_group_permission_to_repo_group',
2165 'grant_user_group_permission_to_repo_group',
2149 repogroupid=TEST_REPO_GROUP,
2166 repogroupid=TEST_REPO_GROUP,
2150 usergroupid=TEST_USER_GROUP,
2167 usergroupid=TEST_USER_GROUP,
2151 perm=perm,
2168 perm=perm,
2152 apply_to_children=apply_to_children,)
2169 apply_to_children=apply_to_children,)
2153 response = api_call(self, params)
2170 response = api_call(self, params)
2154
2171
2155 ret = {
2172 ret = {
2156 'msg': 'Granted perm: `%s` (recursive:%s) for user group: `%s` in repo group: `%s`' % (
2173 'msg': 'Granted perm: `%s` (recursive:%s) for user group: `%s` in repo group: `%s`' % (
2157 perm, apply_to_children, TEST_USER_GROUP, TEST_REPO_GROUP
2174 perm, apply_to_children, TEST_USER_GROUP, TEST_REPO_GROUP
2158 ),
2175 ),
2159 'success': True
2176 'success': True
2160 }
2177 }
2161 expected = ret
2178 expected = ret
2162 self._compare_ok(id_, expected, given=response.body)
2179 self._compare_ok(id_, expected, given=response.body)
2163
2180
2164 @parametrize('name,perm,apply_to_children,grant_admin,access_ok', [
2181 @parametrize('name,perm,apply_to_children,grant_admin,access_ok', [
2165 ('none_fails', 'group.none', 'none', False, False),
2182 ('none_fails', 'group.none', 'none', False, False),
2166 ('read_fails', 'group.read', 'none', False, False),
2183 ('read_fails', 'group.read', 'none', False, False),
2167 ('write_fails', 'group.write', 'none', False, False),
2184 ('write_fails', 'group.write', 'none', False, False),
2168 ('admin_fails', 'group.admin', 'none', False, False),
2185 ('admin_fails', 'group.admin', 'none', False, False),
2169
2186
2170 # with granted perms
2187 # with granted perms
2171 ('none_ok', 'group.none', 'none', True, True),
2188 ('none_ok', 'group.none', 'none', True, True),
2172 ('read_ok', 'group.read', 'none', True, True),
2189 ('read_ok', 'group.read', 'none', True, True),
2173 ('write_ok', 'group.write', 'none', True, True),
2190 ('write_ok', 'group.write', 'none', True, True),
2174 ('admin_ok', 'group.admin', 'none', True, True),
2191 ('admin_ok', 'group.admin', 'none', True, True),
2175 ])
2192 ])
2176 def test_api_grant_user_group_permission_to_repo_group_by_regular_user(
2193 def test_api_grant_user_group_permission_to_repo_group_by_regular_user(
2177 self, name, perm, apply_to_children, grant_admin, access_ok):
2194 self, name, perm, apply_to_children, grant_admin, access_ok):
2178 if grant_admin:
2195 if grant_admin:
2179 RepoGroupModel().grant_user_permission(TEST_REPO_GROUP,
2196 RepoGroupModel().grant_user_permission(TEST_REPO_GROUP,
2180 self.TEST_USER_LOGIN,
2197 self.TEST_USER_LOGIN,
2181 'group.admin')
2198 'group.admin')
2182 Session().commit()
2199 Session().commit()
2183
2200
2184 id_, params = _build_data(self.apikey_regular,
2201 id_, params = _build_data(self.apikey_regular,
2185 'grant_user_group_permission_to_repo_group',
2202 'grant_user_group_permission_to_repo_group',
2186 repogroupid=TEST_REPO_GROUP,
2203 repogroupid=TEST_REPO_GROUP,
2187 usergroupid=TEST_USER_GROUP,
2204 usergroupid=TEST_USER_GROUP,
2188 perm=perm,
2205 perm=perm,
2189 apply_to_children=apply_to_children,)
2206 apply_to_children=apply_to_children,)
2190 response = api_call(self, params)
2207 response = api_call(self, params)
2191 if access_ok:
2208 if access_ok:
2192 ret = {
2209 ret = {
2193 'msg': 'Granted perm: `%s` (recursive:%s) for user group: `%s` in repo group: `%s`' % (
2210 'msg': 'Granted perm: `%s` (recursive:%s) for user group: `%s` in repo group: `%s`' % (
2194 perm, apply_to_children, TEST_USER_GROUP, TEST_REPO_GROUP
2211 perm, apply_to_children, TEST_USER_GROUP, TEST_REPO_GROUP
2195 ),
2212 ),
2196 'success': True
2213 'success': True
2197 }
2214 }
2198 expected = ret
2215 expected = ret
2199 self._compare_ok(id_, expected, given=response.body)
2216 self._compare_ok(id_, expected, given=response.body)
2200 else:
2217 else:
2201 expected = 'repository group `%s` does not exist' % TEST_REPO_GROUP
2218 expected = 'repository group `%s` does not exist' % TEST_REPO_GROUP
2202 self._compare_error(id_, expected, given=response.body)
2219 self._compare_error(id_, expected, given=response.body)
2203
2220
2204 def test_api_grant_user_group_permission_to_repo_group_wrong_permission(self):
2221 def test_api_grant_user_group_permission_to_repo_group_wrong_permission(self):
2205 perm = 'haha.no.permission'
2222 perm = 'haha.no.permission'
2206 id_, params = _build_data(self.apikey,
2223 id_, params = _build_data(self.apikey,
2207 'grant_user_group_permission_to_repo_group',
2224 'grant_user_group_permission_to_repo_group',
2208 repogroupid=TEST_REPO_GROUP,
2225 repogroupid=TEST_REPO_GROUP,
2209 usergroupid=TEST_USER_GROUP,
2226 usergroupid=TEST_USER_GROUP,
2210 perm=perm)
2227 perm=perm)
2211 response = api_call(self, params)
2228 response = api_call(self, params)
2212
2229
2213 expected = 'permission `%s` does not exist' % perm
2230 expected = 'permission `%s` does not exist' % perm
2214 self._compare_error(id_, expected, given=response.body)
2231 self._compare_error(id_, expected, given=response.body)
2215
2232
2216 @mock.patch.object(RepoGroupModel, 'grant_user_group_permission', crash)
2233 @mock.patch.object(RepoGroupModel, 'grant_user_group_permission', crash)
2217 def test_api_grant_user_group_permission_exception_when_adding_to_repo_group(self):
2234 def test_api_grant_user_group_permission_exception_when_adding_to_repo_group(self):
2218 perm = 'group.read'
2235 perm = 'group.read'
2219 id_, params = _build_data(self.apikey,
2236 id_, params = _build_data(self.apikey,
2220 'grant_user_group_permission_to_repo_group',
2237 'grant_user_group_permission_to_repo_group',
2221 repogroupid=TEST_REPO_GROUP,
2238 repogroupid=TEST_REPO_GROUP,
2222 usergroupid=TEST_USER_GROUP,
2239 usergroupid=TEST_USER_GROUP,
2223 perm=perm)
2240 perm=perm)
2224 response = api_call(self, params)
2241 response = api_call(self, params)
2225
2242
2226 expected = 'failed to edit permission for user group: `%s` in repo group: `%s`' % (
2243 expected = 'failed to edit permission for user group: `%s` in repo group: `%s`' % (
2227 TEST_USER_GROUP, TEST_REPO_GROUP
2244 TEST_USER_GROUP, TEST_REPO_GROUP
2228 )
2245 )
2229 self._compare_error(id_, expected, given=response.body)
2246 self._compare_error(id_, expected, given=response.body)
2230
2247
2231 @parametrize('name,apply_to_children', [
2248 @parametrize('name,apply_to_children', [
2232 ('none', 'none'),
2249 ('none', 'none'),
2233 ('all', 'all'),
2250 ('all', 'all'),
2234 ('repos', 'repos'),
2251 ('repos', 'repos'),
2235 ('groups', 'groups'),
2252 ('groups', 'groups'),
2236 ])
2253 ])
2237 def test_api_revoke_user_group_permission_from_repo_group(self, name, apply_to_children):
2254 def test_api_revoke_user_group_permission_from_repo_group(self, name, apply_to_children):
2238 RepoGroupModel().grant_user_group_permission(repo_group=TEST_REPO_GROUP,
2255 RepoGroupModel().grant_user_group_permission(repo_group=TEST_REPO_GROUP,
2239 group_name=TEST_USER_GROUP,
2256 group_name=TEST_USER_GROUP,
2240 perm='group.read',)
2257 perm='group.read',)
2241 Session().commit()
2258 Session().commit()
2242 id_, params = _build_data(self.apikey,
2259 id_, params = _build_data(self.apikey,
2243 'revoke_user_group_permission_from_repo_group',
2260 'revoke_user_group_permission_from_repo_group',
2244 repogroupid=TEST_REPO_GROUP,
2261 repogroupid=TEST_REPO_GROUP,
2245 usergroupid=TEST_USER_GROUP,
2262 usergroupid=TEST_USER_GROUP,
2246 apply_to_children=apply_to_children,)
2263 apply_to_children=apply_to_children,)
2247 response = api_call(self, params)
2264 response = api_call(self, params)
2248
2265
2249 expected = {
2266 expected = {
2250 'msg': 'Revoked perm (recursive:%s) for user group: `%s` in repo group: `%s`' % (
2267 'msg': 'Revoked perm (recursive:%s) for user group: `%s` in repo group: `%s`' % (
2251 apply_to_children, TEST_USER_GROUP, TEST_REPO_GROUP
2268 apply_to_children, TEST_USER_GROUP, TEST_REPO_GROUP
2252 ),
2269 ),
2253 'success': True
2270 'success': True
2254 }
2271 }
2255 self._compare_ok(id_, expected, given=response.body)
2272 self._compare_ok(id_, expected, given=response.body)
2256
2273
2257 @parametrize('name,apply_to_children,grant_admin,access_ok', [
2274 @parametrize('name,apply_to_children,grant_admin,access_ok', [
2258 ('none', 'none', False, False),
2275 ('none', 'none', False, False),
2259 ('all', 'all', False, False),
2276 ('all', 'all', False, False),
2260 ('repos', 'repos', False, False),
2277 ('repos', 'repos', False, False),
2261 ('groups', 'groups', False, False),
2278 ('groups', 'groups', False, False),
2262
2279
2263 # after granting admin rights
2280 # after granting admin rights
2264 ('none', 'none', False, False),
2281 ('none', 'none', False, False),
2265 ('all', 'all', False, False),
2282 ('all', 'all', False, False),
2266 ('repos', 'repos', False, False),
2283 ('repos', 'repos', False, False),
2267 ('groups', 'groups', False, False),
2284 ('groups', 'groups', False, False),
2268 ])
2285 ])
2269 def test_api_revoke_user_group_permission_from_repo_group_by_regular_user(
2286 def test_api_revoke_user_group_permission_from_repo_group_by_regular_user(
2270 self, name, apply_to_children, grant_admin, access_ok):
2287 self, name, apply_to_children, grant_admin, access_ok):
2271 RepoGroupModel().grant_user_permission(repo_group=TEST_REPO_GROUP,
2288 RepoGroupModel().grant_user_permission(repo_group=TEST_REPO_GROUP,
2272 user=TEST_USER_ADMIN_LOGIN,
2289 user=TEST_USER_ADMIN_LOGIN,
2273 perm='group.read',)
2290 perm='group.read',)
2274 Session().commit()
2291 Session().commit()
2275
2292
2276 if grant_admin:
2293 if grant_admin:
2277 RepoGroupModel().grant_user_permission(TEST_REPO_GROUP,
2294 RepoGroupModel().grant_user_permission(TEST_REPO_GROUP,
2278 self.TEST_USER_LOGIN,
2295 self.TEST_USER_LOGIN,
2279 'group.admin')
2296 'group.admin')
2280 Session().commit()
2297 Session().commit()
2281
2298
2282 id_, params = _build_data(self.apikey_regular,
2299 id_, params = _build_data(self.apikey_regular,
2283 'revoke_user_group_permission_from_repo_group',
2300 'revoke_user_group_permission_from_repo_group',
2284 repogroupid=TEST_REPO_GROUP,
2301 repogroupid=TEST_REPO_GROUP,
2285 usergroupid=TEST_USER_GROUP,
2302 usergroupid=TEST_USER_GROUP,
2286 apply_to_children=apply_to_children,)
2303 apply_to_children=apply_to_children,)
2287 response = api_call(self, params)
2304 response = api_call(self, params)
2288 if access_ok:
2305 if access_ok:
2289 expected = {
2306 expected = {
2290 'msg': 'Revoked perm (recursive:%s) for user group: `%s` in repo group: `%s`' % (
2307 'msg': 'Revoked perm (recursive:%s) for user group: `%s` in repo group: `%s`' % (
2291 apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
2308 apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
2292 ),
2309 ),
2293 'success': True
2310 'success': True
2294 }
2311 }
2295 self._compare_ok(id_, expected, given=response.body)
2312 self._compare_ok(id_, expected, given=response.body)
2296 else:
2313 else:
2297 expected = 'repository group `%s` does not exist' % TEST_REPO_GROUP
2314 expected = 'repository group `%s` does not exist' % TEST_REPO_GROUP
2298 self._compare_error(id_, expected, given=response.body)
2315 self._compare_error(id_, expected, given=response.body)
2299
2316
2300 @mock.patch.object(RepoGroupModel, 'revoke_user_group_permission', crash)
2317 @mock.patch.object(RepoGroupModel, 'revoke_user_group_permission', crash)
2301 def test_api_revoke_user_group_permission_from_repo_group_exception_when_adding(self):
2318 def test_api_revoke_user_group_permission_from_repo_group_exception_when_adding(self):
2302 id_, params = _build_data(self.apikey, 'revoke_user_group_permission_from_repo_group',
2319 id_, params = _build_data(self.apikey, 'revoke_user_group_permission_from_repo_group',
2303 repogroupid=TEST_REPO_GROUP,
2320 repogroupid=TEST_REPO_GROUP,
2304 usergroupid=TEST_USER_GROUP,)
2321 usergroupid=TEST_USER_GROUP,)
2305 response = api_call(self, params)
2322 response = api_call(self, params)
2306
2323
2307 expected = 'failed to edit permission for user group: `%s` in repo group: `%s`' % (
2324 expected = 'failed to edit permission for user group: `%s` in repo group: `%s`' % (
2308 TEST_USER_GROUP, TEST_REPO_GROUP
2325 TEST_USER_GROUP, TEST_REPO_GROUP
2309 )
2326 )
2310 self._compare_error(id_, expected, given=response.body)
2327 self._compare_error(id_, expected, given=response.body)
2311
2328
2312 def test_api_get_gist(self):
2329 def test_api_get_gist(self):
2313 gist = fixture.create_gist()
2330 gist = fixture.create_gist()
2314 gist_id = gist.gist_access_id
2331 gist_id = gist.gist_access_id
2315 gist_created_on = gist.created_on
2332 gist_created_on = gist.created_on
2316 id_, params = _build_data(self.apikey, 'get_gist',
2333 id_, params = _build_data(self.apikey, 'get_gist',
2317 gistid=gist_id, )
2334 gistid=gist_id, )
2318 response = api_call(self, params)
2335 response = api_call(self, params)
2319
2336
2320 expected = {
2337 expected = {
2321 'access_id': gist_id,
2338 'access_id': gist_id,
2322 'created_on': gist_created_on,
2339 'created_on': gist_created_on,
2323 'description': 'new-gist',
2340 'description': 'new-gist',
2324 'expires': -1.0,
2341 'expires': -1.0,
2325 'gist_id': int(gist_id),
2342 'gist_id': int(gist_id),
2326 'type': 'public',
2343 'type': 'public',
2327 'url': 'http://localhost:80/_admin/gists/%s' % gist_id
2344 'url': 'http://localhost:80/_admin/gists/%s' % gist_id
2328 }
2345 }
2329
2346
2330 self._compare_ok(id_, expected, given=response.body)
2347 self._compare_ok(id_, expected, given=response.body)
2331
2348
2332 def test_api_get_gist_that_does_not_exist(self):
2349 def test_api_get_gist_that_does_not_exist(self):
2333 id_, params = _build_data(self.apikey_regular, 'get_gist',
2350 id_, params = _build_data(self.apikey_regular, 'get_gist',
2334 gistid='12345', )
2351 gistid='12345', )
2335 response = api_call(self, params)
2352 response = api_call(self, params)
2336 expected = 'gist `%s` does not exist' % ('12345',)
2353 expected = 'gist `%s` does not exist' % ('12345',)
2337 self._compare_error(id_, expected, given=response.body)
2354 self._compare_error(id_, expected, given=response.body)
2338
2355
2339 def test_api_get_gist_private_gist_without_permission(self):
2356 def test_api_get_gist_private_gist_without_permission(self):
2340 gist = fixture.create_gist()
2357 gist = fixture.create_gist()
2341 gist_id = gist.gist_access_id
2358 gist_id = gist.gist_access_id
2342 gist_created_on = gist.created_on
2359 gist_created_on = gist.created_on
2343 id_, params = _build_data(self.apikey_regular, 'get_gist',
2360 id_, params = _build_data(self.apikey_regular, 'get_gist',
2344 gistid=gist_id, )
2361 gistid=gist_id, )
2345 response = api_call(self, params)
2362 response = api_call(self, params)
2346
2363
2347 expected = 'gist `%s` does not exist' % gist_id
2364 expected = 'gist `%s` does not exist' % gist_id
2348 self._compare_error(id_, expected, given=response.body)
2365 self._compare_error(id_, expected, given=response.body)
2349
2366
2350 def test_api_get_gists(self):
2367 def test_api_get_gists(self):
2351 fixture.create_gist()
2368 fixture.create_gist()
2352 fixture.create_gist()
2369 fixture.create_gist()
2353
2370
2354 id_, params = _build_data(self.apikey, 'get_gists')
2371 id_, params = _build_data(self.apikey, 'get_gists')
2355 response = api_call(self, params)
2372 response = api_call(self, params)
2356 expected = response.json
2373 expected = response.json
2357 assert len(response.json['result']) == 2
2374 assert len(response.json['result']) == 2
2358 #self._compare_ok(id_, expected, given=response.body)
2375 #self._compare_ok(id_, expected, given=response.body)
2359
2376
2360 def test_api_get_gists_regular_user(self):
2377 def test_api_get_gists_regular_user(self):
2361 # by admin
2378 # by admin
2362 fixture.create_gist()
2379 fixture.create_gist()
2363 fixture.create_gist()
2380 fixture.create_gist()
2364
2381
2365 # by reg user
2382 # by reg user
2366 fixture.create_gist(owner=self.TEST_USER_LOGIN)
2383 fixture.create_gist(owner=self.TEST_USER_LOGIN)
2367 fixture.create_gist(owner=self.TEST_USER_LOGIN)
2384 fixture.create_gist(owner=self.TEST_USER_LOGIN)
2368 fixture.create_gist(owner=self.TEST_USER_LOGIN)
2385 fixture.create_gist(owner=self.TEST_USER_LOGIN)
2369
2386
2370 id_, params = _build_data(self.apikey_regular, 'get_gists')
2387 id_, params = _build_data(self.apikey_regular, 'get_gists')
2371 response = api_call(self, params)
2388 response = api_call(self, params)
2372 expected = response.json
2389 expected = response.json
2373 assert len(response.json['result']) == 3
2390 assert len(response.json['result']) == 3
2374 #self._compare_ok(id_, expected, given=response.body)
2391 #self._compare_ok(id_, expected, given=response.body)
2375
2392
2376 def test_api_get_gists_only_for_regular_user(self):
2393 def test_api_get_gists_only_for_regular_user(self):
2377 # by admin
2394 # by admin
2378 fixture.create_gist()
2395 fixture.create_gist()
2379 fixture.create_gist()
2396 fixture.create_gist()
2380
2397
2381 # by reg user
2398 # by reg user
2382 fixture.create_gist(owner=self.TEST_USER_LOGIN)
2399 fixture.create_gist(owner=self.TEST_USER_LOGIN)
2383 fixture.create_gist(owner=self.TEST_USER_LOGIN)
2400 fixture.create_gist(owner=self.TEST_USER_LOGIN)
2384 fixture.create_gist(owner=self.TEST_USER_LOGIN)
2401 fixture.create_gist(owner=self.TEST_USER_LOGIN)
2385
2402
2386 id_, params = _build_data(self.apikey, 'get_gists',
2403 id_, params = _build_data(self.apikey, 'get_gists',
2387 userid=self.TEST_USER_LOGIN)
2404 userid=self.TEST_USER_LOGIN)
2388 response = api_call(self, params)
2405 response = api_call(self, params)
2389 expected = response.json
2406 expected = response.json
2390 assert len(response.json['result']) == 3
2407 assert len(response.json['result']) == 3
2391 #self._compare_ok(id_, expected, given=response.body)
2408 #self._compare_ok(id_, expected, given=response.body)
2392
2409
2393 def test_api_get_gists_regular_user_with_different_userid(self):
2410 def test_api_get_gists_regular_user_with_different_userid(self):
2394 id_, params = _build_data(self.apikey_regular, 'get_gists',
2411 id_, params = _build_data(self.apikey_regular, 'get_gists',
2395 userid=TEST_USER_ADMIN_LOGIN)
2412 userid=TEST_USER_ADMIN_LOGIN)
2396 response = api_call(self, params)
2413 response = api_call(self, params)
2397 expected = 'userid is not the same as your user'
2414 expected = 'userid is not the same as your user'
2398 self._compare_error(id_, expected, given=response.body)
2415 self._compare_error(id_, expected, given=response.body)
2399
2416
2400 def test_api_create_gist(self):
2417 def test_api_create_gist(self):
2401 id_, params = _build_data(self.apikey_regular, 'create_gist',
2418 id_, params = _build_data(self.apikey_regular, 'create_gist',
2402 lifetime=10,
2419 lifetime=10,
2403 description='foobar-gist',
2420 description='foobar-gist',
2404 gist_type='public',
2421 gist_type='public',
2405 files={'foobar': {'content': 'foo'}})
2422 files={'foobar': {'content': 'foo'}})
2406 response = api_call(self, params)
2423 response = api_call(self, params)
2407 response_json = response.json
2424 response_json = response.json
2408 expected = {
2425 expected = {
2409 'gist': {
2426 'gist': {
2410 'access_id': response_json['result']['gist']['access_id'],
2427 'access_id': response_json['result']['gist']['access_id'],
2411 'created_on': response_json['result']['gist']['created_on'],
2428 'created_on': response_json['result']['gist']['created_on'],
2412 'description': 'foobar-gist',
2429 'description': 'foobar-gist',
2413 'expires': response_json['result']['gist']['expires'],
2430 'expires': response_json['result']['gist']['expires'],
2414 'gist_id': response_json['result']['gist']['gist_id'],
2431 'gist_id': response_json['result']['gist']['gist_id'],
2415 'type': 'public',
2432 'type': 'public',
2416 'url': response_json['result']['gist']['url']
2433 'url': response_json['result']['gist']['url']
2417 },
2434 },
2418 'msg': 'created new gist'
2435 'msg': 'created new gist'
2419 }
2436 }
2420 self._compare_ok(id_, expected, given=response.body)
2437 self._compare_ok(id_, expected, given=response.body)
2421
2438
2422 @mock.patch.object(GistModel, 'create', crash)
2439 @mock.patch.object(GistModel, 'create', crash)
2423 def test_api_create_gist_exception_occurred(self):
2440 def test_api_create_gist_exception_occurred(self):
2424 id_, params = _build_data(self.apikey_regular, 'create_gist',
2441 id_, params = _build_data(self.apikey_regular, 'create_gist',
2425 files={})
2442 files={})
2426 response = api_call(self, params)
2443 response = api_call(self, params)
2427 expected = 'failed to create gist'
2444 expected = 'failed to create gist'
2428 self._compare_error(id_, expected, given=response.body)
2445 self._compare_error(id_, expected, given=response.body)
2429
2446
2430 def test_api_delete_gist(self):
2447 def test_api_delete_gist(self):
2431 gist_id = fixture.create_gist().gist_access_id
2448 gist_id = fixture.create_gist().gist_access_id
2432 id_, params = _build_data(self.apikey, 'delete_gist',
2449 id_, params = _build_data(self.apikey, 'delete_gist',
2433 gistid=gist_id)
2450 gistid=gist_id)
2434 response = api_call(self, params)
2451 response = api_call(self, params)
2435 expected = {'gist': None, 'msg': 'deleted gist ID:%s' % gist_id}
2452 expected = {'gist': None, 'msg': 'deleted gist ID:%s' % gist_id}
2436 self._compare_ok(id_, expected, given=response.body)
2453 self._compare_ok(id_, expected, given=response.body)
2437
2454
2438 def test_api_delete_gist_regular_user(self):
2455 def test_api_delete_gist_regular_user(self):
2439 gist_id = fixture.create_gist(owner=self.TEST_USER_LOGIN).gist_access_id
2456 gist_id = fixture.create_gist(owner=self.TEST_USER_LOGIN).gist_access_id
2440 id_, params = _build_data(self.apikey_regular, 'delete_gist',
2457 id_, params = _build_data(self.apikey_regular, 'delete_gist',
2441 gistid=gist_id)
2458 gistid=gist_id)
2442 response = api_call(self, params)
2459 response = api_call(self, params)
2443 expected = {'gist': None, 'msg': 'deleted gist ID:%s' % gist_id}
2460 expected = {'gist': None, 'msg': 'deleted gist ID:%s' % gist_id}
2444 self._compare_ok(id_, expected, given=response.body)
2461 self._compare_ok(id_, expected, given=response.body)
2445
2462
2446 def test_api_delete_gist_regular_user_no_permission(self):
2463 def test_api_delete_gist_regular_user_no_permission(self):
2447 gist_id = fixture.create_gist().gist_access_id
2464 gist_id = fixture.create_gist().gist_access_id
2448 id_, params = _build_data(self.apikey_regular, 'delete_gist',
2465 id_, params = _build_data(self.apikey_regular, 'delete_gist',
2449 gistid=gist_id)
2466 gistid=gist_id)
2450 response = api_call(self, params)
2467 response = api_call(self, params)
2451 expected = 'gist `%s` does not exist' % (gist_id,)
2468 expected = 'gist `%s` does not exist' % (gist_id,)
2452 self._compare_error(id_, expected, given=response.body)
2469 self._compare_error(id_, expected, given=response.body)
2453
2470
2454 @mock.patch.object(GistModel, 'delete', crash)
2471 @mock.patch.object(GistModel, 'delete', crash)
2455 def test_api_delete_gist_exception_occurred(self):
2472 def test_api_delete_gist_exception_occurred(self):
2456 gist_id = fixture.create_gist().gist_access_id
2473 gist_id = fixture.create_gist().gist_access_id
2457 id_, params = _build_data(self.apikey, 'delete_gist',
2474 id_, params = _build_data(self.apikey, 'delete_gist',
2458 gistid=gist_id)
2475 gistid=gist_id)
2459 response = api_call(self, params)
2476 response = api_call(self, params)
2460 expected = 'failed to delete gist ID:%s' % (gist_id,)
2477 expected = 'failed to delete gist ID:%s' % (gist_id,)
2461 self._compare_error(id_, expected, given=response.body)
2478 self._compare_error(id_, expected, given=response.body)
2462
2479
2463 def test_api_get_ip(self):
2480 def test_api_get_ip(self):
2464 id_, params = _build_data(self.apikey, 'get_ip')
2481 id_, params = _build_data(self.apikey, 'get_ip')
2465 response = api_call(self, params)
2482 response = api_call(self, params)
2466 expected = {
2483 expected = {
2467 'server_ip_addr': '0.0.0.0',
2484 'server_ip_addr': '0.0.0.0',
2468 'user_ips': []
2485 'user_ips': []
2469 }
2486 }
2470 self._compare_ok(id_, expected, given=response.body)
2487 self._compare_ok(id_, expected, given=response.body)
2471
2488
2472 def test_api_get_server_info(self):
2489 def test_api_get_server_info(self):
2473 id_, params = _build_data(self.apikey, 'get_server_info')
2490 id_, params = _build_data(self.apikey, 'get_server_info')
2474 response = api_call(self, params)
2491 response = api_call(self, params)
2475 expected = Setting.get_server_info()
2492 expected = Setting.get_server_info()
2476 self._compare_ok(id_, expected, given=response.body)
2493 self._compare_ok(id_, expected, given=response.body)
2477
2494
2478 def test_api_get_changesets(self):
2495 def test_api_get_changesets(self):
2479 id_, params = _build_data(self.apikey, 'get_changesets',
2496 id_, params = _build_data(self.apikey, 'get_changesets',
2480 repoid=self.REPO, start=0, end=2)
2497 repoid=self.REPO, start=0, end=2)
2481 response = api_call(self, params)
2498 response = api_call(self, params)
2482 result = json.loads(response.body)["result"]
2499 result = json.loads(response.body)["result"]
2483 assert len(result) == 3
2500 assert len(result) == 3
2484 assert 'message' in result[0]
2501 assert 'message' in result[0]
2485 assert 'added' not in result[0]
2502 assert 'added' not in result[0]
2486
2503
2487 def test_api_get_changesets_with_file_list(self):
2504 def test_api_get_changesets_with_file_list(self):
2488 id_, params = _build_data(self.apikey, 'get_changesets',
2505 id_, params = _build_data(self.apikey, 'get_changesets',
2489 repoid=self.REPO, start_date="2010-04-07T23:30:30", end_date="2010-04-08T00:31:14", with_file_list=True)
2506 repoid=self.REPO, start_date="2010-04-07T23:30:30", end_date="2010-04-08T00:31:14", with_file_list=True)
2490 response = api_call(self, params)
2507 response = api_call(self, params)
2491 result = json.loads(response.body)["result"]
2508 result = json.loads(response.body)["result"]
2492 assert len(result) == 3
2509 assert len(result) == 3
2493 assert 'message' in result[0]
2510 assert 'message' in result[0]
2494 assert 'added' in result[0]
2511 assert 'added' in result[0]
2495
2512
2496 def test_api_get_changeset(self):
2513 def test_api_get_changeset(self):
2497 review = fixture.review_changeset(self.REPO, self.TEST_REVISION, "approved")
2514 review = fixture.review_changeset(self.REPO, self.TEST_REVISION, "approved")
2498 id_, params = _build_data(self.apikey, 'get_changeset',
2515 id_, params = _build_data(self.apikey, 'get_changeset',
2499 repoid=self.REPO, raw_id=self.TEST_REVISION)
2516 repoid=self.REPO, raw_id=self.TEST_REVISION)
2500 response = api_call(self, params)
2517 response = api_call(self, params)
2501 result = json.loads(response.body)["result"]
2518 result = json.loads(response.body)["result"]
2502 assert result["raw_id"] == self.TEST_REVISION
2519 assert result["raw_id"] == self.TEST_REVISION
2503 assert "reviews" not in result
2520 assert "reviews" not in result
2504
2521
2505 def test_api_get_changeset_with_reviews(self):
2522 def test_api_get_changeset_with_reviews(self):
2506 reviewobjs = fixture.review_changeset(self.REPO, self.TEST_REVISION, "approved")
2523 reviewobjs = fixture.review_changeset(self.REPO, self.TEST_REVISION, "approved")
2507 id_, params = _build_data(self.apikey, 'get_changeset',
2524 id_, params = _build_data(self.apikey, 'get_changeset',
2508 repoid=self.REPO, raw_id=self.TEST_REVISION,
2525 repoid=self.REPO, raw_id=self.TEST_REVISION,
2509 with_reviews=True)
2526 with_reviews=True)
2510 response = api_call(self, params)
2527 response = api_call(self, params)
2511 result = json.loads(response.body)["result"]
2528 result = json.loads(response.body)["result"]
2512 assert result["raw_id"] == self.TEST_REVISION
2529 assert result["raw_id"] == self.TEST_REVISION
2513 assert "reviews" in result
2530 assert "reviews" in result
2514 assert len(result["reviews"]) == 1
2531 assert len(result["reviews"]) == 1
2515 review = result["reviews"][0]
2532 review = result["reviews"][0]
2516 expected = {
2533 expected = {
2517 'status': 'approved',
2534 'status': 'approved',
2518 'modified_at': reviewobjs[0].modified_at.replace(microsecond=0).isoformat(),
2535 'modified_at': reviewobjs[0].modified_at.replace(microsecond=0).isoformat(),
2519 'reviewer': 'test_admin',
2536 'reviewer': 'test_admin',
2520 }
2537 }
2521 assert review == expected
2538 assert review == expected
2522
2539
2523 def test_api_get_changeset_that_does_not_exist(self):
2540 def test_api_get_changeset_that_does_not_exist(self):
2524 """ Fetch changeset status for non-existant changeset.
2541 """ Fetch changeset status for non-existant changeset.
2525 revision id is the above git hash used in the test above with the
2542 revision id is the above git hash used in the test above with the
2526 last 3 nibbles replaced with 0xf. Should not exist for git _or_ hg.
2543 last 3 nibbles replaced with 0xf. Should not exist for git _or_ hg.
2527 """
2544 """
2528 id_, params = _build_data(self.apikey, 'get_changeset',
2545 id_, params = _build_data(self.apikey, 'get_changeset',
2529 repoid=self.REPO, raw_id = '7ab37bc680b4aa72c34d07b230c866c28e9fcfff')
2546 repoid=self.REPO, raw_id = '7ab37bc680b4aa72c34d07b230c866c28e9fcfff')
2530 response = api_call(self, params)
2547 response = api_call(self, params)
2531 expected = u'Changeset %s does not exist' % ('7ab37bc680b4aa72c34d07b230c866c28e9fcfff',)
2548 expected = u'Changeset %s does not exist' % ('7ab37bc680b4aa72c34d07b230c866c28e9fcfff',)
2532 self._compare_error(id_, expected, given=response.body)
2549 self._compare_error(id_, expected, given=response.body)
2533
2550
2534 def test_api_get_changeset_without_permission(self):
2551 def test_api_get_changeset_without_permission(self):
2535 review = fixture.review_changeset(self.REPO, self.TEST_REVISION, "approved")
2552 review = fixture.review_changeset(self.REPO, self.TEST_REVISION, "approved")
2536 RepoModel().revoke_user_permission(repo=self.REPO, user=self.TEST_USER_LOGIN)
2553 RepoModel().revoke_user_permission(repo=self.REPO, user=self.TEST_USER_LOGIN)
2537 RepoModel().revoke_user_permission(repo=self.REPO, user="default")
2554 RepoModel().revoke_user_permission(repo=self.REPO, user="default")
2538 id_, params = _build_data(self.apikey_regular, 'get_changeset',
2555 id_, params = _build_data(self.apikey_regular, 'get_changeset',
2539 repoid=self.REPO, raw_id=self.TEST_REVISION)
2556 repoid=self.REPO, raw_id=self.TEST_REVISION)
2540 response = api_call(self, params)
2557 response = api_call(self, params)
2541 expected = u'Access denied to repo %s' % self.REPO
2558 expected = u'Access denied to repo %s' % self.REPO
2542 self._compare_error(id_, expected, given=response.body)
2559 self._compare_error(id_, expected, given=response.body)
2543
2560
2544 def test_api_get_pullrequest(self):
2561 def test_api_get_pullrequest(self):
2545 pull_request_id = fixture.create_pullrequest(self, self.REPO, self.TEST_PR_SRC, self.TEST_PR_DST, u'get test')
2562 pull_request_id = fixture.create_pullrequest(self, self.REPO, self.TEST_PR_SRC, self.TEST_PR_DST, u'get test')
2546 random_id = random.randrange(1, 9999)
2563 random_id = random.randrange(1, 9999)
2547 params = json.dumps({
2564 params = json.dumps({
2548 "id": random_id,
2565 "id": random_id,
2549 "api_key": self.apikey,
2566 "api_key": self.apikey,
2550 "method": 'get_pullrequest',
2567 "method": 'get_pullrequest',
2551 "args": {"pullrequest_id": pull_request_id},
2568 "args": {"pullrequest_id": pull_request_id},
2552 })
2569 })
2553 response = api_call(self, params)
2570 response = api_call(self, params)
2554 pullrequest = PullRequest().get(pull_request_id)
2571 pullrequest = PullRequest().get(pull_request_id)
2555 expected = {
2572 expected = {
2556 "status": "new",
2573 "status": "new",
2557 "pull_request_id": pull_request_id,
2574 "pull_request_id": pull_request_id,
2558 "description": "No description",
2575 "description": "No description",
2559 "url": "/%s/pull-request/%s/_/%s" % (self.REPO, pull_request_id, "stable"),
2576 "url": "/%s/pull-request/%s/_/%s" % (self.REPO, pull_request_id, "stable"),
2560 "reviewers": [{"username": "test_regular"}],
2577 "reviewers": [{"username": "test_regular"}],
2561 "org_repo_url": "http://localhost:80/%s" % self.REPO,
2578 "org_repo_url": "http://localhost:80/%s" % self.REPO,
2562 "org_ref_parts": ["branch", "stable", self.TEST_PR_SRC],
2579 "org_ref_parts": ["branch", "stable", self.TEST_PR_SRC],
2563 "other_ref_parts": ["branch", "default", self.TEST_PR_DST],
2580 "other_ref_parts": ["branch", "default", self.TEST_PR_DST],
2564 "comments": [{"username": TEST_USER_ADMIN_LOGIN, "text": "",
2581 "comments": [{"username": TEST_USER_ADMIN_LOGIN, "text": "",
2565 "comment_id": pullrequest.comments[0].comment_id}],
2582 "comment_id": pullrequest.comments[0].comment_id}],
2566 "owner": TEST_USER_ADMIN_LOGIN,
2583 "owner": TEST_USER_ADMIN_LOGIN,
2567 "statuses": [{"status": "under_review", "reviewer": TEST_USER_ADMIN_LOGIN, "modified_at": "2000-01-01T00:00:00"} for i in range(0, len(self.TEST_PR_REVISIONS))],
2584 "statuses": [{"status": "under_review", "reviewer": TEST_USER_ADMIN_LOGIN, "modified_at": "2000-01-01T00:00:00"} for i in range(0, len(self.TEST_PR_REVISIONS))],
2568 "title": "get test",
2585 "title": "get test",
2569 "revisions": self.TEST_PR_REVISIONS,
2586 "revisions": self.TEST_PR_REVISIONS,
2570 }
2587 }
2571 self._compare_ok(random_id, expected,
2588 self._compare_ok(random_id, expected,
2572 given=re.sub("\d\d\d\d\-\d\d\-\d\dT\d\d\:\d\d\:\d\d",
2589 given=re.sub("\d\d\d\d\-\d\d\-\d\dT\d\d\:\d\d\:\d\d",
2573 "2000-01-01T00:00:00", response.body))
2590 "2000-01-01T00:00:00", response.body))
2574
2591
2575 def test_api_close_pullrequest(self):
2592 def test_api_close_pullrequest(self):
2576 pull_request_id = fixture.create_pullrequest(self, self.REPO, self.TEST_PR_SRC, self.TEST_PR_DST, u'close test')
2593 pull_request_id = fixture.create_pullrequest(self, self.REPO, self.TEST_PR_SRC, self.TEST_PR_DST, u'close test')
2577 random_id = random.randrange(1, 9999)
2594 random_id = random.randrange(1, 9999)
2578 params = json.dumps({
2595 params = json.dumps({
2579 "id": random_id,
2596 "id": random_id,
2580 "api_key": self.apikey,
2597 "api_key": self.apikey,
2581 "method": "comment_pullrequest",
2598 "method": "comment_pullrequest",
2582 "args": {"pull_request_id": pull_request_id, "close_pr": True},
2599 "args": {"pull_request_id": pull_request_id, "close_pr": True},
2583 })
2600 })
2584 response = api_call(self, params)
2601 response = api_call(self, params)
2585 self._compare_ok(random_id, True, given=response.body)
2602 self._compare_ok(random_id, True, given=response.body)
2586 pullrequest = PullRequest().get(pull_request_id)
2603 pullrequest = PullRequest().get(pull_request_id)
2587 assert pullrequest.comments[-1].text == ''
2604 assert pullrequest.comments[-1].text == ''
2588 assert pullrequest.status == PullRequest.STATUS_CLOSED
2605 assert pullrequest.status == PullRequest.STATUS_CLOSED
2589 assert pullrequest.is_closed() == True
2606 assert pullrequest.is_closed() == True
2590
2607
2591 def test_api_status_pullrequest(self):
2608 def test_api_status_pullrequest(self):
2592 pull_request_id = fixture.create_pullrequest(self, self.REPO, self.TEST_PR_SRC, self.TEST_PR_DST, u"status test")
2609 pull_request_id = fixture.create_pullrequest(self, self.REPO, self.TEST_PR_SRC, self.TEST_PR_DST, u"status test")
2593
2610
2594 random_id = random.randrange(1, 9999)
2611 random_id = random.randrange(1, 9999)
2595 params = json.dumps({
2612 params = json.dumps({
2596 "id": random_id,
2613 "id": random_id,
2597 "api_key": User.get_by_username(TEST_USER_REGULAR2_LOGIN).api_key,
2614 "api_key": User.get_by_username(TEST_USER_REGULAR2_LOGIN).api_key,
2598 "method": "comment_pullrequest",
2615 "method": "comment_pullrequest",
2599 "args": {"pull_request_id": pull_request_id, "status": ChangesetStatus.STATUS_APPROVED},
2616 "args": {"pull_request_id": pull_request_id, "status": ChangesetStatus.STATUS_APPROVED},
2600 })
2617 })
2601 response = api_call(self, params)
2618 response = api_call(self, params)
2602 pullrequest = PullRequest().get(pull_request_id)
2619 pullrequest = PullRequest().get(pull_request_id)
2603 self._compare_error(random_id, "No permission to change pull request status. User needs to be admin, owner or reviewer.", given=response.body)
2620 self._compare_error(random_id, "No permission to change pull request status. User needs to be admin, owner or reviewer.", given=response.body)
2604 assert ChangesetStatus.STATUS_UNDER_REVIEW == ChangesetStatusModel().calculate_pull_request_result(pullrequest)[2]
2621 assert ChangesetStatus.STATUS_UNDER_REVIEW == ChangesetStatusModel().calculate_pull_request_result(pullrequest)[2]
2605 params = json.dumps({
2622 params = json.dumps({
2606 "id": random_id,
2623 "id": random_id,
2607 "api_key": User.get_by_username(TEST_USER_REGULAR_LOGIN).api_key,
2624 "api_key": User.get_by_username(TEST_USER_REGULAR_LOGIN).api_key,
2608 "method": "comment_pullrequest",
2625 "method": "comment_pullrequest",
2609 "args": {"pull_request_id": pull_request_id, "status": ChangesetStatus.STATUS_APPROVED},
2626 "args": {"pull_request_id": pull_request_id, "status": ChangesetStatus.STATUS_APPROVED},
2610 })
2627 })
2611 response = api_call(self, params)
2628 response = api_call(self, params)
2612 self._compare_ok(random_id, True, given=response.body)
2629 self._compare_ok(random_id, True, given=response.body)
2613 pullrequest = PullRequest().get(pull_request_id)
2630 pullrequest = PullRequest().get(pull_request_id)
2614 assert ChangesetStatus.STATUS_APPROVED == ChangesetStatusModel().calculate_pull_request_result(pullrequest)[2]
2631 assert ChangesetStatus.STATUS_APPROVED == ChangesetStatusModel().calculate_pull_request_result(pullrequest)[2]
2615
2632
2616 def test_api_comment_pullrequest(self):
2633 def test_api_comment_pullrequest(self):
2617 pull_request_id = fixture.create_pullrequest(self, self.REPO, self.TEST_PR_SRC, self.TEST_PR_DST, u"comment test")
2634 pull_request_id = fixture.create_pullrequest(self, self.REPO, self.TEST_PR_SRC, self.TEST_PR_DST, u"comment test")
2618 random_id = random.randrange(1, 9999)
2635 random_id = random.randrange(1, 9999)
2619 params = json.dumps({
2636 params = json.dumps({
2620 "id": random_id,
2637 "id": random_id,
2621 "api_key": self.apikey,
2638 "api_key": self.apikey,
2622 "method": "comment_pullrequest",
2639 "method": "comment_pullrequest",
2623 "args": {"pull_request_id": pull_request_id, "comment_msg": "Looks good to me"},
2640 "args": {"pull_request_id": pull_request_id, "comment_msg": "Looks good to me"},
2624 })
2641 })
2625 response = api_call(self, params)
2642 response = api_call(self, params)
2626 self._compare_ok(random_id, True, given=response.body)
2643 self._compare_ok(random_id, True, given=response.body)
2627 pullrequest = PullRequest().get(pull_request_id)
2644 pullrequest = PullRequest().get(pull_request_id)
2628 assert pullrequest.comments[-1].text == u'Looks good to me'
2645 assert pullrequest.comments[-1].text == u'Looks good to me'
General Comments 0
You need to be logged in to leave comments. Login now