返回 douyin-downloader
test_transcript_manager.py
根目录 / tests / test_transcript_manager.py
1 import asyncio
2
3 from config import ConfigLoader
4 from core.transcript_manager import TranscriptManager
5 from storage import FileManager
6
7
8 class _FakeDatabase:
9 def __init__(self):
10 self.rows = []
11
12 async def upsert_transcript_job(self, payload):
13 self.rows.append(payload)
14
15
16 def test_transcript_default_disabled():
17 loader = ConfigLoader()
18 transcript_cfg = loader.get("transcript", {})
19
20 assert transcript_cfg.get("enabled") is False
21 assert transcript_cfg.get("api_url") == "https://api.openai.com/v1/audio/transcriptions"
22
23
24 def test_transcript_skip_when_missing_api_key(tmp_path):
25 config = ConfigLoader()
26 config.update(
27 transcript={
28 "enabled": True,
29 "api_key_env": "OPENAI_API_KEY",
30 "api_key": "",
31 "output_dir": "",
32 "response_formats": ["txt", "json"],
33 }
34 )
35
36 file_manager = FileManager(str(tmp_path / "Downloaded"))
37 database = _FakeDatabase()
38 manager = TranscriptManager(config, file_manager, database=database)
39
40 video_path = tmp_path / "Downloaded" / "author" / "post" / "demo.mp4"
41 video_path.parent.mkdir(parents=True, exist_ok=True)
42 video_path.write_bytes(b"video")
43
44 result = asyncio.run(manager.process_video(video_path, aweme_id="123"))
45
46 assert result["status"] == "skipped"
47 assert result["reason"] == "missing_api_key"
48 assert database.rows[-1]["status"] == "skipped"
49 assert database.rows[-1]["skip_reason"] == "missing_api_key"
50
51
52 def test_transcript_output_dir_defaults_to_video_dir(tmp_path):
53 config = ConfigLoader()
54 config.update(transcript={"enabled": True, "output_dir": ""})
55 file_manager = FileManager(str(tmp_path / "Downloaded"))
56 manager = TranscriptManager(config, file_manager, database=None)
57
58 video_path = tmp_path / "Downloaded" / "a" / "post" / "x.mp4"
59 video_path.parent.mkdir(parents=True, exist_ok=True)
60 video_path.write_bytes(b"video")
61
62 resolved = manager.resolve_output_dir(video_path)
63 assert resolved == video_path.parent
64
65
66 def test_transcript_output_dir_mirrors_video_tree(tmp_path):
67 config = ConfigLoader()
68 output_root = tmp_path / "Transcripts"
69 config.update(transcript={"enabled": True, "output_dir": str(output_root)})
70 file_manager = FileManager(str(tmp_path / "Downloaded"))
71 manager = TranscriptManager(config, file_manager, database=None)
72
73 video_path = tmp_path / "Downloaded" / "a" / "post" / "2026-02-18_demo" / "x.mp4"
74 video_path.parent.mkdir(parents=True, exist_ok=True)
75 video_path.write_bytes(b"video")
76
77 resolved = manager.resolve_output_dir(video_path)
78 expected = output_root / "a" / "post" / "2026-02-18_demo"
79 assert resolved == expected
80
81
82 def test_transcript_file_names(tmp_path):
83 config = ConfigLoader()
84 config.update(transcript={"enabled": True, "output_dir": ""})
85 file_manager = FileManager(str(tmp_path / "Downloaded"))
86 manager = TranscriptManager(config, file_manager, database=None)
87
88 video_path = tmp_path / "Downloaded" / "a" / "post" / "demo.mp4"
89 video_path.parent.mkdir(parents=True, exist_ok=True)
90 video_path.write_bytes(b"video")
91
92 text_path, json_path = manager.build_output_paths(video_path)
93 assert text_path.name == "demo.transcript.txt"
94 assert json_path.name == "demo.transcript.json"
95
95 lines PYTHON