Skip to content

Commit f648e08

Browse files
authored
Extend test of 'requester_pays' bucket to include RUD w/ 'user_project' set (#4084)
* Pass through extra posargs for system tests. * Plumb 'user_project' arg through 'Client.bucket'.
1 parent 81f6750 commit f648e08

File tree

4 files changed

+72
-15
lines changed

4 files changed

+72
-15
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/nox.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def system_tests(session, python_version):
7474
session.install('.')
7575

7676
# Run py.test against the system tests.
77-
session.run('py.test', '--quiet', 'tests/system.py')
77+
session.run('py.test', '--quiet', 'tests/system.py', *session.posargs)
7878

7979

8080
@nox.session

storage/tests/system.py

Lines changed: 49 additions & 12 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
@@ -83,10 +86,11 @@ def setUp(self):
8386
self.case_buckets_to_delete = []
8487

8588
def tearDown(self):
86-
with Config.CLIENT.batch():
87-
for bucket_name in self.case_buckets_to_delete:
88-
bucket = Config.CLIENT.bucket(bucket_name)
89-
retry_429(bucket.delete)()
89+
if self.case_buckets_to_delete:
90+
with Config.CLIENT.batch():
91+
for bucket_name in self.case_buckets_to_delete:
92+
bucket = Config.CLIENT.bucket(bucket_name)
93+
retry_429(bucket.delete)()
9094

9195
def test_create_bucket(self):
9296
new_bucket_name = 'a-new-bucket' + unique_resource_id('-')
@@ -96,14 +100,6 @@ def test_create_bucket(self):
96100
self.case_buckets_to_delete.append(new_bucket_name)
97101
self.assertEqual(created.name, new_bucket_name)
98102

99-
def test_create_bucket_with_requester_pays(self):
100-
new_bucket_name = 'w-requester-pays' + unique_resource_id('-')
101-
created = Config.CLIENT.create_bucket(
102-
new_bucket_name, requester_pays=True)
103-
self.case_buckets_to_delete.append(new_bucket_name)
104-
self.assertEqual(created.name, new_bucket_name)
105-
self.assertTrue(created.requester_pays)
106-
107103
def test_list_buckets(self):
108104
buckets_to_create = [
109105
'new' + unique_resource_id(),
@@ -142,6 +138,47 @@ def test_bucket_update_labels(self):
142138
bucket.update()
143139
self.assertEqual(bucket.labels, {})
144140

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

146183
class TestStorageFiles(unittest.TestCase):
147184

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)