grids: fixed tests and added one for permissions to repository group.

This commit is contained in:
Marcin Kuzminski 2019-12-20 18:27:24 +01:00
parent 7260aed821
commit ef0dad2905
7 changed files with 101 additions and 43 deletions

View file

@ -47,6 +47,7 @@ def route_path(name, params=None, **kwargs):
base_url = {
'repos': ADMIN_PREFIX + '/repos',
'repos_data': ADMIN_PREFIX + '/repos_data',
'repo_new': ADMIN_PREFIX + '/repos/new',
'repo_create': ADMIN_PREFIX + '/repos/create',
@ -70,11 +71,12 @@ def _get_permission_for_user(user, repo):
@pytest.mark.usefixtures("app")
class TestAdminRepos(object):
def test_repo_list(self, autologin_user, user_util):
def test_repo_list(self, autologin_user, user_util, xhr_header):
repo = user_util.create_repo()
repo_name = repo.repo_name
response = self.app.get(
route_path('repos'), status=200)
route_path('repos_data'), status=200,
extra_environ=xhr_header)
response.mustcontain(repo_name)

View file

@ -84,7 +84,7 @@ class TestAdminRepositoryGroups(object):
fixture.create_repo_group('test_repo_group')
response = self.app.get(route_path(
'repo_groups_data'), extra_environ=xhr_header)
response.mustcontain('"name_raw": "test_repo_group"')
response.mustcontain('<a href=\\"/{}/_edit\\" title=\\"Edit\\">Edit</a>'.format('test_repo_group'))
fixture.destroy_repo_group('test_repo_group')
def test_new(self, autologin_user):

View file

@ -546,6 +546,7 @@ class TestAdminUsersView(TestController):
usr = user_util.create_user(auto_cleanup=False)
username = usr.username
fixture.create_repo(obj_name, cur_user=usr.username)
Session().commit()
new_user = Session().query(User)\
.filter(User.username == username).one()

View file

@ -22,7 +22,7 @@
import pytest
import rhodecode
from rhodecode.model.db import Repository
from rhodecode.model.db import Repository, RepoGroup, User
from rhodecode.model.meta import Session
from rhodecode.model.repo import RepoModel
from rhodecode.model.repo_group import RepoGroupModel
@ -37,6 +37,8 @@ fixture = Fixture()
def route_path(name, **kwargs):
return {
'home': '/',
'main_page_repos_data': '/_home_repos',
'main_page_repo_groups_data': '/_home_repo_groups',
'repo_group_home': '/{repo_group_name}'
}[name].format(**kwargs)
@ -49,9 +51,40 @@ class TestHomeController(TestController):
# if global permission is set
response.mustcontain('New Repository')
def test_index_grid_repos(self, xhr_header):
self.log_user()
response = self.app.get(route_path('main_page_repos_data'), extra_environ=xhr_header)
# search for objects inside the JavaScript JSON
for repo in Repository.getAll():
response.mustcontain('"name_raw": "%s"' % repo.repo_name)
for obj in Repository.getAll():
response.mustcontain('<a href=\\"/{}\\">'.format(obj.repo_name))
def test_index_grid_repo_groups(self, xhr_header):
self.log_user()
response = self.app.get(route_path('main_page_repo_groups_data'),
extra_environ=xhr_header,)
# search for objects inside the JavaScript JSON
for obj in RepoGroup.getAll():
response.mustcontain('<a href=\\"/{}\\">'.format(obj.group_name))
def test_index_grid_repo_groups_without_access(self, xhr_header, user_util):
user = user_util.create_user(password='qweqwe')
group_ok = user_util.create_repo_group(owner=user)
group_id_ok = group_ok.group_id
group_forbidden = user_util.create_repo_group(owner=User.get_first_super_admin())
group_id_forbidden = group_forbidden.group_id
user_util.grant_user_permission_to_repo_group(group_forbidden, user, 'group.none')
self.log_user(user.username, 'qweqwe')
self.app.get(route_path('main_page_repo_groups_data'),
extra_environ=xhr_header,
params={'repo_group_id': group_id_ok}, status=200)
self.app.get(route_path('main_page_repo_groups_data'),
extra_environ=xhr_header,
params={'repo_group_id': group_id_forbidden}, status=404)
def test_index_contains_statics_with_ver(self):
from rhodecode.lib.base import calculate_version_hash
@ -64,9 +97,9 @@ class TestHomeController(TestController):
response.mustcontain('style.css?ver={0}'.format(rhodecode_version_hash))
response.mustcontain('scripts.min.js?ver={0}'.format(rhodecode_version_hash))
def test_index_contains_backend_specific_details(self, backend):
def test_index_contains_backend_specific_details(self, backend, xhr_header):
self.log_user()
response = self.app.get(route_path('home'))
response = self.app.get(route_path('main_page_repos_data'), extra_environ=xhr_header)
tip = backend.repo.get_commit().raw_id
# html in javascript variable:
@ -81,25 +114,44 @@ class TestHomeController(TestController):
response = self.app.get(route_path('home'), status=302)
assert 'login' in response.location
def test_index_page_on_groups(self, autologin_user, repo_group):
response = self.app.get(route_path('repo_group_home', repo_group_name='gr1'))
response.mustcontain("gr1/repo_in_group")
def test_index_page_on_groups_with_wrong_group_id(self, autologin_user, xhr_header):
group_id = 918123
self.app.get(
route_path('main_page_repo_groups_data'),
params={'repo_group_id': group_id},
status=404, extra_environ=xhr_header)
def test_index_page_on_group_with_trailing_slash(
self, autologin_user, repo_group):
response = self.app.get(route_path('repo_group_home', repo_group_name='gr1') + '/')
response.mustcontain("gr1/repo_in_group")
def test_index_page_on_groups(self, autologin_user, user_util, xhr_header):
gr = user_util.create_repo_group()
repo = user_util.create_repo(parent=gr)
repo_name = repo.repo_name
group_id = gr.group_id
@pytest.fixture(scope='class')
def repo_group(self, request):
gr = fixture.create_repo_group('gr1')
fixture.create_repo(name='gr1/repo_in_group', repo_group=gr)
response = self.app.get(route_path(
'repo_group_home', repo_group_name=gr.group_name))
response.mustcontain('d.repo_group_id = {}'.format(group_id))
@request.addfinalizer
def cleanup():
RepoModel().delete('gr1/repo_in_group')
RepoGroupModel().delete(repo_group='gr1', force_delete=True)
Session().commit()
response = self.app.get(
route_path('main_page_repos_data'),
params={'repo_group_id': group_id},
extra_environ=xhr_header,)
response.mustcontain(repo_name)
def test_index_page_on_group_with_trailing_slash(self, autologin_user, user_util, xhr_header):
gr = user_util.create_repo_group()
repo = user_util.create_repo(parent=gr)
repo_name = repo.repo_name
group_id = gr.group_id
response = self.app.get(route_path(
'repo_group_home', repo_group_name=gr.group_name+'/'))
response.mustcontain('d.repo_group_id = {}'.format(group_id))
response = self.app.get(
route_path('main_page_repos_data'),
params={'repo_group_id': group_id},
extra_environ=xhr_header, )
response.mustcontain(repo_name)
@pytest.mark.parametrize("name, state", [
('Disabled', False),

View file

@ -29,7 +29,7 @@ from rhodecode.apps._base import BaseAppView, DataGridAppView
from rhodecode.lib import helpers as h
from rhodecode.lib.auth import (
LoginRequired, NotAnonymous, HasRepoGroupPermissionAnyDecorator, CSRFRequired,
HasRepoGroupPermissionAny)
HasRepoGroupPermissionAny, AuthUser)
from rhodecode.lib.codeblocks import filenode_as_lines_tokens
from rhodecode.lib.index import searcher_from_config
from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int
@ -723,7 +723,7 @@ class HomeView(BaseAppView, DataGridAppView):
if repo_group_id:
group = RepoGroup.get_or_404(repo_group_id)
_perms = ['group.read', 'group.write', 'group.admin']
_perms = AuthUser.repo_group_read_perms
if not HasRepoGroupPermissionAny(*_perms)(
group.group_name, 'user is allowed to list repo group children'):
raise HTTPNotFound()
@ -740,7 +740,7 @@ class HomeView(BaseAppView, DataGridAppView):
if repo_group_id:
group = RepoGroup.get_or_404(repo_group_id)
_perms = ['group.read', 'group.write', 'group.admin']
_perms = AuthUser.repo_group_read_perms
if not HasRepoGroupPermissionAny(*_perms)(
group.group_name, 'user is allowed to list repo group children'):
raise HTTPNotFound()
@ -748,8 +748,7 @@ class HomeView(BaseAppView, DataGridAppView):
return self._main_page_repos_data(repo_group_id)
@LoginRequired()
@HasRepoGroupPermissionAnyDecorator(
'group.read', 'group.write', 'group.admin')
@HasRepoGroupPermissionAnyDecorator(*AuthUser.repo_group_read_perms)
@view_config(
route_name='repo_group_home', request_method='GET',
renderer='rhodecode:templates/index_repo_group.mako')

View file

@ -93,7 +93,7 @@ class TestLoginController(object):
session = response.get_session_from_response()
username = session['rhodecode_user'].get('username')
assert username == 'test_admin'
response.mustcontain('/%s' % HG_REPO)
response.mustcontain('logout')
def test_login_regular_ok(self):
response = self.app.post(route_path('login'),
@ -104,8 +104,7 @@ class TestLoginController(object):
session = response.get_session_from_response()
username = session['rhodecode_user'].get('username')
assert username == 'test_regular'
response.mustcontain('/%s' % HG_REPO)
response.mustcontain('logout')
def test_login_regular_forbidden_when_super_admin_restriction(self):
from rhodecode.authentication.plugins.auth_rhodecode import RhodeCodeAuthPlugin
@ -225,7 +224,7 @@ class TestLoginController(object):
session = response.get_session_from_response()
username = session['rhodecode_user'].get('username')
assert username == temp_user
response.mustcontain('/%s' % HG_REPO)
response.mustcontain('logout')
# new password should be bcrypted, after log-in and transfer
user = User.get_by_username(temp_user)

View file

@ -33,6 +33,8 @@ def route_path(name, params=None, **kwargs):
'admin_home': ADMIN_PREFIX,
'repos':
ADMIN_PREFIX + '/repos',
'repos_data':
ADMIN_PREFIX + '/repos_data',
'repo_groups':
ADMIN_PREFIX + '/repo_groups',
'repo_groups_data':
@ -62,8 +64,9 @@ class TestAdminDelegatedUser(TestController):
# user doesn't have any access to resources so main admin page should 404
self.app.get(route_path('admin_home'), status=404)
response = self.app.get(route_path('repos'), status=200)
response.mustcontain('data: []')
response = self.app.get(route_path('repos_data'),
status=200, extra_environ=xhr_header)
assert response.json['data'] == []
response = self.app.get(route_path('repo_groups_data'),
status=200, extra_environ=xhr_header)
@ -97,16 +100,17 @@ class TestAdminDelegatedUser(TestController):
assert_response.element_contains('td.delegated-admin-user-groups', '1')
# admin interfaces have visible elements
response = self.app.get(route_path('repos'), status=200)
response.mustcontain('"name_raw": "{}"'.format(repo_name))
response = self.app.get(route_path('repos_data'),
extra_environ=xhr_header, status=200)
response.mustcontain('<a href=\\"/{}\\">'.format(repo_name))
response = self.app.get(route_path('repo_groups_data'),
extra_environ=xhr_header, status=200)
response.mustcontain('"name_raw": "{}"'.format(repo_group_name))
response.mustcontain('<a href=\\"/{}\\">'.format(repo_group_name))
response = self.app.get(route_path('user_groups_data'),
extra_environ=xhr_header, status=200)
response.mustcontain('"name_raw": "{}"'.format(user_group_name))
response.mustcontain('<a href=\\"/_profile_user_group/{}\\">'.format(user_group_name))
def test_regular_user_can_see_admin_interfaces_if_admin_perm(
self, user_util, xhr_header):
@ -140,13 +144,14 @@ class TestAdminDelegatedUser(TestController):
assert_response.element_contains('td.delegated-admin-user-groups', '1')
# admin interfaces have visible elements
response = self.app.get(route_path('repos'), status=200)
response.mustcontain('"name_raw": "{}"'.format(repo_name))
response = self.app.get(route_path('repos_data'),
extra_environ=xhr_header, status=200)
response.mustcontain('<a href=\\"/{}\\">'.format(repo_name))
response = self.app.get(route_path('repo_groups_data'),
extra_environ=xhr_header, status=200)
response.mustcontain('"name_raw": "{}"'.format(repo_group_name))
response.mustcontain('<a href=\\"/{}\\">'.format(repo_group_name))
response = self.app.get(route_path('user_groups_data'),
extra_environ=xhr_header, status=200)
response.mustcontain('"name_raw": "{}"'.format(user_group_name))
response.mustcontain('<a href=\\"/_profile_user_group/{}\\">'.format(user_group_name))