from __future__ import annotations import unittest from govoplan_files.backend.storage.common import FileConflictResolution, FileStorageError from govoplan_files.backend.storage.transfers import _normalize_rename_request, _normalize_transfer_request class TransferHelperTests(unittest.TestCase): def test_transfer_normalization_deduplicates_folder_paths_and_conflicts(self) -> None: normalized = _normalize_transfer_request( operation=" COPY ", source_owner_type=" USER ", target_owner_type=" GROUP ", folder_paths=["Reports", "Reports/2026", "", "./Archive"], target_folder=" Target ", conflict_strategy="rename", conflict_resolutions=[FileConflictResolution(target_path="Target/a.txt", action="skip")], ) self.assertEqual("copy", normalized.operation) self.assertEqual("user", normalized.source_owner_type) self.assertEqual("group", normalized.target_owner_type) self.assertEqual(["Reports", "Reports/2026", "Archive"], normalized.source_folder_paths) self.assertEqual("Target", normalized.target_folder) self.assertEqual("rename", normalized.conflict_strategy) self.assertEqual("skip", normalized.conflict_resolution_map["Target/a.txt"].action) def test_transfer_normalization_rejects_unknown_operation(self) -> None: with self.assertRaisesRegex(FileStorageError, "Unsupported transfer operation"): _normalize_transfer_request( operation="link", source_owner_type="user", target_owner_type="group", folder_paths=[], target_folder="", conflict_strategy="reject", conflict_resolutions=None, ) def test_rename_normalization_collapses_nested_folder_roots(self) -> None: normalized = _normalize_rename_request( file_ids=["file-1", "file-1", "file-2"], folder_paths=["Reports", "Reports/2026", "Archive"], owner_type=" USER ", owner_id="owner-1", mode=" prefix ", ) self.assertEqual("prefix", normalized.mode) self.assertEqual(["file-1", "file-2"], normalized.selected_file_ids) self.assertEqual(["Archive", "Reports"], normalized.selected_folder_roots) self.assertEqual("user", normalized.owner_type) def test_rename_normalization_rejects_invalid_direct_multi_select(self) -> None: with self.assertRaisesRegex(FileStorageError, "Direct rename requires exactly one selected item"): _normalize_rename_request( file_ids=["file-1", "file-2"], folder_paths=[], owner_type="user", owner_id="owner-1", mode="direct", ) if __name__ == "__main__": unittest.main()