fix(auth): Fix test coverage for mtls_helper (#1886) · googleapis/google-auth-library-python@02e7163
@@ -12,7 +12,6 @@
1212# See the License for the specific language governing permissions and
1313# limitations under the License.
141415-import json
1615import os
1716import re
1817@@ -739,81 +738,78 @@ def test_crypto_error(self):
739738ENCRYPTED_EC_PRIVATE_KEY, b"wrong_password"
740739 )
741740742-def test_check_use_client_cert(self, monkeypatch):
743-monkeypatch.setenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "true")
744-use_client_cert = _mtls_helper.check_use_client_cert()
745-assert use_client_cert is True
746741747-def test_check_use_client_cert_for_workload_with_config_file(self, monkeypatch):
748-config_data = {
749-"version": 1,
750-"cert_configs": {
751-"workload": {
752-"cert_path": "path/to/cert/file",
753-"key_path": "path/to/key/file",
754- }
755- },
756- }
757-config_filename = "mock_certificate_config.json"
758-config_file_content = json.dumps(config_data)
759-monkeypatch.setenv("GOOGLE_API_CERTIFICATE_CONFIG", config_filename)
760-monkeypatch.setenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "")
761-# Use mock_open to simulate the file in memory
762-mock_file_handle = mock.mock_open(read_data=config_file_content)
763-with mock.patch("builtins.open", mock_file_handle):
764-use_client_cert = _mtls_helper.check_use_client_cert()
765-assert use_client_cert is True
766-767-def test_check_use_client_cert_false(self, monkeypatch):
768-monkeypatch.setenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false")
769-use_client_cert = _mtls_helper.check_use_client_cert()
770-assert use_client_cert is False
771-772-def test_check_use_client_cert_unsupported_value(self, monkeypatch):
773-monkeypatch.setenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "dummy")
774-use_client_cert = _mtls_helper.check_use_client_cert()
775-assert use_client_cert is False
776-777-def test_check_use_client_cert_for_workload_with_config_file_not_found(
778-self, monkeypatch
779- ):
780-monkeypatch.setenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "")
781-use_client_cert = _mtls_helper.check_use_client_cert()
782-assert use_client_cert is False
742+class TestCheckUseClientCert(object):
743+@mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"})
744+def test_env_var_explicit_true(self):
745+assert _mtls_helper.check_use_client_cert() is True
783746784-def test_check_use_client_cert_for_workload_with_config_file_not_json(
785-self, monkeypatch
786- ):
787-config_filename = "mock_certificate_config.json"
788-config_file_content = "not_valid_json"
789-monkeypatch.setenv("GOOGLE_API_CERTIFICATE_CONFIG", config_filename)
790-monkeypatch.setenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "")
791-# Use mock_open to simulate the file in memory
792-mock_file_handle = mock.mock_open(read_data=config_file_content)
793-with mock.patch("builtins.open", mock_file_handle):
794-use_client_cert = _mtls_helper.check_use_client_cert()
795-assert use_client_cert is False
796-797-def test_check_use_client_cert_for_workload_with_config_file_no_workload(
798-self, monkeypatch
799- ):
800-config_data = {"version": 1, "cert_configs": {"dummy_key": {}}}
801-config_filename = "mock_certificate_config.json"
802-config_file_content = json.dumps(config_data)
803-monkeypatch.setenv("GOOGLE_API_CERTIFICATE_CONFIG", config_filename)
804-monkeypatch.setenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "")
805-# Use mock_open to simulate the file in memory
806-mock_file_handle = mock.mock_open(read_data=config_file_content)
807-with mock.patch("builtins.open", mock_file_handle):
808-use_client_cert = _mtls_helper.check_use_client_cert()
809-assert use_client_cert is False
810-811-def test_check_use_client_cert_when_file_does_not_exist(self, monkeypatch):
812-config_filename = "mock_certificate_config.json"
813-monkeypatch.setenv("GOOGLE_API_CERTIFICATE_CONFIG", config_filename)
814-monkeypatch.setenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "")
815-use_client_cert = _mtls_helper.check_use_client_cert()
816-assert use_client_cert is False
747+@mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "True"})
748+def test_env_var_explicit_true_capitalized(self):
749+assert _mtls_helper.check_use_client_cert() is True
750+751+@mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"})
752+def test_env_var_explicit_false(self):
753+assert _mtls_helper.check_use_client_cert() is False
754+755+@mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "garbage"})
756+def test_env_var_explicit_garbage(self):
757+assert _mtls_helper.check_use_client_cert() is False
758+759+@mock.patch("builtins.open", autospec=True)
760+@mock.patch.dict(
761+ os.environ,
762+ {
763+ "GOOGLE_API_USE_CLIENT_CERTIFICATE": "",
764+ "GOOGLE_API_CERTIFICATE_CONFIG": "/path/to/config",
765+ },
766+ )
767+def test_config_file_success(self, mock_file):
768+# We manually apply mock_open here so we can keep autospec=True on the decorator
769+mock_file.side_effect = mock.mock_open(
770+read_data='{"cert_configs": {"workload": "exists"}}'
771+ )
772+assert _mtls_helper.check_use_client_cert() is True
773+774+@mock.patch("builtins.open", autospec=True)
775+@mock.patch.dict(
776+ os.environ,
777+ {
778+ "GOOGLE_API_USE_CLIENT_CERTIFICATE": "",
779+ "GOOGLE_API_CERTIFICATE_CONFIG": "/path/to/config",
780+ },
781+ )
782+def test_config_file_missing_keys(self, mock_file):
783+mock_file.side_effect = mock.mock_open(read_data='{"cert_configs": {}}')
784+assert _mtls_helper.check_use_client_cert() is False
785+786+@mock.patch("builtins.open", autospec=True)
787+@mock.patch.dict(
788+ os.environ,
789+ {
790+ "GOOGLE_API_USE_CLIENT_CERTIFICATE": "",
791+ "GOOGLE_API_CERTIFICATE_CONFIG": "/path/to/config",
792+ },
793+ )
794+def test_config_file_bad_json(self, mock_file):
795+mock_file.side_effect = mock.mock_open(read_data="{bad_json")
796+assert _mtls_helper.check_use_client_cert() is False
797+798+@mock.patch("builtins.open", autospec=True)
799+@mock.patch.dict(
800+ os.environ,
801+ {
802+ "GOOGLE_API_USE_CLIENT_CERTIFICATE": "",
803+ "GOOGLE_API_CERTIFICATE_CONFIG": "/path/does/not/exist",
804+ },
805+ )
806+def test_config_file_not_found(self, mock_file):
807+mock_file.side_effect = FileNotFoundError
808+assert _mtls_helper.check_use_client_cert() is False
809+810+@mock.patch.dict(os.environ, {}, clear=True)
811+def test_no_env_vars_set(self):
812+assert _mtls_helper.check_use_client_cert() is False
817813818814819815class TestMtlsHelper: