Skip to content

Commit 0bbc9c6

Browse files
author
Michael Brewer
committed
test(feature-toggles): Add schema tests
1 parent 577b5cc commit 0bbc9c6

File tree

2 files changed

+71
-4
lines changed

2 files changed

+71
-4
lines changed

aws_lambda_powertools/utilities/feature_toggles/schema.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from enum import Enum
2+
from logging import Logger
23
from typing import Any, Dict
34

45
from .exceptions import ConfigurationError
@@ -22,7 +23,7 @@ class ACTION(str, Enum):
2223

2324

2425
class SchemaValidator:
25-
def __init__(self, logger: object):
26+
def __init__(self, logger: Logger):
2627
self._logger = logger
2728

2829
def _raise_conf_exc(self, error_str: str) -> None:
@@ -47,7 +48,7 @@ def _validate_rule(self, feature_name: str, rule: Dict[str, Any]) -> None:
4748
self._raise_conf_exc(f"feature rule is not a dictionary, feature_name={feature_name}")
4849
rule_name = rule.get(RULE_NAME_KEY)
4950
if not rule_name or rule_name is None or not isinstance(rule_name, str):
50-
self._raise_conf_exc(f"invalid rule_name, feature_name={feature_name}")
51+
return self._raise_conf_exc(f"invalid rule_name, feature_name={feature_name}")
5152
rule_default_value = rule.get(RULE_DEFAULT_VALUE)
5253
if rule_default_value is None or not isinstance(rule_default_value, bool):
5354
self._raise_conf_exc(f"invalid rule_default_value, rule_name={rule_name}")
@@ -76,8 +77,8 @@ def _validate_feature(self, feature_name: str, feature_dict_def: Dict[str, Any])
7677
def validate_json_schema(self, schema: Dict[str, Any]) -> None:
7778
if not isinstance(schema, dict):
7879
self._raise_conf_exc("invalid AWS AppConfig JSON schema detected, root schema is not a dictionary")
79-
features_dict: Dict = schema.get(FEATURES_KEY)
80+
features_dict = schema.get(FEATURES_KEY)
8081
if not isinstance(features_dict, dict):
81-
self._raise_conf_exc("invalid AWS AppConfig JSON schema detected, missing features dictionary")
82+
return self._raise_conf_exc("invalid AWS AppConfig JSON schema detected, missing features dictionary")
8283
for feature_name, feature_dict_def in features_dict.items():
8384
self._validate_feature(feature_name, feature_dict_def)

tests/functional/feature_toggles/test_schema_validation.py

+66
Original file line numberDiff line numberDiff line change
@@ -262,3 +262,69 @@ def test_valid_condition_all_actions():
262262
},
263263
}
264264
validator.validate_json_schema(schema)
265+
266+
267+
def test_validate_condition_invalid_condition_type():
268+
# GIVEN an invalid condition type of empty dict
269+
validator = SchemaValidator(logger)
270+
condition = {}
271+
272+
# WHEN calling _validate_condition
273+
with pytest.raises(ConfigurationError) as err:
274+
validator._validate_condition("foo", condition)
275+
276+
# THEN raise ConfigurationError
277+
assert "invalid condition type" in str(err)
278+
279+
280+
def test_validate_condition_invalid_condition_action():
281+
# GIVEN an invalid condition action of foo
282+
validator = SchemaValidator(logger)
283+
condition = {"action": "foo"}
284+
285+
# WHEN calling _validate_condition
286+
with pytest.raises(ConfigurationError) as err:
287+
validator._validate_condition("foo", condition)
288+
289+
# THEN raise ConfigurationError
290+
assert "invalid action value" in str(err)
291+
292+
293+
def test_validate_condition_invalid_condition_key():
294+
# GIVEN a configuration with a missing "key"
295+
validator = SchemaValidator(logger)
296+
condition = {"action": ACTION.EQUALS.value}
297+
298+
# WHEN calling _validate_condition
299+
with pytest.raises(ConfigurationError) as err:
300+
validator._validate_condition("foo", condition)
301+
302+
# THEN raise ConfigurationError
303+
assert "invalid key value" in str(err)
304+
305+
306+
def test_validate_condition_missing_condition_value():
307+
# GIVEN a configuration with a missing condition value
308+
validator = SchemaValidator(logger)
309+
condition = {"action": ACTION.EQUALS.value, "key": "Foo"}
310+
311+
# WHEN calling _validate_condition
312+
with pytest.raises(ConfigurationError) as err:
313+
validator._validate_condition("foo", condition)
314+
315+
# THEN raise ConfigurationError
316+
assert "missing condition value" in str(err)
317+
318+
319+
def test_validate_rule_invalid_rule_name():
320+
# GIVEN a rule_name not in the rule dict
321+
validator = SchemaValidator(logger)
322+
rule_name = "invalid_rule_name"
323+
rule = {"missing": ""}
324+
325+
# WHEN calling _validate_rule
326+
with pytest.raises(ConfigurationError) as err:
327+
validator._validate_rule(rule_name, rule)
328+
329+
# THEN raise ConfigurationError
330+
assert "invalid rule_name" in str(err)

0 commit comments

Comments
 (0)