diff --git a/rhodecode/tests/api/api_base.py b/rhodecode/tests/api/api_base.py
--- a/rhodecode/tests/api/api_base.py
+++ b/rhodecode/tests/api/api_base.py
@@ -1,4 +1,25 @@
+# -*- coding: utf-8 -*-
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+"""
+tests for api. run with::
+
+ RC_WHOOSH_TEST_DISABLE=1 nosetests --with-coverage --cover-package=rhodecode.controllers.api.api -x rhodecode/tests/api
+"""
+
from __future__ import with_statement
+import os
import random
import mock
@@ -7,16 +28,19 @@ from rhodecode.tests.fixture import Fixt
from rhodecode.lib.compat import json
from rhodecode.lib.auth import AuthUser
from rhodecode.model.user import UserModel
-from rhodecode.model.users_group import UserGroupModel
+from rhodecode.model.user_group import UserGroupModel
from rhodecode.model.repo import RepoModel
+from rhodecode.model.repo_group import RepoGroupModel
from rhodecode.model.meta import Session
from rhodecode.model.scm import ScmModel
-from rhodecode.model.db import Repository, User
-from rhodecode.lib.utils2 import time_to_datetime
+from rhodecode.model.gist import GistModel
+from rhodecode.model.db import Repository, User, RhodeCodeSetting
+from rhodecode.lib.utils2 import time_to_datetime
API_URL = '/_admin/api'
-TEST_USER_GROUP = 'test_users_group'
+TEST_USER_GROUP = 'test_user_group'
+TEST_REPO_GROUP = 'test_repo_group'
fixture = Fixture()
@@ -35,6 +59,7 @@ def _build_data(apikey, method, **kw):
"args": kw
})
+
jsonify = lambda obj: json.loads(json.dumps(obj))
@@ -49,17 +74,18 @@ def api_call(test_obj, params):
## helpers
-def make_users_group(name=TEST_USER_GROUP):
+def make_user_group(name=TEST_USER_GROUP):
gr = fixture.create_user_group(name, cur_user=TEST_USER_ADMIN_LOGIN)
- UserGroupModel().add_user_to_group(users_group=gr,
+ UserGroupModel().add_user_to_group(user_group=gr,
user=TEST_USER_ADMIN_LOGIN)
Session().commit()
return gr
-def destroy_users_group(name=TEST_USER_GROUP):
- UserGroupModel().delete(users_group=name, force=True)
+def make_repo_group(name=TEST_REPO_GROUP):
+ gr = fixture.create_repo_group(name, cur_user=TEST_USER_ADMIN_LOGIN)
Session().commit()
+ return gr
class BaseTestApi(object):
@@ -67,7 +93,7 @@ class BaseTestApi(object):
REPO_TYPE = None
@classmethod
- def setUpClass(cls):
+ def setup_class(cls):
cls.usr = UserModel().get_by_username(TEST_USER_ADMIN_LOGIN)
cls.apikey = cls.usr.api_key
cls.test_user = UserModel().create_or_update(
@@ -82,15 +108,18 @@ class BaseTestApi(object):
cls.apikey_regular = cls.test_user.api_key
@classmethod
- def teardownClass(cls):
+ def teardown_class(cls):
pass
def setUp(self):
self.maxDiff = None
- make_users_group()
+ make_user_group()
+ make_repo_group()
def tearDown(self):
- destroy_users_group()
+ fixture.destroy_user_group(TEST_USER_GROUP)
+ fixture.destroy_gists()
+ fixture.destroy_repo_group(TEST_REPO_GROUP)
def _compare_ok(self, id_, expected, given):
expected = jsonify({
@@ -110,13 +139,28 @@ class BaseTestApi(object):
given = json.loads(given)
self.assertEqual(expected, given)
-# def test_Optional(self):
-# from rhodecode.controllers.api.api import Optional
-# option1 = Optional(None)
-# self.assertEqual('' % None, repr(option1))
-#
-# self.assertEqual(1, Optional.extract(Optional(1)))
-# self.assertEqual('trololo', Optional.extract('trololo'))
+ def test_Optional_object(self):
+ from rhodecode.controllers.api.api import Optional
+
+ option1 = Optional(None)
+ self.assertEqual('' % None, repr(option1))
+ self.assertEqual(option1(), None)
+
+ self.assertEqual(1, Optional.extract(Optional(1)))
+ self.assertEqual('trololo', Optional.extract('trololo'))
+
+ def test_Optional_OAttr(self):
+ from rhodecode.controllers.api.api import Optional, OAttr
+
+ option1 = Optional(OAttr('apiuser'))
+ self.assertEqual('apiuser', Optional.extract(option1))
+
+ def test_OAttr_object(self):
+ from rhodecode.controllers.api.api import OAttr
+
+ oattr1 = OAttr('apiuser')
+ self.assertEqual('', repr(oattr1))
+ self.assertEqual(oattr1(), oattr1)
def test_api_wrong_key(self):
id_, params = _build_data('trololo', 'get_user')
@@ -149,23 +193,35 @@ class BaseTestApi(object):
self._compare_error(id_, expected, given=response.body)
def test_api_args_is_null(self):
- id_, params = _build_data(self.apikey, 'get_users',)
+ id_, params = _build_data(self.apikey, 'get_users', )
params = params.replace('"args": {}', '"args": null')
response = api_call(self, params)
self.assertEqual(response.status, '200 OK')
def test_api_args_is_bad(self):
- id_, params = _build_data(self.apikey, 'get_users',)
+ id_, params = _build_data(self.apikey, 'get_users', )
params = params.replace('"args": {}', '"args": 1')
response = api_call(self, params)
self.assertEqual(response.status, '200 OK')
+ def test_api_args_different_args(self):
+ import string
+ expected = {
+ 'ascii_letters': string.ascii_letters,
+ 'ws': string.whitespace,
+ 'printables': string.printable
+ }
+ id_, params = _build_data(self.apikey, 'test', args=expected)
+ response = api_call(self, params)
+ self.assertEqual(response.status, '200 OK')
+ self._compare_ok(id_, expected, response.body)
+
def test_api_get_users(self):
- id_, params = _build_data(self.apikey, 'get_users',)
+ id_, params = _build_data(self.apikey, 'get_users', )
response = api_call(self, params)
ret_all = []
- _users = User.query().filter(User.username != User.DEFAULT_USER)\
- .order_by(User.username).all()
+ _users = User.query().filter(User.username != User.DEFAULT_USER) \
+ .order_by(User.username).all()
for usr in _users:
ret = usr.get_api_data()
ret_all.append(jsonify(ret))
@@ -223,28 +279,25 @@ class BaseTestApi(object):
self._compare_error(id_, expected, given=response.body)
def test_api_pull(self):
- #TODO: issues with rhodecode_extras here.. not sure why !
- pass
+ repo_name = 'test_pull'
+ r = fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
+ r.clone_uri = os.path.join(TESTS_TMP_PATH, self.REPO)
+ Session.add(r)
+ Session.commit()
-# repo_name = 'test_pull'
-# r = fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
-# r.clone_uri = TEST_self.REPO
-# Session.add(r)
-# Session.commit()
-#
-# id_, params = _build_data(self.apikey, 'pull',
-# repoid=repo_name,)
-# response = self.app.post(API_URL, content_type='application/json',
-# params=params)
-#
-# expected = 'Pulled from `%s`' % repo_name
-# self._compare_ok(id_, expected, given=response.body)
-#
-# fixture.destroy_repo(repo_name)
+ id_, params = _build_data(self.apikey, 'pull',
+ repoid=repo_name,)
+ response = api_call(self, params)
+
+ expected = {'msg': 'Pulled from `%s`' % repo_name,
+ 'repository': repo_name}
+ self._compare_ok(id_, expected, given=response.body)
+
+ fixture.destroy_repo(repo_name)
def test_api_pull_error(self):
id_, params = _build_data(self.apikey, 'pull',
- repoid=self.REPO,)
+ repoid=self.REPO, )
response = api_call(self, params)
expected = 'Unable to pull changes from `%s`' % self.REPO
@@ -259,7 +312,7 @@ class BaseTestApi(object):
@mock.patch.object(ScmModel, 'repo_scan', crash)
def test_api_rescann_error(self):
- id_, params = _build_data(self.apikey, 'rescan_repos',)
+ id_, params = _build_data(self.apikey, 'rescan_repos', )
response = api_call(self, params)
expected = 'Error occurred during rescan repositories action'
@@ -267,13 +320,16 @@ class BaseTestApi(object):
def test_api_invalidate_cache(self):
repo = RepoModel().get_by_repo_name(self.REPO)
- repo.scm_instance_cached() # seed cache
+ repo.scm_instance_cached() # seed cache
id_, params = _build_data(self.apikey, 'invalidate_cache',
repoid=self.REPO)
response = api_call(self, params)
- expected = ("Caches of repository `%s` was invalidated" % (self.REPO))
+ expected = {
+ 'msg': "Cache for repository `%s` was invalidated" % (self.REPO,),
+ 'repository': self.REPO
+ }
self._compare_ok(id_, expected, given=response.body)
@mock.patch.object(ScmModel, 'mark_for_invalidation', crash)
@@ -285,6 +341,17 @@ class BaseTestApi(object):
expected = 'Error occurred during cache invalidation action'
self._compare_error(id_, expected, given=response.body)
+ def test_api_invalidate_cache_regular_user_no_permission(self):
+ repo = RepoModel().get_by_repo_name(self.REPO)
+ repo.scm_instance_cached() # seed cache
+
+ id_, params = _build_data(self.apikey_regular, 'invalidate_cache',
+ repoid=self.REPO)
+ response = api_call(self, params)
+
+ expected = "repository `%s` does not exist" % (self.REPO,)
+ self._compare_error(id_, expected, given=response.body)
+
def test_api_lock_repo_lock_aquire(self):
id_, params = _build_data(self.apikey, 'lock',
userid=TEST_USER_ADMIN_LOGIN,
@@ -292,14 +359,13 @@ class BaseTestApi(object):
locked=True)
response = api_call(self, params)
expected = {
- 'repo': self.REPO,
- 'locked': True,
- 'locked_since': None,
+ 'repo': self.REPO, 'locked': True,
+ 'locked_since': response.json['result']['locked_since'],
'locked_by': TEST_USER_ADMIN_LOGIN,
+ 'lock_state_changed': True,
'msg': ('User `%s` set lock state for repo `%s` to `%s`'
% (TEST_USER_ADMIN_LOGIN, self.REPO, True))
}
- expected['locked_since'] = json.loads(response.body)['result']['locked_since']
self._compare_ok(id_, expected, given=response.body)
def test_api_lock_repo_lock_aquire_by_non_admin(self):
@@ -314,12 +380,12 @@ class BaseTestApi(object):
expected = {
'repo': repo_name,
'locked': True,
- 'locked_since': None,
+ 'locked_since': response.json['result']['locked_since'],
'locked_by': self.TEST_USER_LOGIN,
+ 'lock_state_changed': True,
'msg': ('User `%s` set lock state for repo `%s` to `%s`'
% (self.TEST_USER_LOGIN, repo_name, True))
}
- expected['locked_since'] = json.loads(response.body)['result']['locked_since']
self._compare_ok(id_, expected, given=response.body)
finally:
fixture.destroy_repo(repo_name)
@@ -358,6 +424,7 @@ class BaseTestApi(object):
'locked': False,
'locked_since': None,
'locked_by': TEST_USER_ADMIN_LOGIN,
+ 'lock_state_changed': True,
'msg': ('User `%s` set lock state for repo `%s` to `%s`'
% (TEST_USER_ADMIN_LOGIN, self.REPO, False))
}
@@ -368,34 +435,56 @@ class BaseTestApi(object):
repoid=self.REPO,
locked=True)
response = api_call(self, params)
+ time_ = response.json['result']['locked_since']
expected = {
'repo': self.REPO,
'locked': True,
- 'locked_since': None,
+ 'locked_since': time_,
'locked_by': TEST_USER_ADMIN_LOGIN,
+ 'lock_state_changed': True,
'msg': ('User `%s` set lock state for repo `%s` to `%s`'
% (TEST_USER_ADMIN_LOGIN, self.REPO, True))
}
- expected['locked_since'] = json.loads(response.body)['result']['locked_since']
+
self._compare_ok(id_, expected, given=response.body)
def test_api_lock_repo_lock_optional_locked(self):
id_, params = _build_data(self.apikey, 'lock',
repoid=self.REPO)
response = api_call(self, params)
- time_ = json.loads(response.body)['result']['locked_since']
+ time_ = response.json['result']['locked_since']
expected = {
'repo': self.REPO,
'locked': True,
- 'locked_since': None,
+ 'locked_since': time_,
'locked_by': TEST_USER_ADMIN_LOGIN,
- 'msg': ('Repo `%s` locked by `%s`. '
- % (self.REPO,
- json.dumps(time_to_datetime(time_))))
+ 'lock_state_changed': False,
+ 'msg': ('Repo `%s` locked by `%s` on `%s`.'
+ % (self.REPO, TEST_USER_ADMIN_LOGIN,
+ json.dumps(time_to_datetime(time_))))
+ }
+ self._compare_ok(id_, expected, given=response.body)
- }
- expected['locked_since'] = time_
- self._compare_ok(id_, expected, given=response.body)
+ def test_api_lock_repo_lock_optional_not_locked(self):
+ repo_name = 'api_not_locked'
+ repo = fixture.create_repo(repo_name, repo_type=self.REPO_TYPE,
+ cur_user=self.TEST_USER_LOGIN)
+ self.assertEqual(repo.locked, [None, None])
+ try:
+ id_, params = _build_data(self.apikey, 'lock',
+ repoid=repo.repo_id)
+ response = api_call(self, params)
+ expected = {
+ 'repo': repo_name,
+ 'locked': False,
+ 'locked_since': None,
+ 'locked_by': None,
+ 'lock_state_changed': False,
+ 'msg': ('Repo `%s` not locked.' % (repo_name,))
+ }
+ self._compare_ok(id_, expected, given=response.body)
+ finally:
+ fixture.destroy_repo(repo_name)
@mock.patch.object(Repository, 'lock', crash)
def test_api_lock_error(self):
@@ -427,6 +516,33 @@ class BaseTestApi(object):
expected = []
self._compare_ok(id_, expected, given=response.body)
+ def test_api_get_locks_with_one_locked_repo(self):
+ repo_name = 'api_delete_me'
+ repo = fixture.create_repo(repo_name, repo_type=self.REPO_TYPE,
+ cur_user=self.TEST_USER_LOGIN)
+ Repository.lock(repo, User.get_by_username(self.TEST_USER_LOGIN).user_id)
+ try:
+ id_, params = _build_data(self.apikey, 'get_locks')
+ response = api_call(self, params)
+ expected = [repo.get_api_data()]
+ self._compare_ok(id_, expected, given=response.body)
+ finally:
+ fixture.destroy_repo(repo_name)
+
+ def test_api_get_locks_with_one_locked_repo_for_specific_user(self):
+ repo_name = 'api_delete_me'
+ repo = fixture.create_repo(repo_name, repo_type=self.REPO_TYPE,
+ cur_user=self.TEST_USER_LOGIN)
+ Repository.lock(repo, User.get_by_username(self.TEST_USER_LOGIN).user_id)
+ try:
+ id_, params = _build_data(self.apikey, 'get_locks',
+ userid=self.TEST_USER_LOGIN)
+ response = api_call(self, params)
+ expected = [repo.get_api_data()]
+ self._compare_ok(id_, expected, given=response.body)
+ finally:
+ fixture.destroy_repo(repo_name)
+
def test_api_get_locks_with_userid(self):
id_, params = _build_data(self.apikey, 'get_locks',
userid=TEST_USER_REGULAR_LOGIN)
@@ -470,11 +586,11 @@ class BaseTestApi(object):
user=jsonify(usr.get_api_data())
)
- expected = ret
- self._compare_ok(id_, expected, given=response.body)
-
- UserModel().delete(usr.user_id)
- Session().commit()
+ try:
+ expected = ret
+ self._compare_ok(id_, expected, given=response.body)
+ finally:
+ fixture.destroy_user(usr.user_id)
def test_api_create_user_without_password(self):
username = 'test_new_api_user_passwordless'
@@ -490,12 +606,31 @@ class BaseTestApi(object):
msg='created new user `%s`' % username,
user=jsonify(usr.get_api_data())
)
+ try:
+ expected = ret
+ self._compare_ok(id_, expected, given=response.body)
+ finally:
+ fixture.destroy_user(usr.user_id)
- expected = ret
- self._compare_ok(id_, expected, given=response.body)
+ def test_api_create_user_with_extern_name(self):
+ username = 'test_new_api_user_passwordless'
+ email = username + "@foo.com"
+
+ id_, params = _build_data(self.apikey, 'create_user',
+ username=username,
+ email=email, extern_name='rhodecode')
+ response = api_call(self, params)
- UserModel().delete(usr.user_id)
- Session().commit()
+ usr = UserModel().get_by_username(username)
+ ret = dict(
+ msg='created new user `%s`' % username,
+ user=jsonify(usr.get_api_data())
+ )
+ try:
+ expected = ret
+ self._compare_ok(id_, expected, given=response.body)
+ finally:
+ fixture.destroy_user(usr.user_id)
@mock.patch.object(UserModel, 'create_or_update', crash)
def test_api_create_user_when_exception_happened(self):
@@ -523,7 +658,7 @@ class BaseTestApi(object):
## DELETE THIS USER NOW
id_, params = _build_data(self.apikey, 'delete_user',
- userid=username,)
+ userid=username, )
response = api_call(self, params)
ret = {'msg': 'deleted user ID:%s %s' % (usr_id, username),
@@ -541,10 +676,10 @@ class BaseTestApi(object):
username = usr.username
id_, params = _build_data(self.apikey, 'delete_user',
- userid=username,)
+ userid=username, )
response = api_call(self, params)
- ret = 'failed to delete ID:%s %s' % (usr.user_id,
- usr.username)
+ ret = 'failed to delete user ID:%s %s' % (usr.user_id,
+ usr.username)
expected = ret
self._compare_error(id_, expected, given=response.body)
@@ -553,12 +688,14 @@ class BaseTestApi(object):
('email', 'new_username'),
('admin', True),
('admin', False),
- ('ldap_dn', 'test'),
- ('ldap_dn', None),
+ ('extern_type', 'ldap'),
+ ('extern_type', None),
+ ('extern_name', 'test'),
+ ('extern_name', None),
('active', False),
('active', True),
('password', 'newpass')
- ])
+ ])
def test_api_update_user(self, name, expected):
usr = UserModel().get_by_username(self.TEST_USER_LOGIN)
kw = {name: expected,
@@ -567,10 +704,11 @@ class BaseTestApi(object):
response = api_call(self, params)
ret = {
- 'msg': 'updated user ID:%s %s' % (usr.user_id, self.TEST_USER_LOGIN),
- 'user': jsonify(UserModel()\
- .get_by_username(self.TEST_USER_LOGIN)\
- .get_api_data())
+ 'msg': 'updated user ID:%s %s' % (
+ usr.user_id, self.TEST_USER_LOGIN),
+ 'user': jsonify(UserModel() \
+ .get_by_username(self.TEST_USER_LOGIN) \
+ .get_api_data())
}
expected = ret
@@ -584,8 +722,9 @@ class BaseTestApi(object):
response = api_call(self, params)
ret = {
- 'msg': 'updated user ID:%s %s' % (usr.user_id, TEST_USER_ADMIN_LOGIN),
- 'user': ret
+ 'msg': 'updated user ID:%s %s' % (
+ usr.user_id, TEST_USER_ADMIN_LOGIN),
+ 'user': ret
}
expected = ret
self._compare_ok(id_, expected, given=response.body)
@@ -598,12 +737,22 @@ class BaseTestApi(object):
response = api_call(self, params)
ret = {
- 'msg': 'updated user ID:%s %s' % (usr.user_id, TEST_USER_ADMIN_LOGIN),
- 'user': ret
+ 'msg': 'updated user ID:%s %s' % (
+ usr.user_id, TEST_USER_ADMIN_LOGIN),
+ 'user': ret
}
expected = ret
self._compare_ok(id_, expected, given=response.body)
+ def test_api_update_user_default_user(self):
+ usr = User.get_default_user()
+ id_, params = _build_data(self.apikey, 'update_user',
+ userid=usr.user_id)
+
+ response = api_call(self, params)
+ expected = 'editing default user is forbidden'
+ self._compare_error(id_, expected, given=response.body)
+
@mock.patch.object(UserModel, 'update_user', crash)
def test_api_update_user_when_exception_happens(self):
usr = UserModel().get_by_username(TEST_USER_ADMIN_LOGIN)
@@ -619,10 +768,10 @@ class BaseTestApi(object):
def test_api_get_repo(self):
new_group = 'some_new_group'
- make_users_group(new_group)
- RepoModel().grant_users_group_permission(repo=self.REPO,
- group_name=new_group,
- perm='repository.read')
+ make_user_group(new_group)
+ RepoModel().grant_user_group_permission(repo=self.REPO,
+ group_name=new_group,
+ perm='repository.read')
Session().commit()
id_, params = _build_data(self.apikey, 'get_repo',
repoid=self.REPO)
@@ -636,18 +785,16 @@ class BaseTestApi(object):
for user in repo.repo_to_perm:
perm = user.permission.permission_name
user = user.user
- user_data = user.get_api_data()
- user_data['type'] = "user"
- user_data['permission'] = perm
+ user_data = {'name': user.username, 'type': "user",
+ 'permission': perm}
members.append(user_data)
- for users_group in repo.users_group_to_perm:
- perm = users_group.permission.permission_name
- users_group = users_group.users_group
- users_group_data = users_group.get_api_data()
- users_group_data['type'] = "users_group"
- users_group_data['permission'] = perm
- members.append(users_group_data)
+ for user_group in repo.users_group_to_perm:
+ perm = user_group.permission.permission_name
+ user_group = user_group.users_group
+ user_group_data = {'name': user_group.users_group_name,
+ 'type': "user_group", 'permission': perm}
+ members.append(user_group_data)
for user in repo.followers:
followers.append(user.user.get_api_data())
@@ -657,10 +804,19 @@ class BaseTestApi(object):
expected = ret
self._compare_ok(id_, expected, given=response.body)
- destroy_users_group(new_group)
+ fixture.destroy_user_group(new_group)
- def test_api_get_repo_by_non_admin(self):
- id_, params = _build_data(self.apikey, 'get_repo',
+ @parameterized.expand([
+ ('repository.admin',),
+ ('repository.write',),
+ ('repository.read',),
+ ])
+ def test_api_get_repo_by_non_admin(self, grant_perm):
+ RepoModel().grant_user_permission(repo=self.REPO,
+ user=self.TEST_USER_LOGIN,
+ perm=grant_perm)
+ Session().commit()
+ id_, params = _build_data(self.apikey_regular, 'get_repo',
repoid=self.REPO)
response = api_call(self, params)
@@ -669,21 +825,20 @@ class BaseTestApi(object):
members = []
followers = []
+ self.assertEqual(2, len(repo.repo_to_perm))
for user in repo.repo_to_perm:
perm = user.permission.permission_name
- user = user.user
- user_data = user.get_api_data()
- user_data['type'] = "user"
- user_data['permission'] = perm
+ user_obj = user.user
+ user_data = {'name': user_obj.username, 'type': "user",
+ 'permission': perm}
members.append(user_data)
- for users_group in repo.users_group_to_perm:
- perm = users_group.permission.permission_name
- users_group = users_group.users_group
- users_group_data = users_group.get_api_data()
- users_group_data['type'] = "users_group"
- users_group_data['permission'] = perm
- members.append(users_group_data)
+ for user_group in repo.users_group_to_perm:
+ perm = user_group.permission.permission_name
+ user_group_obj = user_group.users_group
+ user_group_data = {'name': user_group_obj.users_group_name,
+ 'type': "user_group", 'permission': perm}
+ members.append(user_group_data)
for user in repo.followers:
followers.append(user.user.get_api_data())
@@ -692,7 +847,10 @@ class BaseTestApi(object):
ret['followers'] = followers
expected = ret
- self._compare_ok(id_, expected, given=response.body)
+ try:
+ self._compare_ok(id_, expected, given=response.body)
+ finally:
+ RepoModel().revoke_user_permission(self.REPO, self.TEST_USER_LOGIN)
def test_api_get_repo_by_non_admin_no_permission_to_repo(self):
RepoModel().grant_user_permission(repo=self.REPO,
@@ -753,7 +911,7 @@ class BaseTestApi(object):
# we don't the actual return types here since it's tested somewhere
# else
- expected = json.loads(response.body)['result']
+ expected = response.json['result']
self._compare_ok(id_, expected, given=response.body)
def test_api_get_repo_nodes_bad_revisions(self):
@@ -761,7 +919,7 @@ class BaseTestApi(object):
path = '/'
id_, params = _build_data(self.apikey, 'get_repo_nodes',
repoid=self.REPO, revision=rev,
- root_path=path,)
+ root_path=path, )
response = api_call(self, params)
expected = 'failed to get repo: `%s` nodes' % self.REPO
@@ -772,7 +930,7 @@ class BaseTestApi(object):
path = '/idontexits'
id_, params = _build_data(self.apikey, 'get_repo_nodes',
repoid=self.REPO, revision=rev,
- root_path=path,)
+ root_path=path, )
response = api_call(self, params)
expected = 'failed to get repo: `%s` nodes' % self.REPO
@@ -788,35 +946,83 @@ class BaseTestApi(object):
ret_type=ret_type)
response = api_call(self, params)
- expected = 'ret_type must be one of %s' % (['files', 'dirs', 'all'])
+ expected = ('ret_type must be one of %s'
+ % (','.join(['files', 'dirs', 'all'])))
self._compare_error(id_, expected, given=response.body)
+ @parameterized.expand([('all', 'all', 'repository.write'),
+ ('dirs', 'dirs', 'repository.admin'),
+ ('files', 'files', 'repository.read'), ])
+ def test_api_get_repo_nodes_by_regular_user(self, name, ret_type, grant_perm):
+ RepoModel().grant_user_permission(repo=self.REPO,
+ user=self.TEST_USER_LOGIN,
+ perm=grant_perm)
+ Session().commit()
+
+ rev = 'tip'
+ path = '/'
+ id_, params = _build_data(self.apikey_regular, 'get_repo_nodes',
+ repoid=self.REPO, revision=rev,
+ root_path=path,
+ ret_type=ret_type)
+ response = api_call(self, params)
+
+ # we don't the actual return types here since it's tested somewhere
+ # else
+ expected = response.json['result']
+ try:
+ self._compare_ok(id_, expected, given=response.body)
+ finally:
+ RepoModel().revoke_user_permission(self.REPO, self.TEST_USER_LOGIN)
+
def test_api_create_repo(self):
repo_name = 'api-repo'
id_, params = _build_data(self.apikey, 'create_repo',
- repo_name=repo_name,
- owner=TEST_USER_ADMIN_LOGIN,
- repo_type='hg',
- )
+ repo_name=repo_name,
+ owner=TEST_USER_ADMIN_LOGIN,
+ repo_type=self.REPO_TYPE,
+ )
response = api_call(self, params)
repo = RepoModel().get_by_repo_name(repo_name)
+ self.assertNotEqual(repo, None)
ret = {
'msg': 'Created new repository `%s`' % repo_name,
- 'repo': jsonify(repo.get_api_data())
+ 'success': True,
+ 'task': None,
}
expected = ret
self._compare_ok(id_, expected, given=response.body)
fixture.destroy_repo(repo_name)
+ def test_api_create_repo_in_group(self):
+ repo_name = 'my_gr/api-repo'
+ id_, params = _build_data(self.apikey, 'create_repo',
+ repo_name=repo_name,
+ owner=TEST_USER_ADMIN_LOGIN,
+ repo_type=self.REPO_TYPE,)
+ response = api_call(self, params)
+ print params
+ repo = RepoModel().get_by_repo_name(repo_name)
+ self.assertNotEqual(repo, None)
+ ret = {
+ 'msg': 'Created new repository `%s`' % repo_name,
+ 'success': True,
+ 'task': None,
+ }
+ expected = ret
+ self._compare_ok(id_, expected, given=response.body)
+ fixture.destroy_repo(repo_name)
+ fixture.destroy_repo_group('my_gr')
+
def test_api_create_repo_unknown_owner(self):
repo_name = 'api-repo'
owner = 'i-dont-exist'
id_, params = _build_data(self.apikey, 'create_repo',
- repo_name=repo_name,
- owner=owner,
- repo_type='hg',
- )
+ repo_name=repo_name,
+ owner=owner,
+ repo_type=self.REPO_TYPE,
+ )
response = api_call(self, params)
expected = 'user `%s` does not exist' % owner
self._compare_error(id_, expected, given=response.body)
@@ -825,15 +1031,17 @@ class BaseTestApi(object):
repo_name = 'api-repo'
owner = 'i-dont-exist'
id_, params = _build_data(self.apikey, 'create_repo',
- repo_name=repo_name,
- repo_type='hg',
- )
+ repo_name=repo_name,
+ repo_type=self.REPO_TYPE,
+ )
response = api_call(self, params)
repo = RepoModel().get_by_repo_name(repo_name)
+ self.assertNotEqual(repo, None)
ret = {
'msg': 'Created new repository `%s`' % repo_name,
- 'repo': jsonify(repo.get_api_data())
+ 'success': True,
+ 'task': None,
}
expected = ret
self._compare_ok(id_, expected, given=response.body)
@@ -843,15 +1051,17 @@ class BaseTestApi(object):
repo_name = 'api-repo'
owner = 'i-dont-exist'
id_, params = _build_data(self.apikey_regular, 'create_repo',
- repo_name=repo_name,
- repo_type='hg',
- )
+ repo_name=repo_name,
+ repo_type=self.REPO_TYPE,
+ )
response = api_call(self, params)
repo = RepoModel().get_by_repo_name(repo_name)
+ self.assertNotEqual(repo, None)
ret = {
'msg': 'Created new repository `%s`' % repo_name,
- 'repo': jsonify(repo.get_api_data())
+ 'success': True,
+ 'task': None,
}
expected = ret
self._compare_ok(id_, expected, given=response.body)
@@ -861,10 +1071,9 @@ class BaseTestApi(object):
repo_name = 'api-repo'
owner = 'i-dont-exist'
id_, params = _build_data(self.apikey_regular, 'create_repo',
- repo_name=repo_name,
- repo_type='hg',
- owner=owner
- )
+ repo_name=repo_name,
+ repo_type=self.REPO_TYPE,
+ owner=owner)
response = api_call(self, params)
expected = 'Only RhodeCode admin can specify `owner` param'
@@ -874,54 +1083,132 @@ class BaseTestApi(object):
def test_api_create_repo_exists(self):
repo_name = self.REPO
id_, params = _build_data(self.apikey, 'create_repo',
- repo_name=repo_name,
- owner=TEST_USER_ADMIN_LOGIN,
- repo_type='hg',
- )
+ repo_name=repo_name,
+ owner=TEST_USER_ADMIN_LOGIN,
+ repo_type=self.REPO_TYPE,)
response = api_call(self, params)
expected = "repo `%s` already exist" % repo_name
self._compare_error(id_, expected, given=response.body)
- @mock.patch.object(RepoModel, 'create_repo', crash)
+ @mock.patch.object(RepoModel, 'create', crash)
def test_api_create_repo_exception_occurred(self):
repo_name = 'api-repo'
id_, params = _build_data(self.apikey, 'create_repo',
- repo_name=repo_name,
- owner=TEST_USER_ADMIN_LOGIN,
- repo_type='hg',
- )
+ repo_name=repo_name,
+ owner=TEST_USER_ADMIN_LOGIN,
+ repo_type=self.REPO_TYPE,)
response = api_call(self, params)
expected = 'failed to create repository `%s`' % repo_name
self._compare_error(id_, expected, given=response.body)
+ @parameterized.expand([
+ ('owner', {'owner': TEST_USER_REGULAR_LOGIN}),
+ ('description', {'description': 'new description'}),
+ ('active', {'active': True}),
+ ('active', {'active': False}),
+ ('clone_uri', {'clone_uri': 'http://foo.com/repo'}),
+ ('clone_uri', {'clone_uri': None}),
+ ('landing_rev', {'landing_rev': 'branch:master'}),
+ ('enable_statistics', {'enable_statistics': True}),
+ ('enable_locking', {'enable_locking': True}),
+ ('enable_downloads', {'enable_downloads': True}),
+ ('name', {'name': 'new_repo_name'}),
+ ('repo_group', {'group': 'test_group_for_update'}),
+ ])
+ def test_api_update_repo(self, changing_attr, updates):
+ repo_name = 'api_update_me'
+ repo = fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
+ if changing_attr == 'repo_group':
+ fixture.create_repo_group(updates['group'])
+
+ id_, params = _build_data(self.apikey, 'update_repo',
+ repoid=repo_name, **updates)
+ response = api_call(self, params)
+ if changing_attr == 'name':
+ repo_name = updates['name']
+ if changing_attr == 'repo_group':
+ repo_name = '/'.join([updates['group'], repo_name])
+ try:
+ expected = {
+ 'msg': 'updated repo ID:%s %s' % (repo.repo_id, repo_name),
+ 'repository': repo.get_api_data()
+ }
+ self._compare_ok(id_, expected, given=response.body)
+ finally:
+ fixture.destroy_repo(repo_name)
+ if changing_attr == 'repo_group':
+ fixture.destroy_repo_group(updates['group'])
+
+ def test_api_update_repo_repo_group_does_not_exist(self):
+ repo_name = 'admin_owned'
+ fixture.create_repo(repo_name)
+ updates = {'group': 'test_group_for_update'}
+ id_, params = _build_data(self.apikey, 'update_repo',
+ repoid=repo_name, **updates)
+ response = api_call(self, params)
+ try:
+ expected = 'repository group `%s` does not exist' % updates['group']
+ self._compare_error(id_, expected, given=response.body)
+ finally:
+ fixture.destroy_repo(repo_name)
+
+ def test_api_update_repo_regular_user_not_allowed(self):
+ repo_name = 'admin_owned'
+ fixture.create_repo(repo_name)
+ updates = {'active': False}
+ id_, params = _build_data(self.apikey_regular, 'update_repo',
+ repoid=repo_name, **updates)
+ response = api_call(self, params)
+ try:
+ expected = 'repository `%s` does not exist' % repo_name
+ self._compare_error(id_, expected, given=response.body)
+ finally:
+ fixture.destroy_repo(repo_name)
+
+ @mock.patch.object(RepoModel, 'update', crash)
+ def test_api_update_repo_exception_occured(self):
+ repo_name = 'api_update_me'
+ fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
+ id_, params = _build_data(self.apikey, 'update_repo',
+ repoid=repo_name, owner=TEST_USER_ADMIN_LOGIN,)
+ response = api_call(self, params)
+ try:
+ expected = 'failed to update repo `%s`' % repo_name
+ self._compare_error(id_, expected, given=response.body)
+ finally:
+ fixture.destroy_repo(repo_name)
+
def test_api_delete_repo(self):
repo_name = 'api_delete_me'
fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
id_, params = _build_data(self.apikey, 'delete_repo',
- repoid=repo_name,)
+ repoid=repo_name, )
response = api_call(self, params)
ret = {
'msg': 'Deleted repository `%s`' % repo_name,
'success': True
}
- expected = ret
- self._compare_ok(id_, expected, given=response.body)
+ try:
+ expected = ret
+ self._compare_ok(id_, expected, given=response.body)
+ finally:
+ fixture.destroy_repo(repo_name)
def test_api_delete_repo_by_non_admin(self):
repo_name = 'api_delete_me'
fixture.create_repo(repo_name, repo_type=self.REPO_TYPE,
cur_user=self.TEST_USER_LOGIN)
- try:
- id_, params = _build_data(self.apikey_regular, 'delete_repo',
- repoid=repo_name,)
- response = api_call(self, params)
+ id_, params = _build_data(self.apikey_regular, 'delete_repo',
+ repoid=repo_name, )
+ response = api_call(self, params)
- ret = {
- 'msg': 'Deleted repository `%s`' % repo_name,
- 'success': True
- }
+ ret = {
+ 'msg': 'Deleted repository `%s`' % repo_name,
+ 'success': True
+ }
+ try:
expected = ret
self._compare_ok(id_, expected, given=response.body)
finally:
@@ -932,7 +1219,7 @@ class BaseTestApi(object):
fixture.create_repo(repo_name, repo_type=self.REPO_TYPE)
try:
id_, params = _build_data(self.apikey_regular, 'delete_repo',
- repoid=repo_name,)
+ repoid=repo_name, )
response = api_call(self, params)
expected = 'repository `%s` does not exist' % (repo_name)
self._compare_error(id_, expected, given=response.body)
@@ -945,7 +1232,7 @@ class BaseTestApi(object):
try:
with mock.patch.object(RepoModel, 'delete', crash):
id_, params = _build_data(self.apikey, 'delete_repo',
- repoid=repo_name,)
+ repoid=repo_name, )
response = api_call(self, params)
expected = 'failed to delete repository `%s`' % repo_name
@@ -956,16 +1243,17 @@ class BaseTestApi(object):
def test_api_fork_repo(self):
fork_name = 'api-repo-fork'
id_, params = _build_data(self.apikey, 'fork_repo',
- repoid=self.REPO,
- fork_name=fork_name,
- owner=TEST_USER_ADMIN_LOGIN,
- )
+ repoid=self.REPO,
+ fork_name=fork_name,
+ owner=TEST_USER_ADMIN_LOGIN,
+ )
response = api_call(self, params)
ret = {
'msg': 'Created fork of `%s` as `%s`' % (self.REPO,
fork_name),
- 'success': True
+ 'success': True,
+ 'task': None,
}
expected = ret
self._compare_ok(id_, expected, given=response.body)
@@ -974,15 +1262,16 @@ class BaseTestApi(object):
def test_api_fork_repo_non_admin(self):
fork_name = 'api-repo-fork'
id_, params = _build_data(self.apikey_regular, 'fork_repo',
- repoid=self.REPO,
- fork_name=fork_name,
- )
+ repoid=self.REPO,
+ fork_name=fork_name,
+ )
response = api_call(self, params)
ret = {
'msg': 'Created fork of `%s` as `%s`' % (self.REPO,
fork_name),
- 'success': True
+ 'success': True,
+ 'task': None,
}
expected = ret
self._compare_ok(id_, expected, given=response.body)
@@ -991,10 +1280,10 @@ class BaseTestApi(object):
def test_api_fork_repo_non_admin_specify_owner(self):
fork_name = 'api-repo-fork'
id_, params = _build_data(self.apikey_regular, 'fork_repo',
- repoid=self.REPO,
- fork_name=fork_name,
- owner=TEST_USER_ADMIN_LOGIN,
- )
+ repoid=self.REPO,
+ fork_name=fork_name,
+ owner=TEST_USER_ADMIN_LOGIN,
+ )
response = api_call(self, params)
expected = 'Only RhodeCode admin can specify `owner` param'
self._compare_error(id_, expected, given=response.body)
@@ -1006,9 +1295,9 @@ class BaseTestApi(object):
perm='repository.none')
fork_name = 'api-repo-fork'
id_, params = _build_data(self.apikey_regular, 'fork_repo',
- repoid=self.REPO,
- fork_name=fork_name,
- )
+ repoid=self.REPO,
+ fork_name=fork_name,
+ )
response = api_call(self, params)
expected = 'repository `%s` does not exist' % (self.REPO)
self._compare_error(id_, expected, given=response.body)
@@ -1018,10 +1307,10 @@ class BaseTestApi(object):
fork_name = 'api-repo-fork'
owner = 'i-dont-exist'
id_, params = _build_data(self.apikey, 'fork_repo',
- repoid=self.REPO,
- fork_name=fork_name,
- owner=owner,
- )
+ repoid=self.REPO,
+ fork_name=fork_name,
+ owner=owner,
+ )
response = api_call(self, params)
expected = 'user `%s` does not exist' % owner
self._compare_error(id_, expected, given=response.body)
@@ -1034,10 +1323,10 @@ class BaseTestApi(object):
fork_name = 'api-repo-fork'
id_, params = _build_data(self.apikey, 'fork_repo',
- repoid=self.REPO,
- fork_name=fork_name,
- owner=TEST_USER_ADMIN_LOGIN,
- )
+ repoid=self.REPO,
+ fork_name=fork_name,
+ owner=TEST_USER_ADMIN_LOGIN,
+ )
response = api_call(self, params)
expected = "fork `%s` already exist" % fork_name
@@ -1049,10 +1338,10 @@ class BaseTestApi(object):
fork_name = self.REPO
id_, params = _build_data(self.apikey, 'fork_repo',
- repoid=self.REPO,
- fork_name=fork_name,
- owner=TEST_USER_ADMIN_LOGIN,
- )
+ repoid=self.REPO,
+ fork_name=fork_name,
+ owner=TEST_USER_ADMIN_LOGIN,
+ )
response = api_call(self, params)
expected = "repo `%s` already exist" % fork_name
@@ -1062,68 +1351,68 @@ class BaseTestApi(object):
def test_api_fork_repo_exception_occurred(self):
fork_name = 'api-repo-fork'
id_, params = _build_data(self.apikey, 'fork_repo',
- repoid=self.REPO,
- fork_name=fork_name,
- owner=TEST_USER_ADMIN_LOGIN,
- )
+ repoid=self.REPO,
+ fork_name=fork_name,
+ owner=TEST_USER_ADMIN_LOGIN,
+ )
response = api_call(self, params)
expected = 'failed to fork repository `%s` as `%s`' % (self.REPO,
fork_name)
self._compare_error(id_, expected, given=response.body)
- def test_api_get_users_group(self):
- id_, params = _build_data(self.apikey, 'get_users_group',
- usersgroupid=TEST_USER_GROUP)
+ def test_api_get_user_group(self):
+ id_, params = _build_data(self.apikey, 'get_user_group',
+ usergroupid=TEST_USER_GROUP)
response = api_call(self, params)
- users_group = UserGroupModel().get_group(TEST_USER_GROUP)
+ user_group = UserGroupModel().get_group(TEST_USER_GROUP)
members = []
- for user in users_group.members:
+ for user in user_group.members:
user = user.user
members.append(user.get_api_data())
- ret = users_group.get_api_data()
+ ret = user_group.get_api_data()
ret['members'] = members
expected = ret
self._compare_ok(id_, expected, given=response.body)
- def test_api_get_users_groups(self):
+ def test_api_get_user_groups(self):
+ gr_name = 'test_user_group2'
+ make_user_group(gr_name)
- make_users_group('test_users_group2')
-
- id_, params = _build_data(self.apikey, 'get_users_groups',)
+ id_, params = _build_data(self.apikey, 'get_user_groups', )
response = api_call(self, params)
- expected = []
- for gr_name in [TEST_USER_GROUP, 'test_users_group2']:
- users_group = UserGroupModel().get_group(gr_name)
- ret = users_group.get_api_data()
- expected.append(ret)
- self._compare_ok(id_, expected, given=response.body)
+ try:
+ expected = []
+ for gr_name in [TEST_USER_GROUP, 'test_user_group2']:
+ user_group = UserGroupModel().get_group(gr_name)
+ ret = user_group.get_api_data()
+ expected.append(ret)
+ self._compare_ok(id_, expected, given=response.body)
+ finally:
+ fixture.destroy_user_group(gr_name)
- UserGroupModel().delete(users_group='test_users_group2')
- Session().commit()
-
- def test_api_create_users_group(self):
+ def test_api_create_user_group(self):
group_name = 'some_new_group'
- id_, params = _build_data(self.apikey, 'create_users_group',
+ id_, params = _build_data(self.apikey, 'create_user_group',
group_name=group_name)
response = api_call(self, params)
ret = {
'msg': 'created new user group `%s`' % group_name,
- 'users_group': jsonify(UserGroupModel()\
- .get_by_name(group_name)\
- .get_api_data())
+ 'user_group': jsonify(UserGroupModel() \
+ .get_by_name(group_name) \
+ .get_api_data())
}
expected = ret
self._compare_ok(id_, expected, given=response.body)
- destroy_users_group(group_name)
+ fixture.destroy_user_group(group_name)
- def test_api_get_users_group_that_exist(self):
- id_, params = _build_data(self.apikey, 'create_users_group',
+ def test_api_get_user_group_that_exist(self):
+ id_, params = _build_data(self.apikey, 'create_user_group',
group_name=TEST_USER_GROUP)
response = api_call(self, params)
@@ -1131,36 +1420,72 @@ class BaseTestApi(object):
self._compare_error(id_, expected, given=response.body)
@mock.patch.object(UserGroupModel, 'create', crash)
- def test_api_get_users_group_exception_occurred(self):
+ def test_api_get_user_group_exception_occurred(self):
group_name = 'exception_happens'
- id_, params = _build_data(self.apikey, 'create_users_group',
+ id_, params = _build_data(self.apikey, 'create_user_group',
group_name=group_name)
response = api_call(self, params)
expected = 'failed to create group `%s`' % group_name
self._compare_error(id_, expected, given=response.body)
- def test_api_add_user_to_users_group(self):
+ @parameterized.expand([('group_name', {'group_name': 'new_group_name'}),
+ ('group_name', {'group_name': 'test_group_for_update'}),
+ ('owner', {'owner': TEST_USER_REGULAR_LOGIN}),
+ ('active', {'active': False}),
+ ('active', {'active': True})])
+ def test_api_update_user_group(self, changing_attr, updates):
+ gr_name = 'test_group_for_update'
+ user_group = fixture.create_user_group(gr_name)
+ id_, params = _build_data(self.apikey, 'update_user_group',
+ usergroupid=gr_name, **updates)
+ response = api_call(self, params)
+ try:
+ expected = {
+ 'msg': 'updated user group ID:%s %s' % (user_group.users_group_id,
+ user_group.users_group_name),
+ 'user_group': user_group.get_api_data()
+ }
+ self._compare_ok(id_, expected, given=response.body)
+ finally:
+ if changing_attr == 'group_name':
+ # switch to updated name for proper cleanup
+ gr_name = updates['group_name']
+ fixture.destroy_user_group(gr_name)
+
+ @mock.patch.object(UserGroupModel, 'update', crash)
+ def test_api_update_user_group_exception_occured(self):
gr_name = 'test_group'
fixture.create_user_group(gr_name)
- id_, params = _build_data(self.apikey, 'add_user_to_users_group',
- usersgroupid=gr_name,
+ id_, params = _build_data(self.apikey, 'update_user_group',
+ usergroupid=gr_name)
+ response = api_call(self, params)
+ try:
+ expected = 'failed to update user group `%s`' % gr_name
+ self._compare_error(id_, expected, given=response.body)
+ finally:
+ fixture.destroy_user_group(gr_name)
+
+ def test_api_add_user_to_user_group(self):
+ gr_name = 'test_group'
+ fixture.create_user_group(gr_name)
+ id_, params = _build_data(self.apikey, 'add_user_to_user_group',
+ usergroupid=gr_name,
userid=TEST_USER_ADMIN_LOGIN)
response = api_call(self, params)
+ try:
+ expected = {
+ 'msg': 'added member `%s` to user group `%s`' % (
+ TEST_USER_ADMIN_LOGIN, gr_name),
+ 'success': True
+ }
+ self._compare_ok(id_, expected, given=response.body)
+ finally:
+ fixture.destroy_user_group(gr_name)
- expected = {
- 'msg': 'added member `%s` to user group `%s`' % (
- TEST_USER_ADMIN_LOGIN, gr_name
- ),
- 'success': True}
- self._compare_ok(id_, expected, given=response.body)
-
- UserGroupModel().delete(users_group=gr_name)
- Session().commit()
-
- def test_api_add_user_to_users_group_that_doesnt_exist(self):
- id_, params = _build_data(self.apikey, 'add_user_to_users_group',
- usersgroupid='false-group',
+ def test_api_add_user_to_user_group_that_doesnt_exist(self):
+ id_, params = _build_data(self.apikey, 'add_user_to_user_group',
+ usergroupid='false-group',
userid=TEST_USER_ADMIN_LOGIN)
response = api_call(self, params)
@@ -1168,80 +1493,136 @@ class BaseTestApi(object):
self._compare_error(id_, expected, given=response.body)
@mock.patch.object(UserGroupModel, 'add_user_to_group', crash)
- def test_api_add_user_to_users_group_exception_occurred(self):
+ def test_api_add_user_to_user_group_exception_occurred(self):
gr_name = 'test_group'
fixture.create_user_group(gr_name)
- id_, params = _build_data(self.apikey, 'add_user_to_users_group',
- usersgroupid=gr_name,
+ id_, params = _build_data(self.apikey, 'add_user_to_user_group',
+ usergroupid=gr_name,
userid=TEST_USER_ADMIN_LOGIN)
response = api_call(self, params)
- expected = 'failed to add member to user group `%s`' % gr_name
- self._compare_error(id_, expected, given=response.body)
+ try:
+ expected = 'failed to add member to user group `%s`' % gr_name
+ self._compare_error(id_, expected, given=response.body)
+ finally:
+ fixture.destroy_user_group(gr_name)
- UserGroupModel().delete(users_group=gr_name)
+ def test_api_remove_user_from_user_group(self):
+ gr_name = 'test_group_3'
+ gr = fixture.create_user_group(gr_name)
+ UserGroupModel().add_user_to_group(gr, user=TEST_USER_ADMIN_LOGIN)
Session().commit()
+ id_, params = _build_data(self.apikey, 'remove_user_from_user_group',
+ usergroupid=gr_name,
+ userid=TEST_USER_ADMIN_LOGIN)
+ response = api_call(self, params)
- def test_api_remove_user_from_users_group(self):
+ try:
+ expected = {
+ 'msg': 'removed member `%s` from user group `%s`' % (
+ TEST_USER_ADMIN_LOGIN, gr_name
+ ),
+ 'success': True}
+ self._compare_ok(id_, expected, given=response.body)
+ finally:
+ fixture.destroy_user_group(gr_name)
+
+ @mock.patch.object(UserGroupModel, 'remove_user_from_group', crash)
+ def test_api_remove_user_from_user_group_exception_occurred(self):
gr_name = 'test_group_3'
gr = fixture.create_user_group(gr_name)
UserGroupModel().add_user_to_group(gr, user=TEST_USER_ADMIN_LOGIN)
Session().commit()
- id_, params = _build_data(self.apikey, 'remove_user_from_users_group',
- usersgroupid=gr_name,
+ id_, params = _build_data(self.apikey, 'remove_user_from_user_group',
+ usergroupid=gr_name,
+ userid=TEST_USER_ADMIN_LOGIN)
+ response = api_call(self, params)
+ try:
+ expected = 'failed to remove member from user group `%s`' % gr_name
+ self._compare_error(id_, expected, given=response.body)
+ finally:
+ fixture.destroy_user_group(gr_name)
+
+ def test_api_delete_user_group(self):
+ gr_name = 'test_group'
+ ugroup = fixture.create_user_group(gr_name)
+ gr_id = ugroup.users_group_id
+ id_, params = _build_data(self.apikey, 'delete_user_group',
+ usergroupid=gr_name,
userid=TEST_USER_ADMIN_LOGIN)
response = api_call(self, params)
- expected = {
- 'msg': 'removed member `%s` from user group `%s`' % (
- TEST_USER_ADMIN_LOGIN, gr_name
- ),
- 'success': True}
- self._compare_ok(id_, expected, given=response.body)
+ try:
+ expected = {
+ 'user_group': None,
+ 'msg': 'deleted user group ID:%s %s' % (gr_id, gr_name)
+ }
+ self._compare_ok(id_, expected, given=response.body)
+ finally:
+ if UserGroupModel().get_by_name(gr_name):
+ fixture.destroy_user_group(gr_name)
- UserGroupModel().delete(users_group=gr_name)
- Session().commit()
+ def test_api_delete_user_group_that_is_assigned(self):
+ gr_name = 'test_group'
+ ugroup = fixture.create_user_group(gr_name)
+ gr_id = ugroup.users_group_id
- @mock.patch.object(UserGroupModel, 'remove_user_from_group', crash)
- def test_api_remove_user_from_users_group_exception_occurred(self):
- gr_name = 'test_group_3'
- gr = fixture.create_user_group(gr_name)
- UserGroupModel().add_user_to_group(gr, user=TEST_USER_ADMIN_LOGIN)
- Session().commit()
- id_, params = _build_data(self.apikey, 'remove_user_from_users_group',
- usersgroupid=gr_name,
+ ugr_to_perm = RepoModel().grant_user_group_permission(self.REPO, gr_name, 'repository.write')
+ msg = 'RepoGroup assigned to [%s]' % (ugr_to_perm)
+
+ id_, params = _build_data(self.apikey, 'delete_user_group',
+ usergroupid=gr_name,
userid=TEST_USER_ADMIN_LOGIN)
response = api_call(self, params)
- expected = 'failed to remove member from user group `%s`' % gr_name
- self._compare_error(id_, expected, given=response.body)
+ try:
+ expected = msg
+ self._compare_error(id_, expected, given=response.body)
+ finally:
+ if UserGroupModel().get_by_name(gr_name):
+ fixture.destroy_user_group(gr_name)
- UserGroupModel().delete(users_group=gr_name)
- Session().commit()
+ def test_api_delete_user_group_exception_occured(self):
+ gr_name = 'test_group'
+ ugroup = fixture.create_user_group(gr_name)
+ gr_id = ugroup.users_group_id
+ id_, params = _build_data(self.apikey, 'delete_user_group',
+ usergroupid=gr_name,
+ userid=TEST_USER_ADMIN_LOGIN)
+
+ try:
+ with mock.patch.object(UserGroupModel, 'delete', crash):
+ response = api_call(self, params)
+ expected = 'failed to delete user group ID:%s %s' % (gr_id, gr_name)
+ self._compare_error(id_, expected, given=response.body)
+ finally:
+ fixture.destroy_user_group(gr_name)
@parameterized.expand([('none', 'repository.none'),
('read', 'repository.read'),
('write', 'repository.write'),
('admin', 'repository.admin')])
def test_api_grant_user_permission(self, name, perm):
- id_, params = _build_data(self.apikey, 'grant_user_permission',
+ id_, params = _build_data(self.apikey,
+ 'grant_user_permission',
repoid=self.REPO,
userid=TEST_USER_ADMIN_LOGIN,
perm=perm)
response = api_call(self, params)
ret = {
- 'msg': 'Granted perm: `%s` for user: `%s` in repo: `%s`' % (
- perm, TEST_USER_ADMIN_LOGIN, self.REPO
- ),
- 'success': True
- }
+ 'msg': 'Granted perm: `%s` for user: `%s` in repo: `%s`' % (
+ perm, TEST_USER_ADMIN_LOGIN, self.REPO
+ ),
+ 'success': True
+ }
expected = ret
self._compare_ok(id_, expected, given=response.body)
def test_api_grant_user_permission_wrong_permission(self):
perm = 'haha.no.permission'
- id_, params = _build_data(self.apikey, 'grant_user_permission',
+ id_, params = _build_data(self.apikey,
+ 'grant_user_permission',
repoid=self.REPO,
userid=TEST_USER_ADMIN_LOGIN,
perm=perm)
@@ -1253,21 +1634,23 @@ class BaseTestApi(object):
@mock.patch.object(RepoModel, 'grant_user_permission', crash)
def test_api_grant_user_permission_exception_when_adding(self):
perm = 'repository.read'
- id_, params = _build_data(self.apikey, 'grant_user_permission',
+ id_, params = _build_data(self.apikey,
+ 'grant_user_permission',
repoid=self.REPO,
userid=TEST_USER_ADMIN_LOGIN,
perm=perm)
response = api_call(self, params)
expected = 'failed to edit permission for user: `%s` in repo: `%s`' % (
- TEST_USER_ADMIN_LOGIN, self.REPO
- )
+ TEST_USER_ADMIN_LOGIN, self.REPO
+ )
self._compare_error(id_, expected, given=response.body)
def test_api_revoke_user_permission(self):
- id_, params = _build_data(self.apikey, 'revoke_user_permission',
+ id_, params = _build_data(self.apikey,
+ 'revoke_user_permission',
repoid=self.REPO,
- userid=TEST_USER_ADMIN_LOGIN,)
+ userid=TEST_USER_ADMIN_LOGIN, )
response = api_call(self, params)
expected = {
@@ -1280,24 +1663,26 @@ class BaseTestApi(object):
@mock.patch.object(RepoModel, 'revoke_user_permission', crash)
def test_api_revoke_user_permission_exception_when_adding(self):
- id_, params = _build_data(self.apikey, 'revoke_user_permission',
+ id_, params = _build_data(self.apikey,
+ 'revoke_user_permission',
repoid=self.REPO,
- userid=TEST_USER_ADMIN_LOGIN,)
+ userid=TEST_USER_ADMIN_LOGIN, )
response = api_call(self, params)
expected = 'failed to edit permission for user: `%s` in repo: `%s`' % (
- TEST_USER_ADMIN_LOGIN, self.REPO
- )
+ TEST_USER_ADMIN_LOGIN, self.REPO
+ )
self._compare_error(id_, expected, given=response.body)
@parameterized.expand([('none', 'repository.none'),
('read', 'repository.read'),
('write', 'repository.write'),
('admin', 'repository.admin')])
- def test_api_grant_users_group_permission(self, name, perm):
- id_, params = _build_data(self.apikey, 'grant_users_group_permission',
+ def test_api_grant_user_group_permission(self, name, perm):
+ id_, params = _build_data(self.apikey,
+ 'grant_user_group_permission',
repoid=self.REPO,
- usersgroupid=TEST_USER_GROUP,
+ usergroupid=TEST_USER_GROUP,
perm=perm)
response = api_call(self, params)
@@ -1310,39 +1695,42 @@ class BaseTestApi(object):
expected = ret
self._compare_ok(id_, expected, given=response.body)
- def test_api_grant_users_group_permission_wrong_permission(self):
+ def test_api_grant_user_group_permission_wrong_permission(self):
perm = 'haha.no.permission'
- id_, params = _build_data(self.apikey, 'grant_users_group_permission',
+ id_, params = _build_data(self.apikey,
+ 'grant_user_group_permission',
repoid=self.REPO,
- usersgroupid=TEST_USER_GROUP,
+ usergroupid=TEST_USER_GROUP,
perm=perm)
response = api_call(self, params)
expected = 'permission `%s` does not exist' % perm
self._compare_error(id_, expected, given=response.body)
- @mock.patch.object(RepoModel, 'grant_users_group_permission', crash)
- def test_api_grant_users_group_permission_exception_when_adding(self):
+ @mock.patch.object(RepoModel, 'grant_user_group_permission', crash)
+ def test_api_grant_user_group_permission_exception_when_adding(self):
perm = 'repository.read'
- id_, params = _build_data(self.apikey, 'grant_users_group_permission',
+ id_, params = _build_data(self.apikey,
+ 'grant_user_group_permission',
repoid=self.REPO,
- usersgroupid=TEST_USER_GROUP,
+ usergroupid=TEST_USER_GROUP,
perm=perm)
response = api_call(self, params)
expected = 'failed to edit permission for user group: `%s` in repo: `%s`' % (
- TEST_USER_GROUP, self.REPO
- )
+ TEST_USER_GROUP, self.REPO
+ )
self._compare_error(id_, expected, given=response.body)
- def test_api_revoke_users_group_permission(self):
- RepoModel().grant_users_group_permission(repo=self.REPO,
- group_name=TEST_USER_GROUP,
- perm='repository.read')
+ def test_api_revoke_user_group_permission(self):
+ RepoModel().grant_user_group_permission(repo=self.REPO,
+ group_name=TEST_USER_GROUP,
+ perm='repository.read')
Session().commit()
- id_, params = _build_data(self.apikey, 'revoke_users_group_permission',
+ id_, params = _build_data(self.apikey,
+ 'revoke_user_group_permission',
repoid=self.REPO,
- usersgroupid=TEST_USER_GROUP,)
+ usergroupid=TEST_USER_GROUP, )
response = api_call(self, params)
expected = {
@@ -1353,15 +1741,555 @@ class BaseTestApi(object):
}
self._compare_ok(id_, expected, given=response.body)
- @mock.patch.object(RepoModel, 'revoke_users_group_permission', crash)
- def test_api_revoke_users_group_permission_exception_when_adding(self):
-
- id_, params = _build_data(self.apikey, 'revoke_users_group_permission',
+ @mock.patch.object(RepoModel, 'revoke_user_group_permission', crash)
+ def test_api_revoke_user_group_permission_exception_when_adding(self):
+ id_, params = _build_data(self.apikey,
+ 'revoke_user_group_permission',
repoid=self.REPO,
- usersgroupid=TEST_USER_GROUP,)
+ usergroupid=TEST_USER_GROUP, )
response = api_call(self, params)
expected = 'failed to edit permission for user group: `%s` in repo: `%s`' % (
- TEST_USER_GROUP, self.REPO
- )
+ TEST_USER_GROUP, self.REPO
+ )
+ self._compare_error(id_, expected, given=response.body)
+
+ @parameterized.expand([
+ ('none', 'group.none', 'none'),
+ ('read', 'group.read', 'none'),
+ ('write', 'group.write', 'none'),
+ ('admin', 'group.admin', 'none'),
+
+ ('none', 'group.none', 'all'),
+ ('read', 'group.read', 'all'),
+ ('write', 'group.write', 'all'),
+ ('admin', 'group.admin', 'all'),
+
+ ('none', 'group.none', 'repos'),
+ ('read', 'group.read', 'repos'),
+ ('write', 'group.write', 'repos'),
+ ('admin', 'group.admin', 'repos'),
+
+ ('none', 'group.none', 'groups'),
+ ('read', 'group.read', 'groups'),
+ ('write', 'group.write', 'groups'),
+ ('admin', 'group.admin', 'groups'),
+ ])
+ def test_api_grant_user_permission_to_repo_group(self, name, perm, apply_to_children):
+ id_, params = _build_data(self.apikey,
+ 'grant_user_permission_to_repo_group',
+ repogroupid=TEST_REPO_GROUP,
+ userid=TEST_USER_ADMIN_LOGIN,
+ perm=perm, apply_to_children=apply_to_children)
+ response = api_call(self, params)
+
+ ret = {
+ 'msg': 'Granted perm: `%s` (recursive:%s) for user: `%s` in repo group: `%s`' % (
+ perm, apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
+ ),
+ 'success': True
+ }
+ expected = ret
+ self._compare_ok(id_, expected, given=response.body)
+
+ @parameterized.expand([
+ ('none_fails', 'group.none', 'none', False, False),
+ ('read_fails', 'group.read', 'none', False, False),
+ ('write_fails', 'group.write', 'none', False, False),
+ ('admin_fails', 'group.admin', 'none', False, False),
+
+ # with granted perms
+ ('none_ok', 'group.none', 'none', True, True),
+ ('read_ok', 'group.read', 'none', True, True),
+ ('write_ok', 'group.write', 'none', True, True),
+ ('admin_ok', 'group.admin', 'none', True, True),
+ ])
+ def test_api_grant_user_permission_to_repo_group_by_regular_user(
+ self, name, perm, apply_to_children, grant_admin, access_ok):
+ if grant_admin:
+ RepoGroupModel().grant_user_permission(TEST_REPO_GROUP,
+ self.TEST_USER_LOGIN,
+ 'group.admin')
+ Session().commit()
+
+ id_, params = _build_data(self.apikey_regular,
+ 'grant_user_permission_to_repo_group',
+ repogroupid=TEST_REPO_GROUP,
+ userid=TEST_USER_ADMIN_LOGIN,
+ perm=perm, apply_to_children=apply_to_children)
+ response = api_call(self, params)
+ if access_ok:
+ ret = {
+ 'msg': 'Granted perm: `%s` (recursive:%s) for user: `%s` in repo group: `%s`' % (
+ perm, apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
+ ),
+ 'success': True
+ }
+ expected = ret
+ self._compare_ok(id_, expected, given=response.body)
+ else:
+ expected = 'repository group `%s` does not exist' % TEST_REPO_GROUP
+ self._compare_error(id_, expected, given=response.body)
+
+ def test_api_grant_user_permission_to_repo_group_wrong_permission(self):
+ perm = 'haha.no.permission'
+ id_, params = _build_data(self.apikey,
+ 'grant_user_permission_to_repo_group',
+ repogroupid=TEST_REPO_GROUP,
+ userid=TEST_USER_ADMIN_LOGIN,
+ perm=perm)
+ response = api_call(self, params)
+
+ expected = 'permission `%s` does not exist' % perm
+ self._compare_error(id_, expected, given=response.body)
+
+ @mock.patch.object(RepoGroupModel, 'grant_user_permission', crash)
+ def test_api_grant_user_permission_to_repo_group_exception_when_adding(self):
+ perm = 'group.read'
+ id_, params = _build_data(self.apikey,
+ 'grant_user_permission_to_repo_group',
+ repogroupid=TEST_REPO_GROUP,
+ userid=TEST_USER_ADMIN_LOGIN,
+ perm=perm)
+ response = api_call(self, params)
+
+ expected = 'failed to edit permission for user: `%s` in repo group: `%s`' % (
+ TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
+ )
+ self._compare_error(id_, expected, given=response.body)
+
+ @parameterized.expand([
+ ('none', 'none'),
+ ('all', 'all'),
+ ('repos', 'repos'),
+ ('groups', 'groups'),
+ ])
+ def test_api_revoke_user_permission_from_repo_group(self, name, apply_to_children):
+ RepoGroupModel().grant_user_permission(repo_group=TEST_REPO_GROUP,
+ user=TEST_USER_ADMIN_LOGIN,
+ perm='group.read',)
+ Session().commit()
+
+ id_, params = _build_data(self.apikey,
+ 'revoke_user_permission_from_repo_group',
+ repogroupid=TEST_REPO_GROUP,
+ userid=TEST_USER_ADMIN_LOGIN,
+ apply_to_children=apply_to_children,)
+ response = api_call(self, params)
+
+ expected = {
+ 'msg': 'Revoked perm (recursive:%s) for user: `%s` in repo group: `%s`' % (
+ apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
+ ),
+ 'success': True
+ }
+ self._compare_ok(id_, expected, given=response.body)
+
+ @parameterized.expand([
+ ('none', 'none', False, False),
+ ('all', 'all', False, False),
+ ('repos', 'repos', False, False),
+ ('groups', 'groups', False, False),
+
+ # after granting admin rights
+ ('none', 'none', False, False),
+ ('all', 'all', False, False),
+ ('repos', 'repos', False, False),
+ ('groups', 'groups', False, False),
+ ])
+ def test_api_revoke_user_permission_from_repo_group_by_regular_user(
+ self, name, apply_to_children, grant_admin, access_ok):
+ RepoGroupModel().grant_user_permission(repo_group=TEST_REPO_GROUP,
+ user=TEST_USER_ADMIN_LOGIN,
+ perm='group.read',)
+ Session().commit()
+
+ if grant_admin:
+ RepoGroupModel().grant_user_permission(TEST_REPO_GROUP,
+ self.TEST_USER_LOGIN,
+ 'group.admin')
+ Session().commit()
+
+ id_, params = _build_data(self.apikey_regular,
+ 'revoke_user_permission_from_repo_group',
+ repogroupid=TEST_REPO_GROUP,
+ userid=TEST_USER_ADMIN_LOGIN,
+ apply_to_children=apply_to_children,)
+ response = api_call(self, params)
+ if access_ok:
+ expected = {
+ 'msg': 'Revoked perm (recursive:%s) for user: `%s` in repo group: `%s`' % (
+ apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
+ ),
+ 'success': True
+ }
+ self._compare_ok(id_, expected, given=response.body)
+ else:
+ expected = 'repository group `%s` does not exist' % TEST_REPO_GROUP
+ self._compare_error(id_, expected, given=response.body)
+
+ @mock.patch.object(RepoGroupModel, 'revoke_user_permission', crash)
+ def test_api_revoke_user_permission_from_repo_group_exception_when_adding(self):
+ id_, params = _build_data(self.apikey,
+ 'revoke_user_permission_from_repo_group',
+ repogroupid=TEST_REPO_GROUP,
+ userid=TEST_USER_ADMIN_LOGIN, )
+ response = api_call(self, params)
+
+ expected = 'failed to edit permission for user: `%s` in repo group: `%s`' % (
+ TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
+ )
self._compare_error(id_, expected, given=response.body)
+
+ @parameterized.expand([
+ ('none', 'group.none', 'none'),
+ ('read', 'group.read', 'none'),
+ ('write', 'group.write', 'none'),
+ ('admin', 'group.admin', 'none'),
+
+ ('none', 'group.none', 'all'),
+ ('read', 'group.read', 'all'),
+ ('write', 'group.write', 'all'),
+ ('admin', 'group.admin', 'all'),
+
+ ('none', 'group.none', 'repos'),
+ ('read', 'group.read', 'repos'),
+ ('write', 'group.write', 'repos'),
+ ('admin', 'group.admin', 'repos'),
+
+ ('none', 'group.none', 'groups'),
+ ('read', 'group.read', 'groups'),
+ ('write', 'group.write', 'groups'),
+ ('admin', 'group.admin', 'groups'),
+ ])
+ def test_api_grant_user_group_permission_to_repo_group(self, name, perm, apply_to_children):
+ id_, params = _build_data(self.apikey,
+ 'grant_user_group_permission_to_repo_group',
+ repogroupid=TEST_REPO_GROUP,
+ usergroupid=TEST_USER_GROUP,
+ perm=perm,
+ apply_to_children=apply_to_children,)
+ response = api_call(self, params)
+
+ ret = {
+ 'msg': 'Granted perm: `%s` (recursive:%s) for user group: `%s` in repo group: `%s`' % (
+ perm, apply_to_children, TEST_USER_GROUP, TEST_REPO_GROUP
+ ),
+ 'success': True
+ }
+ expected = ret
+ self._compare_ok(id_, expected, given=response.body)
+
+ @parameterized.expand([
+ ('none_fails', 'group.none', 'none', False, False),
+ ('read_fails', 'group.read', 'none', False, False),
+ ('write_fails', 'group.write', 'none', False, False),
+ ('admin_fails', 'group.admin', 'none', False, False),
+
+ # with granted perms
+ ('none_ok', 'group.none', 'none', True, True),
+ ('read_ok', 'group.read', 'none', True, True),
+ ('write_ok', 'group.write', 'none', True, True),
+ ('admin_ok', 'group.admin', 'none', True, True),
+ ])
+ def test_api_grant_user_group_permission_to_repo_group_by_regular_user(
+ self, name, perm, apply_to_children, grant_admin, access_ok):
+ if grant_admin:
+ RepoGroupModel().grant_user_permission(TEST_REPO_GROUP,
+ self.TEST_USER_LOGIN,
+ 'group.admin')
+ Session().commit()
+
+ id_, params = _build_data(self.apikey_regular,
+ 'grant_user_group_permission_to_repo_group',
+ repogroupid=TEST_REPO_GROUP,
+ usergroupid=TEST_USER_GROUP,
+ perm=perm,
+ apply_to_children=apply_to_children,)
+ response = api_call(self, params)
+ if access_ok:
+ ret = {
+ 'msg': 'Granted perm: `%s` (recursive:%s) for user group: `%s` in repo group: `%s`' % (
+ perm, apply_to_children, TEST_USER_GROUP, TEST_REPO_GROUP
+ ),
+ 'success': True
+ }
+ expected = ret
+ self._compare_ok(id_, expected, given=response.body)
+ else:
+ expected = 'repository group `%s` does not exist' % TEST_REPO_GROUP
+ self._compare_error(id_, expected, given=response.body)
+
+ def test_api_grant_user_group_permission_to_repo_group_wrong_permission(self):
+ perm = 'haha.no.permission'
+ id_, params = _build_data(self.apikey,
+ 'grant_user_group_permission_to_repo_group',
+ repogroupid=TEST_REPO_GROUP,
+ usergroupid=TEST_USER_GROUP,
+ perm=perm)
+ response = api_call(self, params)
+
+ expected = 'permission `%s` does not exist' % perm
+ self._compare_error(id_, expected, given=response.body)
+
+ @mock.patch.object(RepoGroupModel, 'grant_user_group_permission', crash)
+ def test_api_grant_user_group_permission_exception_when_adding(self):
+ perm = 'group.read'
+ id_, params = _build_data(self.apikey,
+ 'grant_user_group_permission_to_repo_group',
+ repogroupid=TEST_REPO_GROUP,
+ usergroupid=TEST_USER_GROUP,
+ perm=perm)
+ response = api_call(self, params)
+
+ expected = 'failed to edit permission for user group: `%s` in repo group: `%s`' % (
+ TEST_USER_GROUP, TEST_REPO_GROUP
+ )
+ self._compare_error(id_, expected, given=response.body)
+
+ @parameterized.expand([
+ ('none', 'none'),
+ ('all', 'all'),
+ ('repos', 'repos'),
+ ('groups', 'groups'),
+ ])
+ def test_api_revoke_user_group_permission_from_repo_group(self, name, apply_to_children):
+ RepoGroupModel().grant_user_group_permission(repo_group=TEST_REPO_GROUP,
+ group_name=TEST_USER_GROUP,
+ perm='group.read',)
+ Session().commit()
+ id_, params = _build_data(self.apikey,
+ 'revoke_user_group_permission_from_repo_group',
+ repogroupid=TEST_REPO_GROUP,
+ usergroupid=TEST_USER_GROUP,
+ apply_to_children=apply_to_children,)
+ response = api_call(self, params)
+
+ expected = {
+ 'msg': 'Revoked perm (recursive:%s) for user group: `%s` in repo group: `%s`' % (
+ apply_to_children, TEST_USER_GROUP, TEST_REPO_GROUP
+ ),
+ 'success': True
+ }
+ self._compare_ok(id_, expected, given=response.body)
+
+ @parameterized.expand([
+ ('none', 'none', False, False),
+ ('all', 'all', False, False),
+ ('repos', 'repos', False, False),
+ ('groups', 'groups', False, False),
+
+ # after granting admin rights
+ ('none', 'none', False, False),
+ ('all', 'all', False, False),
+ ('repos', 'repos', False, False),
+ ('groups', 'groups', False, False),
+ ])
+ def test_api_revoke_user_group_permission_from_repo_group_by_regular_user(
+ self, name, apply_to_children, grant_admin, access_ok):
+ RepoGroupModel().grant_user_permission(repo_group=TEST_REPO_GROUP,
+ user=TEST_USER_ADMIN_LOGIN,
+ perm='group.read',)
+ Session().commit()
+
+ if grant_admin:
+ RepoGroupModel().grant_user_permission(TEST_REPO_GROUP,
+ self.TEST_USER_LOGIN,
+ 'group.admin')
+ Session().commit()
+
+ id_, params = _build_data(self.apikey_regular,
+ 'revoke_user_group_permission_from_repo_group',
+ repogroupid=TEST_REPO_GROUP,
+ usergroupid=TEST_USER_GROUP,
+ apply_to_children=apply_to_children,)
+ response = api_call(self, params)
+ if access_ok:
+ expected = {
+ 'msg': 'Revoked perm (recursive:%s) for user group: `%s` in repo group: `%s`' % (
+ apply_to_children, TEST_USER_ADMIN_LOGIN, TEST_REPO_GROUP
+ ),
+ 'success': True
+ }
+ self._compare_ok(id_, expected, given=response.body)
+ else:
+ expected = 'repository group `%s` does not exist' % TEST_REPO_GROUP
+ self._compare_error(id_, expected, given=response.body)
+
+ @mock.patch.object(RepoGroupModel, 'revoke_user_group_permission', crash)
+ def test_api_revoke_user_group_permission_from_repo_group_exception_when_adding(self):
+ id_, params = _build_data(self.apikey, 'revoke_user_group_permission_from_repo_group',
+ repogroupid=TEST_REPO_GROUP,
+ usergroupid=TEST_USER_GROUP,)
+ response = api_call(self, params)
+
+ expected = 'failed to edit permission for user group: `%s` in repo group: `%s`' % (
+ TEST_USER_GROUP, TEST_REPO_GROUP
+ )
+ self._compare_error(id_, expected, given=response.body)
+
+ def test_api_get_gist(self):
+ gist = fixture.create_gist()
+ gist_id = gist.gist_access_id
+ gist_created_on = gist.created_on
+ id_, params = _build_data(self.apikey, 'get_gist',
+ gistid=gist_id, )
+ response = api_call(self, params)
+
+ expected = {
+ 'access_id': gist_id,
+ 'created_on': gist_created_on,
+ 'description': 'new-gist',
+ 'expires': -1.0,
+ 'gist_id': int(gist_id),
+ 'type': 'public',
+ 'url': 'http://localhost:80/_admin/gists/%s' % gist_id
+ }
+
+ self._compare_ok(id_, expected, given=response.body)
+
+ def test_api_get_gist_that_does_not_exist(self):
+ id_, params = _build_data(self.apikey_regular, 'get_gist',
+ gistid='12345', )
+ response = api_call(self, params)
+ expected = 'gist `%s` does not exist' % ('12345',)
+ self._compare_error(id_, expected, given=response.body)
+
+ def test_api_get_gist_private_gist_without_permission(self):
+ gist = fixture.create_gist()
+ gist_id = gist.gist_access_id
+ gist_created_on = gist.created_on
+ id_, params = _build_data(self.apikey_regular, 'get_gist',
+ gistid=gist_id, )
+ response = api_call(self, params)
+
+ expected = 'gist `%s` does not exist' % gist_id
+ self._compare_error(id_, expected, given=response.body)
+
+ def test_api_get_gists(self):
+ fixture.create_gist()
+ fixture.create_gist()
+
+ id_, params = _build_data(self.apikey, 'get_gists')
+ response = api_call(self, params)
+ expected = response.json
+ self.assertEqual(len(response.json['result']), 2)
+ #self._compare_ok(id_, expected, given=response.body)
+
+ def test_api_get_gists_regular_user(self):
+ # by admin
+ fixture.create_gist()
+ fixture.create_gist()
+
+ # by reg user
+ fixture.create_gist(owner=self.TEST_USER_LOGIN)
+ fixture.create_gist(owner=self.TEST_USER_LOGIN)
+ fixture.create_gist(owner=self.TEST_USER_LOGIN)
+
+ id_, params = _build_data(self.apikey_regular, 'get_gists')
+ response = api_call(self, params)
+ expected = response.json
+ self.assertEqual(len(response.json['result']), 3)
+ #self._compare_ok(id_, expected, given=response.body)
+
+ def test_api_get_gists_only_for_regular_user(self):
+ # by admin
+ fixture.create_gist()
+ fixture.create_gist()
+
+ # by reg user
+ fixture.create_gist(owner=self.TEST_USER_LOGIN)
+ fixture.create_gist(owner=self.TEST_USER_LOGIN)
+ fixture.create_gist(owner=self.TEST_USER_LOGIN)
+
+ id_, params = _build_data(self.apikey, 'get_gists',
+ userid=self.TEST_USER_LOGIN)
+ response = api_call(self, params)
+ expected = response.json
+ self.assertEqual(len(response.json['result']), 3)
+ #self._compare_ok(id_, expected, given=response.body)
+
+ def test_api_get_gists_regular_user_with_different_userid(self):
+ id_, params = _build_data(self.apikey_regular, 'get_gists',
+ userid=TEST_USER_ADMIN_LOGIN)
+ response = api_call(self, params)
+ expected = 'userid is not the same as your user'
+ self._compare_error(id_, expected, given=response.body)
+
+ def test_api_create_gist(self):
+ id_, params = _build_data(self.apikey_regular, 'create_gist',
+ lifetime=10,
+ description='foobar-gist',
+ gist_type='public',
+ files={'foobar': {'content': 'foo'}})
+ response = api_call(self, params)
+ response_json = response.json
+ expected = {
+ 'gist': {
+ 'access_id': response_json['result']['gist']['access_id'],
+ 'created_on': response_json['result']['gist']['created_on'],
+ 'description': 'foobar-gist',
+ 'expires': response_json['result']['gist']['expires'],
+ 'gist_id': response_json['result']['gist']['gist_id'],
+ 'type': 'public',
+ 'url': response_json['result']['gist']['url']
+ },
+ 'msg': 'created new gist'
+ }
+ self._compare_ok(id_, expected, given=response.body)
+
+ @mock.patch.object(GistModel, 'create', crash)
+ def test_api_create_gist_exception_occured(self):
+ id_, params = _build_data(self.apikey_regular, 'create_gist',
+ files={})
+ response = api_call(self, params)
+ expected = 'failed to create gist'
+ self._compare_error(id_, expected, given=response.body)
+
+ def test_api_delete_gist(self):
+ gist_id = fixture.create_gist().gist_access_id
+ id_, params = _build_data(self.apikey, 'delete_gist',
+ gistid=gist_id)
+ response = api_call(self, params)
+ expected = {'gist': None, 'msg': 'deleted gist ID:%s' % gist_id}
+ self._compare_ok(id_, expected, given=response.body)
+
+ def test_api_delete_gist_regular_user(self):
+ gist_id = fixture.create_gist(owner=self.TEST_USER_LOGIN).gist_access_id
+ id_, params = _build_data(self.apikey_regular, 'delete_gist',
+ gistid=gist_id)
+ response = api_call(self, params)
+ expected = {'gist': None, 'msg': 'deleted gist ID:%s' % gist_id}
+ self._compare_ok(id_, expected, given=response.body)
+
+ def test_api_delete_gist_regular_user_no_permission(self):
+ gist_id = fixture.create_gist().gist_access_id
+ id_, params = _build_data(self.apikey_regular, 'delete_gist',
+ gistid=gist_id)
+ response = api_call(self, params)
+ expected = 'gist `%s` does not exist' % (gist_id,)
+ self._compare_error(id_, expected, given=response.body)
+
+ @mock.patch.object(GistModel, 'delete', crash)
+ def test_api_delete_gist_exception_occured(self):
+ gist_id = fixture.create_gist().gist_access_id
+ id_, params = _build_data(self.apikey, 'delete_gist',
+ gistid=gist_id)
+ response = api_call(self, params)
+ expected = 'failed to delete gist ID:%s' % (gist_id,)
+ self._compare_error(id_, expected, given=response.body)
+
+ def test_api_get_ip(self):
+ id_, params = _build_data(self.apikey, 'get_ip')
+ response = api_call(self, params)
+ expected = {
+ 'server_ip_addr': '0.0.0.0',
+ 'user_ips': []
+ }
+ self._compare_ok(id_, expected, given=response.body)
+
+ def test_api_get_server_info(self):
+ id_, params = _build_data(self.apikey, 'get_server_info')
+ response = api_call(self, params)
+ expected = RhodeCodeSetting.get_server_info()
+ self._compare_ok(id_, expected, given=response.body)