From 4292b0c629752793f81467d3acb038a07f268dc9 Mon Sep 17 00:00:00 2001 From: jbannon Date: Sun, 7 Aug 2022 21:52:15 +0000 Subject: [PATCH] test main completely --- tests/conftest.py | 18 +++++++++++++ tests/e2e/youtube/test_playlist.py | 42 ++++++++++++++++++++++++++++++ tests/unit/utils/test_yaml.py | 4 +-- 3 files changed, 62 insertions(+), 2 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index fd7e8944..3855b9a0 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,10 +1,15 @@ import contextlib +import json import logging +import tempfile from typing import Any +from typing import Callable from typing import Dict from typing import List from unittest.mock import patch +import pytest + from ytdl_sub.utils.logger import Logger @@ -59,3 +64,16 @@ def preset_dict_to_dl_args(preset_dict: Dict) -> str: return [f"--{cli_key} {current_value}"] return " ".join(_recursive_preset_args(cli_key="", current_value=preset_dict)) + + +@pytest.fixture +def preset_dict_to_subscription_yaml_generator() -> Callable: + @contextlib.contextmanager + def _preset_dict_to_subscription_yaml_generator(subscription_name: str, preset_dict: Dict): + subscription_dict = {subscription_name: preset_dict} + with tempfile.NamedTemporaryFile(suffix=".yaml") as tmp_file: + tmp_file.write(json.dumps(subscription_dict).encode("utf-8")) + tmp_file.flush() + yield tmp_file.name + + return _preset_dict_to_subscription_yaml_generator diff --git a/tests/e2e/youtube/test_playlist.py b/tests/e2e/youtube/test_playlist.py index 4065d443..e3e27b7a 100644 --- a/tests/e2e/youtube/test_playlist.py +++ b/tests/e2e/youtube/test_playlist.py @@ -2,6 +2,7 @@ from pathlib import Path import pytest from conftest import assert_debug_log +from e2e.conftest import mock_run_from_cli from e2e.expected_download import ExpectedDownloadFile from e2e.expected_download import ExpectedDownloads from e2e.expected_transaction_log import assert_transaction_log_matches @@ -90,3 +91,44 @@ class TestPlaylistAsKodiMusicVideo: transaction_log = playlist_subscription.download() expected_playlist_download.assert_files_exist(relative_directory=output_directory) assert transaction_log.is_empty + + @pytest.mark.parametrize("dry_run", [True, False]) + def test_playlist_download_from_cli_sub( + self, + preset_dict_to_subscription_yaml_generator, + music_video_config_path, + playlist_preset_dict, + expected_playlist_download, + output_directory, + dry_run, + ): + with preset_dict_to_subscription_yaml_generator( + subscription_name="music_video_playlist_test", preset_dict=playlist_preset_dict + ) as subscription_path: + args = "--dry-run " if dry_run else "" + args += f"--config {music_video_config_path} " + args += f"sub {subscription_path}" + subscription_transaction_log = mock_run_from_cli(args=args) + + assert len(subscription_transaction_log) == 1 + transaction_log = subscription_transaction_log[0][1] + + assert_transaction_log_matches( + output_directory=output_directory, + transaction_log=transaction_log, + transaction_log_summary_file_name="youtube/test_playlist.txt", + ) + + if not dry_run: + expected_playlist_download.assert_files_exist(relative_directory=output_directory) + + # Ensure another invocation will hit ExistingVideoReached + with assert_debug_log( + logger=ytdl_sub.downloaders.downloader.download_logger, + expected_message="ExistingVideoReached, stopping additional downloads", + ): + transaction_log = mock_run_from_cli(args=args)[0][1] + expected_playlist_download.assert_files_exist( + relative_directory=output_directory + ) + assert transaction_log.is_empty diff --git a/tests/unit/utils/test_yaml.py b/tests/unit/utils/test_yaml.py index 1ccdbee2..1f257745 100644 --- a/tests/unit/utils/test_yaml.py +++ b/tests/unit/utils/test_yaml.py @@ -8,7 +8,7 @@ from ytdl_sub.utils.yaml import load_yaml @pytest.fixture -def bad_yaml(): +def bad_yaml() -> str: return """ this: is: @@ -20,7 +20,7 @@ def bad_yaml(): @pytest.fixture -def bad_yaml_file_path(bad_yaml): +def bad_yaml_file_path(bad_yaml) -> str: with tempfile.NamedTemporaryFile(suffix=".yaml") as tmp_file: tmp_file.write(bad_yaml.encode("utf-8")) tmp_file.flush()