113 lines
4.2 KiB
Python
113 lines
4.2 KiB
Python
"""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
|