Files @ abc29122c7f2
Branch filter:

Location: kallithea/kallithea/tests/functional/test_admin_repo_groups.py

mads
repo group: introduce editing of owner

The repo group owner concept was only partially implemented. Owners were shown
in the repo group listing, but couldn't be changed. Users owning repo groups
couldn't be deleted, with no other solution than deleting owned repo groups.

This also fixes the existing broken update_repo_group API, which tried to use
unimplemented functionality.
from kallithea.model import db, meta
from kallithea.model.repo_group import RepoGroupModel
from kallithea.tests import base
from kallithea.tests.fixture import Fixture


fixture = Fixture()


class TestRepoGroupsController(base.TestController):

    def test_index(self):
        self.log_user()
        response = self.app.get(base.url('repos_groups'))
        response.mustcontain('"records": []')

    def test_new(self):
        self.log_user()
        response = self.app.get(base.url('new_repos_group'))

    def test_create(self):
        self.log_user()

        group_name = 'foo'

        # creation with form error
        response = self.app.post(base.url('repos_groups'),
                                         {'group_name': group_name,
                                          '_session_csrf_secret_token': self.session_csrf_secret_token()})
        response.mustcontain('name="group_name" type="text" value="%s"' % group_name)
        response.mustcontain('<!-- for: group_description -->')

        # creation
        response = self.app.post(base.url('repos_groups'),
                                         {'group_name': group_name,
                                         'group_description': 'lala',
                                         'parent_group_id': '-1',
                                         'group_copy_permissions': 'True',
                                          '_session_csrf_secret_token': self.session_csrf_secret_token()})
        self.checkSessionFlash(response, 'Created repository group %s' % group_name)

        # edit form
        response = self.app.get(base.url('edit_repo_group', group_name=group_name))
        response.mustcontain('>lala<')

        # edit with form error
        response = self.app.post(base.url('update_repos_group', group_name=group_name),
                                         {'group_name': group_name,
                                          '_session_csrf_secret_token': self.session_csrf_secret_token()})
        response.mustcontain('name="group_name" type="text" value="%s"' % group_name)
        response.mustcontain('<!-- for: group_description -->')

        # edit
        response = self.app.post(base.url('update_repos_group', group_name=group_name),
                                         {'group_name': group_name,
                                         'owner': base.TEST_USER_REGULAR2_LOGIN,
                                         'group_description': 'lolo',
                                          '_session_csrf_secret_token': self.session_csrf_secret_token()})
        self.checkSessionFlash(response, 'Updated repository group %s' % group_name)
        response = response.follow()
        response.mustcontain('name="group_name" type="text" value="%s"' % group_name)
        response.mustcontain(no='<!-- for: group_description -->')
        response.mustcontain('>lolo<')

        # listing
        response = self.app.get(base.url('repos_groups'))
        response.mustcontain('raw_name": "%s"' % group_name)

        # show
        response = self.app.get(base.url('repos_group', group_name=group_name))
        response.mustcontain('href="/_admin/repo_groups/%s/edit"' % group_name)

        # show ignores extra trailing slashes in the URL
        response = self.app.get(base.url('repos_group', group_name='%s//' % group_name))
        response.mustcontain('href="/_admin/repo_groups/%s/edit"' % group_name)

        # delete
        response = self.app.post(base.url('delete_repo_group', group_name=group_name),
                                 {'_session_csrf_secret_token': self.session_csrf_secret_token()})
        self.checkSessionFlash(response, 'Removed repository group %s' % group_name)

    def test_new_by_regular_user(self):
        self.log_user(base.TEST_USER_REGULAR_LOGIN, base.TEST_USER_REGULAR_PASS)
        response = self.app.get(base.url('new_repos_group'), status=403)

    def test_case_insensitivity(self):
        self.log_user()
        group_name = 'newgroup'
        response = self.app.post(base.url('repos_groups'),
                                 fixture._get_repo_group_create_params(group_name=group_name,
                                                                 _session_csrf_secret_token=self.session_csrf_secret_token()))
        # try to create repo group with swapped case
        swapped_group_name = group_name.swapcase()
        response = self.app.post(base.url('repos_groups'),
                                 fixture._get_repo_group_create_params(group_name=swapped_group_name,
                                                                 _session_csrf_secret_token=self.session_csrf_secret_token()))
        response.mustcontain('already exists')

        RepoGroupModel().delete(group_name)
        meta.Session().commit()

    def test_subgroup_deletion(self):
        self.log_user()
        parent = None
        parent_name = 'parent'
        sub = None
        sub_name = 'sub'
        sub_path = 'parent/sub'

        try:
            # create parent group
            assert db.RepoGroup.guess_instance(parent_name) is None
            response = self.app.post(
                base.url('repos_groups'),
                fixture._get_repo_group_create_params(
                    group_name=parent_name,
                    _session_csrf_secret_token=self.session_csrf_secret_token()
                )
            )
            parent = db.RepoGroup.guess_instance(parent_name)
            assert parent is not None

            # create sub group
            assert db.RepoGroup.guess_instance(sub_path) is None
            response = self.app.post(
                base.url('repos_groups'),
                fixture._get_repo_group_create_params(
                    group_name=sub_name,
                    parent_group_id=parent.group_id,
                    _session_csrf_secret_token=self.session_csrf_secret_token()
                )
            )
            sub = db.RepoGroup.guess_instance(sub_path)
            assert sub is not None

            # delete sub group
            response = self.app.post(
                base.url('delete_repo_group', group_name=sub_path),
                params={
                    '_session_csrf_secret_token': self.session_csrf_secret_token()
                },
            )
            sub = db.RepoGroup.guess_instance(sub_path)
            assert sub is None

        finally:
            if sub:
                RepoGroupModel().delete(sub)
            if parent:
                RepoGroupModel().delete(parent)
            meta.Session().commit()