import os import tempfile import unittest from unittest.mock import patch from common_util.common_util_storage import ( get_project_stage_path, resolve_stored_project_path, ) from config.config_system import get_project_storage_path class ProjectStoragePathTest(unittest.TestCase): def test_get_project_storage_path(self) -> None: with tempfile.TemporaryDirectory() as storage_root: with patch("config.config_system.STORAGE_BASE_DIR", storage_root): result = get_project_storage_path("회사", "사용자", "project-id") self.assertEqual( result, os.path.join(storage_root, "회사", "사용자", "project-id"), ) self.assertTrue(os.path.isdir(result)) self.assertNotIn(f"{os.sep}projects{os.sep}", result) for invalid_segment in ("", ".", "..", "../escape", "nested/path", "nested\\path"): with self.subTest(invalid_segment=invalid_segment): with self.assertRaises(ValueError): get_project_storage_path(invalid_segment, "사용자", "project-id") def test_get_project_stage_path(self) -> None: with tempfile.TemporaryDirectory() as project_root: result = get_project_stage_path(project_root, "B03_FileInput") self.assertEqual(result, os.path.join(project_root, "B03_FileInput")) self.assertTrue(os.path.isdir(result)) for invalid_stage in ("", "B02_ProjRegister", "../escape"): with self.subTest(invalid_stage=invalid_stage): with self.assertRaises(ValueError): get_project_stage_path(project_root, invalid_stage) def test_resolve_stored_project_path(self) -> None: with tempfile.TemporaryDirectory() as storage_root: with patch("common_util.common_util_storage.STORAGE_BASE_DIR", storage_root): result = resolve_stored_project_path("storage/company/user/project-id") expected = os.path.join(storage_root, "company", "user", "project-id") self.assertEqual(result, expected) self.assertTrue(os.path.isdir(result)) for invalid_path in ("company/user/project", "../outside", "storage"): with self.subTest(invalid_path=invalid_path): with self.assertRaises(ValueError): resolve_stored_project_path(invalid_path) if __name__ == "__main__": unittest.main()