From 5ff239bc0e28c62ad92dd38319888f9f3e958d55 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Mon, 25 Sep 2023 23:13:41 -0700 Subject: [PATCH] clean up tests, WIP --- src/ytdl_sub/subscriptions/subscription.py | 4 +- tests/unit/config/test_subscription.py | 129 +++++++++++++++------ 2 files changed, 98 insertions(+), 35 deletions(-) diff --git a/src/ytdl_sub/subscriptions/subscription.py b/src/ytdl_sub/subscriptions/subscription.py index 15f45014..4c4c819e 100644 --- a/src/ytdl_sub/subscriptions/subscription.py +++ b/src/ytdl_sub/subscriptions/subscription.py @@ -65,7 +65,9 @@ class Subscription(SubscriptionDownload): ) @classmethod - def _maybe_get_subscription_value(cls, config: ConfigFile, subscription_dict: Dict) -> Optional[str]: + def _maybe_get_subscription_value( + cls, config: ConfigFile, subscription_dict: Dict + ) -> Optional[str]: if FILE_SUBSCRIPTION_VALUE_KEY in subscription_dict: if not isinstance(subscription_dict[FILE_SUBSCRIPTION_VALUE_KEY], str): raise ValidationException( diff --git a/tests/unit/config/test_subscription.py b/tests/unit/config/test_subscription.py index 18a2bcd9..bc36a3df 100644 --- a/tests/unit/config/test_subscription.py +++ b/tests/unit/config/test_subscription.py @@ -1,8 +1,10 @@ import re +from contextlib import contextmanager from typing import Dict from unittest.mock import patch import pytest +from mergedeep import mergedeep from ytdl_sub.config.config_file import ConfigFile from ytdl_sub.plugins.nfo_tags import NfoTagsOptions @@ -11,6 +13,22 @@ from ytdl_sub.subscriptions.subscription import Subscription from ytdl_sub.utils.exceptions import ValidationException +@pytest.fixture +def config_file_with_subscription_value(config_file: ConfigFile): + config_dict = config_file.as_dict() + mergedeep.merge( + config_dict, {"configuration": {"subscription_value": "test_config_subscription_value"}} + ) + return ConfigFile.from_dict(config_dict) + + +@contextmanager +def mock_load_yaml(preset_dict: Dict) -> None: + with patch("ytdl_sub.subscriptions.subscription.load_yaml") as mock_load_yaml: + mock_load_yaml.return_value = preset_dict + yield + + @pytest.fixture def preset_file(youtube_video: Dict, output_options: Dict): with patch("ytdl_sub.subscriptions.subscription.load_yaml") as mock_load_yaml: @@ -21,9 +39,11 @@ def preset_file(youtube_video: Dict, output_options: Dict): "nfo_tags": { "tags": {"key-3": "file_preset"}, }, - "overrides": {"test_override": "original"}, + "overrides": { + "test_file_subscription_value": "original", + "test_config_subscription_value": "original", + }, }, - "__value__": "test_override", "test_preset": { "preset": "parent_preset_3", "nfo_tags": { @@ -34,6 +54,28 @@ def preset_file(youtube_video: Dict, output_options: Dict): yield +@pytest.fixture +def preset_with_subscription_value(youtube_video: Dict, output_options: Dict): + with patch("ytdl_sub.subscriptions.subscription.load_yaml") as mock_load_yaml: + mock_load_yaml.return_value = { + "__preset__": { + "preset": "parent_preset_3", + "download": youtube_video, + "output_options": output_options, + "nfo_tags": { + "tags": {"key-3": "file_preset"}, + }, + "overrides": { + "test_file_subscription_value": "original", + "test_config_subscription_value": "original", + }, + }, + "__value__": "test_file_subscription_value", + "test_value": "is_overwritten", + } + yield + + @pytest.fixture def preset_file_with_value(youtube_video: Dict, output_options: Dict): with patch("ytdl_sub.subscriptions.subscription.load_yaml") as mock_load_yaml: @@ -45,37 +87,17 @@ def preset_file_with_value(youtube_video: Dict, output_options: Dict): "nfo_tags": { "tags": {"key-3": "file_preset"}, }, - "overrides": {"test_override": "original"}, + "overrides": { + "test_file_subscription_value": "original", + "test_config_subscription_value": "original", + }, }, - "__value__": "test_override", + "__value__": "test_file_subscription_value", "test_value": "is_overwritten", } yield -@pytest.fixture -def preset_file_invalid_value(): - with patch("ytdl_sub.subscriptions.subscription.load_yaml") as mock_load_yaml: - mock_load_yaml.return_value = { - "__value__": {"should be": "string"}, - } - yield - - -@pytest.fixture -def preset_file_subscription_using_value_when_not_defined(): - with patch("ytdl_sub.subscriptions.subscription.load_yaml") as mock_load_yaml: - mock_load_yaml.return_value = {"sub_name": "single value, __value__ not defined"} - yield - - -@pytest.fixture -def preset_file_subscription_with_invalid_form(): - with patch("ytdl_sub.subscriptions.subscription.load_yaml") as mock_load_yaml: - mock_load_yaml.return_value = {"sub_name": 4332} - yield - - @pytest.mark.usefixtures(preset_file.__name__) def test_subscription_file_preset_applies(config_file: ConfigFile): subs = Subscription.from_file_path(config=config_file, subscription_path="mocked") @@ -103,12 +125,51 @@ def test_subscription_file_value_applies(config_file: ConfigFile): # Test __value__ worked correctly value_sub = subs[0] - assert value_sub.overrides.dict_with_format_strings.get("test_override") == "is_overwritten" + assert ( + value_sub.overrides.dict_with_format_strings.get("test_file_subscription_value") + == "is_overwritten" + ) + assert ( + value_sub.overrides.dict_with_format_strings.get("test_config_subscription_value") + == "original" + ) + + +@pytest.mark.usefixtures(preset_file_with_value.__name__) +def test_subscription_file_value_applies_sub_file_takes_precedence( + config_file_with_subscription_value: ConfigFile, +): + subs = Subscription.from_file_path( + config=config_file_with_subscription_value, subscription_path="mocked" + ) + assert len(subs) == 1 + + # Test __value__ worked correctly + value_sub = subs[0] + assert ( + value_sub.overrides.dict_with_format_strings.get("test_file_subscription_value") + == "is_overwritten" + ) + assert ( + value_sub.overrides.dict_with_format_strings.get("test_config_subscription_value") + == "original" + ) + + +# @pytest.mark.usefixtures(preset_file.__name__) +# def test_subscription_file_value_applies_from_config(config_file: ConfigFile): +# subs = Subscription.from_file_path(config=config_file, subscription_path="mocked") +# assert len(subs) == 1 +# +# # Test __value__ worked correctly +# value_sub = subs[0] +# assert value_sub.overrides.dict_with_format_strings.get("test_file_subscription_value") == "original" +# assert value_sub.overrides.dict_with_format_strings.get( +# "test_config_subscription_value") == "is_overwritten" -@pytest.mark.usefixtures(preset_file_invalid_value.__name__) def test_subscription_file_bad_value(config_file: ConfigFile): - with pytest.raises( + with mock_load_yaml(preset_dict={"__value__": {"should be": "string"}}), pytest.raises( ValidationException, match=re.escape( f"Using {FILE_SUBSCRIPTION_VALUE_KEY} in a subscription" @@ -118,9 +179,10 @@ def test_subscription_file_bad_value(config_file: ConfigFile): _ = Subscription.from_file_path(config=config_file, subscription_path="mocked") -@pytest.mark.usefixtures(preset_file_subscription_using_value_when_not_defined.__name__) def test_subscription_file_using_value_when_not_defined(config_file: ConfigFile): - with pytest.raises( + with mock_load_yaml( + preset_dict={"sub_name": "single value, __value__ not defined"} + ), pytest.raises( ValidationException, match=re.escape( f"Subscription sub_name is a string, but " @@ -130,9 +192,8 @@ def test_subscription_file_using_value_when_not_defined(config_file: ConfigFile) _ = Subscription.from_file_path(config=config_file, subscription_path="mocked") -@pytest.mark.usefixtures(preset_file_subscription_with_invalid_form.__name__) def test_subscription_file_invalid_form(config_file: ConfigFile): - with pytest.raises( + with mock_load_yaml(preset_dict={"sub_name": 4332}), pytest.raises( ValidationException, match=re.escape(f"Subscription sub_name should be in the form of a preset"), ):