diff --git a/app/modules/transmission/__init__.py b/app/modules/transmission/__init__.py index 8b31dced3..c46060c29 100644 --- a/app/modules/transmission/__init__.py +++ b/app/modules/transmission/__init__.py @@ -20,7 +20,7 @@ from app.schemas.types import ( ) _TRANSMISSION_DOWNLOADING_STATES = { - "download_pending", + "download pending", "downloading", } _TRANSMISSION_PAUSED_STATES = { diff --git a/app/modules/transmission/transmission.py b/app/modules/transmission/transmission.py index 6a735acfe..f24fe5059 100755 --- a/app/modules/transmission/transmission.py +++ b/app/modules/transmission/transmission.py @@ -143,7 +143,7 @@ class Transmission: if not self.trc: return None try: - torrents, error = self.get_torrents(status=["seeding", "seed_pending"], ids=ids, tags=tags) + torrents, error = self.get_torrents(status=["seeding", "seed pending"], ids=ids, tags=tags) return None if error else torrents or [] except Exception as err: logger.error(f"获取已完成的种子列表出错:{str(err)}") @@ -159,7 +159,7 @@ class Transmission: return None try: torrents, error = self.get_torrents(ids=ids, - status=["downloading", "download_pending"], + status=["downloading", "download pending"], tags=tags) return None if error else torrents or [] except Exception as err: diff --git a/tests/test_downloader_path_mapping.py b/tests/test_downloader_path_mapping.py index 036ab95f7..aef882cfe 100644 --- a/tests/test_downloader_path_mapping.py +++ b/tests/test_downloader_path_mapping.py @@ -680,7 +680,7 @@ def test_all_torrents_include_completed_and_downloading_states(): total_size=1024, labels=[], progress=100, - status="seed_pending", + status="seed pending", ), SimpleNamespace( name="Downloading", diff --git a/tests/test_episode_group_recognition.py b/tests/test_episode_group_recognition.py index 28d12789e..2c66f52d6 100644 --- a/tests/test_episode_group_recognition.py +++ b/tests/test_episode_group_recognition.py @@ -1,17 +1,9 @@ -import sys -from types import ModuleType from unittest.mock import patch -sys.modules.setdefault("qbittorrentapi", ModuleType("qbittorrentapi")) -setattr(sys.modules["qbittorrentapi"], "TorrentFilesList", list) -sys.modules.setdefault("transmission_rpc", ModuleType("transmission_rpc")) -setattr(sys.modules["transmission_rpc"], "File", object) -sys.modules.setdefault("psutil", ModuleType("psutil")) - -from app.chain.base import ChainBase # noqa: E402 -from app.domain.context import MediaInfo # noqa: E402 -from app.domain.meta.metabase import MetaBase # noqa: E402 -from app.schemas.types import MediaSource, MediaType # noqa: E402 +from app.chain.base import ChainBase +from app.domain.context import MediaInfo +from app.domain.meta.metabase import MetaBase +from app.schemas.types import MediaSource, MediaType def test_recognize_media_uses_meta_episode_group(): diff --git a/tests/test_transmission_status.py b/tests/test_transmission_status.py new file mode 100644 index 000000000..b61b2778f --- /dev/null +++ b/tests/test_transmission_status.py @@ -0,0 +1,50 @@ +"""Transmission 任务状态过滤与 transmission-rpc 7 原始状态值的对齐回归。""" + +from types import SimpleNamespace +from unittest.mock import MagicMock + +import pytest +from transmission_rpc.torrent import Status + +from app.modules.transmission import TransmissionModule +from app.modules.transmission.transmission import Transmission +from app.schemas.types import DownloadTaskState + + +def _client(*torrents: SimpleNamespace) -> Transmission: + """构造只返回给定任务的离线 Transmission 客户端。""" + client = Transmission.__new__(Transmission) + client.trc = MagicMock() + client.trc.get_torrents.return_value = list(torrents) + return client + + +def test_completed_torrents_include_queued_seeding(): + """排队做种(seed pending)的任务已下载完成,必须进入待整理列表。""" + seeding = SimpleNamespace(status=Status.SEEDING, labels=[]) + queued = SimpleNamespace(status=Status.SEED_PENDING, labels=[]) + downloading = SimpleNamespace(status=Status.DOWNLOADING, labels=[]) + + assert _client(seeding, queued, downloading).get_completed_torrents() == [seeding, queued] + + +def test_downloading_torrents_include_queued_download(): + """排队下载(download pending)的任务仍属于下载中列表。""" + downloading = SimpleNamespace(status=Status.DOWNLOADING, labels=[]) + queued = SimpleNamespace(status=Status.DOWNLOAD_PENDING, labels=[]) + seeding = SimpleNamespace(status=Status.SEEDING, labels=[]) + + assert _client(downloading, queued, seeding).get_downloading_torrents() == [downloading, queued] + + +@pytest.mark.parametrize("status, expected", [ + (Status.DOWNLOAD_PENDING, DownloadTaskState.DOWNLOADING), + (Status.DOWNLOADING, DownloadTaskState.DOWNLOADING), + (Status.STOPPED, DownloadTaskState.PAUSED), + (Status.SEED_PENDING, DownloadTaskState.COMPLETED), +]) +def test_normalize_state_uses_transmission_rpc_status_values(status: Status, expected: DownloadTaskState): + """排队下载的任务不得被归一为已完成。""" + normalize = getattr(TransmissionModule, "_TransmissionModule__normalize_torrent_state") + + assert normalize(status) == expected.value