1616import os
1717
1818import pytest
19+
1920from botocore .endpoint_provider import (
2021 EndpointProvider ,
2122 EndpointRule ,
2223 ErrorRule ,
2324 RuleCreator ,
2425 RuleSet ,
2526 RuleSetStandardLibary ,
26- TreeRule ,
27+ TreeRule , RuleSetEndpoint ,
2728)
2829from botocore .exceptions import (
2930 EndpointResolutionError ,
3233from botocore .loaders import Loader
3334from botocore .regions import EndpointRulesetResolver
3435
36+ from unittest .mock import Mock , patch
37+
3538REGION_TEMPLATE = "{Region}"
3639REGION_REF = {"ref" : "Region" }
3740BUCKET_ARN_REF = {"ref" : "bucketArn" }
@@ -486,3 +489,77 @@ def test_auth_schemes_conversion_first_authtype_unknown(
486489def test_get_attr (rule_lib , value , path , expected_value ):
487490 result = rule_lib .get_attr (value , path )
488491 assert result == expected_value
492+ @pytest .mark .parametrize (
493+ "use_ssl, endpoint_url, provider_params, expected_url" ,
494+ [
495+ # use_ssl=True, endpoint_url="http://..." → HTTP
496+ (
497+ True ,
498+ 'http://custom.com' ,
499+ {'Endpoint' : 'http://custom.com' },
500+ 'http://custom.com' ,
501+ ),
502+ # use_ssl=True, endpoint_url="https://..." → HTTPS
503+ (
504+ True ,
505+ 'https://custom.com' ,
506+ {'Endpoint' : 'https://custom.com' },
507+ 'https://custom.com' ,
508+ ),
509+ # use_ssl=False, endpoint_url="http://..." → HTTP
510+ (
511+ False ,
512+ 'http://custom.com' ,
513+ {'Endpoint' : 'http://custom.com' },
514+ 'http://custom.com' ,
515+ ),
516+ # use_ssl=False, endpoint_url="https://..." → HTTPS
517+ (
518+ False ,
519+ 'https://custom.com' ,
520+ {'Endpoint' : 'https://custom.com' },
521+ 'https://custom.com' ,
522+ ),
523+ # use_ssl=True, no endpoint → HTTPS
524+ (
525+ True ,
526+ 'https://s3-test-only-domain.amazonaws.com' ,
527+ {},
528+ 'https://s3-test-only-domain.amazonaws.com' ,
529+ ),
530+ # use_ssl=False, no endpoint → HTTP (downgrade)
531+ (
532+ False ,
533+ 'https://s3-test-only-domain.amazonaws.com' ,
534+ {},
535+ 'http://s3-test-only-domain.amazonaws.com' ,
536+ ),
537+ ],
538+ )
539+ def test_construct_endpoint_parametrized (
540+ use_ssl , endpoint_url , provider_params , expected_url
541+ ):
542+ resolver = EndpointRulesetResolver (
543+ endpoint_ruleset_data = {
544+ 'version' : '1.0' ,
545+ 'parameters' : {},
546+ 'rules' : [],
547+ },
548+ partition_data = {},
549+ service_model = None ,
550+ builtins = {},
551+ client_context = None ,
552+ event_emitter = None ,
553+ use_ssl = use_ssl ,
554+ requested_auth_scheme = None ,
555+ )
556+
557+ with patch .object (resolver ._provider , 'resolve_endpoint' ) as mock_resolve :
558+ mock_resolve .return_value = RuleSetEndpoint (
559+ url = endpoint_url , properties = {}, headers = {}
560+ )
561+ with patch .object (
562+ resolver , '_get_provider_params' , return_value = provider_params
563+ ):
564+ result = resolver .construct_endpoint (None , None , None )
565+ assert result .url == expected_url
0 commit comments