@@ -174,6 +174,132 @@ def test_from_service_account_json_bad_args(self):
174174 )
175175
176176
177+ class Test_ClientProjectMixin (unittest .TestCase ):
178+ @staticmethod
179+ def _get_target_class ():
180+ from google .cloud .client import _ClientProjectMixin
181+
182+ return _ClientProjectMixin
183+
184+ def _make_one (self , * args , ** kw ):
185+ return self ._get_target_class ()(* args , ** kw )
186+
187+ def test_ctor_defaults_wo_envvar (self ):
188+ environ = {}
189+ patch_env = mock .patch ("os.environ" , new = environ )
190+ patch_default = mock .patch (
191+ "google.cloud.client._determine_default_project" ,
192+ return_value = None ,
193+ )
194+ with patch_env :
195+ with patch_default as patched :
196+ with self .assertRaises (EnvironmentError ):
197+ self ._make_one ()
198+
199+ patched .assert_called_once_with (None )
200+
201+ def test_ctor_defaults_w_envvar (self ):
202+ from google .auth .environment_vars import PROJECT
203+
204+ project = "some-project-123"
205+ environ = {PROJECT : project }
206+ patch_env = mock .patch ("os.environ" , new = environ )
207+ with patch_env :
208+ client = self ._make_one ()
209+
210+ self .assertEqual (client .project , project )
211+
212+ def test_ctor_defaults_w_legacy_envvar (self ):
213+ from google .auth .environment_vars import LEGACY_PROJECT
214+
215+ project = "some-project-123"
216+ environ = {LEGACY_PROJECT : project }
217+ patch_env = mock .patch ("os.environ" , new = environ )
218+ with patch_env :
219+ client = self ._make_one ()
220+
221+ self .assertEqual (client .project , project )
222+
223+ def test_ctor_w_explicit_project (self ):
224+ explicit_project = "explicit-project-456"
225+ patch_default = mock .patch (
226+ "google.cloud.client._determine_default_project" ,
227+ return_value = None ,
228+ )
229+ with patch_default as patched :
230+ client = self ._make_one (project = explicit_project )
231+
232+ self .assertEqual (client .project , explicit_project )
233+
234+ patched .assert_not_called ()
235+
236+ def test_ctor_w_explicit_project_bytes (self ):
237+ explicit_project = b"explicit-project-456"
238+ patch_default = mock .patch (
239+ "google.cloud.client._determine_default_project" ,
240+ return_value = None ,
241+ )
242+ with patch_default as patched :
243+ client = self ._make_one (project = explicit_project )
244+
245+ self .assertEqual (client .project , explicit_project .decode ("utf-8" ))
246+
247+ patched .assert_not_called ()
248+
249+ def test_ctor_w_explicit_project_invalid (self ):
250+ explicit_project = object ()
251+ patch_default = mock .patch (
252+ "google.cloud.client._determine_default_project" ,
253+ return_value = None ,
254+ )
255+ with patch_default as patched :
256+ with self .assertRaises (ValueError ):
257+ self ._make_one (project = explicit_project )
258+
259+ patched .assert_not_called ()
260+
261+ @staticmethod
262+ def _make_credentials (** kw ):
263+ from google .auth .credentials import Credentials
264+
265+ class _Credentials (Credentials ):
266+ def __init__ (self , ** kw ):
267+ self .__dict__ .update (kw )
268+
269+ def refresh (self ): # pragma: NO COVER
270+ pass
271+
272+ return _Credentials (** kw )
273+
274+ def test_ctor_w_explicit_credentials_wo_project (self ):
275+ default_project = "default-project-123"
276+ credentials = self ._make_credentials ()
277+ patch_default = mock .patch (
278+ "google.cloud.client._determine_default_project" ,
279+ return_value = default_project ,
280+ )
281+ with patch_default as patched :
282+ client = self ._make_one (credentials = credentials )
283+
284+ self .assertEqual (client .project , default_project )
285+
286+ patched .assert_called_once_with (None )
287+
288+ def test_ctor_w_explicit_credentials_w_project (self ):
289+ project = "credentials-project-456"
290+ credentials = self ._make_credentials (project_id = project )
291+ patch_default = mock .patch (
292+ "google.cloud.client._determine_default_project" ,
293+ return_value = None ,
294+ )
295+ with patch_default as patched :
296+ client = self ._make_one (credentials = credentials )
297+
298+ self .assertEqual (client .project , project )
299+
300+ patched .assert_not_called ()
301+
302+
177303class TestClientWithProject (unittest .TestCase ):
178304 @staticmethod
179305 def _get_target_class ():
0 commit comments