dopt-basics/tests/test_paths.py

208 lines
5.6 KiB
Python

from pathlib import Path
import pytest
from dopt_basics import paths
FILE_SEARCH = "test.txt"
@pytest.fixture(scope="module")
def base_folder(tmp_path_factory) -> Path:
folder_structure = "path/to/base/folder/"
pth = tmp_path_factory.mktemp("search")
pth = pth / folder_structure
pth.mkdir(parents=True, exist_ok=True)
return pth
@pytest.fixture(scope="module")
def target_file_pth(base_folder) -> Path:
# place in folder 'path' of TMP path
target_folder = base_folder.parents[2]
target_file = target_folder / FILE_SEARCH
with open(target_file, "w") as file:
file.write("TEST")
return target_file
@pytest.mark.parametrize(
"delete_existing",
[True, False],
)
def test_create_folder(tmp_path, delete_existing):
target_dir = tmp_path / "test"
assert not target_dir.exists()
paths.create_folder(target_dir, delete_existing=delete_existing)
assert target_dir.exists()
assert target_dir.is_dir()
paths.create_folder(target_dir, delete_existing=delete_existing)
assert target_dir.exists()
assert target_dir.is_dir()
def test_prepare_save_path_SuccessWithCreate(tmp_path):
base_folder = tmp_path
dirs = ("target", "dir")
filename = None
suffix = None
target_pth = tmp_path / "/".join(dirs)
res_pth = paths.prepare_save_path(base_folder, dirs, filename, suffix, create_folder=True)
assert res_pth.exists()
assert res_pth == target_pth
def test_prepare_save_path_SuccessWithCreateTimestamp(tmp_path):
base_folder = tmp_path
dirs = ("target", "dir")
filename = "test"
suffix = ".pkl"
res_pth = paths.prepare_save_path(
base_folder, dirs, filename, suffix, create_folder=True, include_timestamp=True
)
assert res_pth.parent.exists()
def test_prepare_save_path_SuccessWithoutCreate(tmp_path):
base_folder = tmp_path
dirs = ("target", "dir")
filename = None
suffix = None
target_pth = tmp_path / "/".join(dirs)
res_pth = paths.prepare_save_path(
base_folder, dirs, filename, suffix, create_folder=False
)
assert not res_pth.exists()
assert res_pth == target_pth
def test_prepare_save_path_FailNoTargets(tmp_path):
base_folder = tmp_path
dirs = None
filename = None
suffix = None
with pytest.raises(ValueError):
_ = paths.prepare_save_path(
base_folder,
dirs,
filename,
suffix,
create_folder=False,
)
def test_prepare_save_path_FailNoFilenameSuffix(tmp_path):
base_folder = tmp_path
dirs = None
filename = None
suffix = "pkl"
with pytest.raises(ValueError):
_ = paths.prepare_save_path(
base_folder,
dirs,
filename,
suffix,
create_folder=False,
)
filename = "test"
suffix = None
with pytest.raises(ValueError):
_ = paths.prepare_save_path(
base_folder,
dirs,
filename,
suffix,
create_folder=False,
)
def test_prepare_save_path_FailTimestampWithoutFilename(tmp_path):
base_folder = tmp_path
dirs = ["test"]
filename = None
suffix = None
with pytest.raises(ValueError):
_ = paths.prepare_save_path(
base_folder,
dirs,
filename,
suffix,
create_folder=False,
include_timestamp=True,
)
def test_prepare_save_path_FailBadSuffix(tmp_path):
base_folder = tmp_path
dirs = None
filename = "test"
suffix = "."
with pytest.raises(ValueError):
_ = paths.prepare_save_path(
base_folder,
dirs,
filename,
suffix,
create_folder=False,
include_timestamp=False,
)
def test_prepare_save_path_SuccessSuffixAddDot(tmp_path):
base_folder = tmp_path
dirs = None
filename = "test"
suffix = "pkl"
target_path = tmp_path / f"{filename}.{suffix}"
ret_path = paths.prepare_save_path(
base_folder,
dirs,
filename,
suffix,
create_folder=False,
include_timestamp=False,
)
assert ret_path == target_path
def test_search_cwd(monkeypatch, base_folder, target_file_pth):
monkeypatch.setattr(Path, "cwd", lambda: base_folder)
assert Path.cwd() == base_folder
ret = paths.search_cwd(FILE_SEARCH)
assert ret is None
target_folder = target_file_pth.parent
monkeypatch.setattr(Path, "cwd", lambda: target_folder)
assert Path.cwd() == target_folder
ret = paths.search_cwd(FILE_SEARCH)
assert ret is not None
assert ret == target_file_pth
@pytest.mark.parametrize("stop_folder_name", ["to", "base", None])
def test_search_file_iterative(base_folder, target_file_pth, stop_folder_name):
# target in parent of 'to': 'path'
ret = paths.search_file_iterative(base_folder, FILE_SEARCH, stop_folder_name)
if stop_folder_name == "to" or stop_folder_name is None:
assert ret is not None
assert ret.name == FILE_SEARCH
assert ret == target_file_pth
elif stop_folder_name == "base":
assert ret is None
def test_search_folder_path(base_folder):
stop_folder = "123" # should not exist
found = paths.search_folder_path(base_folder, stop_folder_name=stop_folder)
assert found is None
stop_folder = "to"
found = paths.search_folder_path(base_folder, stop_folder_name=stop_folder)
assert found is not None
assert found.name == "path"
stop_folder = None
found = paths.search_folder_path(base_folder, stop_folder_name=stop_folder)
assert found is None