more fail tests
This commit is contained in:
parent
c3e6114274
commit
9646a3bd65
5 changed files with 140 additions and 9 deletions
|
|
@ -145,7 +145,9 @@ class Preset(StrictDictValidator):
|
||||||
|
|
||||||
plugin = PluginMapping.get(plugin=key)
|
plugin = PluginMapping.get(plugin=key)
|
||||||
plugin_options = self._validate_key(key=key, validator=plugin.plugin_options_type)
|
plugin_options = self._validate_key(key=key, validator=plugin.plugin_options_type)
|
||||||
plugin_options.validate_with_source_variables(source_variables=self._source_variables)
|
plugin_options.validate_with_variables(
|
||||||
|
source_variables=self._source_variables, override_variables=self.overrides.keys
|
||||||
|
)
|
||||||
|
|
||||||
plugins.append((plugin, plugin_options))
|
plugins.append((plugin, plugin_options))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,15 +32,18 @@ class PluginOptions(StrictDictValidator):
|
||||||
return []
|
return []
|
||||||
|
|
||||||
# pylint: disable=unused-argument
|
# pylint: disable=unused-argument
|
||||||
def validate_with_source_variables(self, source_variables: List[str]) -> None:
|
def validate_with_variables(
|
||||||
|
self, source_variables: List[str], override_variables: List[str]
|
||||||
|
) -> None:
|
||||||
"""
|
"""
|
||||||
Performs validation after init using the source variables, in case the plugin
|
Optional validation after init with the session's source and override variables.
|
||||||
depends on specific source variables.
|
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
source_variables
|
source_variables
|
||||||
Source variables to be used when running the plugin
|
Available source variables when running the plugin
|
||||||
|
override_variables
|
||||||
|
Available override variables when running the plugin
|
||||||
"""
|
"""
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ class SourceVariableRegex(StrictDictValidator):
|
||||||
# If there are capture groups, ensure there are capture group names
|
# If there are capture groups, ensure there are capture group names
|
||||||
if len(self._capture_group_names.list) != self._match.num_capture_groups:
|
if len(self._capture_group_names.list) != self._match.num_capture_groups:
|
||||||
raise self._validation_exception(
|
raise self._validation_exception(
|
||||||
f"Number of capture group names must match number of capture groups, "
|
f"number of capture group names must match number of capture groups, "
|
||||||
f"{len(self._capture_group_names.list)} != {self._match.num_capture_groups}"
|
f"{len(self._capture_group_names.list)} != {self._match.num_capture_groups}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -148,21 +148,39 @@ class RegexOptions(PluginOptions):
|
||||||
key="skip_if_match_fails", validator=BoolValidator, default=False
|
key="skip_if_match_fails", validator=BoolValidator, default=False
|
||||||
).value
|
).value
|
||||||
|
|
||||||
def validate_with_source_variables(self, source_variables: List[str]) -> None:
|
def validate_with_variables(
|
||||||
|
self, source_variables: List[str], override_variables: List[str]
|
||||||
|
) -> None:
|
||||||
"""
|
"""
|
||||||
Ensures each source variable capture group is valid
|
Ensures each source variable capture group is valid
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
source_variables
|
source_variables
|
||||||
Variables to check against the provided capture groups
|
Available source variables when running the plugin
|
||||||
|
override_variables
|
||||||
|
Available override variables when running the plugin
|
||||||
"""
|
"""
|
||||||
for key in self.source_variable_capture_dict.keys():
|
for key, regex_options in self.source_variable_capture_dict.items():
|
||||||
|
# Ensure each variable getting captured is a source variable
|
||||||
if key not in source_variables:
|
if key not in source_variables:
|
||||||
raise self._validation_exception(
|
raise self._validation_exception(
|
||||||
f"cannot regex capture '{key}' because it is not a source variable"
|
f"cannot regex capture '{key}' because it is not a source variable"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Ensure the capture group names are not existing source/override variables
|
||||||
|
for capture_group_name in regex_options.capture_group_names:
|
||||||
|
if capture_group_name in source_variables:
|
||||||
|
raise self._validation_exception(
|
||||||
|
f"'{capture_group_name}' cannot be used as a capture group name because it "
|
||||||
|
f"is a source variable"
|
||||||
|
)
|
||||||
|
if capture_group_name in override_variables:
|
||||||
|
raise self._validation_exception(
|
||||||
|
f"'{capture_group_name}' cannot be used as a capture group name because it "
|
||||||
|
f"is an override variable"
|
||||||
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def source_variable_capture_dict(self) -> Dict[str, SourceVariableRegex]:
|
def source_variable_capture_dict(self) -> Dict[str, SourceVariableRegex]:
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import copy
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from typing import Dict
|
||||||
from typing import List
|
from typing import List
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from typing import Tuple
|
from typing import Tuple
|
||||||
|
|
@ -318,3 +319,30 @@ class Subscription:
|
||||||
preset_options=preset,
|
preset_options=preset,
|
||||||
config_options=config.config_options,
|
config_options=config.config_options,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls, config: ConfigFile, preset_name: str, preset_dict: Dict) -> "Subscription":
|
||||||
|
"""
|
||||||
|
Creates a subscription from a preset dict
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
config:
|
||||||
|
Validated instance of the config
|
||||||
|
preset_name:
|
||||||
|
Name of the preset
|
||||||
|
preset_dict:
|
||||||
|
The preset config in dict format
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
Initialized subscription
|
||||||
|
"""
|
||||||
|
return cls.from_preset(
|
||||||
|
preset=Preset.from_dict(
|
||||||
|
config=config,
|
||||||
|
preset_name=preset_name,
|
||||||
|
preset_dict=preset_dict,
|
||||||
|
),
|
||||||
|
config=config,
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
import copy
|
||||||
import re
|
import re
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
@ -6,6 +7,7 @@ from e2e.expected_transaction_log import assert_transaction_log_matches
|
||||||
from ytdl_sub.config.preset import Preset
|
from ytdl_sub.config.preset import Preset
|
||||||
from ytdl_sub.subscriptions.subscription import Subscription
|
from ytdl_sub.subscriptions.subscription import Subscription
|
||||||
from ytdl_sub.utils.exceptions import RegexNoMatchException
|
from ytdl_sub.utils.exceptions import RegexNoMatchException
|
||||||
|
from ytdl_sub.utils.exceptions import ValidationException
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
|
|
@ -123,3 +125,81 @@ class TestRegex:
|
||||||
),
|
),
|
||||||
):
|
):
|
||||||
_ = playlist_subscription_no_match_fails.download(dry_run=True)
|
_ = playlist_subscription_no_match_fails.download(dry_run=True)
|
||||||
|
|
||||||
|
def test_regex_fails_capture_group_is_source_variable(
|
||||||
|
self, regex_subscription_dict, music_video_config
|
||||||
|
):
|
||||||
|
regex_subscription_dict["regex"]["from"]["title"]["capture_group_names"][0] = "uid"
|
||||||
|
with pytest.raises(
|
||||||
|
ValidationException,
|
||||||
|
match=re.escape(
|
||||||
|
"'uid' cannot be used as a capture group name because it is a source variable"
|
||||||
|
),
|
||||||
|
):
|
||||||
|
_ = Subscription.from_dict(
|
||||||
|
config=music_video_config,
|
||||||
|
preset_name="test_regex_fails_capture_group_is_source_variable",
|
||||||
|
preset_dict=regex_subscription_dict,
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_regex_fails_capture_group_is_override_variable(
|
||||||
|
self, regex_subscription_dict, music_video_config
|
||||||
|
):
|
||||||
|
regex_subscription_dict["regex"]["from"]["title"]["capture_group_names"][
|
||||||
|
0
|
||||||
|
] = "in_regex_default"
|
||||||
|
with pytest.raises(
|
||||||
|
ValidationException,
|
||||||
|
match=re.escape(
|
||||||
|
"'in_regex_default' cannot be used as a capture group name because it is an override variable"
|
||||||
|
),
|
||||||
|
):
|
||||||
|
_ = Subscription.from_dict(
|
||||||
|
config=music_video_config,
|
||||||
|
preset_name="test_regex_fails_capture_group_is_override_variable",
|
||||||
|
preset_dict=regex_subscription_dict,
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_regex_fails_source_variable_does_not_exist(
|
||||||
|
self, regex_subscription_dict, music_video_config
|
||||||
|
):
|
||||||
|
regex_subscription_dict["regex"]["from"]["dne"] = copy.deepcopy(
|
||||||
|
regex_subscription_dict["regex"]["from"]["title"]
|
||||||
|
)
|
||||||
|
with pytest.raises(
|
||||||
|
ValidationException,
|
||||||
|
match=re.escape("cannot regex capture 'dne' because it is not a source variable"),
|
||||||
|
):
|
||||||
|
_ = Subscription.from_dict(
|
||||||
|
config=music_video_config,
|
||||||
|
preset_name="test_regex_fails_source_variable_does_not_exist",
|
||||||
|
preset_dict=regex_subscription_dict,
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_regex_fails_unequal_defaults(self, regex_subscription_dict, music_video_config):
|
||||||
|
regex_subscription_dict["regex"]["from"]["title"]["defaults"] = ["1 != 2"]
|
||||||
|
with pytest.raises(
|
||||||
|
ValidationException,
|
||||||
|
match=re.escape("number of defaults must match number of capture groups, 1 != 2"),
|
||||||
|
):
|
||||||
|
_ = Subscription.from_dict(
|
||||||
|
config=music_video_config,
|
||||||
|
preset_name="test_regex_fails_unequal_defaults",
|
||||||
|
preset_dict=regex_subscription_dict,
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_regex_fails_unequal_capture_group_names(
|
||||||
|
self, regex_subscription_dict, music_video_config
|
||||||
|
):
|
||||||
|
regex_subscription_dict["regex"]["from"]["title"]["capture_group_names"].append("unequal")
|
||||||
|
with pytest.raises(
|
||||||
|
ValidationException,
|
||||||
|
match=re.escape(
|
||||||
|
"number of capture group names must match number of capture groups, 3 != 2"
|
||||||
|
),
|
||||||
|
):
|
||||||
|
_ = Subscription.from_dict(
|
||||||
|
config=music_video_config,
|
||||||
|
preset_name="test_regex_fails_unequal_capture_group_names",
|
||||||
|
preset_dict=regex_subscription_dict,
|
||||||
|
)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue