1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
# -------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See LICENSE.txt in the project root for
# license information.
# -------------------------------------------------------------------------
import pytest
from unittest.mock import Mock
# module under test
from corehttp.exceptions import (
HttpResponseError,
SerializationError,
DeserializationError,
)
from corehttp.rest import HttpRequest
from rest_client import MockRestClient
from utils import SYNC_TRANSPORTS
class FakeErrorOne(object):
def __init__(self):
self.error = Mock(message="A fake error", code="FakeErrorOne")
class FakeErrorTwo(object):
def __init__(self):
self.code = "FakeErrorTwo"
self.message = "A different fake error"
class FakeHttpResponse(HttpResponseError):
def __init__(self, response, error, *args, **kwargs):
self.error = error
super(FakeHttpResponse, self).__init__(self, response=response, *args, **kwargs)
class TestExceptions(object):
def test_empty_httpresponse_error(self):
error = HttpResponseError()
assert str(error) == "Operation returned an invalid status 'None'"
assert error.message == "Operation returned an invalid status 'None'"
assert error.response is None
assert error.reason is None
assert error.status_code is None
def test_message_httpresponse_error(self):
error = HttpResponseError(message="Specific error message")
assert str(error) == "Specific error message"
assert error.message == "Specific error message"
assert error.response is None
assert error.reason is None
assert error.status_code is None
def test_error_continuation_token(self):
error = HttpResponseError(message="Specific error message", continuation_token="foo")
assert str(error) == "Specific error message"
assert error.message == "Specific error message"
assert error.response is None
assert error.reason is None
assert error.status_code is None
assert error.continuation_token == "foo"
@pytest.mark.parametrize("transport", SYNC_TRANSPORTS)
def test_httpresponse_error_with_response(self, port, transport):
request = HttpRequest("GET", url="http://localhost:{}/basic/string".format(port))
client = MockRestClient(port, transport=transport())
response = client.send_request(request, stream=False)
error = HttpResponseError(response=response)
assert error.message == "Operation returned an invalid status 'OK'"
assert error.response is not None
assert error.reason == "OK"
assert isinstance(error.status_code, int)
@pytest.mark.parametrize("transport", SYNC_TRANSPORTS)
def test_httpresponse_error_with_model(self, port, transport):
request = HttpRequest("GET", url="http://localhost:{}/basic/string".format(port))
client = MockRestClient(port, transport=transport())
response = client.send_request(request, stream=False)
error = HttpResponseError(response=response, model=FakeErrorTwo())
assert error.message == "Operation returned an invalid status 'OK'"
assert error.response is not None
assert error.reason == "OK"
assert error.model
assert error.model.code == "FakeErrorTwo"
assert error.model.message == "A different fake error"
assert isinstance(error.status_code, int)
@pytest.mark.parametrize("transport", SYNC_TRANSPORTS)
def test_malformed_json(self, port, transport):
request = HttpRequest("GET", "/errors/malformed-json")
client = MockRestClient(port, transport=transport())
response = client.send_request(request)
with pytest.raises(HttpResponseError) as ex:
response.raise_for_status()
assert (
str(ex.value)
== 'Operation returned an invalid status \'BAD REQUEST\'\nContent: {"code": 400, "error": {"global": ["MY-ERROR-MESSAGE-THAT-IS-COMING-FROM-THE-API"]'
)
@pytest.mark.parametrize("transport", SYNC_TRANSPORTS)
def test_text(self, port, transport):
request = HttpRequest("GET", "/errors/text")
client = MockRestClient(port, transport=transport())
response = client.send_request(request)
with pytest.raises(HttpResponseError) as ex:
response.raise_for_status()
assert str(ex.value) == "Operation returned an invalid status 'BAD REQUEST'\nContent: I am throwing an error"
def test_serialization_error():
message = "Oopsy bad input passed for serialization"
error = SerializationError(message)
with pytest.raises(SerializationError) as ex:
raise error
assert str(ex.value) == message
with pytest.raises(ValueError) as ex:
raise error
assert str(ex.value) == message
def test_deserialization_error():
message = "Oopsy bad input passed for serialization"
error = DeserializationError(message)
with pytest.raises(DeserializationError) as ex:
raise error
assert str(ex.value) == message
with pytest.raises(ValueError) as ex:
raise error
assert str(ex.value) == message
|