Esempio n. 1
0
    def test_skill_invoke_throw_exception_when_skill_id_doesnt_match(self):
        skill_config = self.create_skill_config()
        skill_config.skill_id = "123"
        mock_request_envelope = RequestEnvelope(context=Context(
            system=SystemState(application=Application(
                application_id="test"))))
        skill = Skill(skill_configuration=skill_config)

        with self.assertRaises(AskSdkException) as exc:
            skill.invoke(request_envelope=mock_request_envelope, context=None)

        assert "Skill ID Verification failed" in str(exc.exception), (
            "Skill invocation didn't throw verification error when Skill ID "
            "doesn't match Application ID")
Esempio n. 2
0
    def test_skill_invoke_null_response_in_response_envelope(self):
        mock_request_envelope = RequestEnvelope()

        self.mock_handler_adapter.supports.return_value = True
        self.mock_handler_adapter.execute.return_value = None

        skill_config = self.create_skill_config()
        skill = Skill(skill_configuration=skill_config)

        response_envelope = skill.invoke(
            request_envelope=mock_request_envelope, context=None)

        assert response_envelope.response is None, (
            "Skill invocation returned incorrect response from "
            "request dispatch")
    def __init__(self,
                 bot: BotBase,
                 loglevel: int = logging.INFO,
                 logfile: Optional[str] = None) -> None:
        self._bot = bot
        self._skill_builder = SkillBuilder()
        self._skill_builder.request_handlers.extend([
            LaunchRequestHandler(self._bot),
            IntentRequestHandler(self._bot),
            SessionEndedRequestHandler(self._bot),
        ])
        self._skill_builder.add_exception_handler(
            DefaultExceptionHandler(self._bot))

        self._skill = Skill(
            skill_configuration=self._skill_builder.skill_configuration)

        super().__init__(loglevel=loglevel, logfile=logfile)
Esempio n. 4
0
    def test_skill_invoke_pass_session_attributes_to_response_envelope(self):
        mock_request_envelope = RequestEnvelope(
            context=Context(system=SystemState(application=Application(
                application_id="test"))),
            session=Session(attributes={"foo": "bar"}))

        self.mock_handler_adapter.supports.return_value = True
        self.mock_handler_adapter.execute.return_value = None

        skill_config = self.create_skill_config()
        skill_config.skill_id = "test"
        skill = Skill(skill_configuration=skill_config)

        response_envelope = skill.invoke(
            request_envelope=mock_request_envelope, context=None)

        assert response_envelope.session_attributes is not None, (
            "Session Attributes are not propagated from Request Envelope "
            "session to Response Envelope, "
            "during skill invocation")
        assert response_envelope.session_attributes["foo"] == "bar", (
            "Invalid Session Attributes propagated from Request Envelope "
            "session to Response Envelope, "
            "during skill invocation")
Esempio n. 5
0
    def test_skill_invoke_set_service_client_factory_if_api_client_provided(
            self):
        mock_request_envelope = RequestEnvelope(context=Context(
            system=SystemState(application=Application(application_id="test"),
                               api_access_token="test_api_access_token",
                               api_endpoint="test_api_endpoint")))

        self.mock_handler_adapter.supports.return_value = True
        self.mock_handler_adapter.execute.return_value = None

        skill_config = self.create_skill_config()
        skill_config.skill_id = "test"
        skill_config.api_client = "test_api_client"
        skill = Skill(skill_configuration=skill_config)

        skill.invoke(request_envelope=mock_request_envelope, context=None)

        called_args, called_kwargs = self.mock_request_mapper.get_request_handler_chain.call_args
        test_handler_input = called_args[0]

        assert test_handler_input.service_client_factory is not None, (
            "Service Client Factory not initialized when api client is "
            "provided in skill configuration, "
            "during skill invocation")
        assert test_handler_input.service_client_factory.api_configuration.api_client == "test_api_client", (
            "Api Client value in Service Client Factory different than the "
            "one provided in skill configuration")
        assert test_handler_input.service_client_factory.api_configuration.authorization_value == \
            "test_api_access_token", ("Api Access Token value in Service "
                                      "Client Factory different than the one "
                                      "present "
                                      "in request envelope")
        assert test_handler_input.service_client_factory.api_configuration.api_endpoint == \
            "test_api_endpoint", ("Api Endpoint value in Service Client "
                                  "Factory different than the one present "
                                  "in request envelope")
Esempio n. 6
0
    def test_create_skill(self):
        mock_request_handler = mock.MagicMock(spec=AbstractRequestHandler)
        self.sb.add_request_handler(request_handler=mock_request_handler)

        mock_exception_handler = mock.MagicMock(spec=AbstractExceptionHandler)
        self.sb.add_exception_handler(exception_handler=mock_exception_handler)

        actual_skill = self.sb.create()
        expected_skill = Skill(self.sb.skill_configuration)

        assert actual_skill.request_dispatcher.request_mappers[0].request_handler_chains[0].request_handler == \
            expected_skill.request_dispatcher.request_mappers[0].request_handler_chains[0].request_handler, (
            "Skill Builder created skill with incorrect request handlers when "
            "using create method")

        assert actual_skill.request_dispatcher.exception_mapper.exception_handlers[0] == \
            expected_skill.request_dispatcher.exception_mapper.exception_handlers[0], (
            "Skill Builder created skill with incorrect exception handlers "
            "when using create method")
class AlexaPrizeBotBuilder(BotBuilderBase):
    """The bot builder class for the Alexa Prize channel.
    """

    __slots__ = ('_bot', '_skill_builder', '_skill')

    def __init__(self,
                 bot: BotBase,
                 loglevel: int = logging.INFO,
                 logfile: Optional[str] = None) -> None:
        self._bot = bot
        self._skill_builder = SkillBuilder()
        self._skill_builder.request_handlers.extend([
            LaunchRequestHandler(self._bot),
            IntentRequestHandler(self._bot),
            SessionEndedRequestHandler(self._bot),
        ])
        self._skill_builder.add_exception_handler(
            DefaultExceptionHandler(self._bot))

        self._skill = Skill(
            skill_configuration=self._skill_builder.skill_configuration)

        super().__init__(loglevel=loglevel, logfile=logfile)

    async def _lambda_function(self, event: RequestEnvelope,
                               context: Any) -> Dict[str, Any]:
        """The AWS Lambda function handler.

        See
        https://github.com/alexa-labs/alexa-skills-kit-sdk-for-python/blob/master/ask-sdk-core/ask_sdk_core/skill_builder.py
        """

        request_envelope = self._skill.serializer.deserialize(
            payload=json.dumps(event), obj_type=RequestEnvelope)

        slowbro_logger = SlowbroLogger(
            logger=logger, request_id=request_envelope.request.request_id)

        slowbro_logger.info('Session ID: %s',
                            request_envelope.session.session_id)

        response_envelope = self._skill.invoke(
            request_envelope=request_envelope, context=context)

        return self._skill.serializer.serialize(response_envelope)

    async def _server_handler(self, req: web.Request) -> web.Response:
        """The server handler.

        For Alexa Skill, the response Status code is always 200 unless exception
        happens.
        """

        event = await req.json()

        try:
            data = await self._lambda_function(event, {})
            return web.json_response(data)
        except Exception as e:
            raise e