Fix tests for installation with pyOpenSSL #729

This commit is contained in:
Jakub Roztocil 2018-11-14 16:10:08 +01:00
parent d1407baf76
commit b88e88d2e3

View File

@ -2,17 +2,31 @@ import os
import pytest import pytest
import pytest_httpbin.certs import pytest_httpbin.certs
from requests.exceptions import SSLError import requests.exceptions
from httpie import ExitStatus from httpie import ExitStatus
from httpie.input import SSL_VERSION_ARG_MAPPING from httpie.input import SSL_VERSION_ARG_MAPPING
from utils import http, HTTP_OK, TESTS_ROOT from utils import HTTP_OK, TESTS_ROOT, http
try:
# Handle OpenSSL errors, if installed.
# See <https://github.com/jakubroztocil/httpie/issues/729>
# noinspection PyUnresolvedReferences
import OpenSSL.SSL
ssl_errors = (
requests.exceptions.SSLError,
OpenSSL.SSL.Error,
)
except ImportError:
ssl_errors = (
requests.exceptions.SSLError,
)
CLIENT_CERT = os.path.join(TESTS_ROOT, 'client_certs', 'client.crt') CLIENT_CERT = os.path.join(TESTS_ROOT, 'client_certs', 'client.crt')
CLIENT_KEY = os.path.join(TESTS_ROOT, 'client_certs', 'client.key') CLIENT_KEY = os.path.join(TESTS_ROOT, 'client_certs', 'client.key')
CLIENT_PEM = os.path.join(TESTS_ROOT, 'client_certs', 'client.pem') CLIENT_PEM = os.path.join(TESTS_ROOT, 'client_certs', 'client.pem')
# FIXME: # FIXME:
# We test against a local httpbin instance which uses a self-signed cert. # We test against a local httpbin instance which uses a self-signed cert.
# Requests without --verify=<CA_BUNDLE> will fail with a verification error. # Requests without --verify=<CA_BUNDLE> will fail with a verification error.
@ -28,7 +42,7 @@ def test_ssl_version(httpbin_secure, ssl_version):
httpbin_secure + '/get' httpbin_secure + '/get'
) )
assert HTTP_OK in r assert HTTP_OK in r
except SSLError as e: except ssl_errors as e:
if ssl_version == 'ssl3': if ssl_version == 'ssl3':
# pytest-httpbin doesn't support ssl3 # pytest-httpbin doesn't support ssl3
assert 'SSLV3_ALERT_HANDSHAKE_FAILURE' in str(e) assert 'SSLV3_ALERT_HANDSHAKE_FAILURE' in str(e)
@ -57,12 +71,12 @@ class TestClientCert:
assert 'No such file or directory' in r.stderr assert 'No such file or directory' in r.stderr
def test_cert_file_invalid(self, httpbin_secure): def test_cert_file_invalid(self, httpbin_secure):
with pytest.raises(SSLError): with pytest.raises(ssl_errors):
http(httpbin_secure + '/get', http(httpbin_secure + '/get',
'--cert', __file__) '--cert', __file__)
def test_cert_ok_but_missing_key(self, httpbin_secure): def test_cert_ok_but_missing_key(self, httpbin_secure):
with pytest.raises(SSLError): with pytest.raises(ssl_errors):
http(httpbin_secure + '/get', http(httpbin_secure + '/get',
'--cert', CLIENT_CERT) '--cert', CLIENT_CERT)
@ -79,21 +93,23 @@ class TestServerCert:
assert HTTP_OK in r assert HTTP_OK in r
def test_verify_custom_ca_bundle_path( def test_verify_custom_ca_bundle_path(
self, httpbin_secure_untrusted): self, httpbin_secure_untrusted
):
r = http(httpbin_secure_untrusted + '/get', '--verify', CA_BUNDLE) r = http(httpbin_secure_untrusted + '/get', '--verify', CA_BUNDLE)
assert HTTP_OK in r assert HTTP_OK in r
def test_self_signed_server_cert_by_default_raises_ssl_error( def test_self_signed_server_cert_by_default_raises_ssl_error(
self, self,
httpbin_secure_untrusted): httpbin_secure_untrusted
with pytest.raises(SSLError): ):
with pytest.raises(ssl_errors):
http(httpbin_secure_untrusted.url + '/get') http(httpbin_secure_untrusted.url + '/get')
def test_verify_custom_ca_bundle_invalid_path(self, httpbin_secure): def test_verify_custom_ca_bundle_invalid_path(self, httpbin_secure):
# since 2.14.0 requests raises IOError # since 2.14.0 requests raises IOError
with pytest.raises((SSLError, IOError)): with pytest.raises(ssl_errors + (IOError,)):
http(httpbin_secure.url + '/get', '--verify', '/__not_found__') http(httpbin_secure.url + '/get', '--verify', '/__not_found__')
def test_verify_custom_ca_bundle_invalid_bundle(self, httpbin_secure): def test_verify_custom_ca_bundle_invalid_bundle(self, httpbin_secure):
with pytest.raises(SSLError): with pytest.raises(ssl_errors):
http(httpbin_secure.url + '/get', '--verify', __file__) http(httpbin_secure.url + '/get', '--verify', __file__)