@@ -2573,6 +2573,168 @@ def test_lock_retention_policy_w_user_project(self):
25732573 {"ifMetagenerationMatch" : 1234 , "userProject" : user_project },
25742574 )
25752575
2576+ def test_generate_signed_url_w_invalid_version (self ):
2577+ expiration = "2014-10-16T20:34:37.000Z"
2578+ connection = _Connection ()
2579+ client = _Client (connection )
2580+ bucket = self ._make_one (name = "bucket_name" , client = client )
2581+ with self .assertRaises (ValueError ):
2582+ bucket .generate_signed_url (expiration , version = "nonesuch" )
2583+
2584+ def _generate_signed_url_helper (
2585+ self ,
2586+ version ,
2587+ bucket_name = "bucket-name" ,
2588+ api_access_endpoint = None ,
2589+ method = "GET" ,
2590+ content_md5 = None ,
2591+ content_type = None ,
2592+ response_type = None ,
2593+ response_disposition = None ,
2594+ generation = None ,
2595+ headers = None ,
2596+ query_parameters = None ,
2597+ credentials = None ,
2598+ expiration = None ,
2599+ max_age = None ,
2600+ ):
2601+ from six .moves .urllib import parse
2602+ from google .cloud ._helpers import UTC
2603+ from google .cloud .storage .blob import _API_ACCESS_ENDPOINT
2604+
2605+ api_access_endpoint = api_access_endpoint or _API_ACCESS_ENDPOINT
2606+
2607+ delta = datetime .timedelta (hours = 1 )
2608+
2609+ if expiration is None and max_age is None :
2610+ expiration = datetime .datetime .utcnow ().replace (tzinfo = UTC ) + delta
2611+
2612+ connection = _Connection ()
2613+ client = _Client (connection )
2614+ bucket = self ._make_one (name = bucket_name , client = client )
2615+ to_patch = "google.cloud.storage.bucket.generate_signed_url_{}" .format (version )
2616+
2617+ with mock .patch (to_patch ) as signer :
2618+ signed_uri = bucket .generate_signed_url (
2619+ expiration = expiration ,
2620+ max_age = max_age ,
2621+ api_access_endpoint = api_access_endpoint ,
2622+ method = method ,
2623+ credentials = credentials ,
2624+ headers = headers ,
2625+ query_parameters = query_parameters ,
2626+ version = version ,
2627+ )
2628+
2629+ self .assertEqual (signed_uri , signer .return_value )
2630+
2631+ if credentials is None :
2632+ expected_creds = client ._credentials
2633+ else :
2634+ expected_creds = credentials
2635+
2636+ encoded_name = bucket_name .encode ("utf-8" )
2637+ expected_resource = "/{}" .format (parse .quote (encoded_name ))
2638+ expected_kwargs = {
2639+ "resource" : expected_resource ,
2640+ "expiration" : expiration ,
2641+ "max_age" : max_age ,
2642+ "api_access_endpoint" : api_access_endpoint ,
2643+ "method" : method .upper (),
2644+ "headers" : headers ,
2645+ "query_parameters" : query_parameters ,
2646+ }
2647+ signer .assert_called_once_with (expected_creds , ** expected_kwargs )
2648+
2649+ def _generate_signed_url_v2_helper (self , ** kw ):
2650+ version = "v2"
2651+ self ._generate_signed_url_helper (version , ** kw )
2652+
2653+ def test_generate_signed_url_v2_w_defaults (self ):
2654+ self ._generate_signed_url_v2_helper ()
2655+
2656+ def test_generate_signed_url_v2_w_expiration (self ):
2657+ from google .cloud ._helpers import UTC
2658+
2659+ expiration = datetime .datetime .utcnow ().replace (tzinfo = UTC )
2660+ self ._generate_signed_url_v2_helper (expiration = expiration )
2661+
2662+ def test_generate_signed_url_v2_w_max_age (self ):
2663+ self ._generate_signed_url_v2_helper (max_age = 3600 )
2664+
2665+ def test_generate_signed_url_v2_w_endpoint (self ):
2666+ self ._generate_signed_url_v2_helper (
2667+ api_access_endpoint = "https://api.example.com/v1"
2668+ )
2669+
2670+ def test_generate_signed_url_v2_w_method (self ):
2671+ self ._generate_signed_url_v2_helper (method = "POST" )
2672+
2673+ def test_generate_signed_url_v2_w_lowercase_method (self ):
2674+ self ._generate_signed_url_v2_helper (method = "get" )
2675+
2676+ def test_generate_signed_url_v2_w_content_md5 (self ):
2677+ self ._generate_signed_url_v2_helper (content_md5 = "FACEDACE" )
2678+
2679+ def test_generate_signed_url_v2_w_content_type (self ):
2680+ self ._generate_signed_url_v2_helper (content_type = "text.html" )
2681+
2682+ def test_generate_signed_url_v2_w_response_type (self ):
2683+ self ._generate_signed_url_v2_helper (response_type = "text.html" )
2684+
2685+ def test_generate_signed_url_v2_w_response_disposition (self ):
2686+ self ._generate_signed_url_v2_helper (response_disposition = "inline" )
2687+
2688+ def test_generate_signed_url_v2_w_generation (self ):
2689+ self ._generate_signed_url_v2_helper (generation = 12345 )
2690+
2691+ def test_generate_signed_url_v2_w_headers (self ):
2692+ self ._generate_signed_url_v2_helper (headers = {"x-goog-foo" : "bar" })
2693+
2694+ def test_generate_signed_url_v2_w_credentials (self ):
2695+ credentials = object ()
2696+ self ._generate_signed_url_v2_helper (credentials = credentials )
2697+
2698+ def _generate_signed_url_v4_helper (self , ** kw ):
2699+ version = "v4"
2700+ self ._generate_signed_url_helper (version , ** kw )
2701+
2702+ def test_generate_signed_url_v4_w_defaults (self ):
2703+ self ._generate_signed_url_v2_helper ()
2704+
2705+ def test_generate_signed_url_v4_w_endpoint (self ):
2706+ self ._generate_signed_url_v4_helper (
2707+ api_access_endpoint = "https://api.example.com/v1"
2708+ )
2709+
2710+ def test_generate_signed_url_v4_w_method (self ):
2711+ self ._generate_signed_url_v4_helper (method = "POST" )
2712+
2713+ def test_generate_signed_url_v4_w_lowercase_method (self ):
2714+ self ._generate_signed_url_v4_helper (method = "get" )
2715+
2716+ def test_generate_signed_url_v4_w_content_md5 (self ):
2717+ self ._generate_signed_url_v4_helper (content_md5 = "FACEDACE" )
2718+
2719+ def test_generate_signed_url_v4_w_content_type (self ):
2720+ self ._generate_signed_url_v4_helper (content_type = "text.html" )
2721+
2722+ def test_generate_signed_url_v4_w_response_type (self ):
2723+ self ._generate_signed_url_v4_helper (response_type = "text.html" )
2724+
2725+ def test_generate_signed_url_v4_w_response_disposition (self ):
2726+ self ._generate_signed_url_v4_helper (response_disposition = "inline" )
2727+
2728+ def test_generate_signed_url_v4_w_generation (self ):
2729+ self ._generate_signed_url_v4_helper (generation = 12345 )
2730+
2731+ def test_generate_signed_url_v4_w_headers (self ):
2732+ self ._generate_signed_url_v4_helper (headers = {"x-goog-foo" : "bar" })
2733+
2734+ def test_generate_signed_url_v4_w_credentials (self ):
2735+ credentials = object ()
2736+ self ._generate_signed_url_v4_helper (credentials = credentials )
2737+
25762738
25772739class _Connection (object ):
25782740 _delete_bucket = False
@@ -2612,6 +2774,13 @@ def api_request(self, **kw):
26122774
26132775class _Client (object ):
26142776 def __init__ (self , connection , project = None ):
2615- self ._connection = connection
26162777 self ._base_connection = connection
26172778 self .project = project
2779+
2780+ @property
2781+ def _connection (self ):
2782+ return self ._base_connection
2783+
2784+ @property
2785+ def _credentials (self ):
2786+ return self ._base_connection .credentials
0 commit comments