@@ -3865,3 +3865,60 @@ def test_secrets_provider_get_multiple_with_json_transform_error(config):
38653865
38663866 with pytest .raises (parameters .TransformParameterError ):
38673867 provider .get_multiple (secret_names , transform = "binary" , raise_on_transform_error = True )
3868+
3869+
3870+ @pytest .mark .parametrize ("force_fetch" , [False , True ])
3871+ @pytest .mark .parametrize ("secret_value" , [{"SecretString" : "value" }, {"SecretBinary" : b"value" }])
3872+ def test_secrets_provider_get_multiple_excludes_prefix_matches (config , force_fetch , secret_value ):
3873+ provider = parameters .SecretsProvider (boto_config = config )
3874+ names = ["db" , "db-password" ]
3875+ response = {
3876+ "SecretValues" : [{"Name" : name , ** secret_value } for name in ["db" , "db-password" , "db2" , "db-password-old" ]],
3877+ }
3878+ expected_params = {"Filters" : [{"Key" : "name" , "Values" : names }]}
3879+ expected = dict .fromkeys (names , next (iter (secret_value .values ())))
3880+
3881+ with stub .Stubber (provider .client ) as stubber :
3882+ stubber .add_response ("batch_get_secret_value" , response , expected_params )
3883+ assert provider .get_multiple (names ) == expected
3884+ if force_fetch :
3885+ stubber .add_response ("batch_get_secret_value" , response , expected_params )
3886+ assert provider .get_multiple (names , force_fetch = force_fetch ) == expected
3887+ key = provider ._build_cache_key (name = "|" .join (sorted (names )), transform = None , is_nested = True )
3888+ assert provider .fetch_from_cache (key ) == expected
3889+ stubber .assert_no_pending_responses ()
3890+
3891+
3892+ def test_secrets_provider_get_multiple_skips_prefix_only_page (config ):
3893+ provider = parameters .SecretsProvider (boto_config = config )
3894+ names = ["db" ]
3895+ expected_params = {"Filters" : [{"Key" : "name" , "Values" : names }]}
3896+ with stub .Stubber (provider .client ) as stubber :
3897+ stubber .add_response (
3898+ "batch_get_secret_value" ,
3899+ {"SecretValues" : [{"Name" : "db-old" , "SecretString" : "not json" }], "NextToken" : "next-page" },
3900+ expected_params ,
3901+ )
3902+ stubber .add_response (
3903+ "batch_get_secret_value" ,
3904+ {"SecretValues" : [{"Name" : "db" , "SecretString" : '{"enabled": true}' }]},
3905+ {** expected_params , "NextToken" : "next-page" },
3906+ )
3907+ assert provider .get_multiple (names , transform = "json" , raise_on_transform_error = True ) == {
3908+ "db" : {"enabled" : True },
3909+ }
3910+ stubber .assert_no_pending_responses ()
3911+
3912+
3913+ def test_secrets_provider_get_multiple_only_prefix_matches (config ):
3914+ provider = parameters .SecretsProvider (boto_config = config )
3915+ with stub .Stubber (provider .client ) as stubber :
3916+ stubber .add_response (
3917+ "batch_get_secret_value" ,
3918+ {"SecretValues" : [{"Name" : "db-old" , "SecretString" : "value" }]},
3919+ {"Filters" : [{"Key" : "name" , "Values" : ["db" ]}]},
3920+ )
3921+ with pytest .raises (GetSecretError , match = "No secrets found matching the provided names" ):
3922+ provider .get_multiple (["db" ])
3923+ assert not provider .store
3924+ stubber .assert_no_pending_responses ()
0 commit comments