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"eg|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()