Skip to content

Commit 0893f0c

Browse files
committed
Extend test of 'requester_pays' bucket to include CRUD w/ 'user_project' set (#4084)
* Pass through extra posargs for system tests. * Plumb 'user_project' arg through 'Client.bucket'.
1 parent 2e83f75 commit 0893f0c

File tree

3 files changed

+66
-10
lines changed

3 files changed

+66
-10
lines changed

storage/google/cloud/storage/client.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def current_batch(self):
121121
"""
122122
return self._batch_stack.top
123123

124-
def bucket(self, bucket_name):
124+
def bucket(self, bucket_name, user_project=None):
125125
"""Factory constructor for bucket object.
126126
127127
.. note::
@@ -131,10 +131,14 @@ def bucket(self, bucket_name):
131131
:type bucket_name: str
132132
:param bucket_name: The name of the bucket to be instantiated.
133133
134+
:type user_project: str
135+
:param user_project: (Optional) the project ID to be billed for API
136+
requests made via this instance.
137+
134138
:rtype: :class:`google.cloud.storage.bucket.Bucket`
135139
:returns: The bucket object created.
136140
"""
137-
return Bucket(client=self, name=bucket_name)
141+
return Bucket(client=self, name=bucket_name, user_project=user_project)
138142

139143
def batch(self):
140144
"""Factory constructor for batch object.

storage/tests/system.py

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
from test_utils.system import unique_resource_id
2929

3030

31+
USER_PROJECT = os.environ.get('GOOGLE_CLOUD_TESTS_USER_PROJECT')
32+
33+
3134
def _bad_copy(bad_request):
3235
"""Predicate: pass only exceptions for a failed copyTo."""
3336
err_msg = bad_request.message
@@ -95,14 +98,6 @@ def test_create_bucket(self):
9598
self.case_buckets_to_delete.append(new_bucket_name)
9699
self.assertEqual(created.name, new_bucket_name)
97100

98-
def test_create_bucket_with_requester_pays(self):
99-
new_bucket_name = 'w-requester-pays' + unique_resource_id('-')
100-
created = Config.CLIENT.create_bucket(
101-
new_bucket_name, requester_pays=True)
102-
self.case_buckets_to_delete.append(new_bucket_name)
103-
self.assertEqual(created.name, new_bucket_name)
104-
self.assertTrue(created.requester_pays)
105-
106101
def test_list_buckets(self):
107102
buckets_to_create = [
108103
'new' + unique_resource_id(),
@@ -141,6 +136,47 @@ def test_bucket_update_labels(self):
141136
bucket.update()
142137
self.assertEqual(bucket.labels, {})
143138

139+
@unittest.skipUnless(USER_PROJECT, 'USER_PROJECT not set in environment.')
140+
def test_crud_bucket_with_requester_pays(self):
141+
new_bucket_name = 'w-requester-pays' + unique_resource_id('-')
142+
created = Config.CLIENT.create_bucket(
143+
new_bucket_name, requester_pays=True)
144+
self.case_buckets_to_delete.append(new_bucket_name)
145+
self.assertEqual(created.name, new_bucket_name)
146+
self.assertTrue(created.requester_pays)
147+
148+
with_up = Config.CLIENT.bucket(
149+
new_bucket_name, user_project=USER_PROJECT)
150+
151+
# Bucket will be deleted in-line below.
152+
self.case_buckets_to_delete.remove(new_bucket_name)
153+
154+
try:
155+
# Exercise 'buckets.get' w/ userProject.
156+
self.assertTrue(with_up.exists())
157+
with_up.reload()
158+
self.assertTrue(with_up.requester_pays)
159+
160+
# Exercise 'buckets.patch' w/ userProject.
161+
with_up.configure_website(
162+
main_page_suffix='index.html', not_found_page='404.html')
163+
with_up.patch()
164+
self.assertEqual(
165+
with_up._properties['website'], {
166+
'mainPageSuffix': 'index.html',
167+
'notFoundPage': '404.html',
168+
})
169+
170+
# Exercise 'buckets.update' w/ userProject.
171+
new_labels = {'another-label': 'another-value'}
172+
with_up.labels = new_labels
173+
with_up.update()
174+
self.assertEqual(with_up.labels, new_labels)
175+
176+
finally:
177+
# Exercise 'buckets.delete' w/ userProject.
178+
with_up.delete()
179+
144180

145181
class TestStorageFiles(unittest.TestCase):
146182

storage/tests/unit/test_client.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,22 @@ def test_bucket(self):
140140
self.assertIsInstance(bucket, Bucket)
141141
self.assertIs(bucket.client, client)
142142
self.assertEqual(bucket.name, BUCKET_NAME)
143+
self.assertIsNone(bucket.user_project)
144+
145+
def test_bucket_w_user_project(self):
146+
from google.cloud.storage.bucket import Bucket
147+
148+
PROJECT = 'PROJECT'
149+
USER_PROJECT = 'USER_PROJECT'
150+
CREDENTIALS = _make_credentials()
151+
BUCKET_NAME = 'BUCKET_NAME'
152+
153+
client = self._make_one(project=PROJECT, credentials=CREDENTIALS)
154+
bucket = client.bucket(BUCKET_NAME, user_project=USER_PROJECT)
155+
self.assertIsInstance(bucket, Bucket)
156+
self.assertIs(bucket.client, client)
157+
self.assertEqual(bucket.name, BUCKET_NAME)
158+
self.assertEqual(bucket.user_project, USER_PROJECT)
143159

144160
def test_batch(self):
145161
from google.cloud.storage.batch import Batch

0 commit comments

Comments
 (0)