77 lines
3.1 KiB
Python
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()
|