Spaces:
Paused
Paused
| """ | |
| Tests for podcast episode directory path generation. | |
| Verifies that episode output directories use UUID-based names | |
| instead of raw episode names, preventing filesystem issues with | |
| spaces and special characters (GitHub issue #663). | |
| """ | |
| import uuid | |
| from pathlib import PurePosixPath | |
| from commands.podcast_commands import build_episode_output_dir | |
| class TestBuildEpisodeOutputDir: | |
| """Test the actual production helper that builds episode output paths.""" | |
| def test_directory_name_is_valid_uuid(self): | |
| dir_name, _ = build_episode_output_dir("/data") | |
| parsed = uuid.UUID(dir_name) | |
| assert str(parsed) == dir_name | |
| def test_path_structure(self): | |
| dir_name, output_dir = build_episode_output_dir("/data") | |
| assert str(output_dir) == f"/data/podcasts/episodes/{dir_name}" | |
| def test_no_collision_between_calls(self): | |
| dir1, _ = build_episode_output_dir("/data") | |
| dir2, _ = build_episode_output_dir("/data") | |
| assert dir1 != dir2 | |
| def test_path_is_independent_of_episode_name(self): | |
| """The returned path must never contain user-supplied episode names. | |
| Since build_episode_output_dir does not accept an episode name at all, | |
| any name the user types is structurally excluded from the path. | |
| """ | |
| problematic_names = [ | |
| "My Episode Name", | |
| "Episode: Part 1", | |
| 'test "quotes"', | |
| "path/traversal", | |
| "café résumé", | |
| " spaces ", | |
| "?*<>|", | |
| ] | |
| for name in problematic_names: | |
| _, output_dir = build_episode_output_dir("/data") | |
| path_str = str(output_dir) | |
| # The episode name must not appear anywhere in the path | |
| assert name not in path_str | |
| # UUID paths contain only hex digits and hyphens after the base | |
| dir_component = output_dir.name | |
| assert all(c in "0123456789abcdef-" for c in dir_component), ( | |
| f"Unexpected chars in directory name: {dir_component}" | |
| ) | |
| def test_path_works_on_posix(self): | |
| dir_name, output_dir = build_episode_output_dir("/data") | |
| posix = PurePosixPath(str(output_dir)) | |
| assert posix.parts == ("/", "data", "podcasts", "episodes", dir_name) | |
| def test_directory_can_be_created(self, tmp_path): | |
| """Create the directory on the real filesystem.""" | |
| _, output_dir = build_episode_output_dir(str(tmp_path)) | |
| output_dir.mkdir(parents=True, exist_ok=True) | |
| assert output_dir.exists() | |
| assert output_dir.is_dir() | |