From 3c3a9cb7e5d6a8ad13b35c955903087f29c83c80 Mon Sep 17 00:00:00 2001 From: Ran Isenberg Date: Sun, 26 Mar 2023 17:06:30 +0300 Subject: [PATCH 1/5] fix: Feature Flag Rule Conditions Values and Context Key Variables cannot have Falsy values --- .../utilities/feature_flags/feature_flags.py | 2 -- .../utilities/feature_flags/schema.py | 4 +-- .../feature_flags/test_schema_validation.py | 25 +++++++++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) 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..0658b25b38d 100644 --- a/aws_lambda_powertools/utilities/feature_flags/schema.py +++ b/aws_lambda_powertools/utilities/feature_flags/schema.py @@ -325,8 +325,8 @@ 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: + value = condition.get(CONDITION_VALUE) + if value is None: raise SchemaValidationError(f"'value' key must not be empty, rule={rule_name}") action = condition.get(CONDITION_ACTION, "") diff --git a/tests/functional/feature_flags/test_schema_validation.py b/tests/functional/feature_flags/test_schema_validation.py index 73246f97e91..56322425644 100644 --- a/tests/functional/feature_flags/test_schema_validation.py +++ b/tests/functional/feature_flags/test_schema_validation.py @@ -305,6 +305,31 @@ def test_validate_condition_missing_condition_value(): 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 empty"): + 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 From 10065279834b93177e002d89f36e00c67b7a420a Mon Sep 17 00:00:00 2001 From: Ran Isenberg Date: Sun, 26 Mar 2023 17:11:46 +0300 Subject: [PATCH 2/5] fix: Feature Flag Rule Conditions Values and Context Key Variables cannot have Falsy values --- .../utilities/feature_flags/schema.py | 2 +- .../feature_flags/test_schema_validation.py | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/aws_lambda_powertools/utilities/feature_flags/schema.py b/aws_lambda_powertools/utilities/feature_flags/schema.py index 0658b25b38d..df999a51563 100644 --- a/aws_lambda_powertools/utilities/feature_flags/schema.py +++ b/aws_lambda_powertools/utilities/feature_flags/schema.py @@ -327,7 +327,7 @@ def validate_condition_key(condition: Dict[str, Any], rule_name: str): def validate_condition_value(condition: Dict[str, Any], rule_name: str): value = condition.get(CONDITION_VALUE) if value is None: - raise SchemaValidationError(f"'value' key must not be empty, rule={rule_name}") + raise SchemaValidationError(f"'value' key must not be none, 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 56322425644..8441b9449ca 100644 --- a/tests/functional/feature_flags/test_schema_validation.py +++ b/tests/functional/feature_flags/test_schema_validation.py @@ -301,7 +301,7 @@ 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 none"): ConditionsValidator.validate_condition_value(condition=condition, rule_name="dummy") @@ -314,10 +314,22 @@ def test_validate_condition_none_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 none"): 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 = { From be1fdd36e4ee982fc6ffce5500aea31c0e5cd8f4 Mon Sep 17 00:00:00 2001 From: Heitor Lessa Date: Mon, 27 Mar 2023 18:52:22 +0200 Subject: [PATCH 3/5] chore: change to `null` Signed-off-by: Heitor Lessa --- aws_lambda_powertools/utilities/feature_flags/schema.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws_lambda_powertools/utilities/feature_flags/schema.py b/aws_lambda_powertools/utilities/feature_flags/schema.py index df999a51563..08f2ee13819 100644 --- a/aws_lambda_powertools/utilities/feature_flags/schema.py +++ b/aws_lambda_powertools/utilities/feature_flags/schema.py @@ -327,7 +327,7 @@ def validate_condition_key(condition: Dict[str, Any], rule_name: str): def validate_condition_value(condition: Dict[str, Any], rule_name: str): value = condition.get(CONDITION_VALUE) if value is None: - raise SchemaValidationError(f"'value' key must not be none, rule={rule_name}") + 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 From 48e52949f2d13b07cb5eb13652d6ca5a50a23a0f Mon Sep 17 00:00:00 2001 From: Heitor Lessa Date: Mon, 27 Mar 2023 18:53:18 +0200 Subject: [PATCH 4/5] chore: change to `null` Signed-off-by: Heitor Lessa --- tests/functional/feature_flags/test_schema_validation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/feature_flags/test_schema_validation.py b/tests/functional/feature_flags/test_schema_validation.py index 8441b9449ca..13568311f7b 100644 --- a/tests/functional/feature_flags/test_schema_validation.py +++ b/tests/functional/feature_flags/test_schema_validation.py @@ -301,7 +301,7 @@ def test_validate_condition_missing_condition_value(): } # WHEN calling validate_condition - with pytest.raises(SchemaValidationError, match="'value' key must not be none"): + with pytest.raises(SchemaValidationError, match="'value' key must not be null"): ConditionsValidator.validate_condition_value(condition=condition, rule_name="dummy") From bf0c9a46f8c764d16a3b9648da39209efcd5c636 Mon Sep 17 00:00:00 2001 From: Heitor Lessa Date: Mon, 27 Mar 2023 18:53:38 +0200 Subject: [PATCH 5/5] chore: change to `null` Signed-off-by: Heitor Lessa --- tests/functional/feature_flags/test_schema_validation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/functional/feature_flags/test_schema_validation.py b/tests/functional/feature_flags/test_schema_validation.py index 13568311f7b..8d3b97ad814 100644 --- a/tests/functional/feature_flags/test_schema_validation.py +++ b/tests/functional/feature_flags/test_schema_validation.py @@ -314,7 +314,7 @@ def test_validate_condition_none_condition_value(): } # WHEN calling validate_condition - with pytest.raises(SchemaValidationError, match="'value' key must not be none"): + with pytest.raises(SchemaValidationError, match="'value' key must not be null"): ConditionsValidator.validate_condition_value(condition=condition, rule_name="dummy")