mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-01-28 08:03:36 +00:00
Now it is possible to change default branch when editing a repository. Gitweb site shows default branch as a main branch and the 'git clone' command checks out to default branch. Added unit and functional tests. Splitted one large 'test_actions' into multiple tests. Tests performed: - All gitweb unit and functional tests pass. - Created a repository from a remote repository which has default branch other than master. Confirmed that the 'Edit repository' page shows correct branch and gitweb site shows this branch as a default branch Closes #1925 Signed-off-by: Veiko Aasa <veiko17@disroot.org> Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
152 lines
4.4 KiB
Python
152 lines
4.4 KiB
Python
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
"""
|
|
Test module for gitweb module operations.
|
|
"""
|
|
|
|
import imp
|
|
import json
|
|
import pathlib
|
|
from unittest.mock import patch
|
|
|
|
import pytest
|
|
from django.forms import ValidationError
|
|
|
|
REPO_NAME = 'Test-repo'
|
|
REPO_DATA = {
|
|
'name': REPO_NAME,
|
|
'description': '',
|
|
'owner': '',
|
|
'access': 'private',
|
|
'default_branch': 'master',
|
|
}
|
|
|
|
|
|
def _action_file():
|
|
"""Return the path to the 'gitweb' actions file."""
|
|
current_directory = pathlib.Path(__file__).parent
|
|
return str(current_directory / '..' / '..' / '..' / '..' / 'actions' /
|
|
'gitweb')
|
|
|
|
|
|
gitweb_actions = imp.load_source('gitweb', _action_file())
|
|
|
|
|
|
@pytest.fixture(name='call_action')
|
|
def fixture_call_action(tmpdir, capsys):
|
|
"""Run actions with custom repo root path."""
|
|
|
|
def _call_action(args, **kwargs):
|
|
gitweb_actions.GIT_REPO_PATH = str(tmpdir)
|
|
with patch('argparse._sys.argv', ['gitweb'] + args):
|
|
gitweb_actions.main()
|
|
captured = capsys.readouterr()
|
|
return captured.out
|
|
|
|
return _call_action
|
|
|
|
|
|
@pytest.fixture(name='existing_repo')
|
|
def fixture_existing_repo(call_action):
|
|
"""A fixture to create a repository."""
|
|
try:
|
|
call_action(['delete-repo', '--name', REPO_NAME])
|
|
except FileNotFoundError:
|
|
pass
|
|
|
|
call_action([
|
|
'create-repo', '--name', REPO_NAME, '--description', '', '--owner', '',
|
|
'--is-private', '--keep-ownership'
|
|
])
|
|
|
|
|
|
def test_create_repo(call_action):
|
|
"""Test creating a repository."""
|
|
call_action([
|
|
'create-repo', '--name', REPO_NAME, '--description', '', '--owner', '',
|
|
'--is-private', '--keep-ownership'
|
|
])
|
|
|
|
assert json.loads(call_action(['repo-info', '--name',
|
|
REPO_NAME])) == REPO_DATA
|
|
|
|
|
|
def test_change_repo_medatada(call_action, existing_repo):
|
|
"""Test change a metadata of the repository."""
|
|
new_data = {
|
|
'name': REPO_NAME,
|
|
'description': 'description2',
|
|
'owner': 'owner2',
|
|
'access': 'public',
|
|
'default_branch': 'master',
|
|
}
|
|
|
|
call_action([
|
|
'set-repo-description', '--name', REPO_NAME, '--description',
|
|
new_data['description']
|
|
])
|
|
call_action(
|
|
['set-repo-owner', '--name', REPO_NAME, '--owner', new_data['owner']])
|
|
call_action([
|
|
'set-repo-access', '--name', REPO_NAME, '--access', new_data['access']
|
|
])
|
|
|
|
assert json.loads(call_action(['repo-info', '--name',
|
|
REPO_NAME])) == new_data
|
|
|
|
|
|
def test_rename_repository(call_action, existing_repo):
|
|
"""Test renaming a repository."""
|
|
new_name = 'Test-repo_2'
|
|
|
|
call_action(['rename-repo', '--oldname', REPO_NAME, '--newname', new_name])
|
|
with pytest.raises(RuntimeError, match='Repository not found'):
|
|
call_action(['repo-info', '--name', REPO_NAME])
|
|
|
|
assert json.loads(call_action(['repo-info', '--name', new_name])) == {
|
|
**REPO_DATA,
|
|
**{
|
|
'name': new_name
|
|
}
|
|
}
|
|
|
|
|
|
def test_get_branches(call_action, existing_repo):
|
|
"""Test getting all the branches of the repository."""
|
|
assert json.loads(call_action(['get-branches', '--name', REPO_NAME])) == {
|
|
"default_branch": "master",
|
|
"branches": []
|
|
}
|
|
|
|
|
|
def test_delete_repository(call_action, existing_repo):
|
|
"""Test deleting a repository."""
|
|
call_action(['delete-repo', '--name', REPO_NAME])
|
|
|
|
with pytest.raises(RuntimeError, match='Repository not found'):
|
|
call_action(['repo-info', '--name', REPO_NAME])
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
'name',
|
|
['.Test-repo', 'Test-repo.git.git', '/root/Test-repo', 'Test-repö'])
|
|
def test_action_create_repo_with_invalid_names(call_action, name):
|
|
"""Test that creating repository with invalid names fails."""
|
|
with pytest.raises(ValidationError):
|
|
call_action([
|
|
'create-repo', '--name', name, '--description', '', '--owner', '',
|
|
'--keep-ownership'
|
|
])
|
|
|
|
|
|
@pytest.mark.parametrize('url', [
|
|
'Test-repo', 'file://root/Test-repo', 'localhost/Test-repo',
|
|
'ssh://localhost/Test-repo', 'https://localhost/.Test-repo'
|
|
])
|
|
def test_action_create_repo_with_invalid_urls(call_action, url):
|
|
"""Test that cloning repository with invalid URL fails."""
|
|
with pytest.raises(ValidationError):
|
|
call_action([
|
|
'create-repo', '--url', url, '--description', '', '--owner', '',
|
|
'--keep-ownership'
|
|
])
|