From eb5e17a1150aecf2be93f2d31ecec94a6c9e0145 Mon Sep 17 00:00:00 2001 From: Attente <19653207+wikrin@users.noreply.github.com> Date: Sun, 5 Apr 2026 21:32:27 +0800 Subject: [PATCH] =?UTF-8?q?test:=20=E8=A1=A5=E5=85=85=E5=AA=92=E4=BD=93?= =?UTF-8?q?=E5=88=AE=E5=89=8A=E8=B7=AF=E5=BE=84=E3=80=81=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E4=B8=8E=E4=BA=8B=E4=BB=B6=E6=B5=81=E7=A8=8B=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_mediascrape.py | 147 ++++++++++++++++++++++++++------------ 1 file changed, 103 insertions(+), 44 deletions(-) diff --git a/tests/test_mediascrape.py b/tests/test_mediascrape.py index 8410097f..415b837f 100644 --- a/tests/test_mediascrape.py +++ b/tests/test_mediascrape.py @@ -2,7 +2,7 @@ import sys import unittest from pathlib import Path from unittest.mock import patch, MagicMock - +# ruff: noqa: E402 sys.modules['app.helper.sites'] = MagicMock() sys.modules['app.db.systemconfig_oper'] = MagicMock() sys.modules['app.db.systemconfig_oper'].SystemConfigOper.return_value.get.return_value = None @@ -172,6 +172,62 @@ class TestMediaScrapingImages(unittest.TestCase): self.assertEqual(len(calls), 1) self.assertEqual(calls[0].kwargs["url"], "http://season01") + def test_scrape_episode_thumb_image_path(self): + fileitem = schemas.FileItem(path="/tv/Show/Season 1/S01E01.mp4", name="S01E01.mp4", type="file", storage="local") + parent_item = schemas.FileItem(path="/tv/Show/Season 1", name="Season 1", type="dir", storage="local") + mediainfo = MediaInfo() + self.media_chain.metadata_img.return_value = { + "thumb.jpg": "http://episode-thumb" + } + self.media_chain.scraping_policies.option.return_value = ScrapingOption("episode", "thumb", ScrapingPolicy.OVERWRITE) + self.media_chain.storagechain.get_file_item.return_value = None + + self.media_chain._scrape_images_generic( + fileitem, + mediainfo, + ScrapingTarget.EPISODE, + parent_fileitem=parent_item, + season_number=1, + episode_number=1 + ) + + self.media_chain.metadata_img.assert_called_once_with( + mediainfo=mediainfo, + season=1, + episode=1 + ) + self.media_chain._download_and_save_image.assert_called_once_with( + fileitem=parent_item, + path=Path("/tv/Show/Season 1/S01E01.jpg"), + url="http://episode-thumb" + ) + + def test_scrape_episode_thumb_image_path_via_parent_lookup(self): + fileitem = schemas.FileItem(path="/tv/Show/Season 1/S01E01.mp4", name="S01E01.mp4", type="file", storage="local") + parent_item = schemas.FileItem(path="/tv/Show/Season 1", name="Season 1", type="dir", storage="local") + mediainfo = MediaInfo() + self.media_chain.metadata_img.return_value = { + "thumb.jpg": "http://episode-thumb" + } + self.media_chain.scraping_policies.option.return_value = ScrapingOption("episode", "thumb", ScrapingPolicy.OVERWRITE) + self.media_chain.storagechain.get_parent_item.return_value = parent_item + self.media_chain.storagechain.get_file_item.return_value = None + + self.media_chain._scrape_images_generic( + fileitem, + mediainfo, + ScrapingTarget.EPISODE, + season_number=1, + episode_number=1 + ) + + self.media_chain.storagechain.get_parent_item.assert_called_once_with(fileitem) + self.media_chain._download_and_save_image.assert_called_once_with( + fileitem=parent_item, + path=Path("/tv/Show/Season 1/S01E01.jpg"), + url="http://episode-thumb" + ) + @patch("app.chain.media.RequestUtils") @patch("app.chain.media.NamedTemporaryFile") @patch("app.chain.media.Path.chmod") @@ -225,16 +281,22 @@ class TestMediaScrapingTVDirectory(unittest.TestCase): def test_initialize_tv_directory_specials(self, mock_settings): # mock specials directory recognition mock_settings.RENAME_FORMAT_S0_NAMES = ["Specials", "SPs"] - mock_settings.RMT_MEDIAEXT = [".mp4", ".mkv"] fileitem = schemas.FileItem(path="/tv/Show/Specials", name="Specials", type="dir", storage="local") meta = MetaInfo("Show") mediainfo = MediaInfo(type=MediaType.TV) - self.media_chain.storagechain.list_files.return_value = [] + filepath = Path(fileitem.path) - self.media_chain._handle_tv_scraping(fileitem, meta, mediainfo, init_folder=True, parent=None, overwrite=False, recursive=True) + self.media_chain._initialize_tv_directory_metadata( + fileitem=fileitem, + filepath=filepath, + meta=meta, + mediainfo=mediainfo, + parent=None, + overwrite=False, + ) - self.media_chain._scrape_nfo_generic.assert_called_with( + self.media_chain._scrape_nfo_generic.assert_called_once_with( current_fileitem=fileitem, meta=meta, mediainfo=mediainfo, @@ -242,7 +304,7 @@ class TestMediaScrapingTVDirectory(unittest.TestCase): overwrite=False, season_number=0 ) - self.media_chain._scrape_images_generic.assert_called_with( + self.media_chain._scrape_images_generic.assert_called_once_with( current_fileitem=fileitem, mediainfo=mediainfo, item_type=ScrapingTarget.SEASON, @@ -251,15 +313,25 @@ class TestMediaScrapingTVDirectory(unittest.TestCase): season_number=0 ) - def test_initialize_tv_directory_season(self): + @patch("app.chain.media.settings") + def test_initialize_tv_directory_season(self, mock_settings): + mock_settings.RENAME_FORMAT_S0_NAMES = ["Specials", "SPs"] + fileitem = schemas.FileItem(path="/tv/Show/Season 1", name="Season 1", type="dir", storage="local") meta = MetaInfo("Show") mediainfo = MediaInfo(type=MediaType.TV) - self.media_chain.storagechain.list_files.return_value = [] + filepath = Path(fileitem.path) - self.media_chain._handle_tv_scraping(fileitem, meta, mediainfo, init_folder=True, parent=None, overwrite=False, recursive=True) + self.media_chain._initialize_tv_directory_metadata( + fileitem=fileitem, + filepath=filepath, + meta=meta, + mediainfo=mediainfo, + parent=None, + overwrite=False, + ) - self.media_chain._scrape_nfo_generic.assert_called_with( + self.media_chain._scrape_nfo_generic.assert_called_once_with( current_fileitem=fileitem, meta=meta, mediainfo=mediainfo, @@ -272,18 +344,17 @@ class TestMediaScrapingTVDirectory(unittest.TestCase): class TestMediaScrapeEvents(unittest.TestCase): def setUp(self): self.media_chain = MediaChain() + self.media_chain.storagechain = MagicMock() @patch("app.chain.media.MediaChain.scrape_metadata") - @patch("app.chain.media.StorageChain.get_item") - @patch("app.chain.media.StorageChain.get_parent_item") def test_scrape_metadata_event_file( - self, mock_get_parent, mock_get_item, mock_scrape_metadata + self, mock_scrape_metadata ): fileitem = schemas.FileItem(path="/movies/movie.mkv", name="movie.mkv", type="file", storage="local") parent_item = schemas.FileItem(path="/movies", name="movies", type="dir", storage="local") - mock_get_item.return_value = fileitem - mock_get_parent.return_value = parent_item + self.media_chain.storagechain.get_item.return_value = fileitem + self.media_chain.storagechain.get_parent_item.return_value = parent_item mediainfo = MediaInfo() event = Event( @@ -306,15 +377,13 @@ class TestMediaScrapeEvents(unittest.TestCase): ) @patch("app.chain.media.MediaChain.scrape_metadata") - @patch("app.chain.media.StorageChain.get_item") - @patch("app.chain.media.StorageChain.is_bluray_folder") def test_scrape_metadata_event_dir_bluray( - self, mock_is_bluray, mock_get_item, mock_scrape_metadata + self, mock_scrape_metadata ): fileitem = schemas.FileItem(path="/movies/bluray_movie", name="bluray_movie", type="dir", storage="local") - mock_get_item.return_value = fileitem - mock_is_bluray.return_value = True + self.media_chain.storagechain.get_item.return_value = fileitem + self.media_chain.storagechain.is_bluray_folder.return_value = True mediainfo = MediaInfo() event = Event( @@ -338,22 +407,19 @@ class TestMediaScrapeEvents(unittest.TestCase): ) @patch("app.chain.media.MediaChain.scrape_metadata") - @patch("app.chain.media.StorageChain.get_item") - @patch("app.chain.media.StorageChain.is_bluray_folder") - @patch("app.chain.media.StorageChain.get_file_item") def test_scrape_metadata_event_dir_with_filelist( - self, mock_get_file_item, mock_is_bluray, mock_get_item, mock_scrape_metadata + self, mock_scrape_metadata ): fileitem = schemas.FileItem(path="/tv/show", name="show", type="dir", storage="local") - mock_get_item.return_value = fileitem - mock_is_bluray.return_value = False + self.media_chain.storagechain.get_item.return_value = fileitem + self.media_chain.storagechain.is_bluray_folder.return_value = False def side_effect_get_file_item(storage, path): path_str = str(path) return schemas.FileItem(path=path_str, name=Path(path_str).name, type="dir" if "." not in path_str else "file", storage="local") - mock_get_file_item.side_effect = side_effect_get_file_item + self.media_chain.storagechain.get_file_item.side_effect = side_effect_get_file_item mediainfo = MediaInfo() event = Event( @@ -377,13 +443,12 @@ class TestMediaScrapeEvents(unittest.TestCase): self.assertIn("/tv/show/Season 1/S01E01.mp4", paths) @patch("app.chain.media.MediaChain.scrape_metadata") - @patch("app.chain.media.StorageChain.get_item") def test_scrape_metadata_event_dir_full( - self, mock_get_item, mock_scrape_metadata + self, mock_scrape_metadata ): fileitem = schemas.FileItem(path="/movies/movie", name="movie", type="dir", storage="local") - mock_get_item.return_value = fileitem + self.media_chain.storagechain.get_item.return_value = fileitem mediainfo = MediaInfo() meta = MetaInfo("movie") @@ -501,22 +566,19 @@ class TestMediaScrapeEvents(unittest.TestCase): mock_handle_tv.assert_not_called() @patch("app.chain.media.MediaChain.scrape_metadata") - @patch("app.chain.media.StorageChain.get_item") - @patch("app.chain.media.StorageChain.is_bluray_folder") - @patch("app.chain.media.StorageChain.get_file_item") def test_scrape_metadata_event_dir_with_multiple_files( - self, mock_get_file_item, mock_is_bluray, mock_get_item, mock_scrape_metadata + self, mock_scrape_metadata ): fileitem = schemas.FileItem(path="/movies/collection", name="collection", type="dir", storage="local") - mock_get_item.return_value = fileitem - mock_is_bluray.return_value = False + self.media_chain.storagechain.get_item.return_value = fileitem + self.media_chain.storagechain.is_bluray_folder.return_value = False def side_effect_get_file_item(storage, path): path_str = str(path) return schemas.FileItem(path=path_str, name=Path(path_str).name, type="dir" if "." not in path_str else "file", storage="local") - mock_get_file_item.side_effect = side_effect_get_file_item + self.media_chain.storagechain.get_file_item.side_effect = side_effect_get_file_item mediainfo = MediaInfo() event = Event( @@ -546,22 +608,19 @@ class TestMediaScrapeEvents(unittest.TestCase): self.assertIn("/movies/collection/movie3.avi", paths) @patch("app.chain.media.MediaChain.scrape_metadata") - @patch("app.chain.media.StorageChain.get_item") - @patch("app.chain.media.StorageChain.is_bluray_folder") - @patch("app.chain.media.StorageChain.get_file_item") def test_scrape_metadata_event_dir_with_tv_multi_seasons_episodes( - self, mock_get_file_item, mock_is_bluray, mock_get_item, mock_scrape_metadata + self, mock_scrape_metadata ): fileitem = schemas.FileItem(path="/tv/MultiSeasonShow", name="MultiSeasonShow", type="dir", storage="local") - mock_get_item.return_value = fileitem - mock_is_bluray.return_value = False + self.media_chain.storagechain.get_item.return_value = fileitem + self.media_chain.storagechain.is_bluray_folder.return_value = False def side_effect_get_file_item(storage, path): path_str = str(path) return schemas.FileItem(path=path_str, name=Path(path_str).name, type="dir" if "." not in path_str else "file", storage="local") - mock_get_file_item.side_effect = side_effect_get_file_item + self.media_chain.storagechain.get_file_item.side_effect = side_effect_get_file_item mediainfo = MediaInfo() event = Event(