mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-06-08 09:10:32 +08:00
fix: handle OpenList delayed transfer metadata
This commit is contained in:
@@ -200,6 +200,44 @@ class AlistStorageTest(unittest.TestCase):
|
||||
self.assertEqual(50, len(items))
|
||||
self.assertEqual(1, request_utils.post_res.call_count)
|
||||
|
||||
def test_move_item_returns_target_when_openlist_metadata_is_delayed(self):
|
||||
"""
|
||||
OpenList 操作成功但目标元数据延迟可见时,应返回可用的目标文件项。
|
||||
"""
|
||||
source = FileItem(
|
||||
storage="alist",
|
||||
type="file",
|
||||
path="/downloads/Test.Show.S01E01.mkv",
|
||||
name="Test.Show.S01E01.mkv",
|
||||
basename="Test.Show.S01E01",
|
||||
extension="mkv",
|
||||
size=1024,
|
||||
modify_time=1715939275.0,
|
||||
)
|
||||
request_utils = MagicMock()
|
||||
request_utils.post_res.return_value = _FakeResponse(
|
||||
{"code": 200, "message": "success", "data": None}
|
||||
)
|
||||
|
||||
with patch.object(Alist, "get_conf", return_value={"url": "http://openlist.test", "token": "token"}):
|
||||
with patch.object(self.storage, "_Alist__get_header_with_token", return_value={}):
|
||||
with patch.object(alist_module, "RequestUtils", return_value=request_utils):
|
||||
with patch.object(self.storage, "_delay_get_item", return_value=None):
|
||||
target = self.storage.move_item(
|
||||
source,
|
||||
Path("/library/Test Show (2026)/Season 1"),
|
||||
"Test.Show.S01E01.mkv",
|
||||
)
|
||||
|
||||
self.assertIsNotNone(target)
|
||||
self.assertEqual(
|
||||
"/library/Test Show (2026)/Season 1/Test.Show.S01E01.mkv",
|
||||
target.path,
|
||||
)
|
||||
self.assertEqual("alist", target.storage)
|
||||
self.assertEqual("file", target.type)
|
||||
self.assertEqual(1024, target.size)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
@@ -725,6 +725,56 @@ class TransferJobManagerTest(unittest.TestCase):
|
||||
event_data["file_list"],
|
||||
)
|
||||
|
||||
def test_success_callback_handles_missing_target_diritem(self):
|
||||
"""
|
||||
成功结果缺少目标目录项时,回调不应把已入库任务误判为失败。
|
||||
"""
|
||||
chain = make_transfer_chain()
|
||||
chain.eventmanager = MagicMock()
|
||||
chain.transfer_completed = lambda *args, **kwargs: None
|
||||
|
||||
task = make_task(1)
|
||||
task.mediainfo = FakeMedia()
|
||||
task.background = False
|
||||
task.manual = True
|
||||
self.assertTrue(chain._TransferChain__put_to_jobview(task))
|
||||
|
||||
target_item = FileItem(
|
||||
storage="alist",
|
||||
path="/library/Test Show (2026)/Season 1/Test.Show.S01E01.mkv",
|
||||
type="file",
|
||||
name="Test.Show.S01E01.mkv",
|
||||
extension="mkv",
|
||||
)
|
||||
transferinfo = TransferInfo(
|
||||
success=True,
|
||||
fileitem=task.fileitem,
|
||||
target_item=target_item,
|
||||
file_list_new=[target_item.path],
|
||||
transfer_type="copy",
|
||||
need_scrape=True,
|
||||
need_notify=False,
|
||||
)
|
||||
|
||||
with patch(
|
||||
"app.chain.transfer.TransferHistoryOper",
|
||||
return_value=SimpleNamespace(add_success=lambda **kwargs: SimpleNamespace(id=1)),
|
||||
):
|
||||
state, errmsg = chain._TransferChain__default_callback(task, transferinfo)
|
||||
|
||||
self.assertTrue(state)
|
||||
self.assertEqual("", errmsg)
|
||||
metadata_calls = [
|
||||
call
|
||||
for call in chain.eventmanager.send_event.call_args_list
|
||||
if call.args[0] == EventType.MetadataScrape
|
||||
]
|
||||
self.assertEqual(1, len(metadata_calls))
|
||||
event_data = metadata_calls[0].args[1]
|
||||
self.assertEqual("alist", event_data["fileitem"].storage)
|
||||
self.assertEqual("/library/Test Show (2026)/Season 1", event_data["fileitem"].path)
|
||||
self.assertEqual([target_item.path], event_data["file_list"])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user