示例#1
0
class ConversationTest(TestCase):
    def setUp(self):
        bus = mock.Mock()
        self.intent_service = IntentService(bus)
        self.intent_service.add_active_skill('atari_skill')
        self.intent_service.add_active_skill('c64_skill')

    def test_converse(self):
        """Check that the _converse method reports if the utterance is handled.

        Also check that the skill that handled the query is moved to the
        top of the active skill list.
        """
        def response(message, return_msg_type):
            c64 = Message(return_msg_type, {'skill_id': 'c64_skill',
                                            'result': False})
            atari = Message(return_msg_type, {'skill_id': 'atari_skill',
                                              'result': True})
            msgs = {'c64_skill': c64, 'atari_skill': atari}

            return msgs[message.data['skill_id']]

        self.intent_service.bus.wait_for_response.side_effect = response

        hello = ['hello old friend']
        utterance_msg = Message('recognizer_loop:utterance',
                                data={'lang': 'en-US',
                                      'utterances': hello})
        result = self.intent_service._converse(hello, 'en-US', utterance_msg)

        # Check that the active skill list was updated to set the responding
        # Skill first.
        first_active_skill = self.intent_service.active_skills[0][0]
        self.assertEqual(first_active_skill, 'atari_skill')

        # Check that a skill responded that it could handle the message
        self.assertTrue(result)

    def test_converse_error(self):
        """Check that all skill IDs in the active_skills list are called.
        even if there's an error.
        """
        def response(message, return_msg_type):
            c64 = Message(return_msg_type, {'skill_id': 'c64_skill',
                                            'result': False})
            amiga = Message(return_msg_type,
                            {'skill_id': 'amiga_skill',
                             'error': 'skill id does not exist'})
            atari = Message(return_msg_type, {'skill_id': 'atari_skill',
                                              'result': False})
            msgs = {'c64_skill': c64,
                    'atari_skill': atari,
                    'amiga_skill': amiga}

            return msgs[message.data['skill_id']]

        self.intent_service.add_active_skill('amiga_skill')
        self.intent_service.bus.wait_for_response.side_effect = response

        hello = ['hello old friend']
        utterance_msg = Message('recognizer_loop:utterance',
                                data={'lang': 'en-US',
                                      'utterances': hello})
        result = self.intent_service._converse(hello, 'en-US', utterance_msg)

        # Check that the active skill list was updated to set the responding
        # Skill first.

        # Check that a skill responded that it couldn't handle the message
        self.assertFalse(result)

        # Check that each skill in the list of active skills were called
        call_args = self.intent_service.bus.wait_for_response.call_args_list
        sent_skill_ids = [call[0][0].data['skill_id'] for call in call_args]
        self.assertEqual(sent_skill_ids,
                         ['amiga_skill', 'c64_skill', 'atari_skill'])

    def test_reset_converse(self):
        """Check that a blank stt sends the reset signal to the skills."""
        def response(message, return_msg_type):
            c64 = Message(return_msg_type,
                          {'skill_id': 'c64_skill',
                           'error': 'skill id does not exist'})
            atari = Message(return_msg_type, {'skill_id': 'atari_skill',
                                              'result': False})
            msgs = {'c64_skill': c64, 'atari_skill': atari}

            return msgs[message.data['skill_id']]

        reset_msg = Message('mycroft.speech.recognition.unknown',
                            data={'lang': 'en-US'})
        self.intent_service.bus.wait_for_response.side_effect = response

        self.intent_service.reset_converse(reset_msg)
        # Check send messages
        wait_for_response_mock = self.intent_service.bus.wait_for_response
        c64_message = wait_for_response_mock.call_args_list[0][0][0]
        self.assertTrue(check_converse_request(c64_message, 'c64_skill'))
        atari_message = wait_for_response_mock.call_args_list[1][0][0]
        self.assertTrue(check_converse_request(atari_message, 'atari_skill'))
        first_active_skill = self.intent_service.active_skills[0][0]
        self.assertEqual(first_active_skill, 'atari_skill')
class ConversationTest(TestCase):
    def setUp(self):
        bus = mock.Mock()
        self.intent_service = IntentService(bus)
        self.intent_service.add_active_skill('atari_skill')
        self.intent_service.add_active_skill('c64_skill')

    def test_converse(self):
        """Check that the _converse method reports if the utterance is handled.

        Also check that the skill that handled the query is moved to the
        top of the active skill list.
        """
        result = None

        def runner(utterances, lang, message):
            nonlocal result
            result = self.intent_service._converse(utterances, lang, message)

        hello = ['hello old friend']
        utterance_msg = Message('recognizer_loop:utterance',
                                data={
                                    'lang': 'en-US',
                                    'utterances': hello
                                })
        t = Thread(target=runner, args=(hello, 'en-US', utterance_msg))
        t.start()
        time.sleep(0.5)
        self.intent_service.handle_converse_response(
            Message('converse.response', {
                'skill_id': 'c64_skill',
                'result': False
            }))
        time.sleep(0.5)
        self.intent_service.handle_converse_response(
            Message('converse.response', {
                'skill_id': 'atari_skill',
                'result': True
            }))
        t.join()

        # Check that the active skill list was updated to set the responding
        # Skill first.
        first_active_skill = self.intent_service.active_skills[0][0]
        self.assertEqual(first_active_skill, 'atari_skill')

        # Check that a skill responded that it could handle the message
        self.assertTrue(result)

    def test_reset_converse(self):
        """Check that a blank stt sends the reset signal to the skills."""
        print(self.intent_service.active_skills)
        reset_msg = Message('mycroft.speech.recognition.unknown',
                            data={'lang': 'en-US'})
        t = Thread(target=self.intent_service.reset_converse,
                   args=(reset_msg, ))
        t.start()
        time.sleep(0.5)
        self.intent_service.handle_converse_error(
            Message('converse.error', {
                'skill_id': 'c64_skill',
                'error': 'skill id does not exist'
            }))
        time.sleep(0.5)
        self.intent_service.handle_converse_response(
            Message('converse.response', {
                'skill_id': 'atari_skill',
                'result': False
            }))

        # Check send messages
        c64_message = self.intent_service.bus.emit.call_args_list[0][0][0]
        self.assertTrue(check_converse_request(c64_message, 'c64_skill'))
        atari_message = self.intent_service.bus.emit.call_args_list[1][0][0]
        self.assertTrue(check_converse_request(atari_message, 'atari_skill'))