返回 Social Auto Upload
test_douyin_declaration.py
根目录 / tests / test_douyin_declaration.py
1 # Language: 中文
2 import asyncio
3 import unittest
4 from unittest.mock import AsyncMock, MagicMock, patch
5
6 from uploader.douyin_uploader import main as douyin_main
7 from uploader.douyin_uploader.main import DouYinVideo
8
9
10 class DouyinDeclarationTests(unittest.TestCase):
11 def test_upload_only_sets_explicit_declaration(self):
12 video = DouYinVideo(
13 "标题", "/tmp/demo.mp4", [], 0, "/tmp/cookie.json",
14 declaration="已确认声明原文",
15 )
16 self.assertEqual(video.declaration, "已确认声明原文")
17
18 def test_missing_declaration_does_not_fall_back_to_personal_opinion(self):
19 video = DouYinVideo("标题", "/tmp/demo.mp4", [], 0, "/tmp/cookie.json")
20 self.assertIsNone(video.declaration)
21
22 def test_legacy_positional_runtime_flags_keep_their_meaning(self):
23 video = DouYinVideo(
24 "标题", "/tmp/demo.mp4", [], 0, "/tmp/cookie.json",
25 None, "", "", None, "",
26 "scheduled", False, False,
27 )
28 self.assertEqual(video.publish_strategy, "scheduled")
29 self.assertFalse(video.debug)
30 self.assertFalse(video.headless)
31 self.assertIsNone(video.declaration)
32
33 def test_apply_declaration_skips_when_unspecified(self):
34 video = DouYinVideo("标题", "/tmp/demo.mp4", [], 0, "/tmp/cookie.json")
35 video.set_self_declaration = AsyncMock()
36 asyncio.run(video.apply_self_declaration(object()))
37 video.set_self_declaration.assert_not_awaited()
38
39 def test_apply_declaration_uses_exact_explicit_text(self):
40 page = object()
41 video = DouYinVideo(
42 "标题", "/tmp/demo.mp4", [], 0, "/tmp/cookie.json",
43 declaration="已确认声明原文",
44 )
45 video.set_self_declaration = AsyncMock(return_value=True)
46 asyncio.run(video.apply_self_declaration(page))
47 video.set_self_declaration.assert_awaited_once_with(page, "已确认声明原文")
48
49 def test_explicit_declaration_failure_blocks_publish(self):
50 video = DouYinVideo(
51 "标题", "/tmp/demo.mp4", [], 0, "/tmp/cookie.json",
52 declaration="已确认声明原文",
53 )
54 video.set_self_declaration = AsyncMock(return_value=False)
55 with self.assertRaisesRegex(RuntimeError, "自主声明"):
56 asyncio.run(video.apply_self_declaration(object()))
57
58 def test_declaration_failure_closes_browser_resources(self):
59 video = DouYinVideo(
60 "标题", "/tmp/demo.mp4", [], 0, "/tmp/cookie.json",
61 declaration="已确认声明原文",
62 )
63 video.validate_upload_args = AsyncMock()
64 video.fill_title_and_description = AsyncMock()
65 video.set_thumbnail = AsyncMock()
66 video.apply_self_declaration = AsyncMock(side_effect=RuntimeError("抖音自主声明设置失败"))
67
68 locator = MagicMock()
69 locator.set_input_files = AsyncMock()
70 locator.count = AsyncMock(return_value=1)
71 page = MagicMock()
72 page.goto = AsyncMock()
73 page.wait_for_url = AsyncMock()
74 page.wait_for_selector = AsyncMock()
75 page.locator.return_value = locator
76
77 context = MagicMock()
78 context.new_page = AsyncMock(return_value=page)
79 context.close = AsyncMock(side_effect=OSError("close failed"))
80 browser = MagicMock()
81 browser.new_context = AsyncMock(return_value=context)
82 browser.close = AsyncMock()
83 playwright = MagicMock()
84 playwright.chromium.launch = AsyncMock(return_value=browser)
85
86 with (
87 patch.object(douyin_main, "set_init_script", AsyncMock(return_value=context)),
88 patch.object(douyin_main.asyncio, "sleep", AsyncMock()),
89 self.assertRaisesRegex(RuntimeError, "自主声明"),
90 ):
91 asyncio.run(video.upload(playwright))
92
93 context.close.assert_awaited_once()
94 browser.close.assert_awaited_once()
95
96
97 if __name__ == "__main__":
98 unittest.main()
99
99 lines PYTHON