douyin-crawler-poc/test_douyin.py

77 lines
3.1 KiB
Python

import importlib
import unittest
from unittest import mock
class FakeResponse:
def __init__(self, body, raw_body):
self.body = body
self.raw_body = raw_body
class DouyinModuleTests(unittest.TestCase):
def test_module_can_import_without_optional_runtime_dependencies(self) -> None:
module = importlib.import_module("Douyin")
self.assertIsNotNone(module)
def test_sanitize_filename_removes_invalid_characters(self) -> None:
module = importlib.import_module("Douyin")
self.assertEqual(
module.sanitize_filename('a/b:c*?d"e<f>g|h\n'),
"a_b_c__d_e_f_g_h",
)
def test_choose_video_url_prefers_douyinvod_link(self) -> None:
module = importlib.import_module("Douyin")
urls = [
"https://www.douyin.com/aweme/v1/play/?video_id=123",
"https://v11-weba.douyinvod.com/example/video.mp4",
"https://v26-web.douyinvod.com/example/video.mp4",
]
self.assertEqual(
module.choose_video_url(urls),
"https://v11-weba.douyinvod.com/example/video.mp4",
)
def test_build_output_path_uses_video_directory(self) -> None:
module = importlib.import_module("Douyin")
output_path = module.build_output_path("测试标题", "123456")
self.assertEqual(output_path.as_posix(), "video/测试标题-123456.mp4")
def test_extract_aweme_payload_uses_dict_body(self) -> None:
module = importlib.import_module("Douyin")
response = FakeResponse({"aweme_list": []}, "")
self.assertEqual(module.extract_aweme_payload(response), {"aweme_list": []})
def test_extract_aweme_payload_falls_back_to_raw_json(self) -> None:
module = importlib.import_module("Douyin")
response = FakeResponse("", '{"aweme_list": [{"aweme_id": "1"}]}')
self.assertEqual(
module.extract_aweme_payload(response),
{"aweme_list": [{"aweme_id": "1"}]},
)
def test_build_browser_address_from_port(self) -> None:
module = importlib.import_module("Douyin")
self.assertEqual(module.build_browser_address(9223), "127.0.0.1:9223")
self.assertIsNone(module.build_browser_address(None))
def test_ensure_browser_debug_port_ready_accepts_open_port(self) -> None:
module = importlib.import_module("Douyin")
connection = mock.MagicMock()
connection.__enter__.return_value = connection
connection.__exit__.return_value = False
with mock.patch.object(module.socket, "create_connection", return_value=connection) as mocked_connect:
module.ensure_browser_debug_port_ready(9223)
mocked_connect.assert_called_once()
def test_ensure_browser_debug_port_ready_rejects_closed_port(self) -> None:
module = importlib.import_module("Douyin")
with mock.patch.object(module.socket, "create_connection", side_effect=OSError("boom")):
with self.assertRaisesRegex(RuntimeError, "login_douyin.py"):
module.ensure_browser_debug_port_ready(9223)
if __name__ == "__main__":
unittest.main()