overrides formatter tests

This commit is contained in:
jbannon 2022-04-12 06:10:05 +00:00
parent 5969cd0268
commit 21e8e6fa51

View file

@ -1,6 +1,12 @@
import pytest import pytest
from ytdl_subscribe.validators.base.string_formatter_validators import DictFormatterValidator from ytdl_subscribe.validators.base.string_formatter_validators import DictFormatterValidator
from ytdl_subscribe.validators.base.string_formatter_validators import (
OverridesDictFormatterValidator,
)
from ytdl_subscribe.validators.base.string_formatter_validators import (
OverridesStringFormatterValidator,
)
from ytdl_subscribe.validators.base.string_formatter_validators import StringFormatterValidator from ytdl_subscribe.validators.base.string_formatter_validators import StringFormatterValidator
from ytdl_subscribe.validators.exceptions import StringFormattingException from ytdl_subscribe.validators.exceptions import StringFormattingException
from ytdl_subscribe.validators.exceptions import ValidationException from ytdl_subscribe.validators.exceptions import ValidationException
@ -22,18 +28,21 @@ def error_message_unequal_regex_matches_str():
) )
@pytest.mark.parametrize(
"string_formatter_class", [StringFormatterValidator, OverridesStringFormatterValidator]
)
class TestStringFormatterValidator(object): class TestStringFormatterValidator(object):
def test_parse(self): def test_parse(self, string_formatter_class):
format_string = "Here is my {var_one} and {var_two} 💩" format_string = "Here is my {var_one} and {var_two} 💩"
validator = StringFormatterValidator(name="test_format_variables", value=format_string) validator = string_formatter_class(name="test_format_variables", value=format_string)
assert validator.format_string == format_string assert validator.format_string == format_string
assert validator.format_variables == ["var_one", "var_two"] assert validator.format_variables == ["var_one", "var_two"]
def test_format_variables(self): def test_format_variables(self, string_formatter_class):
format_string = "No vars 💩" format_string = "No vars 💩"
assert ( assert (
StringFormatterValidator( string_formatter_class(
name="test_format_variables_empty", value=format_string name="test_format_variables_empty", value=format_string
).format_variables ).format_variables
== [] == []
@ -48,11 +57,13 @@ class TestStringFormatterValidator(object):
"Try }var_one} and {var_one}", "Try }var_one} and {var_one}",
], ],
) )
def test_validate_fail_uneven_brackets(self, format_string, error_message_unequal_brackets_str): def test_validate_fail_uneven_brackets(
self, string_formatter_class, format_string, error_message_unequal_brackets_str
):
expected_error_msg = f"Validation error in fail: {error_message_unequal_brackets_str}" expected_error_msg = f"Validation error in fail: {error_message_unequal_brackets_str}"
with pytest.raises(ValidationException, match=expected_error_msg): with pytest.raises(ValidationException, match=expected_error_msg):
_ = StringFormatterValidator(name="fail", value=format_string) _ = string_formatter_class(name="fail", value=format_string)
@pytest.mark.parametrize( @pytest.mark.parametrize(
"format_string", "format_string",
@ -66,12 +77,12 @@ class TestStringFormatterValidator(object):
], ],
) )
def test_validate_fail_bad_variable( def test_validate_fail_bad_variable(
self, format_string, error_message_unequal_regex_matches_str self, string_formatter_class, format_string, error_message_unequal_regex_matches_str
): ):
expected_error_msg = f"Validation error in fail: {error_message_unequal_regex_matches_str}" expected_error_msg = f"Validation error in fail: {error_message_unequal_regex_matches_str}"
with pytest.raises(ValidationException, match=expected_error_msg): with pytest.raises(ValidationException, match=expected_error_msg):
_ = StringFormatterValidator(name="fail", value=format_string) _ = string_formatter_class(name="fail", value=format_string)
@pytest.mark.parametrize( @pytest.mark.parametrize(
"format_string, bad_variable", "format_string, bad_variable",
@ -80,17 +91,19 @@ class TestStringFormatterValidator(object):
("{try} {valid_var}", "try"), ("{try} {valid_var}", "try"),
], ],
) )
def test_validate_fail_variable_keyword_or_not_identifier(self, format_string, bad_variable): def test_validate_fail_variable_keyword_or_not_identifier(
self, string_formatter_class, format_string, bad_variable
):
expected_error_msg = ( expected_error_msg = (
f"Validation error in fail: " f"Validation error in fail: "
f"'{bad_variable}' is a Python keyword and cannot be used as a variable." f"'{bad_variable}' is a Python keyword and cannot be used as a variable."
) )
with pytest.raises(ValidationException, match=expected_error_msg): with pytest.raises(ValidationException, match=expected_error_msg):
_ = StringFormatterValidator(name="fail", value=format_string) _ = string_formatter_class(name="fail", value=format_string)
def test_entry_formatter_fails_missing_field(self): def test_entry_formatter_fails_missing_field(self, string_formatter_class):
format_string = StringFormatterValidator(name="test", value=f"prefix {{bah_humbug}} suffix") format_string = string_formatter_class(name="test", value=f"prefix {{bah_humbug}} suffix")
variable_dict = {"varb": "a", "vara": "b"} variable_dict = {"varb": "a", "vara": "b"}
expected_error_msg = ( expected_error_msg = (
f"Validation error in test: Format variable 'bah_humbug' does not exist. " f"Validation error in test: Format variable 'bah_humbug' does not exist. "
@ -100,16 +113,16 @@ class TestStringFormatterValidator(object):
with pytest.raises(StringFormattingException, match=expected_error_msg): with pytest.raises(StringFormattingException, match=expected_error_msg):
assert format_string.apply_formatter(variable_dict=variable_dict) assert format_string.apply_formatter(variable_dict=variable_dict)
def test_string_formatter_single_field(self): def test_string_formatter_single_field(self, string_formatter_class):
uid = "this uid" uid = "this uid"
format_string = StringFormatterValidator(name="test", value=f"prefix {{uid}} suffix") format_string = string_formatter_class(name="test", value=f"prefix {{uid}} suffix")
expected_string = f"prefix {uid} suffix" expected_string = f"prefix {uid} suffix"
assert format_string.apply_formatter(variable_dict={"uid": uid}) == expected_string assert format_string.apply_formatter(variable_dict={"uid": uid}) == expected_string
def test_entry_formatter_duplicate_fields(self): def test_entry_formatter_duplicate_fields(self, string_formatter_class):
upload_year = "2022" upload_year = "2022"
format_string = StringFormatterValidator( format_string = string_formatter_class(
name="test", value=f"prefix {{upload_year}} {{upload_year}} suffix" name="test", value=f"prefix {{upload_year}} {{upload_year}} suffix"
) )
expected_string = f"prefix {upload_year} {upload_year} suffix" expected_string = f"prefix {upload_year} {upload_year} suffix"
@ -119,19 +132,19 @@ class TestStringFormatterValidator(object):
== expected_string == expected_string
) )
def test_entry_formatter_override_recursive(self): def test_entry_formatter_override_recursive(self, string_formatter_class):
variable_dict = { variable_dict = {
"level_a": "level a", "level_a": "level a",
"level_b": "level b and {level_a}", "level_b": "level b and {level_a}",
"level_c": "level c and {level_b}", "level_c": "level c and {level_b}",
} }
format_string = StringFormatterValidator(name="test", value="level d and {level_c}") format_string = string_formatter_class(name="test", value="level d and {level_c}")
expected_string = "level d and level c and level b and level a" expected_string = "level d and level c and level b and level a"
assert format_string.apply_formatter(variable_dict=variable_dict) == expected_string assert format_string.apply_formatter(variable_dict=variable_dict) == expected_string
def test_entry_formatter_override_recursive_fail_cycle(self): def test_entry_formatter_override_recursive_fail_cycle(self, string_formatter_class):
variable_dict = { variable_dict = {
"level_a": "{level_b}", "level_a": "{level_b}",
"level_b": "{level_a}", "level_b": "{level_a}",
@ -144,21 +157,31 @@ class TestStringFormatterValidator(object):
"Unresolved variables: level_b" "Unresolved variables: level_b"
) )
format_string = StringFormatterValidator(name="test", value="{level_a}") format_string = string_formatter_class(name="test", value="{level_a}")
with pytest.raises(StringFormattingException, match=expected_error_msg): with pytest.raises(StringFormattingException, match=expected_error_msg):
_ = format_string.apply_formatter(variable_dict=variable_dict) _ = format_string.apply_formatter(variable_dict=variable_dict)
class TestDictFormatterValidator(object): class TestDictFormatterValidator(object):
def test_validates_values(self): @pytest.mark.parametrize(
"dict_validator_class, expected_formatter_class",
[
(DictFormatterValidator, StringFormatterValidator),
(OverridesDictFormatterValidator, OverridesStringFormatterValidator),
],
)
def test_validates_values(self, dict_validator_class, expected_formatter_class):
key1_format_string = "string with {variable}" key1_format_string = "string with {variable}"
key2_format_string = "no variables" key2_format_string = "no variables"
validator = DictFormatterValidator( validator = dict_validator_class(
name="validator", name="validator",
value={"key1": key1_format_string, "key2": key2_format_string}, value={"key1": key1_format_string, "key2": key2_format_string},
) )
assert isinstance(validator.dict["key1"], expected_formatter_class)
assert isinstance(validator.dict["key2"], expected_formatter_class)
assert validator.dict["key1"].format_string == key1_format_string assert validator.dict["key1"].format_string == key1_format_string
assert validator.dict["key2"].format_string == key2_format_string assert validator.dict["key2"].format_string == key2_format_string