68 lines
2.0 KiB
Python
68 lines
2.0 KiB
Python
from __future__ import annotations
|
|
|
|
import stat
|
|
from pathlib import Path
|
|
|
|
from chguard.scan import scan_tree
|
|
|
|
|
|
def entries_by_path(root: Path, excludes: tuple[str, ...] = ()):
|
|
return {entry.path: entry for entry in scan_tree(root, excludes=excludes)}
|
|
|
|
|
|
def test_scan_tree_records_root_dirs_files_and_symlinks(
|
|
tmp_path: Path,
|
|
) -> None:
|
|
root = tmp_path / "root"
|
|
root.mkdir()
|
|
data_dir = root / "data"
|
|
data_dir.mkdir()
|
|
file_path = data_dir / "config.txt"
|
|
file_path.write_text("config", encoding="utf-8")
|
|
file_path.chmod(0o640)
|
|
(root / "config-link").symlink_to(file_path)
|
|
|
|
entries = entries_by_path(root)
|
|
|
|
assert entries[""].type == "dir"
|
|
assert entries["data"].type == "dir"
|
|
assert entries["data/config.txt"].type == "file"
|
|
assert entries["data/config.txt"].mode == 0o640
|
|
assert entries["config-link"].type == "symlink"
|
|
assert entries["config-link"].mode == stat.S_IMODE(
|
|
(root / "config-link").lstat().st_mode
|
|
)
|
|
|
|
|
|
def test_scan_tree_excludes_path_prefixes(tmp_path: Path) -> None:
|
|
root = tmp_path / "root"
|
|
root.mkdir()
|
|
(root / "keep").mkdir()
|
|
(root / "keep" / "file.txt").write_text("keep", encoding="utf-8")
|
|
(root / "cache").mkdir()
|
|
(root / "cache" / "file.txt").write_text("cache", encoding="utf-8")
|
|
(root / "var").mkdir()
|
|
(root / "var" / "tmp").mkdir()
|
|
(root / "var" / "tmp" / "file.txt").write_text("tmp", encoding="utf-8")
|
|
|
|
entries = entries_by_path(root, excludes=("cache", "var/tmp"))
|
|
|
|
assert "keep" in entries
|
|
assert "keep/file.txt" in entries
|
|
assert "cache" not in entries
|
|
assert "cache/file.txt" not in entries
|
|
assert "var" in entries
|
|
assert "var/tmp" not in entries
|
|
assert "var/tmp/file.txt" not in entries
|
|
|
|
|
|
def test_scan_tree_file_root_records_only_root_entry(tmp_path: Path) -> None:
|
|
root_file = tmp_path / "single.txt"
|
|
root_file.write_text("single", encoding="utf-8")
|
|
|
|
entries = list(scan_tree(root_file))
|
|
|
|
assert len(entries) == 1
|
|
assert entries[0].path == ""
|
|
assert entries[0].type == "file"
|