Files
tchMaterial-parser/tests/test_parse_collection.py
肥宅水水呀 baf3ba3fbc fix(ui): 修复回调类型注解与复选框锯齿
- 使用 Callable 标注解析、线程调度与主题回调,兼容 Python 3.10
- 对三态复选框应用抗锯齿绘制,并保留封面合成时的透明度
- 补充注解求值及浅色、深色主题下的图标回归测试
2026-09-09 14:10:47 +08:00

58 lines
2.5 KiB
Python

import unittest
from typing import get_type_hints
from src.tchmaterial_parser.api import ResourceInfo
from src.tchmaterial_parser.ui.download_panel import collect_parsed_resources, parse_urls_in_background
def make_resource(url: str, title: str = "资源") -> ResourceInfo:
return ResourceInfo(title, url, "pdf", [])
class CollectParsedResourcesTest(unittest.TestCase):
def test_callback_annotations_can_be_evaluated(self) -> None:
# Python 3.14 延迟求值注解;显式求值以免启动错误被新版解释器掩盖。
get_type_hints(collect_parsed_resources)
get_type_hints(parse_urls_in_background)
def test_flattens_multiple_resources_per_url(self) -> None:
def fake_parse(url: str, bookmarks: bool):
return [make_resource("https://example.com/a.pdf"), make_resource("https://example.com/b.mp3")]
resources, failed = collect_parsed_resources(fake_parse, ["https://example.com/1"], False)
self.assertEqual([resource.url for resource in resources], ["https://example.com/a.pdf", "https://example.com/b.mp3"])
self.assertEqual(failed, set())
def test_deduplicates_by_resource_url_across_urls(self) -> None:
def fake_parse(url: str, bookmarks: bool):
return [make_resource("https://example.com/a.pdf")]
resources, failed = collect_parsed_resources(fake_parse, ["https://example.com/1", "https://example.com/2"], False)
self.assertEqual([resource.url for resource in resources], ["https://example.com/a.pdf"])
self.assertEqual(failed, set())
def test_collects_urls_that_fail_to_parse(self) -> None:
def fake_parse(url: str, bookmarks: bool):
return None if url.endswith("bad") else [make_resource("https://example.com/a.pdf")]
resources, failed = collect_parsed_resources(fake_parse, ["https://example.com/good", "https://example.com/bad"], False)
self.assertEqual([resource.url for resource in resources], ["https://example.com/a.pdf"])
self.assertEqual(failed, {"https://example.com/bad"})
def test_reports_progress_for_each_url(self) -> None:
def fake_parse(url: str, bookmarks: bool):
return None
progress: list[tuple[int, int]] = []
collect_parsed_resources(fake_parse, ["https://example.com/1", "https://example.com/2", "https://example.com/3"], True, lambda current, total: progress.append((current, total)))
self.assertEqual(progress, [(1, 3), (2, 3), (3, 3)])
if __name__ == "__main__":
unittest.main()