130 lines
4.1 KiB
Python
130 lines
4.1 KiB
Python
# tests/test_install_repos.py
|
|
import os
|
|
import unittest
|
|
from unittest.mock import patch, MagicMock, mock_open
|
|
|
|
from pkgmgr.install_repos import install_repos
|
|
|
|
|
|
class TestInstallRepos(unittest.TestCase):
|
|
def setUp(self):
|
|
self.repo = {
|
|
"provider": "github.com",
|
|
"account": "user",
|
|
"repository": "repo",
|
|
}
|
|
self.selected = [self.repo]
|
|
self.base_dir = "/tmp/repos"
|
|
self.bin_dir = "/tmp/bin"
|
|
self.all_repos = self.selected
|
|
|
|
@patch("pkgmgr.install_repos.clone_repos")
|
|
@patch("pkgmgr.install_repos.os.path.exists")
|
|
@patch("pkgmgr.install_repos.get_repo_dir")
|
|
@patch("pkgmgr.install_repos.get_repo_identifier")
|
|
def test_calls_clone_repos_with_clone_mode(
|
|
self,
|
|
mock_get_repo_identifier,
|
|
mock_get_repo_dir,
|
|
mock_exists,
|
|
mock_clone_repos,
|
|
):
|
|
mock_get_repo_identifier.return_value = "github.com/user/repo"
|
|
mock_get_repo_dir.return_value = "/tmp/repos/user/repo"
|
|
# Repo-Verzeichnis existiert nicht -> soll geklont werden
|
|
mock_exists.return_value = False
|
|
|
|
install_repos(
|
|
self.selected,
|
|
self.base_dir,
|
|
self.bin_dir,
|
|
self.all_repos,
|
|
no_verification=True,
|
|
preview=False,
|
|
quiet=True,
|
|
clone_mode="shallow",
|
|
update_dependencies=False,
|
|
)
|
|
|
|
mock_clone_repos.assert_called_once()
|
|
args, kwargs = mock_clone_repos.call_args
|
|
# clone_mode ist letztes Argument
|
|
self.assertEqual(args[-1], "shallow")
|
|
|
|
@patch("pkgmgr.install_repos.run_command")
|
|
@patch("pkgmgr.install_repos.open", new_callable=mock_open, create=True)
|
|
@patch("pkgmgr.install_repos.yaml.safe_load")
|
|
@patch("pkgmgr.install_repos.os.path.exists")
|
|
@patch("pkgmgr.install_repos.create_ink")
|
|
@patch("pkgmgr.install_repos.verify_repository")
|
|
@patch("pkgmgr.install_repos.get_repo_dir")
|
|
@patch("pkgmgr.install_repos.get_repo_identifier")
|
|
def test_pkgmgr_requirements_propagate_clone_mode(
|
|
self,
|
|
mock_get_repo_identifier,
|
|
mock_get_repo_dir,
|
|
mock_verify,
|
|
mock_create_ink,
|
|
mock_exists,
|
|
mock_safe_load,
|
|
mock_open_file,
|
|
mock_run_command,
|
|
):
|
|
mock_get_repo_identifier.return_value = "github.com/user/repo"
|
|
repo_dir = "/tmp/repos/user/repo"
|
|
mock_get_repo_dir.return_value = repo_dir
|
|
|
|
# exists() muss True für repo_dir & requirements.yml liefern,
|
|
# sonst werden die Anforderungen nie verarbeitet.
|
|
def exists_side_effect(path):
|
|
if path == repo_dir:
|
|
return True
|
|
if path == os.path.join(repo_dir, "requirements.yml"):
|
|
return True
|
|
# requirements.txt und Makefile sollen "nicht existieren"
|
|
return False
|
|
|
|
mock_exists.side_effect = exists_side_effect
|
|
|
|
mock_verify.return_value = (True, [], "hash", "key")
|
|
|
|
# requirements.yml enthält pkgmgr-Dependencies
|
|
mock_safe_load.return_value = {
|
|
"pkgmgr": ["github.com/other/account/dep"],
|
|
}
|
|
|
|
commands = []
|
|
|
|
def run_command_side_effect(cmd, cwd=None, preview=False):
|
|
commands.append((cmd, cwd, preview))
|
|
|
|
mock_run_command.side_effect = run_command_side_effect
|
|
|
|
install_repos(
|
|
self.selected,
|
|
self.base_dir,
|
|
self.bin_dir,
|
|
self.all_repos,
|
|
no_verification=False,
|
|
preview=False,
|
|
quiet=True,
|
|
clone_mode="shallow",
|
|
update_dependencies=False,
|
|
)
|
|
|
|
# Prüfen, dass ein pkgmgr install Befehl mit --clone-mode shallow gebaut wurde
|
|
pkgmgr_install_cmds = [
|
|
c for (c, cwd, preview) in commands if "pkgmgr install" in c
|
|
]
|
|
self.assertTrue(
|
|
pkgmgr_install_cmds,
|
|
f"No pkgmgr install command was executed. Commands seen: {commands}",
|
|
)
|
|
|
|
cmd = pkgmgr_install_cmds[0]
|
|
self.assertIn("--clone-mode shallow", cmd)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|