@@ -56,6 +56,34 @@ def test_dynamodb_provider_get(mock_name, mock_value):
56
56
stubber .deactivate ()
57
57
58
58
59
+ def test_dynamodb_provider_get_default_region (monkeypatch , mock_name , mock_value ):
60
+ """
61
+ Test DynamoDBProvider.get() without setting a region
62
+ """
63
+
64
+ monkeypatch .setenv ("AWS_DEFAULT_REGION" , "us-east-1" )
65
+
66
+ table_name = "TEST_TABLE"
67
+
68
+ # Create a new provider
69
+ provider = parameters .DynamoDBProvider (table_name )
70
+
71
+ # Stub the boto3 client
72
+ stubber = stub .Stubber (provider .table .meta .client )
73
+ response = {"Item" : {"id" : {"S" : mock_name }, "value" : {"S" : mock_value }}}
74
+ expected_params = {"TableName" : table_name , "Key" : {"id" : mock_name }}
75
+ stubber .add_response ("get_item" , response , expected_params )
76
+ stubber .activate ()
77
+
78
+ try :
79
+ value = provider .get (mock_name )
80
+
81
+ assert value == mock_value
82
+ stubber .assert_no_pending_responses ()
83
+ finally :
84
+ stubber .deactivate ()
85
+
86
+
59
87
def test_dynamodb_provider_get_cached (mock_name , mock_value ):
60
88
"""
61
89
Test DynamoDBProvider.get() with a cached value
@@ -235,6 +263,43 @@ def test_ssm_provider_get(mock_name, mock_value, mock_version):
235
263
stubber .deactivate ()
236
264
237
265
266
+ def test_ssm_provider_get_default_region (monkeypatch , mock_name , mock_value , mock_version ):
267
+ """
268
+ Test SSMProvider.get() without specifying the region
269
+ """
270
+
271
+ monkeypatch .setenv ("AWS_DEFAULT_REGION" , "us-east-1" )
272
+
273
+ # Create a new provider
274
+ provider = parameters .SSMProvider ()
275
+
276
+ # Stub the boto3 client
277
+ stubber = stub .Stubber (provider .client )
278
+ response = {
279
+ "Parameter" : {
280
+ "Name" : mock_name ,
281
+ "Type" : "String" ,
282
+ "Value" : mock_value ,
283
+ "Version" : mock_version ,
284
+ "Selector" : f"{ mock_name } :{ mock_version } " ,
285
+ "SourceResult" : "string" ,
286
+ "LastModifiedDate" : datetime (2015 , 1 , 1 ),
287
+ "ARN" : f"arn:aws:ssm:us-east-2:111122223333:parameter/{ mock_name } " ,
288
+ }
289
+ }
290
+ expected_params = {"Name" : mock_name , "WithDecryption" : False }
291
+ stubber .add_response ("get_parameter" , response , expected_params )
292
+ stubber .activate ()
293
+
294
+ try :
295
+ value = provider .get (mock_name )
296
+
297
+ assert value == mock_value
298
+ stubber .assert_no_pending_responses ()
299
+ finally :
300
+ stubber .deactivate ()
301
+
302
+
238
303
def test_ssm_provider_get_cached (mock_name , mock_value ):
239
304
"""
240
305
Test SSMProvider.get() with a cached value
@@ -341,6 +406,50 @@ def test_ssm_provider_get_multiple(mock_name, mock_value, mock_version):
341
406
stubber .deactivate ()
342
407
343
408
409
+ def test_ssm_provider_get_multiple_different_path (mock_name , mock_value , mock_version ):
410
+ """
411
+ Test SSMProvider.get_multiple() with a non-cached path and names that don't start with the path
412
+ """
413
+
414
+ mock_param_names = ["A" , "B" , "C" ]
415
+
416
+ # Create a new provider
417
+ provider = parameters .SSMProvider (region = "us-east-1" )
418
+
419
+ # Stub the boto3 client
420
+ stubber = stub .Stubber (provider .client )
421
+ response = {
422
+ "Parameters" : [
423
+ {
424
+ "Name" : f"{ name } " ,
425
+ "Type" : "String" ,
426
+ "Value" : f"{ mock_value } /{ name } " ,
427
+ "Version" : mock_version ,
428
+ "Selector" : f"{ mock_name } /{ name } :{ mock_version } " ,
429
+ "SourceResult" : "string" ,
430
+ "LastModifiedDate" : datetime (2015 , 1 , 1 ),
431
+ "ARN" : f"arn:aws:ssm:us-east-2:111122223333:parameter/{ mock_name } /{ name } " ,
432
+ }
433
+ for name in mock_param_names
434
+ ]
435
+ }
436
+ expected_params = {"Path" : mock_name , "Recursive" : False , "WithDecryption" : False }
437
+ stubber .add_response ("get_parameters_by_path" , response , expected_params )
438
+ stubber .activate ()
439
+
440
+ try :
441
+ values = provider .get_multiple (mock_name )
442
+
443
+ stubber .assert_no_pending_responses ()
444
+
445
+ assert len (values ) == len (mock_param_names )
446
+ for name in mock_param_names :
447
+ assert name in values
448
+ assert values [name ] == f"{ mock_value } /{ name } "
449
+ finally :
450
+ stubber .deactivate ()
451
+
452
+
344
453
def test_ssm_provider_get_multiple_next_token (mock_name , mock_value , mock_version ):
345
454
"""
346
455
Test SSMProvider.get_multiple() with a non-cached path with multiple calls
@@ -437,6 +546,38 @@ def test_secrets_provider_get(mock_name, mock_value):
437
546
stubber .deactivate ()
438
547
439
548
549
+ def test_secrets_provider_get_default_region (monkeypatch , mock_name , mock_value ):
550
+ """
551
+ Test SecretsProvider.get() without specifying a region
552
+ """
553
+
554
+ monkeypatch .setenv ("AWS_DEFAULT_REGION" , "us-east-1" )
555
+
556
+ # Create a new provider
557
+ provider = parameters .SecretsProvider ()
558
+
559
+ # Stub the boto3 client
560
+ stubber = stub .Stubber (provider .client )
561
+ response = {
562
+ "ARN" : f"arn:aws:secretsmanager:us-east-1:132456789012:secret/{ mock_name } " ,
563
+ "Name" : mock_name ,
564
+ "VersionId" : "7a9155b8-2dc9-466e-b4f6-5bc46516c84d" ,
565
+ "SecretString" : mock_value ,
566
+ "CreatedDate" : datetime (2015 , 1 , 1 ),
567
+ }
568
+ expected_params = {"SecretId" : mock_name }
569
+ stubber .add_response ("get_secret_value" , response , expected_params )
570
+ stubber .activate ()
571
+
572
+ try :
573
+ value = provider .get (mock_name )
574
+
575
+ assert value == mock_value
576
+ stubber .assert_no_pending_responses ()
577
+ finally :
578
+ stubber .deactivate ()
579
+
580
+
440
581
def test_secrets_provider_get_cached (mock_name , mock_value ):
441
582
"""
442
583
Test SecretsProvider.get() with a cached value
@@ -631,6 +772,51 @@ def _get_multiple(self, path: str, **kwargs) -> Dict[str, str]:
631
772
assert value ["A" ] == mock_binary
632
773
633
774
775
+ def test_base_provider_get_multiple_cached (mock_name , mock_value ):
776
+ """
777
+ Test BaseProvider.get_multiple() with cached values
778
+ """
779
+
780
+ class TestProvider (BaseProvider ):
781
+ def _get (self , name : str , ** kwargs ) -> str :
782
+ raise NotImplementedError ()
783
+
784
+ def _get_multiple (self , path : str , ** kwargs ) -> Dict [str , str ]:
785
+ raise NotImplementedError ()
786
+
787
+ provider = TestProvider ()
788
+
789
+ provider .store [(mock_name , None )] = ExpirableValue ({"A" : mock_value }, datetime .now () + timedelta (seconds = 60 ))
790
+
791
+ value = provider .get_multiple (mock_name )
792
+
793
+ assert isinstance (value , dict )
794
+ assert value ["A" ] == mock_value
795
+
796
+
797
+ def test_base_provider_get_multiple_expired (mock_name , mock_value ):
798
+ """
799
+ Test BaseProvider.get_multiple() with expired values
800
+ """
801
+
802
+ class TestProvider (BaseProvider ):
803
+ def _get (self , name : str , ** kwargs ) -> str :
804
+ raise NotImplementedError ()
805
+
806
+ def _get_multiple (self , path : str , ** kwargs ) -> Dict [str , str ]:
807
+ assert path == mock_name
808
+ return {"A" : mock_value }
809
+
810
+ provider = TestProvider ()
811
+
812
+ provider .store [(mock_name , None )] = ExpirableValue ({"B" : mock_value }, datetime .now () - timedelta (seconds = 60 ))
813
+
814
+ value = provider .get_multiple (mock_name )
815
+
816
+ assert isinstance (value , dict )
817
+ assert value ["A" ] == mock_value
818
+
819
+
634
820
def test_get_parameter (monkeypatch , mock_name , mock_value ):
635
821
"""
636
822
Test get_parameter()
0 commit comments