diff --git a/aws_lambda_powertools/utilities/feature_flags/feature_flags.py b/aws_lambda_powertools/utilities/feature_flags/feature_flags.py index 9f881ab97f5..a1c57bf7033 100644 --- a/aws_lambda_powertools/utilities/feature_flags/feature_flags.py +++ b/aws_lambda_powertools/utilities/feature_flags/feature_flags.py @@ -47,8 +47,6 @@ def __init__(self, store: StoreProvider, logger: Optional[Union[logging.Logger, self.logger = logger or logging.getLogger(__name__) def _match_by_action(self, action: str, condition_value: Any, context_value: Any) -> bool: - if not context_value: - return False mapping_by_action = { schema.RuleAction.EQUALS.value: lambda a, b: a == b, schema.RuleAction.NOT_EQUALS.value: lambda a, b: a != b, diff --git a/aws_lambda_powertools/utilities/feature_flags/schema.py b/aws_lambda_powertools/utilities/feature_flags/schema.py index b7df5f5fa4f..08f2ee13819 100644 --- a/aws_lambda_powertools/utilities/feature_flags/schema.py +++ b/aws_lambda_powertools/utilities/feature_flags/schema.py @@ -325,9 +325,9 @@ def validate_condition_key(condition: Dict[str, Any], rule_name: str): @staticmethod def validate_condition_value(condition: Dict[str, Any], rule_name: str): - value = condition.get(CONDITION_VALUE, "") - if not value: - raise SchemaValidationError(f"'value' key must not be empty, rule={rule_name}") + value = condition.get(CONDITION_VALUE) + if value is None: + raise SchemaValidationError(f"'value' key must not be null, rule={rule_name}") action = condition.get(CONDITION_ACTION, "") # time actions need to be parsed to make sure date and time format is valid and timezone is recognized diff --git a/tests/functional/feature_flags/test_schema_validation.py b/tests/functional/feature_flags/test_schema_validation.py index 73246f97e91..8d3b97ad814 100644 --- a/tests/functional/feature_flags/test_schema_validation.py +++ b/tests/functional/feature_flags/test_schema_validation.py @@ -301,10 +301,47 @@ def test_validate_condition_missing_condition_value(): } # WHEN calling validate_condition - with pytest.raises(SchemaValidationError, match="'value' key must not be empty"): + with pytest.raises(SchemaValidationError, match="'value' key must not be null"): ConditionsValidator.validate_condition_value(condition=condition, rule_name="dummy") +def test_validate_condition_none_condition_value(): + # GIVEN a configuration with a missing condition value + condition = { + "action": RuleAction.EQUALS.value, + "key": "tenant_id", + "value": None, + } + + # WHEN calling validate_condition + with pytest.raises(SchemaValidationError, match="'value' key must not be null"): + ConditionsValidator.validate_condition_value(condition=condition, rule_name="dummy") + + +def test_validate_condition_empty_condition_value(): + # GIVEN a configuration with a missing condition value + condition = { + "action": RuleAction.EQUALS.value, + "key": "tenant_id", + "value": "", + } + + # WHEN calling validate_condition + ConditionsValidator.validate_condition_value(condition=condition, rule_name="dummy") + + +def test_validate_condition_valid_falsy_condition_value(): + # GIVEN a configuration with a missing condition value + condition = { + "action": RuleAction.EQUALS.value, + "key": "tenant_id", + "value": 0, + } + + # WHEN calling validate_condition + ConditionsValidator.validate_condition_value(condition=condition, rule_name="dummy") + + def test_validate_rule_invalid_rule_type(): # GIVEN an invalid rule type of empty list # WHEN calling validate_rule