| import os |
| import sys |
| import mock |
| import pytest |
| import tempfile |
| import httplib2 |
| |
| |
| CA_CERTS_BUILTIN = os.path.join(os.path.dirname(httplib2.__file__), "cacerts.txt") |
| CERTIFI_CERTS_FILE = "unittest_certifi_file" |
| CUSTOM_CA_CERTS = "unittest_custom_ca_certs" |
| |
| |
| @pytest.fixture() |
| def clean_env(): |
| current_env_var = os.environ.get("HTTPLIB2_CA_CERTS") |
| if current_env_var is not None: |
| os.environ.pop("HTTPLIB2_CA_CERTS") |
| yield |
| if current_env_var is not None: |
| os.environ["HTTPLIB2_CA_CERTS"] = current_env_var |
| |
| |
| @pytest.fixture() |
| def ca_certs_tmpfile(clean_env): |
| tmpfd, tmpfile = tempfile.mkstemp() |
| open(tmpfile, 'a').close() |
| yield tmpfile |
| os.remove(tmpfile) |
| |
| |
| @mock.patch("httplib2.certs.certifi_available", False) |
| @mock.patch("httplib2.certs.custom_ca_locater_available", False) |
| def test_certs_file_from_builtin(clean_env): |
| assert httplib2.certs.where() == CA_CERTS_BUILTIN |
| |
| |
| @mock.patch("httplib2.certs.certifi_available", False) |
| @mock.patch("httplib2.certs.custom_ca_locater_available", False) |
| def test_certs_file_from_environment(ca_certs_tmpfile): |
| os.environ["HTTPLIB2_CA_CERTS"] = ca_certs_tmpfile |
| assert httplib2.certs.where() == ca_certs_tmpfile |
| os.environ["HTTPLIB2_CA_CERTS"] = "" |
| with pytest.raises(RuntimeError): |
| httplib2.certs.where() |
| os.environ.pop("HTTPLIB2_CA_CERTS") |
| assert httplib2.certs.where() == CA_CERTS_BUILTIN |
| |
| |
| @mock.patch("httplib2.certs.certifi_where", mock.MagicMock(return_value=CERTIFI_CERTS_FILE)) |
| @mock.patch("httplib2.certs.certifi_available", True) |
| @mock.patch("httplib2.certs.custom_ca_locater_available", False) |
| def test_certs_file_from_certifi(clean_env): |
| assert httplib2.certs.where() == CERTIFI_CERTS_FILE |
| |
| |
| @mock.patch("httplib2.certs.certifi_available", False) |
| @mock.patch("httplib2.certs.custom_ca_locater_available", True) |
| @mock.patch("httplib2.certs.custom_ca_locater_where", mock.MagicMock(return_value=CUSTOM_CA_CERTS)) |
| def test_certs_file_from_custom_getter(clean_env): |
| assert httplib2.certs.where() == CUSTOM_CA_CERTS |
| |
| |
| @mock.patch("httplib2.certs.certifi_available", False) |
| @mock.patch("httplib2.certs.custom_ca_locater_available", False) |
| def test_with_certifi_removed_from_modules(ca_certs_tmpfile): |
| if "certifi" in sys.modules: |
| del sys.modules["certifi"] |
| os.environ["HTTPLIB2_CA_CERTS"] = ca_certs_tmpfile |
| assert httplib2.certs.where() == ca_certs_tmpfile |
| os.environ.pop("HTTPLIB2_CA_CERTS") |
| assert httplib2.certs.where() == CA_CERTS_BUILTIN |