view kallithea/tests/functional/test_admin_repo_groups.py @ 8947:abc29122c7f2 stable

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.
author Mads Kiilerich <mads@kiilerich.com>
date Sat, 10 Dec 2022 18:18:05 +0100
parents ee1da602b590
children
line wrap: on
line source

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()