77from aws_lambda_powertools .utilities .data_masking .base import DataMasking
88from aws_lambda_powertools .utilities .data_masking .constants import DATA_MASKING_STRING
99from aws_lambda_powertools .utilities .data_masking .exceptions import (
10+ DataMaskingError ,
1011 DataMaskingFieldNotFoundError ,
1112 DataMaskingUnsupportedTypeError ,
1213)
13- from aws_lambda_powertools .warnings import PowertoolsUserWarning
1414
1515
1616@pytest .fixture
@@ -315,6 +315,17 @@ def test_no_matches_for_masking_rule(data_masker):
315315 data = {"name" : "Ana" }
316316 masking_rules = {"$.missing_field" : {"dynamic_mask" : True }}
317317
318+ # WHEN applying the masking rule
319+ with pytest .raises (DataMaskingFieldNotFoundError , match = r"Field or expression .* not found" ):
320+ data_masker .erase (data = data , masking_rules = masking_rules )
321+
322+
323+ def test_no_matches_for_masking_rule_warning ():
324+ # GIVEN a dictionary without the expected field
325+ data_masker = DataMasking (raise_on_missing_field = False )
326+ data = {"name" : "Ana" }
327+ masking_rules = {"$.missing_field" : {"dynamic_mask" : True }}
328+
318329 # WHEN applying the masking rule
319330 with pytest .warns (UserWarning , match = r"No matches found *" ):
320331 result = data_masker .erase (data = data , masking_rules = masking_rules )
@@ -323,7 +334,7 @@ def test_no_matches_for_masking_rule(data_masker):
323334 assert result == data
324335
325336
326- def test_warning_during_masking_value (data_masker ):
337+ def test_error_during_masking_value (data_masker ):
327338 # GIVEN data and a masking rule
328339 data = {"value" : "test" }
329340
@@ -335,11 +346,11 @@ def erase(self, value, **kwargs):
335346 data_masker .provider = MockProvider ()
336347
337348 # WHEN erase is called
338- with pytest .warns ( expected_warning = PowertoolsUserWarning , match = "Error masking value for path value: Mock error" ) :
339- masked_data = data_masker .erase (data , masking_rules = {"value" : {"rule" : "value" }})
349+ with pytest .raises ( DataMaskingError , match = "Failed to mask field at path: value" ) as exc_info :
350+ data_masker .erase (data , masking_rules = {"value" : {"rule" : "value" }})
340351
341- # THEN the original data should remain unchanged
342- assert masked_data [ " value" ] == "test"
352+ # THEN the provider error is preserved
353+ assert isinstance ( exc_info . value . __cause__ , ValueError )
343354
344355
345356def test_mask_nested_field_success (data_masker ):
@@ -456,14 +467,12 @@ def test_erase_handles_invalid_regex_pattern(data_masker):
456467 data = "test123"
457468
458469 # WHEN masking with invalid regex
459- result = data_masker .erase (
460- data ,
461- regex_pattern = "[" ,
462- mask_format = "X" , # Invalid regex pattern that will raise re.error
463- )
464-
465- # THEN original data should be returned
466- assert result == "test123"
470+ with pytest .raises (DataMaskingError , match = "Invalid regex pattern" ):
471+ data_masker .erase (
472+ data ,
473+ regex_pattern = "[" ,
474+ mask_format = "X" , # Invalid regex pattern that will raise re.error
475+ )
467476
468477
469478def test_erase_handles_empty_string_with_dynamic_mask (data_masker ):
@@ -485,6 +494,5 @@ def test_erase_dictionary_with_masking_rules_wrong_field(data_masker):
485494 masking_rules = {"user.ssn..." : {"custom_mask" : "XXX-XX-XXXX" }, "user.address.zip" : {"custom_mask" : "00000" }}
486495
487496 # WHEN erase is called with wrong masking rules
488- # We must have a warning
489- with pytest .warns (expected_warning = PowertoolsUserWarning , match = "Error processing path*" ):
497+ with pytest .raises (DataMaskingError , match = "Invalid masking path" ):
490498 data_masker .erase (data , masking_rules = masking_rules )
0 commit comments