示例#1
0
def main():
    serializer = DefaultSerializer()
    request_envelope = serializer.deserialize(request.data, RequestEnvelope)
    response_envelope = SKILL.invoke(request_envelope=request_envelope,
                                     context=None)

    return jsonify(serializer.serialize(response_envelope))
示例#2
0
def response_from_dict(response_dict) -> ResponseEnvelope:
    """
    Deserialize a response dictionary to a Response object
    Args:
        response_dict(dict): The response dictionary
    Returns: The deserialized response
    """
    serializer = DefaultSerializer()
    response_json = json.dumps(serializer.serialize(response_dict))
    return serializer.deserialize(response_json, ResponseEnvelope)
示例#3
0
def send_request(endpoint_url: str,
                 request_envelope: RequestEnvelope) -> ResponseEnvelope:
    """Sends a request to the endpoint and returns the response."""
    serializer = DefaultSerializer()
    r = requests.post(
        endpoint_url,
        json=serializer.serialize(request_envelope),
    )
    response_envelope = serializer.deserialize(payload=r.text,
                                               obj_type=ResponseEnvelope)

    return response_envelope
示例#4
0
def operator_intent_handler(handler_input: HandlerInput):
    op = get_slot_value(handler_input, "operand")
    stack = DZ.deserialize(
        handler_input.attributes_manager.session_attributes["stack"],
        'list[float]')
    handler_input.attributes_manager.session_attributes[
        "stack"] = DZ.serialize([despatch[op](stack)])

    text = f"Operator intent, {op}"
    handler_input.response_builder.speak(text).set_card(
        SimpleCard("Calculator", text)).set_should_end_session(False)
    return handler_input.response_builder.response
    def test_primitive_obj_deserialization_raising_type_error(self):
        test_serializer = DefaultSerializer()
        mocked_primitive_type = mock.Mock(side_effect=TypeError())

        test_serializer.PRIMITIVE_TYPES = [mocked_primitive_type]

        test_payload = "test"
        test_obj_type = mocked_primitive_type
        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert test_serializer.deserialize(
                test_payload, test_obj_type) == test_payload, \
                "Default Serializer deserialized primitive type which raises TypeError incorrectly"
    def test_primitive_obj_deserialization_raising_unicode_exception(self):
        test_serializer = DefaultSerializer()
        mocked_primitive_type = mock.Mock(
            side_effect=UnicodeEncodeError('hitchhiker', u"", 42, 43, 'the universe and everything else'))

        test_serializer.PRIMITIVE_TYPES = [mocked_primitive_type]

        test_payload = u"√"
        test_obj_type = mocked_primitive_type
        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert test_serializer.deserialize(
                test_payload, test_obj_type) == u"\u221a", \
                "Default Serializer deserialized primitive type which raises UnicodeEncodeError incorrectly"
    def __init__(self, serializer=None, output_type=None):
        # type: (Serializer, Union[T, str]) -> None
        """Initializing the default serializer to deserialize rendered content
        to skill response output.

        If no serializer is specified, default serializer from
        :py:class:`ask_sdk_core.serialize.DefaultSerializer` is set also if the
        output type is not specified default value of
        :py:class:`ask_sdk_model.response.Response` is set.

        The ``output_type`` parameter can be a primitive type, a generic
        model object or a list / dict of model objects.

        :param serializer: Serializer to deserialize template content
        :type serializer: :py:class:`ask_sdk_model.services.Serializer`
        :param output_type: resolved class name for deserialized object
        :type output_type: Union[object, str]
        """
        if serializer is None:
            serializer = DefaultSerializer()

        if output_type is None:
            output_type = 'ask_sdk_model.response.Response'

        self.serializer = serializer
        self.output_type = output_type
示例#8
0
    def test(self, test_items):
        """
        Test the sequence of TestItems against self.validators
        Args:
            test_items(list of TestItem): the sequence of TestItems
        """
        if len(test_items) == 0:
            raise AttributeError("test_items must not be empty")
        handler = self.handler
        session_attributes = {}
        session_id = test_items[0].request.session.session_id.format(
            uuid.uuid4())
        for i, item in enumerate(test_items):
            item.request.session.new = i == 0
            item.request.session.attributes = session_attributes
            item.request.session.session_id = session_id

            if item.session_attributes:
                for k, v in item.session_attributes.items():
                    item.request.session.attributes[k] = v

            context = item.request.context
            if item.user_access_token is not None:
                context.system.api_access_token = item.user_access_token

            if item.profile_info is not None:
                handler = responses.activate(self.handler)
                add_profile_mock(context, item.profile_info)

            response_dict = handler(
                DefaultSerializer().serialize(item.request), context)
            response = response_from_dict(response_dict)
            for validator in self.validators:
                validator.validate(item, response)
            session_attributes = response.session_attributes
 def handle(self, handler_input):
     session_attr = handler_input.attributes_manager.session_attributes
     logger.debug("Session Attr: {}".format(session_attr))
     # get the last response stored in session_attributes and return it
     cached_response_str = json.dumps(session_attr["recent_response"])
     cached_response = DefaultSerializer().deserialize(
         cached_response_str, Response)
     return cached_response
示例#10
0
def operand_intent_handler(handler_input: HandlerInput):
    val = float(get_slot_value(handler_input, "operand"))
    stack = []
    try:
        stack = DZ.deserialize(
            handler_input.attributes_manager.session_attributes['stack'],
            'List[float]')
    except:
        pass
    stack.append(val)
    handler_input.attributes_manager.session_attributes[
        'stack'] = DZ.serialize(stack)
    text = f"Operand intent, {val}"

    handler_input.response_builder.speak(text).set_card(
        SimpleCard("Calculator", text)).set_should_end_session(False)
    return handler_input.response_builder.response
示例#11
0
    def get_recent_response(handler_input):
        """Returns last response object sent."""
        attr = handler_input.attributes_manager.session_attributes

        cached_response_str = json.dumps(attr['recent_response'])
        cached_response = DefaultSerializer().deserialize(
            cached_response_str, Response)
        return cached_response
    def handle(self, handler_input):
        obj_serializer = DefaultSerializer()
        current_intent = handler_input.request_envelope.request.intent

        reprompt = "what is the stop name you looking for?"
        speech = "Can you provide me the stop name you are looking for?"

        # Receive the slot that was stored when the user uttered the bus number
        bus_number = get_slot_value(slot_name=SLOT_ROUTE_NUMBER,
                                    handler_input=handler_input)
        current_intent.confirmation_status = IntentConfirmationStatus.NONE

        route = validate_route(
            bus_number)  # Says if the route is a vlid route of UMD or not
        if route:
            handler_input.attributes_manager.session_attributes[
                R.DEFAULT_ROUTE] = obj_serializer.serialize({
                    R.ROUTE_TITLE:
                    route.route_title,
                    R.ROUTE_TAG:
                    route.route_tag
                })

            # Confirm the route just for the workflow
            current_intent.slots[
                SLOT_ROUTE_NUMBER].confirmation_status = SlotConfirmationStatus.CONFIRMED
            return handler_input.response_builder.add_directive(
                ElicitSlotDirective(
                    current_intent,
                    SLOT_STOP_NAME)).speak(speech).ask(reprompt).response
        else:
            # Set the slot to None so that if Delegation were to be used,
            # Alexa can know to ask for this slot automatically
            current_intent.slots[SLOT_ROUTE_NUMBER].value = None
            wrong_route_speech = "The bus number is incorrect. Please provide me with a valid bus number. What is the " \
                                 "bus number?"
            wrong_route_reprompt = "What is the bus number?"
            return handler_input.response_builder.add_directive(
                ElicitSlotDirective(current_intent, SLOT_ROUTE_NUMBER)).speak(
                    wrong_route_speech).ask(wrong_route_reprompt).response
 def handle(self, handler_input):
     current_intent = handler_input.request_envelope.request.intent
     obj_serializer = DefaultSerializer()
     stop_val = get_slot(slot_name=SLOT_STOP_NAME,
                         handler_input=handler_input)
     default_route = handler_input.attributes_manager.session_attributes.get(
         R.DEFAULT_ROUTE)
     current_intent.confirmation_status = IntentConfirmationStatus.NONE
     matches = stop_val.resolutions.resolutions_per_authority
     # If the stop was matched with a valid name
     if matches[0].status.code == StatusCode.ER_SUCCESS_MATCH:
         matched_stop = matches[0].values[0]
         route = RouteConfig.get_data_route_and_agency_tag(
             agency_tag="umd", route_tag=default_route[R.ROUTE_TAG])
         stop_id = matched_stop.value.id
         if route.has_stop(stop_id):
             stop = route.get_stop_by_id(stop_id)
             handler_input.attributes_manager.session_attributes[
                 R.DEFAULT_STOP] = obj_serializer.serialize({
                     R.STOP_ID:
                     stop.stop_id,
                     R.DIRECTION:
                     stop.direction,
                     R.STOP_TITLE:
                     stop.stop_title
                 })
         else:
             current_intent.slots[SLOT_STOP_NAME].value = None
             current_intent.slots[
                 SLOT_STOP_NAME].confirmation_status = SlotConfirmationStatus.NONE
             return handler_input.response_builder.add_directive(
                 ElicitSlotDirective(current_intent, SLOT_STOP_NAME)
             ).speak(
                 "The stop while confirming is not a stop for this route. Please try again with a stop name or stop number "
                 "that is in this route").ask(
                     "Provide a stop name or stop number").response
     return handler_input.response_builder.add_directive(
         ConfirmIntentDirective(current_intent)).speak(
             "I am setting these defaults. Is that okay?").response
 def handle(self, handler_input):
     # type: (HandlerInput) -> Response
     logger.info("In RepeatHandler")
     attr = handler_input.attributes_manager.session_attributes
     response_builder = handler_input.response_builder
     if "recent_response" in attr:
         cached_response_str = json.dumps(attr["recent_response"])
         cached_response = DefaultSerializer().deserialize(
             cached_response_str, Response)
         return cached_response
     else:
         response_builder.speak(data.FALLBACK_ANSWER).ask(data.SET_MESSAGE)
         return response_builder.response
def main():
    cmdline_parser = argparse.ArgumentParser(
        description=__doc__
    )
    cmdline_parser.add_argument(
        '--endpoint_url',
        default='http://localhost:8080',
        help='endpoint_url'
    )
    cmdline_parser.add_argument(
        '--logdir',
        required=True,
        help='log directory'
    )
    args = cmdline_parser.parse_args()

    serializer = DefaultSerializer()

    if not os.path.exists(args.logdir):
        os.mkdir(args.logdir)


    curr_request = create_launch_request()
    curr_session_attributes: Dict[str, Any] = {}
    round_index = 1
    while True:
        request_envelope = create_request_envelope(
            curr_session_attributes,
            curr_request
        )

        request_json = os.path.join(
            args.logdir,
            'request.round_{}.json'.format(round_index)
        )
        fp = codecs.open(
            request_json,
            'w',
            encoding='utf-8'
        )
        fp.write(json.dumps(serializer.serialize(request_envelope)))
        fp.write('\n')
        fp.close()

        response_envelope = send_request(
            args.endpoint_url,
            request_envelope
        )
        response = response_envelope.response
        if response.should_end_session:
            print('=' * 8, 'Session Ended', '=' * 8)
            print(curr_session_attributes)
            break

        print('=' * 8, 'Round Index:', round_index, '=' * 8 )
        print('Bot Utterance: ',
              unescape_ssml(response.output_speech.ssml[7:-8]))
        if response.reprompt:
            print('Bot Reprompt: ',
                  unescape_ssml(response.reprompt.output_speech.ssml[7:-8]))


        round_index += 1
        user_utterance = input('User Utterance: ')
        curr_session_attributes = response_envelope.session_attributes
        curr_request = create_intent_request(
            round_index=round_index,
            user_utterance=user_utterance,
        )
示例#16
0
def parse_handler_input(
        handler_input: HandlerInput,
) -> Tuple[UserMessage, Dict[str, Any]]:
    """Parses the ASK-SDK HandlerInput into Slowbro UserMessage.

    Returns the UserMessage object and serialized SessionAttributes.
    """

    request_envelope = handler_input.request_envelope

    text: str
    asr_hypos: List[AsrHypothesisUtterance] = []
    if is_request_type("LaunchRequest")(handler_input):
        # This is a launch request.
        text = ''
    elif is_request_type("IntentRequest")(handler_input):
        slots = request_envelope.request.intent.slots
        slot_text = slots.get('Text', None)
        if slot_text is not None:
            text = slot_text.value
        else:
            text = ''

        if hasattr(request_envelope.request, 'speechRecognition'):
            hypotheses = request_envelope.request.speechRecognition.get('hypotheses', [])
            asr_hypos.extend([
                AsrHypothesisUtterance(
                    [
                        AsrHypothesisToken(
                            token['value'],
                            token['confidence'],
                            token['startOffsetInMilliseconds'],
                            token['endOffsetInMilliseconds']
                        )
                        for token in hypo['tokens']
                    ],
                    hypo['confidence']
                )
                for hypo in hypotheses
            ])
        elif text:
            # NOTE: create a fake ASR hypo using the text field.
            asr_hypos.extend([
                AsrHypothesisUtterance(
                    [
                        AsrHypothesisToken(
                            token,
                            -1,
                            -1,
                            -1
                        )
                        for token in text.split(' ')
                    ],
                    -1
                )
            ])

        if not text:
            # Try to recover the text using asr_hypos.
            # Otherwise, raise an exception.
            if asr_hypos:
                text = asr_hypos[0].__str__()
            else:
                raise Exception('Unable to find "text" from handler input:',
                                handler_input)
    else:
        raise Exception('Unable to parse handler input:',
                        handler_input)


    serializer = DefaultSerializer()
    user_message = UserMessage(
        payload=serializer.serialize(request_envelope),
        channel='alexaprize',
        request_id=request_envelope.request.request_id,
        session_id=request_envelope.session.session_id,
        user_id=request_envelope.session.user.user_id,
        text=text,
        asr_hypos=asr_hypos
    )

    attributes_manager = handler_input.attributes_manager
    ser_session_attributes = attributes_manager.session_attributes

    return (user_message, ser_session_attributes)
示例#17
0
import logging.handlers
import uuid

from ask_sdk_core.skill_builder import CustomSkillBuilder
from ask_sdk_core.api_client import DefaultApiClient
from ask_sdk_core.utils import is_request_type, is_intent_name
from ask_sdk_core.handler_input import HandlerInput
from ask_sdk_core.serialize import DefaultSerializer

from ask_sdk_model.interfaces.custom_interface_controller import (
    StartEventHandlerDirective, EventFilter, Expiration, FilterMatchAction,
    StopEventHandlerDirective, SendDirectiveDirective, Header, Endpoint)

logger = logging.getLogger()
logger.setLevel(logging.INFO)
serializer = DefaultSerializer()
skill_builder = CustomSkillBuilder(api_client=DefaultApiClient())


@skill_builder.request_handler(can_handle_func=is_request_type("LaunchRequest")
                               )
def launch_request_handler(handler_input: HandlerInput):
    logger.info("== Launch Intent ==")

    response_builder = handler_input.response_builder

    system = handler_input.request_envelope.context.system

    # Get connected gadget endpoint ID.
    endpoints = get_connected_endpoints(handler_input)
    logger.debug("Checking endpoint..")
示例#18
0
import sys, os
import importlib

from ask_sdk_core.serialize import DefaultSerializer
from ask_sdk_model.request_envelope import RequestEnvelope
from ask_sdk_model.context import Context

sd = DefaultSerializer()

# TODO: I think the smart thing to build a test bench would be to go through all
# the handlers and just look for a file in some predetermined location and a
# file with the name of the function with a json extension.
#   e.g., def LaunchRequestHandler: ==> ../sampleEvents/LaunchRequest.json
# Then if someone wanted different names for the files they would have to
# specify a dictionry below. To quickly get the that information I think it
# would be able to come from the generated language model that the online
# creator makes. But there is away to do it by going through the model and
# looking at it's parent class. 

samples_path = 'utils/sampleEvents'
sample_events = {
    'LaunchRequest': '/LaunchRequestEvent.json',
    'HelpIntent': '/helpIntent.json',
    'GetNextMatchIntent': '/getNextMatchEvent.json',
    'GetNextTeamMatchIntent': '',
    'GetTeamRecordIntent': '/getTeamRecordEvent.json',
    'GetTodaysMatchesIntent': '/getTodaysMatchesEvent.json',
    'GetTomorrowsMatchesIntent': '/getTomorrowsMatchesEvent.json',
    'GetStandingsIntent': '/getStandingsEvent.json',
    'GetTopTeamIntent': '/getTopTeamEven.json',
    'GetNextTeamMatchIntent': '/getNextTeamMatchEvent.json'
 def setUp(self):
     self.test_serializer = DefaultSerializer()
class TestSerialization(unittest.TestCase):
    def setUp(self):
        self.test_serializer = DefaultSerializer()

    def test_none_obj_serialization(self):
        test_obj = None
        assert self.test_serializer.serialize(test_obj) is None, \
            "Default Serializer serialized None object incorrectly"

    def test_primitive_obj_serialization(self):
        test_obj = "test"
        assert self.test_serializer.serialize(test_obj) == test_obj, \
            "Default Serializer serialized str object incorrectly"

        test_obj = 123
        assert self.test_serializer.serialize(test_obj) == test_obj, \
            "Default Serializer serialized int object incorrectly"

        test_obj = u"test"
        assert self.test_serializer.serialize(test_obj) == test_obj, \
            "Default Serializer serialized unicode object incorrectly"

        test_obj = b"test"
        assert self.test_serializer.serialize(test_obj) == test_obj, \
            "Default Serializer serialized bytes object incorrectly"

        test_obj = False
        assert self.test_serializer.serialize(test_obj) == test_obj, \
            "Default Serializer serialized bool object incorrectly"

    def test_list_obj_serialization(self):
        test_obj_inst = data.ModelTestObject2(int_var=123)
        test_list_obj = ["test", 123, test_obj_inst]

        expected_list = ["test", 123, {"var4Int": 123}]
        assert self.test_serializer.serialize(test_list_obj) == expected_list, \
            "Default Serializer serialized list object incorrectly"

    def test_tuple_obj_serialization(self):
        test_obj_inst = data.ModelTestObject2(int_var=123)
        test_tuple_obj = ("test", 123, test_obj_inst)

        expected_tuple = ("test", 123, {"var4Int": 123})
        assert self.test_serializer.serialize(test_tuple_obj) == expected_tuple, \
            "Default Serializer serialized tuple object incorrectly"

    def test_datetime_obj_serialization(self):
        test_obj = datetime.datetime(2018, 1, 1, 10, 20, 30)
        expected_datetime = "2018-01-01T10:20:30"
        assert self.test_serializer.serialize(test_obj) == expected_datetime, \
            "Default Serializer serialized datetime object incorrectly"

    def test_date_obj_serialization(self):
        test_obj = datetime.date(2018, 1, 1)
        expected_date = "2018-01-01"
        assert self.test_serializer.serialize(test_obj) == expected_date, \
            "Default Serializer serialized datetime object incorrectly"

    def test_dict_obj_serialization(self):
        test_obj_inst = data.ModelTestObject2(int_var=123)
        test_dict_obj = {
            "test_str": "test",
            "test_int": 123,
            "test_obj": test_obj_inst
        }

        expected_dict = {
            "test_str": "test",
            "test_obj": {
                "var4Int": 123
            },
            "test_int": 123,
        }
        assert self.test_serializer.serialize(test_dict_obj) == expected_dict, \
            "Default Serializer serialized dict object incorrectly"

    def test_model_obj_serialization(self):
        test_model_obj_2 = data.ModelTestObject2(int_var=123)
        test_model_obj_1 = data.ModelTestObject1(
            str_var="test", datetime_var=datetime.datetime(
                2018, 1, 1, 10, 20, 30), obj_var=test_model_obj_2)

        expected_serialized_obj = {
            "var1": "test",
            "var2Time": "2018-01-01T10:20:30",
            "var3Object": {
                "var4Int": 123
            }
        }
        assert self.test_serializer.serialize(test_model_obj_1) == expected_serialized_obj, \
            "Default Serializer serialized model object incorrectly"

    def test_enum_obj_serialization(self):
        test_model_obj_2 = data.ModelTestObject2(int_var=123)
        test_enum_obj = data.ModelEnumObject("ENUM_VAL_1")
        test_model_obj_1 = data.ModelTestObject1(
            str_var="test", datetime_var=datetime.datetime(
                2018, 1, 1, 10, 20, 30), obj_var=test_model_obj_2,
            enum_var=test_enum_obj)

        expected_serialized_obj = {
            "var1": "test",
            "var2Time": "2018-01-01T10:20:30",
            "var6Enum": "ENUM_VAL_1",
            "var3Object": {
                "var4Int": 123
            }
        }
        assert self.test_serializer.serialize(test_model_obj_1) == expected_serialized_obj, \
            "Default Serializer serialized enum object incorrectly"

    def test_decimal_obj_without_decimals_serialization(self):
        test_decimal_obj = decimal.Decimal(10)
        expected_obj = 10
        actual_obj = self.test_serializer.serialize(test_decimal_obj)

        assert actual_obj == expected_obj, (
            "Default Serializer serialized decimal object containing no "
            "decimals incorrectly")
        assert type(actual_obj) == int, (
            "Default Serializer serialized decimal object containing no "
            "decimals to incorrect type")

    def test_decimal_obj_with_decimals_serialization(self):
        test_decimal_obj = decimal.Decimal(10.5)
        expected_obj = 10.5
        actual_obj = self.test_serializer.serialize(test_decimal_obj)

        assert actual_obj == expected_obj, (
            "Default Serializer serialized decimal object containing "
            "decimals incorrectly")
        assert type(actual_obj) == float, (
            "Default Serializer serialized decimal object containing "
            "decimals to incorrect type")
class TestDeserialization(unittest.TestCase):
    def setUp(self):
        self.test_serializer = DefaultSerializer()

    def test_none_obj_deserialization(self):
        test_payload = None
        test_obj_type = str
        assert self.test_serializer.deserialize(
            test_payload, test_obj_type) is None, \
            "Default Serializer deserialized None object incorrectly"

    def test_str_obj_deserialization(self):
        test_payload = "test"
        test_obj_type = str
        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert self.test_serializer.deserialize(
                test_payload, test_obj_type) == test_payload, \
                "Default Serializer deserialized string object incorrectly"

    def test_unicode_obj_deserialization(self):
        test_payload = u"√"
        test_obj_type = unicode_type
        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert self.test_serializer.deserialize(
                test_payload, test_obj_type) == u"\u221a", \
                "Default Serializer deserialized unicode string object incorrectly"

    def test_int_obj_deserialization(self):
        test_payload = 123
        test_obj_type = int
        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert self.test_serializer.deserialize(
                test_payload, test_obj_type) == test_payload, \
                "Default Serializer deserialized int object incorrectly"

    def test_long_obj_deserialization(self):
        test_payload = 123
        test_obj_type = long_type
        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert self.test_serializer.deserialize(
                test_payload, test_obj_type) == long_type(test_payload), \
                "Default Serializer deserialized long object incorrectly"

    def test_primitive_obj_deserialization_raising_unicode_exception(self):
        test_serializer = DefaultSerializer()
        mocked_primitive_type = mock.Mock(
            side_effect=UnicodeEncodeError('hitchhiker', u"", 42, 43, 'the universe and everything else'))

        test_serializer.PRIMITIVE_TYPES = [mocked_primitive_type]

        test_payload = u"√"
        test_obj_type = mocked_primitive_type
        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert test_serializer.deserialize(
                test_payload, test_obj_type) == u"\u221a", \
                "Default Serializer deserialized primitive type which raises UnicodeEncodeError incorrectly"

    def test_primitive_obj_deserialization_raising_type_error(self):
        test_serializer = DefaultSerializer()
        mocked_primitive_type = mock.Mock(side_effect=TypeError())

        test_serializer.PRIMITIVE_TYPES = [mocked_primitive_type]

        test_payload = "test"
        test_obj_type = mocked_primitive_type
        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert test_serializer.deserialize(
                test_payload, test_obj_type) == test_payload, \
                "Default Serializer deserialized primitive type which raises TypeError incorrectly"

    def test_primitive_obj_deserialization_raising_value_error(self):
        test_payload = "test"
        test_obj_type = int

        with self.assertRaises(SerializationException) as exc:
            with patch("json.loads") as mock_json_loader:
                mock_json_loader.return_value = test_payload
                self.test_serializer.deserialize(test_payload, test_obj_type)

        assert "Failed to parse test into 'int' object" in str(exc.exception), \
            "Default Serializer didn't throw SerializationException when invalid primitive type is deserialized"

    def test_datetime_obj_serialization(self):
        # payload in iso8601 format
        test_payload = "2018-01-01T10:20:30"
        test_obj_type = datetime.datetime

        expected_obj = datetime.datetime(2018, 1, 1, 10, 20, 30)
        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert self.test_serializer.deserialize(test_payload, test_obj_type) == expected_obj, \
                "Default Serializer deserialized datetime object incorrectly"

    def test_date_obj_serialization(self):
        # payload in iso8601 format
        test_payload = "2018-01-01"
        test_obj_type = datetime.date

        expected_obj = datetime.date(2018, 1, 1)
        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert self.test_serializer.deserialize(test_payload, test_obj_type) == expected_obj, \
                "Default Serializer deserialized date object incorrectly"

    def test_datetime_obj_deserialization_raising_value_error(self):
        test_payload = "abc-wx-yzT25:80:90"
        test_obj_type = datetime.datetime

        with self.assertRaises(SerializationException) as exc:
            with patch("json.loads") as mock_json_loader:
                mock_json_loader.return_value = test_payload
                self.test_serializer.deserialize(test_payload, test_obj_type)

        assert "Failed to parse abc-wx-yzT25:80:90 into 'datetime' object" in str(exc.exception), \
            "Default Serializer didn't throw SerializationException when invalid datetime type is deserialized"

    def test_datetime_obj_deserialization_raising_import_error(self):
        test_payload = "abc-wx-yzT25:80:90"
        test_obj_type = datetime.datetime

        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            with mock.patch('dateutil.parser.parse') as parse_class:
                parse_class.side_effect = ImportError
                assert self.test_serializer.deserialize(
                    test_payload, test_obj_type) == test_payload, \
                    "Default Serializer didn't return datetime correctly for import errors"
                parse_class.assert_called_once_with(test_payload)

    def test_obj_type_deserialization(self):
        test_payload = "test"
        test_obj_type = object

        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert self.test_serializer.deserialize(
                test_payload, test_obj_type) == test_payload, \
                "Default Serializer deserialization of object returned other than the object itself"

    def test_native_type_mapping_deserialization(self):
        test_payload = "test"
        test_obj_type = "str"

        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert self.test_serializer.deserialize(
                test_payload, test_obj_type) == test_payload, (
                "Default Serializer deserialization of object with object_type of string class under native mapping "
                "not deserialized correctly")

    def test_polymorphic_list_obj_deserialization(self):
        test_payload = ["test", 123, "2018-01-01T10:20:30"]
        test_obj_type = "list[str, long, datetime]"

        deserialized_datetime_obj = datetime.datetime(2018, 1, 1, 10, 20, 30)
        expected_obj = ["test", 123, deserialized_datetime_obj]

        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert self.test_serializer.deserialize(
                test_payload, test_obj_type) == expected_obj, (
                "Default Serializer deserialized list containing poly type object incorrectly")

    def test_similar_list_obj_deserialization(self):
        test_payload = ["test", "test1", "2018-01-01T10:20:30"]
        test_obj_type = "list[str]"
        expected_obj = ["test", "test1", "2018-01-01T10:20:30"]

        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert self.test_serializer.deserialize(
                test_payload, test_obj_type) == expected_obj, (
                "Default Serializer deserialized list object containing similar type objects incorrectly")

    def test_dict_obj_deserialization(self):
        test_payload = {
            "test_key": ["test_val_1", "test_val_2"],
            "test_date_str": ["2018-01-01T10:20:30"]
        }
        test_obj_type = "dict(str, list[str])"

        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert self.test_serializer.deserialize(
                test_payload, test_obj_type) == test_payload, (
                "Default Serializer deserialized dict object incorrectly")

    def test_model_obj_deserialization(self):
        test_payload = {
            "var1": "test",
            "var2Time": "2018-01-01T10:20:30",
            "var3Object": {
                "var4Int": 123
            },
            "var6Enum": "ENUM_VAL_1"
        }
        test_obj_type = data.ModelTestObject1
        expected_datetime_obj = datetime.datetime(2018, 1, 1, 10, 20, 30)
        expected_sub_obj = data.ModelTestObject2(int_var=123)
        expected_enum_obj = data.ModelEnumObject("ENUM_VAL_1")
        expected_obj = data.ModelTestObject1(
            str_var="test", datetime_var=expected_datetime_obj, obj_var=expected_sub_obj, enum_var=expected_enum_obj)

        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert self.test_serializer.deserialize(
                test_payload, test_obj_type) == expected_obj, (
                "Default Serializer deserialized model object incorrectly")

    def test_model_obj_with_additional_params_in_payload_deserialization(self):
        test_payload = {
            "var4Int": 123,
            "add_param_1": "Test"
        }
        test_obj_type = data.ModelTestObject2
        expected_obj = data.ModelTestObject2(int_var=123)
        expected_obj.add_param_1 = "Test"

        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert self.test_serializer.deserialize(
                test_payload, test_obj_type) == expected_obj, (
                "Default Serializer deserialized model object incorrectly when payload has additional parameters")

    def test_invalid_model_obj_deserialization(self):
        test_payload = {
            "var_1": "some value"
        }
        test_obj_type = data.InvalidModelObject

        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert self.test_serializer.deserialize(
                test_payload, test_obj_type) == test_payload, (
                "Default Serializer didn't provide payload back when an invalid model object type "
                "(without attribute map and swagger type dict) is passed")

    def test_invalid_model_obj_type_deserialization(self):
        test_payload = {
            "var_1": "some value"
        }
        test_obj_type = "InvalidModelObject"

        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            with self.assertRaises(SerializationException) as exc:
                self.test_serializer.deserialize(test_payload, test_obj_type)

            assert "Unable to resolve class {} from installed modules".format(test_obj_type) in str(exc.exception), (
                "Default Serializer didn't throw SerializationException when deserialization is called with invalid "
                "object type")

    def test_invalid_json_deserialization(self):
        test_payload = {
            "var_1": "some value"
        }
        test_obj_type = "str"

        with patch("json.loads") as mock_json_loader:
            mock_json_loader.side_effect = Exception
            with self.assertRaises(SerializationException) as exc:
                self.test_serializer.deserialize(test_payload, test_obj_type)

        assert "Couldn't parse response body" in str(exc.exception), \
            "Default Serializer didn't throw SerializationException when invalid json is deserialized"

    def test_parent_model_obj_with_discriminator_deserialization(self):
        test_payload = {
            "ChildType": 'ChildType1',
            "var1": "Some string",
            "var3Object": {
                "var4Int": 123
            },
            "testVar": "test string"
        }
        test_obj_type = data.ModelAbstractParentObject
        expected_sub_obj = data.ModelTestObject2(int_var=123)
        expected_obj = data.ModelChildObject1(
            str_var="Some string", obj_var=expected_sub_obj, test_var="test string")

        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert self.test_serializer.deserialize(
                test_payload, test_obj_type) == expected_obj, (
                "Default Serializer deserialized model object incorrectly when object type is parent class "
                "with discriminator")

    def test_child_discriminator_model_obj_deserialization(self):
        test_payload = {
            "ChildType": 'ChildType2',
            "var1": "Some string",
            "var3Object": {
                "var4Int": 123
            },
            "testIntVar": 456
        }
        test_obj_type = data.ModelChildObject2
        expected_sub_obj = data.ModelTestObject2(int_var=123)
        expected_obj = data.ModelChildObject2(
            str_var="Some string", obj_var=expected_sub_obj, test_int_var=456)

        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            assert self.test_serializer.deserialize(
                test_payload, test_obj_type) == expected_obj, (
                "Default Serializer deserialized model object incorrectly when object type is parent class "
                "with discriminator")

    def test_parent_model_obj_with_invalid_discriminator_deserialization(self):
        test_payload = {
            "ChildType": 'InvalidType',
            "var1": "Some string",
            "var3Object": {
                "var4Int": 123
            },
            "testVar": "test string"
        }
        test_obj_type = data.ModelAbstractParentObject

        with patch("json.loads") as mock_json_loader:
            mock_json_loader.return_value = test_payload
            with self.assertRaises(SerializationException) as exc:
                self.test_serializer.deserialize(test_payload, test_obj_type)

            assert "Couldn't resolve object by discriminator type" in str(exc.exception), (
                "Default Serializer didn't throw SerializationException when deserialization is called with invalid "
                "discriminator type in payload and parent model")