From bb7501f2c0cb37f0860ff35cb63ae9c73107fbd1 Mon Sep 17 00:00:00 2001 From: Jonathan Edey Date: Tue, 19 Sep 2023 11:30:34 -0400 Subject: [PATCH 1/3] Added additional exception catching with unit tests --- firebase_admin/__init__.py | 3 ++- tests/test_app.py | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/firebase_admin/__init__.py b/firebase_admin/__init__.py index 7e3b2eab0..e2c8f1ec5 100644 --- a/firebase_admin/__init__.py +++ b/firebase_admin/__init__.py @@ -18,6 +18,7 @@ import os import threading +from google.auth.exceptions import DefaultCredentialsError from firebase_admin import credentials from firebase_admin.__about__ import __version__ @@ -257,7 +258,7 @@ def _lookup_project_id(self): if not project_id: try: project_id = self._credential.project_id - except AttributeError: + except (AttributeError, DefaultCredentialsError): pass if not project_id: project_id = os.environ.get('GOOGLE_CLOUD_PROJECT', diff --git a/tests/test_app.py b/tests/test_app.py index fe3a43a5c..3f2b9fa46 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -315,6 +315,22 @@ def evaluate(): assert app.project_id is None testutils.run_without_project_id(evaluate) + def test_no_project_id_from_environment(self, app_credential): + env_var_name = 'GOOGLE_APPLICATION_CREDENTIALS' + def evaluate(): + app = firebase_admin.initialize_app(app_credential, name='myApp') + app._credential._g_credential = None + + + old_env_var = os.environ.get(env_var_name) + if old_env_var: + del os.environ[env_var_name] + project_id = app.project_id + if old_env_var: + os.environ[env_var_name] = old_env_var + assert project_id is None + testutils.run_without_project_id(evaluate) + def test_non_string_project_id(self): options = {'projectId': {'key': 'not a string'}} with pytest.raises(ValueError): From a90a851a2aa12b6c4822a3da601738483487a12e Mon Sep 17 00:00:00 2001 From: Jonathan Edey Date: Tue, 19 Sep 2023 11:55:06 -0400 Subject: [PATCH 2/3] lint: fixed spacing --- tests/test_app.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test_app.py b/tests/test_app.py index 3f2b9fa46..f8d87599a 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -320,8 +320,6 @@ def test_no_project_id_from_environment(self, app_credential): def evaluate(): app = firebase_admin.initialize_app(app_credential, name='myApp') app._credential._g_credential = None - - old_env_var = os.environ.get(env_var_name) if old_env_var: del os.environ[env_var_name] From 2c18219e83e60e0fa7b8a1f2862d48502ee86153 Mon Sep 17 00:00:00 2001 From: Jonathan Edey Date: Wed, 20 Sep 2023 15:02:12 -0400 Subject: [PATCH 3/3] fix: explicitly force exception raise in unit test --- tests/test_app.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/tests/test_app.py b/tests/test_app.py index f8d87599a..4233d5849 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -17,6 +17,7 @@ import os import pytest +from google.auth.exceptions import DefaultCredentialsError import firebase_admin from firebase_admin import credentials @@ -316,16 +317,23 @@ def evaluate(): testutils.run_without_project_id(evaluate) def test_no_project_id_from_environment(self, app_credential): - env_var_name = 'GOOGLE_APPLICATION_CREDENTIALS' + default_env = 'GOOGLE_APPLICATION_CREDENTIALS' + gcloud_env = 'CLOUDSDK_CONFIG' def evaluate(): app = firebase_admin.initialize_app(app_credential, name='myApp') app._credential._g_credential = None - old_env_var = os.environ.get(env_var_name) - if old_env_var: - del os.environ[env_var_name] + old_gcloud_var = os.environ.get(gcloud_env) + os.environ[gcloud_env] = '' + old_default_var = os.environ.get(default_env) + if old_default_var: + del os.environ[default_env] + with pytest.raises((AttributeError, DefaultCredentialsError)): + project_id = app._credential.project_id project_id = app.project_id - if old_env_var: - os.environ[env_var_name] = old_env_var + if old_default_var: + os.environ[default_env] = old_default_var + if old_gcloud_var: + os.environ[gcloud_env] = old_gcloud_var assert project_id is None testutils.run_without_project_id(evaluate)