Expected download summaries WIP
This commit is contained in:
parent
3e60f7d1da
commit
127ba0b184
12 changed files with 148 additions and 106 deletions
|
|
@ -1,4 +1,5 @@
|
|||
import hashlib
|
||||
import json
|
||||
import os.path
|
||||
from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
|
|
@ -6,14 +7,25 @@ from typing import List
|
|||
from typing import Optional
|
||||
from typing import Union
|
||||
|
||||
from ytdl_sub.utils.file_handler import FileMetadata
|
||||
_EXPECTED_DOWNLOADS_SUMMARY_PATH = Path("tests/e2e/resources/expected_downloads_summaries")
|
||||
|
||||
def _get_files_in_directory(relative_directory: Path | str) -> List[Path]:
|
||||
relative_file_paths: List[Path] = []
|
||||
for path in Path(relative_directory).rglob("*"):
|
||||
if path.is_file():
|
||||
relative_path = Path(*path.parts[3:])
|
||||
relative_file_paths.append(relative_path)
|
||||
|
||||
return relative_file_paths
|
||||
|
||||
def _get_file_md5_hash(full_file_path: Path | str) -> str:
|
||||
with open(full_file_path, "rb") as file:
|
||||
return hashlib.md5(file.read()).hexdigest()
|
||||
|
||||
@dataclass
|
||||
class ExpectedDownloadFile:
|
||||
path: Path
|
||||
md5: Optional[Union[str, List[str]]] = None
|
||||
metadata: Optional[FileMetadata] = None
|
||||
|
||||
|
||||
class ExpectedDownloads:
|
||||
|
|
@ -35,21 +47,16 @@ class ExpectedDownloads:
|
|||
def contains(self, relative_path: Path) -> bool:
|
||||
return sum(relative_path == download.path for download in self.expected_downloads) == 1
|
||||
|
||||
def assert_files_exist(self, relative_directory: Path):
|
||||
def assert_files_exist(self, relative_directory: str | Path):
|
||||
"""
|
||||
Assert each expected file exists and that its respective md5 hash matches.
|
||||
"""
|
||||
num_files = 0
|
||||
for path in Path(relative_directory).rglob("*"):
|
||||
if path.is_file():
|
||||
num_files += 1
|
||||
relative_file_paths = _get_files_in_directory(relative_directory=relative_directory)
|
||||
|
||||
relative_path = Path(*path.parts[3:])
|
||||
assert self.contains(
|
||||
relative_path
|
||||
), f"File {relative_path} was created but not expected"
|
||||
for file_path in relative_file_paths:
|
||||
assert self.contains(file_path), f"File {file_path} was created but not expected"
|
||||
|
||||
assert num_files == self.file_count, "Mismatch in number of created files"
|
||||
assert len(relative_file_paths) == self.file_count, "Mismatch in number of created files"
|
||||
|
||||
for expected_download in self.expected_downloads:
|
||||
full_path = Path(relative_directory) / expected_download.path
|
||||
|
|
@ -60,9 +67,7 @@ class ExpectedDownloads:
|
|||
if expected_download.md5 is None:
|
||||
continue
|
||||
|
||||
with open(full_path, "rb") as file:
|
||||
md5_hash = hashlib.md5(file.read()).hexdigest()
|
||||
|
||||
md5_hash = _get_file_md5_hash(full_file_path=full_path)
|
||||
expected_md5_hash = expected_download.md5
|
||||
if isinstance(expected_download.md5, str):
|
||||
expected_md5_hash = [expected_download.md5]
|
||||
|
|
@ -71,3 +76,57 @@ class ExpectedDownloads:
|
|||
f"MD5 hash for {str(expected_download.path)} does not match: "
|
||||
f"{md5_hash} != {expected_md5_hash}"
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, expected_downloads_dict) -> "ExpectedDownloads":
|
||||
expected_downloads: List[ExpectedDownloadFile] = []
|
||||
for file_path, md5_hash in expected_downloads_dict.items():
|
||||
expected_downloads.append(ExpectedDownloadFile(
|
||||
path=Path(file_path), md5=md5_hash
|
||||
))
|
||||
|
||||
return cls(expected_downloads=expected_downloads)
|
||||
|
||||
|
||||
@classmethod
|
||||
def from_file(cls, file_path: str | Path) -> "ExpectedDownloads":
|
||||
with open(file_path, mode='r', encoding='utf-8') as file:
|
||||
expected_downloads_dict = json.load(file)
|
||||
return cls.from_dict(expected_downloads_dict)
|
||||
|
||||
@classmethod
|
||||
def from_directory(cls, directory_path: str | Path) -> "ExpectedDownloads":
|
||||
relative_file_paths = _get_files_in_directory(relative_directory=directory_path)
|
||||
expected_downloads_dict = {
|
||||
str(file_path): _get_file_md5_hash(full_file_path=Path(directory_path) / file_path) for file_path in relative_file_paths
|
||||
}
|
||||
return cls.from_dict(expected_downloads_dict)
|
||||
|
||||
|
||||
def to_summary_file(self, summary_file_path: Path | str) -> None:
|
||||
expected_downloads_dict = {
|
||||
str(exp_dl.path): exp_dl.md5 for exp_dl in self.expected_downloads
|
||||
}
|
||||
|
||||
with open(summary_file_path, mode='w', encoding='utf-8') as file:
|
||||
json.dump(obj=expected_downloads_dict, fp=file, sort_keys=True, ensure_ascii=False, indent=2)
|
||||
|
||||
|
||||
def assert_expected_downloads(
|
||||
output_directory: str | Path,
|
||||
dry_run: bool,
|
||||
expected_download_summary_file_name: str,
|
||||
regenerate_expected_download_summary: bool = True,
|
||||
):
|
||||
if dry_run:
|
||||
output_directory_contents = list(Path(output_directory).rglob("*"))
|
||||
assert len(output_directory_contents) == 0, f"Expected output directory to be empty after a dry-run, but found {output_directory_contents}"
|
||||
return
|
||||
|
||||
summary_full_path = _EXPECTED_DOWNLOADS_SUMMARY_PATH / expected_download_summary_file_name
|
||||
if regenerate_expected_download_summary:
|
||||
ExpectedDownloads.from_directory(directory_path=output_directory).to_summary_file(summary_file_path=summary_full_path)
|
||||
|
||||
ExpectedDownloads.from_file(summary_full_path).assert_files_exist(relative_directory=output_directory)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ def assert_transaction_log_matches(
|
|||
output_directory: str,
|
||||
transaction_log: FileHandlerTransactionLog,
|
||||
transaction_log_summary_file_name: str,
|
||||
regenerate_transaction_log: bool = False,
|
||||
regenerate_transaction_log: bool = True,
|
||||
):
|
||||
"""
|
||||
Parameters
|
||||
|
|
|
|||
|
|
@ -44,5 +44,4 @@ class TestNfoTagsPlugins:
|
|||
output_directory=output_directory,
|
||||
transaction_log=transaction_log,
|
||||
transaction_log_summary_file_name="plugins/test_kodi_safe_xml.txt",
|
||||
regenerate_transaction_log=True,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"JMC - Oblivion Mod "Falcor" p.1-thumb.jpg": "fb95b510681676e81c321171fc23143e",
|
||||
"JMC - Oblivion Mod "Falcor" p.1.mp4": "931a705864c57d21d6fedebed4af6bbc",
|
||||
"JMC - Oblivion Mod "Falcor" p.1.nfo": "89f509a8a3d9003e22a9091abeeae5dc"
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"JMC - Oblivion Mod "Falcor" p.1-thumb.jpg": "fb95b510681676e81c321171fc23143e",
|
||||
"JMC - Oblivion Mod "Falcor" p.1.mp4": "76b8a7dd428e67e5072d003983bb7e33",
|
||||
"JMC - Oblivion Mod "Falcor" p.1.nfo": "89f509a8a3d9003e22a9091abeeae5dc"
|
||||
}
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
Files created in '{output_directory}'
|
||||
----------------------------------------
|
||||
Rick Beato - Can you hear the difference 🎸🔥 #shorts-thumb.jpg
|
||||
Rick Beato - Can you hear the difference 🎸🔥 #shorts.3gp
|
||||
Rick Beato - Can you hear the difference 🎸🔥 #shorts.nfo
|
||||
Rick Beato - Can you hear the difference? 🎸🔥 #shorts-thumb.jpg
|
||||
Rick Beato - Can you hear the difference? 🎸🔥 #shorts.3gp
|
||||
Rick Beato - Can you hear the difference? 🎸🔥 #shorts.nfo
|
||||
NFO tags:
|
||||
musicvideo:
|
||||
album: Music Videos
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
Files created in '{output_directory}'
|
||||
----------------------------------------
|
||||
.ytdl-sub-pz-download-archive.json
|
||||
Season 2010/s2010.e0813 - Oblivion Mod 'Falcor' p.1-thumb.jpg
|
||||
Season 2010/s2010.e0813 - Oblivion Mod 'Falcor' p.1.mp4
|
||||
Season 2010/s2010.e0813 - Oblivion Mod 'Falcor' p.1.nfo
|
||||
Season 2010/s2010.e0813 - Oblivion Mod "Falcor" p.1-thumb.jpg
|
||||
Season 2010/s2010.e0813 - Oblivion Mod "Falcor" p.1.mp4
|
||||
Season 2010/s2010.e0813 - Oblivion Mod "Falcor" p.1.nfo
|
||||
NFO tags:
|
||||
episodedetails:
|
||||
aired: 2010-08-13
|
||||
|
|
@ -18,9 +18,9 @@ Season 2010/s2010.e0813 - Oblivion Mod 'Falcor' p.1.nfo
|
|||
season: 2010
|
||||
title: Oblivion Mod "Falcor" p.1
|
||||
year: 2010
|
||||
Season 2010/s2010.e1202 - Oblivion Mod 'Falcor' p.2-thumb.jpg
|
||||
Season 2010/s2010.e1202 - Oblivion Mod 'Falcor' p.2.mp4
|
||||
Season 2010/s2010.e1202 - Oblivion Mod 'Falcor' p.2.nfo
|
||||
Season 2010/s2010.e1202 - Oblivion Mod "Falcor" p.2-thumb.jpg
|
||||
Season 2010/s2010.e1202 - Oblivion Mod "Falcor" p.2.mp4
|
||||
Season 2010/s2010.e1202 - Oblivion Mod "Falcor" p.2.nfo
|
||||
NFO tags:
|
||||
episodedetails:
|
||||
aired: 2010-12-02
|
||||
|
|
@ -127,9 +127,9 @@ Season 2011/s2011.e0321 - Jesse's Minecraft Server [Trailer - Mar.21].nfo
|
|||
season: 2011
|
||||
title: Jesse's Minecraft Server [Trailer - Mar.21]
|
||||
year: 2011
|
||||
Season 2011/s2011.e0529 - Project Zombie _Official Trailer_ (IP - mc.projectzombie.beastnode.net)-thumb.jpg
|
||||
Season 2011/s2011.e0529 - Project Zombie _Official Trailer_ (IP - mc.projectzombie.beastnode.net).mp4
|
||||
Season 2011/s2011.e0529 - Project Zombie _Official Trailer_ (IP - mc.projectzombie.beastnode.net).nfo
|
||||
Season 2011/s2011.e0529 - Project Zombie |Official Trailer| (IP: mc.projectzombie.beastnode.net)-thumb.jpg
|
||||
Season 2011/s2011.e0529 - Project Zombie |Official Trailer| (IP: mc.projectzombie.beastnode.net).mp4
|
||||
Season 2011/s2011.e0529 - Project Zombie |Official Trailer| (IP: mc.projectzombie.beastnode.net).nfo
|
||||
NFO tags:
|
||||
episodedetails:
|
||||
aired: 2011-05-29
|
||||
|
|
@ -154,9 +154,9 @@ Season 2011/s2011.e0529 - Project Zombie _Official Trailer_ (IP - mc.projectzomb
|
|||
season: 2011
|
||||
title: Project Zombie |Official Trailer| (IP: mc.projectzombie.beastnode.net)
|
||||
year: 2011
|
||||
Season 2011/s2011.e0630 - Project Zombie _Fin-thumb.jpg
|
||||
Season 2011/s2011.e0630 - Project Zombie _Fin.mp4
|
||||
Season 2011/s2011.e0630 - Project Zombie _Fin.nfo
|
||||
Season 2011/s2011.e0630 - Project Zombie |Fin|-thumb.jpg
|
||||
Season 2011/s2011.e0630 - Project Zombie |Fin|.mp4
|
||||
Season 2011/s2011.e0630 - Project Zombie |Fin|.nfo
|
||||
NFO tags:
|
||||
episodedetails:
|
||||
aired: 2011-06-30
|
||||
|
|
@ -167,9 +167,9 @@ Season 2011/s2011.e0630 - Project Zombie _Fin.nfo
|
|||
season: 2011
|
||||
title: Project Zombie |Fin|
|
||||
year: 2011
|
||||
Season 2011/s2011.e1121 - Skyrim 'Ultra HD w_Mods' [PC]-thumb.jpg
|
||||
Season 2011/s2011.e1121 - Skyrim 'Ultra HD w_Mods' [PC].mp4
|
||||
Season 2011/s2011.e1121 - Skyrim 'Ultra HD w_Mods' [PC].nfo
|
||||
Season 2011/s2011.e1121 - Skyrim 'Ultra HD w⧸Mods' [PC]-thumb.jpg
|
||||
Season 2011/s2011.e1121 - Skyrim 'Ultra HD w⧸Mods' [PC].mp4
|
||||
Season 2011/s2011.e1121 - Skyrim 'Ultra HD w⧸Mods' [PC].nfo
|
||||
NFO tags:
|
||||
episodedetails:
|
||||
aired: 2011-11-21
|
||||
|
|
@ -187,9 +187,9 @@ Season 2011/s2011.e1121 - Skyrim 'Ultra HD w_Mods' [PC].nfo
|
|||
season: 2011
|
||||
title: Skyrim 'Ultra HD w/Mods' [PC]
|
||||
year: 2011
|
||||
Season 2012/s2012.e0123 - Project Zombie _Map Trailer-thumb.jpg
|
||||
Season 2012/s2012.e0123 - Project Zombie _Map Trailer.mp4
|
||||
Season 2012/s2012.e0123 - Project Zombie _Map Trailer.nfo
|
||||
Season 2012/s2012.e0123 - Project Zombie |Map Trailer|-thumb.jpg
|
||||
Season 2012/s2012.e0123 - Project Zombie |Map Trailer|.mp4
|
||||
Season 2012/s2012.e0123 - Project Zombie |Map Trailer|.nfo
|
||||
NFO tags:
|
||||
episodedetails:
|
||||
aired: 2012-01-23
|
||||
|
|
@ -207,9 +207,9 @@ Season 2012/s2012.e0123 - Project Zombie _Map Trailer.nfo
|
|||
season: 2012
|
||||
title: Project Zombie |Map Trailer|
|
||||
year: 2012
|
||||
Season 2013/s2013.e0719 - Project Zombie Rewind _Trailer-thumb.jpg
|
||||
Season 2013/s2013.e0719 - Project Zombie Rewind _Trailer.mp4
|
||||
Season 2013/s2013.e0719 - Project Zombie Rewind _Trailer.nfo
|
||||
Season 2013/s2013.e0719 - Project Zombie Rewind |Trailer|-thumb.jpg
|
||||
Season 2013/s2013.e0719 - Project Zombie Rewind |Trailer|.mp4
|
||||
Season 2013/s2013.e0719 - Project Zombie Rewind |Trailer|.nfo
|
||||
NFO tags:
|
||||
episodedetails:
|
||||
aired: 2013-07-19
|
||||
|
|
@ -222,9 +222,9 @@ Season 2013/s2013.e0719 - Project Zombie Rewind _Trailer.nfo
|
|||
season: 2013
|
||||
title: Project Zombie Rewind |Trailer|
|
||||
year: 2013
|
||||
Season 2018/s2018.e1029 - Jesse's Minecraft Server _ Teaser Trailer-thumb.jpg
|
||||
Season 2018/s2018.e1029 - Jesse's Minecraft Server _ Teaser Trailer.mp4
|
||||
Season 2018/s2018.e1029 - Jesse's Minecraft Server _ Teaser Trailer.nfo
|
||||
Season 2018/s2018.e1029 - Jesse's Minecraft Server | Teaser Trailer-thumb.jpg
|
||||
Season 2018/s2018.e1029 - Jesse's Minecraft Server | Teaser Trailer.mp4
|
||||
Season 2018/s2018.e1029 - Jesse's Minecraft Server | Teaser Trailer.nfo
|
||||
NFO tags:
|
||||
episodedetails:
|
||||
aired: 2018-10-29
|
||||
|
|
@ -242,9 +242,9 @@ Season 2018/s2018.e1029 - Jesse's Minecraft Server _ Teaser Trailer.nfo
|
|||
season: 2018
|
||||
title: Jesse's Minecraft Server | Teaser Trailer
|
||||
year: 2018
|
||||
Season 2018/s2018.e1102 - Jesse's Minecraft Server _ IP mc.jesse.id-thumb.jpg
|
||||
Season 2018/s2018.e1102 - Jesse's Minecraft Server _ IP mc.jesse.id.mp4
|
||||
Season 2018/s2018.e1102 - Jesse's Minecraft Server _ IP mc.jesse.id.nfo
|
||||
Season 2018/s2018.e1102 - Jesse's Minecraft Server | IP mc.jesse.id-thumb.jpg
|
||||
Season 2018/s2018.e1102 - Jesse's Minecraft Server | IP mc.jesse.id.mp4
|
||||
Season 2018/s2018.e1102 - Jesse's Minecraft Server | IP mc.jesse.id.nfo
|
||||
NFO tags:
|
||||
episodedetails:
|
||||
aired: 2018-11-02
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
Files created in '{output_directory}'
|
||||
----------------------------------------
|
||||
.ytdl-sub-pz-download-archive.json
|
||||
Season 2018/s2018.e1029 - Jesse's Minecraft Server _ Teaser Trailer-thumb.jpg
|
||||
Season 2018/s2018.e1029 - Jesse's Minecraft Server _ Teaser Trailer.mp4
|
||||
Season 2018/s2018.e1029 - Jesse's Minecraft Server _ Teaser Trailer.nfo
|
||||
Season 2018/s2018.e1029 - Jesse's Minecraft Server | Teaser Trailer-thumb.jpg
|
||||
Season 2018/s2018.e1029 - Jesse's Minecraft Server | Teaser Trailer.mp4
|
||||
Season 2018/s2018.e1029 - Jesse's Minecraft Server | Teaser Trailer.nfo
|
||||
NFO tags:
|
||||
episodedetails:
|
||||
aired: 2018-10-29
|
||||
|
|
@ -21,9 +21,9 @@ Season 2018/s2018.e1029 - Jesse's Minecraft Server _ Teaser Trailer.nfo
|
|||
season: 2018
|
||||
title: Jesse's Minecraft Server | Teaser Trailer
|
||||
year: 2018
|
||||
Season 2018/s2018.e1102 - Jesse's Minecraft Server _ IP mc.jesse.id-thumb.jpg
|
||||
Season 2018/s2018.e1102 - Jesse's Minecraft Server _ IP mc.jesse.id.mp4
|
||||
Season 2018/s2018.e1102 - Jesse's Minecraft Server _ IP mc.jesse.id.nfo
|
||||
Season 2018/s2018.e1102 - Jesse's Minecraft Server | IP mc.jesse.id-thumb.jpg
|
||||
Season 2018/s2018.e1102 - Jesse's Minecraft Server | IP mc.jesse.id.mp4
|
||||
Season 2018/s2018.e1102 - Jesse's Minecraft Server | IP mc.jesse.id.nfo
|
||||
NFO tags:
|
||||
episodedetails:
|
||||
aired: 2018-11-02
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
Files created in '{output_directory}'
|
||||
----------------------------------------
|
||||
JMC - Oblivion Mod 'Falcor' p.1-thumb.jpg
|
||||
JMC - Oblivion Mod 'Falcor' p.1.mp4
|
||||
JMC - Oblivion Mod 'Falcor' p.1.nfo
|
||||
JMC - Oblivion Mod "Falcor" p.1-thumb.jpg
|
||||
JMC - Oblivion Mod "Falcor" p.1.mp4
|
||||
JMC - Oblivion Mod "Falcor" p.1.nfo
|
||||
NFO tags:
|
||||
musicvideo:
|
||||
album: Music Videos
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
Files created in '{output_directory}'
|
||||
----------------------------------------
|
||||
JMC - Oblivion Mod 'Falcor' p.1-thumb.jpg
|
||||
JMC - Oblivion Mod 'Falcor' p.1.mp4
|
||||
JMC - Oblivion Mod "Falcor" p.1-thumb.jpg
|
||||
JMC - Oblivion Mod "Falcor" p.1.mp4
|
||||
Chapters embedded into the video:
|
||||
0:00: Intro
|
||||
0:10: Part 1
|
||||
|
|
@ -9,7 +9,7 @@ JMC - Oblivion Mod 'Falcor' p.1.mp4
|
|||
0:30: Part 3
|
||||
0:40: Part 4
|
||||
1:01: Part 5
|
||||
JMC - Oblivion Mod 'Falcor' p.1.nfo
|
||||
JMC - Oblivion Mod "Falcor" p.1.nfo
|
||||
NFO tags:
|
||||
musicvideo:
|
||||
album: Music Videos
|
||||
|
|
|
|||
|
|
@ -108,9 +108,9 @@ def expected_full_channel_download():
|
|||
ExpectedDownloadFile(path=Path("Season 2018/s2018.e1029 - Jesse's Minecraft Server _ Teaser Trailer.mp4"), md5="82f6ee7253e1dbb83ae7215af08ffacc"),
|
||||
ExpectedDownloadFile(path=Path("Season 2018/s2018.e1029 - Jesse's Minecraft Server _ Teaser Trailer.nfo"), md5="cc7886aae3af6b7b0facd82f95390242"),
|
||||
|
||||
ExpectedDownloadFile(path=Path("Season 2018/s2018.e1102 - Jesse's Minecraft Server _ IP mc.jesse.id-thumb.jpg"), md5="49cc64b25314155c1b8ab0361ac0c34f"),
|
||||
ExpectedDownloadFile(path=Path("Season 2018/s2018.e1102 - Jesse's Minecraft Server _ IP mc.jesse.id.mp4"), md5="e733b4cc385b953b08c8eb0f47e03c1e"),
|
||||
ExpectedDownloadFile(path=Path("Season 2018/s2018.e1102 - Jesse's Minecraft Server _ IP mc.jesse.id.nfo"), md5="2b3ccb3f1ef81ee49fe1afb88f275a09"),
|
||||
ExpectedDownloadFile(path=Path("Season 2018/s2018.e1102 - Jesse's Minecraft Server | IP mc.jesse.id-thumb.jpg"), md5="49cc64b25314155c1b8ab0361ac0c34f"),
|
||||
ExpectedDownloadFile(path=Path("Season 2018/s2018.e1102 - Jesse's Minecraft Server | IP mc.jesse.id.mp4"), md5="e733b4cc385b953b08c8eb0f47e03c1e"),
|
||||
ExpectedDownloadFile(path=Path("Season 2018/s2018.e1102 - Jesse's Minecraft Server | IP mc.jesse.id.nfo"), md5="2b3ccb3f1ef81ee49fe1afb88f275a09"),
|
||||
]
|
||||
)
|
||||
# fmt: on
|
||||
|
|
|
|||
|
|
@ -1,10 +1,7 @@
|
|||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
from conftest import preset_dict_to_dl_args
|
||||
from e2e.conftest import mock_run_from_cli
|
||||
from e2e.expected_download import ExpectedDownloadFile
|
||||
from e2e.expected_download import ExpectedDownloads
|
||||
from e2e.expected_download import assert_expected_downloads
|
||||
from e2e.expected_transaction_log import assert_transaction_log_matches
|
||||
|
||||
from ytdl_sub.subscriptions.subscription import Subscription
|
||||
|
|
@ -30,41 +27,12 @@ def single_video_preset_dict_dl_args(single_video_preset_dict):
|
|||
return preset_dict_to_dl_args(single_video_preset_dict)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def expected_single_video_download():
|
||||
# turn off black formatter here for readability
|
||||
# fmt: off
|
||||
return ExpectedDownloads(
|
||||
expected_downloads=[
|
||||
ExpectedDownloadFile(path=Path("JMC - Oblivion Mod 'Falcor' p.1-thumb.jpg"), md5="fb95b510681676e81c321171fc23143e"),
|
||||
ExpectedDownloadFile(path=Path("JMC - Oblivion Mod 'Falcor' p.1.mp4"), md5="931a705864c57d21d6fedebed4af6bbc"),
|
||||
ExpectedDownloadFile(path=Path("JMC - Oblivion Mod 'Falcor' p.1.nfo"), md5="89f509a8a3d9003e22a9091abeeae5dc"),
|
||||
]
|
||||
)
|
||||
# fmt: on
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def expected_single_video_with_chapter_timestamps_download():
|
||||
# turn off black formatter here for readability
|
||||
# fmt: off
|
||||
return ExpectedDownloads(
|
||||
expected_downloads=[
|
||||
ExpectedDownloadFile(path=Path("JMC - Oblivion Mod 'Falcor' p.1-thumb.jpg"), md5="fb95b510681676e81c321171fc23143e"),
|
||||
ExpectedDownloadFile(path=Path("JMC - Oblivion Mod 'Falcor' p.1.mp4"), md5="76b8a7dd428e67e5072d003983bb7e33"),
|
||||
ExpectedDownloadFile(path=Path("JMC - Oblivion Mod 'Falcor' p.1.nfo"), md5="89f509a8a3d9003e22a9091abeeae5dc"),
|
||||
]
|
||||
)
|
||||
# fmt: on
|
||||
|
||||
|
||||
class TestYoutubeVideo:
|
||||
@pytest.mark.parametrize("dry_run", [True, False])
|
||||
def test_single_video_download(
|
||||
self,
|
||||
music_video_config,
|
||||
single_video_preset_dict,
|
||||
expected_single_video_download,
|
||||
output_directory,
|
||||
dry_run,
|
||||
):
|
||||
|
|
@ -74,14 +42,17 @@ class TestYoutubeVideo:
|
|||
preset_dict=single_video_preset_dict,
|
||||
)
|
||||
|
||||
transaction_log = single_video_subscription.download()
|
||||
transaction_log = single_video_subscription.download(dry_run=dry_run)
|
||||
assert_transaction_log_matches(
|
||||
output_directory=output_directory,
|
||||
transaction_log=transaction_log,
|
||||
transaction_log_summary_file_name="youtube/test_video.txt",
|
||||
)
|
||||
if not dry_run:
|
||||
expected_single_video_download.assert_files_exist(relative_directory=output_directory)
|
||||
assert_expected_downloads(
|
||||
output_directory=output_directory,
|
||||
dry_run=dry_run,
|
||||
expected_download_summary_file_name="youtube/test_video.json"
|
||||
)
|
||||
|
||||
@pytest.mark.parametrize("dry_run", [True, False])
|
||||
def test_single_video_download_from_cli_dl(
|
||||
|
|
@ -105,8 +76,11 @@ class TestYoutubeVideo:
|
|||
transaction_log=transaction_log,
|
||||
transaction_log_summary_file_name="youtube/test_video.txt",
|
||||
)
|
||||
if not dry_run:
|
||||
expected_single_video_download.assert_files_exist(relative_directory=output_directory)
|
||||
assert_expected_downloads(
|
||||
output_directory=output_directory,
|
||||
dry_run=dry_run,
|
||||
expected_download_summary_file_name="youtube/test_video.json"
|
||||
)
|
||||
|
||||
@pytest.mark.parametrize("dry_run", [True, False])
|
||||
def test_single_video_with_timestamp_chapters_download(
|
||||
|
|
@ -114,7 +88,6 @@ class TestYoutubeVideo:
|
|||
timestamps_file_path,
|
||||
music_video_config,
|
||||
single_video_preset_dict,
|
||||
expected_single_video_with_chapter_timestamps_download,
|
||||
output_directory,
|
||||
dry_run,
|
||||
):
|
||||
|
|
@ -125,13 +98,14 @@ class TestYoutubeVideo:
|
|||
preset_dict=single_video_preset_dict,
|
||||
)
|
||||
|
||||
transaction_log = single_video_subscription.download()
|
||||
transaction_log = single_video_subscription.download(dry_run=dry_run)
|
||||
assert_transaction_log_matches(
|
||||
output_directory=output_directory,
|
||||
transaction_log=transaction_log,
|
||||
transaction_log_summary_file_name="youtube/test_video_with_chapter_timestamps.txt",
|
||||
)
|
||||
if not dry_run:
|
||||
expected_single_video_with_chapter_timestamps_download.assert_files_exist(
|
||||
relative_directory=output_directory
|
||||
)
|
||||
assert_expected_downloads(
|
||||
output_directory=output_directory,
|
||||
dry_run=dry_run,
|
||||
expected_download_summary_file_name="youtube/test_video_with_chapter_timestamps.json"
|
||||
)
|
||||
|
|
|
|||
Loading…
Reference in a new issue