from __future__ import annotations from pathlib import Path from bakrest.backup import ( _build_robocopy_command, _build_rsync_command, _robocopy_destination_dir, _split_existing_files, ) from bakrest.config import parse_config from bakrest.registry import ChangeEvent def test_split_existing_files_ignores_deleted(tmp_path: Path) -> None: existing = tmp_path / "image.jpg" existing.write_text("ok", encoding="utf-8") events = [ ChangeEvent(path=str(existing), event_type="modified"), ChangeEvent(path=str(tmp_path / "missing.jpg"), event_type="deleted"), ] present, skipped = _split_existing_files(events) assert [event.path for event in present] == [str(existing)] assert [event.path for event in skipped] == [str(tmp_path / "missing.jpg")] def test_build_rsync_command_uses_files_from(tmp_path: Path) -> None: source = tmp_path / "source" source.mkdir() image = source / "image.jpg" image.write_text("ok", encoding="utf-8") config = parse_config( { "watch": { "include_dirs": [str(source)], "include_extensions": [".jpg"], "exclude_dirs": [], "exclude_patterns": [], }, "backup": { "rsync_path": "rsync", "remote_destination": "user@host:/backup/", "server_check": {"type": "tcp", "port": 22, "interval_seconds": 300, "timeout_seconds": 1}, }, }, tmp_path / "config.toml", ) command = _build_rsync_command(config, [ChangeEvent(path=str(image), event_type="modified")]) assert command[0] == "rsync" assert "-av" in command assert "--relative" in command assert any(part.startswith("--files-from=") for part in command) assert command[-1] == "user@host:/backup/" def test_build_robocopy_command_preserves_path_under_include_root(tmp_path: Path) -> None: source = tmp_path / "Lavori" nested = source / "Cliente" / "Grafica" nested.mkdir(parents=True) image = nested / "image.psd" image.write_text("ok", encoding="utf-8") config = parse_config( { "watch": { "include_dirs": [str(source)], "include_extensions": [".psd"], "exclude_dirs": [], "exclude_patterns": [], }, "backup": { "engine": "robocopy", "robocopy_path": "robocopy", "remote_destinations": ["\\\\server\\Backup1", "\\\\server\\Backup2"], "server_check": {"type": "tcp", "port": 445, "interval_seconds": 300, "timeout_seconds": 1}, }, }, tmp_path / "config.toml", ) destination = _robocopy_destination_dir(config, image, Path("\\\\server\\Backup1")) command = _build_robocopy_command( config, ChangeEvent(path=str(image), event_type="modified"), "\\\\server\\Backup1", ) assert destination == Path("\\\\server\\Backup1") / "Lavori" / "Cliente" / "Grafica" assert command[0] == "robocopy" assert command[1] == str(nested) assert command[2] == str(destination) assert command[3] == "image.psd" assert "/MIR" not in command assert "/PURGE" not in command