"""Unit tests: upgrade""" import pytest @pytest.mark.parametrize("condition", ["override", "equal", "existing_repo"]) def test_upgrade_errors(tmpdir, runner, yadm, condition): """Test upgrade() error conditions""" home = tmpdir.mkdir("home") yadm_dir = home.join(".config/yadm") yadm_data = home.join(".local/share/yadm") override = "" if condition == "override": override = "override" if condition == "equal": yadm_data = yadm_dir if condition == "existing_repo": yadm_dir.ensure_dir("repo.git") yadm_data.ensure_dir("repo.git") script = f""" YADM_TEST=1 source {yadm} YADM_DIR="{yadm_dir}" YADM_DATA="{yadm_data}" YADM_REPO="{yadm_data}/repo.git" YADM_LEGACY_ARCHIVE="files.gpg" YADM_OVERRIDE_REPO="{override}" upgrade """ run = runner(command=["bash"], inp=script) assert run.failure assert "Unable to upgrade" in run.err if condition in ["override", "equal"]: assert "Paths have been overridden" in run.err elif condition == "existing_repo": assert "already exists" in run.err @pytest.mark.parametrize("condition", ["no-paths", "untracked", "tracked", "submodules"]) def test_upgrade(tmpdir, runner, yadm, condition): """Test upgrade() When testing the condition of git-tracked data, "echo" will be used as a mock for git. echo will return true, simulating a positive result from "git ls-files". Also echo will report the parameters for "git mv". """ legacy_paths = ("config", "encrypt", "bootstrap", "hooks/pre_cmd") home = tmpdir.mkdir("home") yadm_dir = home.join(".config/yadm") yadm_data = home.join(".local/share/yadm") yadm_legacy = home.join(".yadm") if condition != "no-paths": yadm_dir.join("repo.git/config").write("test-repo", ensure=True) yadm_dir.join("files.gpg").write("files.gpg", ensure=True) for path in legacy_paths: yadm_legacy.join(path).write(path, ensure=True) mock_git = "" if condition != "no-paths": mock_git = f""" function git() {{ echo "$@" if [[ "$*" = *"submodule status" ]]; then { 'echo " 1234567 mymodule (1.0)"' if condition == 'submodules' else ':' } fi if [[ "$*" = *ls-files* ]]; then return { 1 if condition == 'untracked' else 0 } fi return 0 }} """ script = f""" YADM_TEST=1 source {yadm} YADM_LEGACY_DIR="{yadm_legacy}" YADM_DIR="{yadm_dir}" YADM_DATA="{yadm_data}" YADM_REPO="{yadm_data}/repo.git" YADM_ARCHIVE="{yadm_data}/archive" GIT_PROGRAM="git" {mock_git} function cd {{ echo "$@";}} upgrade """ run = runner(command=["bash"], inp=script) assert run.success assert run.err == "" if condition == "no-paths": assert "Upgrade is not necessary" in run.out else: for lpath, npath in [("repo.git", "repo.git"), ("files.gpg", "archive")]: expected = f"Moving {yadm_dir.join(lpath)} " f"to {yadm_data.join(npath)}" assert expected in run.out for path in legacy_paths: expected = f"Moving {yadm_legacy.join(path)} " f"to {yadm_dir.join(path)}" assert expected in run.out if condition == "untracked": assert "test-repo" in yadm_data.join("repo.git/config").read() assert "files.gpg" in yadm_data.join("archive").read() for path in legacy_paths: assert path in yadm_dir.join(path).read() elif condition in ["tracked", "submodules"]: expected = f'mv {yadm_dir.join("files.gpg")} ' f'{yadm_data.join("archive")}' assert expected in run.out assert "files tracked by yadm have been renamed" in run.out if condition == "submodules": assert "submodule deinit -- mymodule" in run.out assert "submodule update --init --recursive -- mymodule" in run.out else: assert "submodule deinit" not in run.out assert "submodule update --init --recursive" not in run.out