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")
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)
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")
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")
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