def test_cert_error_ssl_module_absent(self, mocker): class Dummy(Exception): pass open_url = mocker.patch.object(http, "open_url") open_url.side_effect = ssl.CertificateError("Invalid") mocker.patch.object(http, "CertificateError", Dummy) with pytest.raises(ssl.CertificateError): http.request("GET", "example.com/bad")
def test_data(self, mocker): data_resp = mocker.Mock() data_resp.read.return_value = "data" data_resp.getcode.return_value = 200 open_url = mocker.patch.object(http, "open_url") open_url.return_value = data_resp http.request("PUT", "example.com/path", data="data") assert "PUT" == open_url.call_args[1]["method"] assert "example.com/path" == open_url.call_args[1]["url"] assert "data" == open_url.call_args[1]["data"] assert open_url.call_args[1]["headers"] is None
def test_kwargs(self, mocker): data_resp = mocker.Mock() data_resp.read.return_value = "data" data_resp.getcode.return_value = 200 open_url = mocker.patch.object(http, "open_url") open_url.return_value = data_resp http.request("PUT", "example.com/path", a=3, b="f") assert "PUT" == open_url.call_args[1]["method"] assert "example.com/path" == open_url.call_args[1]["url"] assert 3 == open_url.call_args[1]["a"] assert "f" == open_url.call_args[1]["b"]
def test_payload_no_headers(self, mocker): data_resp = mocker.Mock() data_resp.read.return_value = "data" data_resp.getcode.return_value = 200 open_url = mocker.patch.object(http, "open_url") open_url.return_value = data_resp http.request("PUT", "example.com/path", payload=dict(a=2)) assert "PUT" == open_url.call_args[1]["method"] assert "example.com/path" == open_url.call_args[1]["url"] assert '{"a":2}' == open_url.call_args[1]["data"] headers = open_url.call_args[1]["headers"] assert {"content-type": "application/json"} == headers
def _username_password_login(self): resp = http.request( "GET", "{0}/auth".format(self.address), force_basic_auth=True, url_username=self.username, url_password=self.password, validate_certs=self.verify, ca_path=self.ca_path, ) if resp.status != 200: raise errors.SensuError( "Authentication call returned status {0}".format(resp.status), ) if resp.json is None: raise errors.SensuError( "Authentication call did not return a valid JSON", ) if "access_token" not in resp.json: raise errors.SensuError( "Authentication call did not return access token", ) return dict( Authorization="Bearer {0}".format(resp.json["access_token"]), )
def get(path): url = "https://bonsai.sensu.io/api/v1/assets/{0}".format(path) resp = http.request("GET", url) if resp.status != 200: raise errors.BonsaiError( "Server returned status {0}".format(resp.status), ) if resp.json is None: raise errors.BonsaiError("Server returned invalid JSON document") return resp.json
def validate_auth_data(self, username, password): resp = http.request( "GET", "{0}/auth/test".format(self.address), force_basic_auth=True, url_username=username, url_password=password, validate_certs=self.verify, ca_path=self.ca_path, ) if resp.status not in (200, 401): raise errors.SensuError( "Authentication test returned status {0}".format(resp.status), ) return resp.status == 200
def test_ok_request(self, mocker): data_resp = mocker.Mock() data_resp.read.return_value = "data" data_resp.getcode.return_value = 200 open_url = mocker.patch.object(http, "open_url") open_url.return_value = data_resp resp = http.request("GET", "example.com/path") assert 200 == resp.status assert "data" == resp.data assert "GET" == open_url.call_args[1]["method"] assert "example.com/path" == open_url.call_args[1]["url"]
def request(self, method, path, payload=None): url = self.address + path headers = self.auth_header response = http.request( method, url, payload=payload, headers=headers, validate_certs=self.verify, ca_path=self.ca_path, ) if response.status in (401, 403): raise errors.SensuError( "Authentication problem. Verify your credentials." ) return response
def test_non_20x_status(self, mocker): open_url = mocker.patch.object(http, "open_url") open_url.side_effect = HTTPError( "url", 404, "missing", {}, None, ) resp = http.request("GET", "example.com/bad") assert 404 == resp.status assert "missing" == resp.data assert "GET" == open_url.call_args[1]["method"] assert "example.com/bad" == open_url.call_args[1]["url"]
def _api_key_login(self): # We check the API key validity by using it to fetch its metadata from # the backend. This should also take care of validating if the backend # even supports the API key authentication. url = "{0}{1}".format(self.address, utils.build_core_v2_path( None, "apikeys", self.api_key, )) headers = dict(Authorization="Key {0}".format(self.api_key)) resp = http.request("GET", url, headers=headers) if resp.status != 200: raise errors.SensuError( "The API key {0}...{1} seems to be invalid or the backend " "does not support the API key authentication".format( self.api_key[:5], self.api_key[-5:], ) ) return headers
def _login(self): resp = http.request( "GET", "{0}/auth".format(self.address), force_basic_auth=True, url_username=self.username, url_password=self.password, ) if resp.status != 200: raise errors.SensuError( "Authentication call returned status {0}".format( resp.status), ) if resp.json is None: raise errors.SensuError( "Authentication call did not return a valid JSON", ) if "access_token" not in resp.json: raise errors.SensuError( "Authentication call did not return access token", ) return resp.json["access_token"]
def test_url_error(self, mocker): open_url = mocker.patch.object(http, "open_url") open_url.side_effect = URLError("Invalid") with pytest.raises(errors.HttpError): http.request("GET", "example.com/bad")
def test_cert_error_ssl_module_present(self, mocker): open_url = mocker.patch.object(http, "open_url") open_url.side_effect = ssl.CertificateError("Invalid") with pytest.raises(errors.HttpError): http.request("GET", "example.com/bad")
def request(self, method, path, payload=None): url = self.address + path headers = self.auth_header return http.request(method, url, payload=payload, headers=headers)
def request(self, method, path, payload=None): url = self.address + path headers = {"Authorization": "Bearer {0}".format(self.token)} return http.request(method, url, payload=payload, headers=headers)