| @ -1,179 +0,0 @@ | |||
| import json | |||
| import os | |||
| import pytest | |||
| from pathlib import Path | |||
| from contextlib import contextmanager | |||
| from tempfile import TemporaryDirectory | |||
| from transpose import Transpose, version, DEFAULT_CACHE_FILENAME | |||
| from transpose.exceptions import TransposeError | |||
| from transpose.utils import check_path, create_cache, get_cache, move, remove, symlink | |||
| TARGET_DIR = "source" | |||
| STORE_DIR = "store" | |||
| SYMLINK_DIR = "symlink_test" | |||
| CACHE_FILE_CONTENTS = {"version": version, "original_path": TARGET_DIR} | |||
| @contextmanager | |||
| def setup(): | |||
| old_dir = os.getcwd() | |||
| with TemporaryDirectory("tests-temp") as td: | |||
| try: | |||
| os.chdir(td) | |||
| os.mkdir(TARGET_DIR) | |||
| os.mkdir(STORE_DIR) | |||
| os.symlink(TARGET_DIR, SYMLINK_DIR) | |||
| cache_path = Path(TARGET_DIR).joinpath(DEFAULT_CACHE_FILENAME) | |||
| with open(str(cache_path), "w") as f: | |||
| json.dump(CACHE_FILE_CONTENTS, f) | |||
| yield | |||
| finally: | |||
| os.chdir(old_dir) | |||
| @setup() | |||
| def test_check_path(): | |||
| existing_dir = Path(TARGET_DIR) | |||
| nonexisting_dir = Path("nonexistent") | |||
| symlink_dir = Path(SYMLINK_DIR) | |||
| cache_path = Path(TARGET_DIR).joinpath(DEFAULT_CACHE_FILENAME) | |||
| assert check_path(existing_dir) is True | |||
| assert check_path(nonexisting_dir) is False | |||
| assert check_path(symlink_dir, is_symlink=True) is True | |||
| assert check_path(cache_path) is False | |||
| @setup() | |||
| def test_cache_create(): | |||
| cache_file = "test_cache_file.json" | |||
| cache_path = Path(TARGET_DIR).joinpath(cache_file) | |||
| original_path = Path("/tmp/some/random/path") | |||
| create_cache(cache_path=cache_path, original_path=original_path) | |||
| cache = json.load(open(cache_path, "r")) | |||
| assert cache_path.exists() | |||
| assert cache["original_path"] == str(original_path) | |||
| assert cache["version"] == version | |||
| @setup() | |||
| def test_cache_get(): | |||
| cache_path = Path(TARGET_DIR).joinpath(DEFAULT_CACHE_FILENAME) | |||
| cache = get_cache(cache_path) | |||
| assert cache["version"] == CACHE_FILE_CONTENTS["version"] | |||
| assert cache["original_path"] == CACHE_FILE_CONTENTS["original_path"] | |||
| @setup() | |||
| def test_file_move(): | |||
| source_path = Path(TARGET_DIR) | |||
| destination_path = Path(STORE_DIR) | |||
| move(source=source_path.absolute(), destination=destination_path.absolute()) | |||
| assert not source_path.exists() | |||
| assert destination_path.exists() | |||
| @setup() | |||
| def test_file_remove(): | |||
| cache_path = Path(TARGET_DIR).joinpath(DEFAULT_CACHE_FILENAME) | |||
| symlink_filepath = Path(TARGET_DIR).joinpath(SYMLINK_DIR) | |||
| target_filepath = Path(TARGET_DIR) | |||
| remove(path=cache_path) | |||
| remove(path=symlink_filepath) | |||
| remove(path=target_filepath) | |||
| assert not cache_path.exists() # Should be able to remove files | |||
| assert not symlink_filepath.exists() # Should be able to remove symlinks | |||
| assert target_filepath.exists() # Should not be able to remove directories | |||
| @setup() | |||
| def test_file_symlink(): | |||
| symlink_name = "test_link" | |||
| symlink_filepath = Path(symlink_name) | |||
| target_filepath = Path(TARGET_DIR) | |||
| symlink(target_path=target_filepath, symlink_path=symlink_filepath) | |||
| assert target_filepath.exists() | |||
| assert symlink_filepath.is_symlink() | |||
| assert symlink_filepath.readlink() == target_filepath | |||
| @setup() | |||
| def test_transpose_init(): | |||
| t = Transpose( | |||
| target_path=TARGET_DIR, | |||
| store_path=STORE_DIR, | |||
| ) | |||
| assert t.cache_filename == ".transpose.json" | |||
| assert t.cache_path == Path(TARGET_DIR).joinpath(".transpose.json") | |||
| t = Transpose( | |||
| target_path=TARGET_DIR, store_path=STORE_DIR, cache_filename=".transpose.txt" | |||
| ) | |||
| assert t.cache_filename == ".transpose.txt" | |||
| assert t.cache_path == Path(TARGET_DIR).joinpath(".transpose.txt") | |||
| @setup() | |||
| def test_transpose_store_restore(): | |||
| t = Transpose( | |||
| target_path=TARGET_DIR, | |||
| store_path=STORE_DIR, | |||
| ) | |||
| t.store("TestStore") | |||
| target_path = Path(TARGET_DIR) | |||
| store_path = Path(STORE_DIR).joinpath("TestStore") | |||
| assert store_path.is_dir() and not store_path.is_symlink() | |||
| assert target_path.is_dir() and target_path.is_symlink() | |||
| assert t.cache_path.is_file() | |||
| t = Transpose( | |||
| target_path=str(store_path), | |||
| store_path=STORE_DIR, | |||
| ) | |||
| t.restore() | |||
| assert not store_path.exists() | |||
| assert target_path.is_dir() and not target_path.is_symlink() | |||
| assert not t.cache_path.exists() | |||
| @setup() | |||
| def test_transpose_restore_force(): | |||
| nonexistent_path = Path(STORE_DIR).joinpath("long/path") | |||
| # Overwrite cache file with nonexistent directory | |||
| cache_path = Path(TARGET_DIR).joinpath(DEFAULT_CACHE_FILENAME) | |||
| cache = {"version": version, "original_path": str(nonexistent_path)} | |||
| with open(str(cache_path), "w") as f: | |||
| json.dump(cache, f) | |||
| # Force not enabled, should raise exception | |||
| t = Transpose(target_path=TARGET_DIR, store_path=STORE_DIR) | |||
| with pytest.raises(TransposeError): | |||
| t.restore() | |||
| assert not nonexistent_path.exists() | |||
| # Force enabled, should create directory tree | |||
| t = Transpose(target_path=TARGET_DIR, store_path=STORE_DIR, force=True) | |||
| t.restore() | |||
| assert nonexistent_path.exists() | |||
| @ -0,0 +1,73 @@ | |||
| import json | |||
| import pytest | |||
| from pathlib import Path | |||
| from transpose import Transpose, version, DEFAULT_CACHE_FILENAME | |||
| from transpose.exceptions import TransposeError | |||
| from .utils import STORE_DIR, TARGET_DIR, setup_env | |||
| @setup_env() | |||
| def test_transpose_init(): | |||
| t = Transpose( | |||
| target_path=TARGET_DIR, | |||
| store_path=STORE_DIR, | |||
| ) | |||
| assert t.cache_filename == ".transpose.json" | |||
| assert t.cache_path == Path(TARGET_DIR).joinpath(".transpose.json") | |||
| t = Transpose( | |||
| target_path=TARGET_DIR, store_path=STORE_DIR, cache_filename=".transpose.txt" | |||
| ) | |||
| assert t.cache_filename == ".transpose.txt" | |||
| assert t.cache_path == Path(TARGET_DIR).joinpath(".transpose.txt") | |||
| @setup_env() | |||
| def test_transpose_store_restore(): | |||
| t = Transpose( | |||
| target_path=TARGET_DIR, | |||
| store_path=STORE_DIR, | |||
| ) | |||
| t.store("TestStore") | |||
| target_path = Path(TARGET_DIR) | |||
| store_path = Path(STORE_DIR).joinpath("TestStore") | |||
| assert store_path.is_dir() and not store_path.is_symlink() | |||
| assert target_path.is_dir() and target_path.is_symlink() | |||
| assert t.cache_path.is_file() | |||
| t = Transpose( | |||
| target_path=str(store_path), | |||
| store_path=STORE_DIR, | |||
| ) | |||
| t.restore() | |||
| assert not store_path.exists() | |||
| assert target_path.is_dir() and not target_path.is_symlink() | |||
| assert not t.cache_path.exists() | |||
| @setup_env() | |||
| def test_transpose_restore_force(): | |||
| nonexistent_path = Path(STORE_DIR).joinpath("long/path") | |||
| # Overwrite cache file with nonexistent directory | |||
| cache_path = Path(TARGET_DIR).joinpath(DEFAULT_CACHE_FILENAME) | |||
| cache = {"version": version, "original_path": str(nonexistent_path)} | |||
| with open(str(cache_path), "w") as f: | |||
| json.dump(cache, f) | |||
| # Force not enabled, should raise exception | |||
| t = Transpose(target_path=TARGET_DIR, store_path=STORE_DIR) | |||
| with pytest.raises(TransposeError): | |||
| t.restore() | |||
| assert not nonexistent_path.exists() | |||
| # Force enabled, should create directory tree | |||
| t = Transpose(target_path=TARGET_DIR, store_path=STORE_DIR, force=True) | |||
| t.restore() | |||
| assert nonexistent_path.exists() | |||
| @ -0,0 +1,86 @@ | |||
| import json | |||
| from pathlib import Path | |||
| from transpose import version, DEFAULT_CACHE_FILENAME | |||
| from transpose.utils import check_path, create_cache, get_cache, move, remove, symlink | |||
| from .utils import CACHE_FILE_CONTENTS, STORE_DIR, SYMLINK_DIR, TARGET_DIR, setup_env | |||
| @setup_env() | |||
| def test_check_path(): | |||
| existing_dir = Path(TARGET_DIR) | |||
| nonexisting_dir = Path("nonexistent") | |||
| symlink_dir = Path(SYMLINK_DIR) | |||
| cache_path = Path(TARGET_DIR).joinpath(DEFAULT_CACHE_FILENAME) | |||
| assert check_path(existing_dir) is True | |||
| assert check_path(nonexisting_dir) is False | |||
| assert check_path(symlink_dir, is_symlink=True) is True | |||
| assert check_path(cache_path) is False | |||
| @setup_env() | |||
| def test_cache_create(): | |||
| cache_file = "test_cache_file.json" | |||
| cache_path = Path(TARGET_DIR).joinpath(cache_file) | |||
| original_path = Path("/tmp/some/random/path") | |||
| create_cache(cache_path=cache_path, original_path=original_path) | |||
| cache = json.load(open(cache_path, "r")) | |||
| assert cache_path.exists() | |||
| assert cache["original_path"] == str(original_path) | |||
| assert cache["version"] == version | |||
| @setup_env() | |||
| def test_cache_get(): | |||
| cache_path = Path(TARGET_DIR).joinpath(DEFAULT_CACHE_FILENAME) | |||
| cache = get_cache(cache_path) | |||
| assert cache["version"] == CACHE_FILE_CONTENTS["version"] | |||
| assert cache["original_path"] == CACHE_FILE_CONTENTS["original_path"] | |||
| @setup_env() | |||
| def test_file_move(): | |||
| source_path = Path(TARGET_DIR) | |||
| destination_path = Path(STORE_DIR) | |||
| move(source=source_path.absolute(), destination=destination_path.absolute()) | |||
| assert not source_path.exists() | |||
| assert destination_path.exists() | |||
| @setup_env() | |||
| def test_file_remove(): | |||
| cache_path = Path(TARGET_DIR).joinpath(DEFAULT_CACHE_FILENAME) | |||
| symlink_filepath = Path(TARGET_DIR).joinpath(SYMLINK_DIR) | |||
| target_filepath = Path(TARGET_DIR) | |||
| remove(path=cache_path) | |||
| remove(path=symlink_filepath) | |||
| remove(path=target_filepath) | |||
| assert not cache_path.exists() # Should be able to remove files | |||
| assert not symlink_filepath.exists() # Should be able to remove symlinks | |||
| assert target_filepath.exists() # Should not be able to remove directories | |||
| @setup_env() | |||
| def test_file_symlink(): | |||
| symlink_name = "test_link" | |||
| symlink_filepath = Path(symlink_name) | |||
| target_filepath = Path(TARGET_DIR) | |||
| symlink(target_path=target_filepath, symlink_path=symlink_filepath) | |||
| assert target_filepath.exists() | |||
| assert symlink_filepath.is_symlink() | |||
| assert symlink_filepath.readlink() == target_filepath | |||
| @ -0,0 +1,35 @@ | |||
| import os | |||
| import json | |||
| from contextlib import contextmanager | |||
| from pathlib import Path | |||
| from tempfile import TemporaryDirectory | |||
| from transpose import DEFAULT_CACHE_FILENAME, version | |||
| from transpose.exceptions import TransposeError | |||
| TARGET_DIR = "source" | |||
| STORE_DIR = "store" | |||
| SYMLINK_DIR = "symlink_test" | |||
| CACHE_FILE_CONTENTS = {"version": version, "original_path": TARGET_DIR} | |||
| @contextmanager | |||
| def setup_env(): | |||
| old_dir = os.getcwd() | |||
| with TemporaryDirectory("tests-temp") as td: | |||
| try: | |||
| os.chdir(td) | |||
| os.mkdir(TARGET_DIR) | |||
| os.mkdir(STORE_DIR) | |||
| os.symlink(TARGET_DIR, SYMLINK_DIR) | |||
| cache_path = Path(TARGET_DIR).joinpath(DEFAULT_CACHE_FILENAME) | |||
| with open(str(cache_path), "w") as f: | |||
| json.dump(CACHE_FILE_CONTENTS, f) | |||
| yield | |||
| finally: | |||
| os.chdir(old_dir) | |||