import json
|
|
import pathlib
|
|
import pytest
|
|
|
|
from transpose import Transpose, TransposeConfig, TransposeEntry
|
|
from transpose.exceptions import TransposeError
|
|
|
|
from .utils import (
|
|
ENTRY_NAME,
|
|
ENTRY_STORE_PATH,
|
|
STORE_PATH,
|
|
TARGET_PATH,
|
|
TRANSPOSE_CONFIG,
|
|
TRANSPOSE_CONFIG_PATH,
|
|
setup_restore,
|
|
setup_store,
|
|
setup_apply,
|
|
)
|
|
|
|
|
|
@setup_store()
|
|
def test_init():
|
|
t = Transpose(config_path=TRANSPOSE_CONFIG_PATH)
|
|
assert t.config.entries.get(ENTRY_NAME)
|
|
assert t.config_path == TRANSPOSE_CONFIG_PATH
|
|
assert t.store_path == TRANSPOSE_CONFIG_PATH.parent
|
|
|
|
|
|
@setup_apply()
|
|
def test_apply():
|
|
t = Transpose(config_path=TRANSPOSE_CONFIG_PATH)
|
|
|
|
# Success
|
|
t.apply(ENTRY_NAME)
|
|
assert TARGET_PATH.is_symlink()
|
|
assert ENTRY_STORE_PATH.is_dir()
|
|
|
|
with pytest.raises(TransposeError, match="Entry does not exist"):
|
|
t.apply("BadName")
|
|
|
|
# Target already exists, force not set
|
|
TARGET_PATH.unlink()
|
|
TARGET_PATH.mkdir()
|
|
with pytest.raises(TransposeError, match="Entry path already exists"):
|
|
t.apply(ENTRY_NAME)
|
|
|
|
# Target already exists, force set (Create backup of original path)
|
|
t.apply(ENTRY_NAME, force=True)
|
|
backup_path = TARGET_PATH.with_suffix(".backup")
|
|
|
|
assert backup_path.is_dir()
|
|
assert TARGET_PATH.is_symlink()
|
|
assert ENTRY_STORE_PATH.is_dir()
|
|
|
|
# Target is disabled in the config
|
|
t.config.entries[ENTRY_NAME].enabled = False
|
|
with pytest.raises(
|
|
TransposeError, match=f"Entry '{ENTRY_NAME}' is not enabled in the config"
|
|
):
|
|
t.apply(ENTRY_NAME)
|
|
|
|
|
|
@setup_restore()
|
|
def test_restore():
|
|
t = Transpose(config_path=TRANSPOSE_CONFIG_PATH)
|
|
|
|
# Target is disabled in the config
|
|
t.config.entries[ENTRY_NAME].enabled = False
|
|
with pytest.raises(
|
|
TransposeError, match=f"Entry '{ENTRY_NAME}' is not enabled in the config"
|
|
):
|
|
t.restore(ENTRY_NAME)
|
|
t.config.entries[ENTRY_NAME].enabled = True
|
|
|
|
# Success
|
|
t.restore(ENTRY_NAME)
|
|
assert TARGET_PATH.is_dir()
|
|
assert not TARGET_PATH.is_symlink()
|
|
assert not ENTRY_STORE_PATH.exists()
|
|
|
|
with pytest.raises(TransposeError, match="Could not locate entry by name"):
|
|
t.restore("BadName")
|
|
|
|
|
|
@setup_restore()
|
|
def test_restore_path_conflicts():
|
|
t = Transpose(config_path=TRANSPOSE_CONFIG_PATH)
|
|
|
|
# Target already exists, force not set
|
|
TARGET_PATH.mkdir()
|
|
with pytest.raises(TransposeError, match="Entry path already exists"):
|
|
t.restore(ENTRY_NAME)
|
|
|
|
t.restore(ENTRY_NAME, force=True)
|
|
backup_path = TARGET_PATH.with_suffix(".backup")
|
|
|
|
assert backup_path.is_dir()
|
|
assert TARGET_PATH.is_dir()
|
|
assert not TARGET_PATH.is_symlink()
|
|
assert not ENTRY_STORE_PATH.exists()
|
|
assert not t.config.entries.get(ENTRY_NAME)
|
|
|
|
|
|
@setup_store()
|
|
def test_store():
|
|
t = Transpose(config_path=TRANSPOSE_CONFIG_PATH)
|
|
|
|
# Success
|
|
t.store("TestEntry", TARGET_PATH)
|
|
assert TARGET_PATH.is_symlink()
|
|
assert STORE_PATH.joinpath("TestEntry").is_dir()
|
|
assert t.config.entries["TestEntry"].path == str(TARGET_PATH)
|
|
|
|
|
|
@setup_store()
|
|
def test_store_conflicts():
|
|
t = Transpose(config_path=TRANSPOSE_CONFIG_PATH)
|
|
|
|
with pytest.raises(TransposeError, match="Entry already exists"):
|
|
t.store(ENTRY_NAME, TARGET_PATH)
|
|
|
|
with pytest.raises(TransposeError, match="Source path does not exist"):
|
|
t.store("TestEntry", "UnknownPath/")
|
|
|
|
STORE_PATH.joinpath("TestEntry").mkdir()
|
|
with pytest.raises(TransposeError, match="Store path already exists"):
|
|
t.store("TestEntry", TARGET_PATH)
|
|
STORE_PATH.joinpath("TestEntry").rmdir()
|
|
|
|
|
|
@setup_store()
|
|
def test_config_add():
|
|
config = TransposeConfig.load(TRANSPOSE_CONFIG_PATH)
|
|
|
|
with pytest.raises(TransposeError, match=f"'{ENTRY_NAME}' already exists"):
|
|
config.add(ENTRY_NAME, TARGET_PATH)
|
|
|
|
config.add("NewEntry", TARGET_PATH)
|
|
assert config.entries.get("NewEntry")
|
|
assert config.entries["NewEntry"].path == str(TARGET_PATH)
|
|
|
|
|
|
@setup_store()
|
|
def test_config_disable():
|
|
config = TransposeConfig.load(TRANSPOSE_CONFIG_PATH)
|
|
|
|
with pytest.raises(TransposeError, match="'UnknownEntry' does not exist"):
|
|
config.disable("UnknownEntry")
|
|
|
|
config.disable(ENTRY_NAME)
|
|
assert config.entries[ENTRY_NAME].enabled is False
|
|
|
|
|
|
@setup_store()
|
|
def test_config_enable():
|
|
config = TransposeConfig.load(TRANSPOSE_CONFIG_PATH)
|
|
|
|
with pytest.raises(TransposeError, match="'UnknownEntry' does not exist"):
|
|
config.enable("UnknownEntry")
|
|
|
|
config.enable(ENTRY_NAME)
|
|
assert config.entries[ENTRY_NAME].enabled is True
|
|
|
|
|
|
@setup_store()
|
|
def test_config_get():
|
|
config = TransposeConfig.load(TRANSPOSE_CONFIG_PATH)
|
|
|
|
with pytest.raises(
|
|
TransposeError, match="does not exist in Transpose config entries"
|
|
):
|
|
config.get("UnknownEntry")
|
|
|
|
assert config.get(ENTRY_NAME).path == str(TARGET_PATH)
|
|
|
|
|
|
@setup_store()
|
|
def test_config_remove():
|
|
config = TransposeConfig.load(TRANSPOSE_CONFIG_PATH)
|
|
|
|
with pytest.raises(
|
|
TransposeError, match="does not exist in Transpose config entries"
|
|
):
|
|
config.remove("UnknownEntry")
|
|
|
|
config.remove(ENTRY_NAME)
|
|
assert not config.entries.get(ENTRY_NAME)
|
|
|
|
|
|
@setup_store()
|
|
def test_config_update():
|
|
config = TransposeConfig.load(TRANSPOSE_CONFIG_PATH)
|
|
|
|
with pytest.raises(
|
|
TransposeError, match="does not exist in Transpose config entries"
|
|
):
|
|
config.update("UnknownEntry", "path", "/some/new/path")
|
|
|
|
config.update(ENTRY_NAME, "path", "/some/new/path")
|
|
assert config.entries[ENTRY_NAME].path == "/some/new/path"
|
|
|
|
|
|
@setup_store()
|
|
def test_config_save():
|
|
config = TransposeConfig.load(TRANSPOSE_CONFIG_PATH)
|
|
config.save(STORE_PATH.joinpath("test.json"))
|
|
|
|
with open(STORE_PATH.joinpath("test.json"), "r") as f:
|
|
saved_config = json.load(f)
|
|
|
|
assert (
|
|
config.entries[ENTRY_NAME].path == saved_config["entries"][ENTRY_NAME]["path"]
|
|
)
|
|
|
|
|
|
@setup_store()
|
|
def test_config_load():
|
|
config = TransposeConfig.load(TRANSPOSE_CONFIG_PATH)
|
|
|
|
assert config.entries.get(ENTRY_NAME)
|
|
assert (
|
|
config.entries[ENTRY_NAME].path
|
|
== TRANSPOSE_CONFIG["entries"][ENTRY_NAME]["path"]
|
|
)
|
|
|
|
with pytest.raises(
|
|
TransposeError, match="Unrecognized Transpose config file format"
|
|
):
|
|
config = TransposeConfig.load(STORE_PATH.joinpath("transpose-bad.json"))
|
|
|
|
with pytest.raises(TransposeError, match="Invalid JSON format"):
|
|
config = TransposeConfig.load(STORE_PATH.joinpath("transpose-invalid.json"))
|