Пример #1
0
 def test_find_answer_function__does_not_exist(self):
     """Verify logic of find_answer_function for unrecognized intent.
     """
     mock_parsed_query = Mock(name='parsed_query', intent='foo_bar_query')
     fact_query = FactQuery(parsed_query=mock_parsed_query)
     fn = fact_query._find_answer_function()
     self.assertIsNone(fn)
Пример #2
0
 def test_find_answer_function__fact(self):
     """Verify logic of find_answer_function for fact intent.
     """
     mock_parsed_query = Mock(name='parsed_query', intent='animal_eat_fact')
     fact_query = FactQuery(parsed_query=mock_parsed_query)
     fn = fact_query._find_answer_function()
     self.assertEqual(fn, fact_query._animal_attribute_query)
Пример #3
0
    def test_animal_values_query__species_subject(self, select_relationships,
                                                  concept_is_species,
                                                  filter_by_concept_type):
        """Verify _animal_values_query for subject that is specise.
        """
        # Set up mocks and test data
        concept_is_species.return_value = True
        mock_1 = Mock(name='mock_1', object=Mock(concept_name='mosquitoes'))
        mock_2 = Mock(name='mock_2', object=Mock(concept_name='flies'))
        mock_3 = Mock(name='mock_2', object=Mock(concept_name='salmon'))
        select_relationships.return_value = [mock_1, mock_2, mock_3]
        filter_by_concept_type.return_value = [mock_1, mock_2]
        fact_query = FactQuery()

        # Make call
        result = fact_query._animal_values_query(relationship_type_name='eat',
                                                 subject_name='reptiles')

        # Verify result
        self.assertEqual(['flies', 'mosquitoes'], result)

        # Verify mocks
        concept_is_species.assert_called_once_with('reptiles')
        select_relationships.assert_called_once_with('eat')
        filter_by_concept_type.assert_called_once_with(
            [mock_1, mock_2, mock_3], 'reptiles', relationship_attr='subject')
Пример #4
0
    def test_animal_attribute_query__no_match(self, select_relationships,
                                              concept_is_species):
        """Verify calls made by _animal_attribute_query.
        """
        # Set up mocks and test data
        select_relationships.return_value = []
        concept_is_species.return_value = False
        parsed_query = Mock(name='parsed_query',
                            text='do herons have wings',
                            subject_name='herons',
                            object_name='wings',
                            relationship_type_name='have',
                            relationship_number=2)
        fact_query = FactQuery(parsed_query=parsed_query)

        # Make call
        result = fact_query._animal_attribute_query()

        # Verify results
        self.assertEqual('no', result)

        # Verify mocks
        select_relationships.assert_called_once_with('have',
                                                     subject_name='herons',
                                                     object_name='wings',
                                                     relationship_number=2)
Пример #5
0
 def test_find_answer_function__ci(self):
     """Verify logic of find_answer_function for query intent that is capitalized.
     """
     mock_parsed_query = Mock(name='parsed_query',
                              intent='ANIMAL_EAT_QUERY')
     fact_query = FactQuery(parsed_query=mock_parsed_query)
     fn = fact_query._find_answer_function()
     self.assertEqual(fn, fact_query._animal_eat_query)
Пример #6
0
    def test_filter_relationships_by_concept_type__object(self):
        """Verify calls made by _filter_relationships_by_concept_type for 'object' attr.
        """
        # Set up mocks and test data
        concept_type = 'birds'
        mock_match_0 = Mock(name='mock_match_0',
                            object=Mock(name='mock_subject_0',
                                        concept_name='mock_subject_0',
                                        concept_types=['birds', 'snakes']))

        mock_match_1 = Mock(name='mock_match_1',
                            object=Mock(name='mock_subject_1',
                                        concept_name='mock_subject_1',
                                        concept_types=['snakes', 'turtles']))

        mock_match_2 = Mock(name='mock_match_2',
                            object=Mock(name='mock_subject_2',
                                        concept_name='mock_subject_2',
                                        concept_types=['snakes', 'birds']))

        mock_matches = [mock_match_0, mock_match_1, mock_match_2]

        # Make call
        filtered_matches = FactQuery._filter_relationships_by_concept_type(
            mock_matches, concept_type, relationship_attr='object')

        # Verify results
        self.assertEqual([mock_match_0, mock_match_2], filtered_matches)
Пример #7
0
    def test_select_matching_relationships(self, select_by_values):
        """Verify calls made by _select_matching_relationships.
        """
        # Set up mocks and test data
        select_by_values.return_value = ['one', 'two']
        test_relationship_type_name = 'eats'
        test_subject_name = 'otter'
        test_object_name = 'mussels'
        test_rel_number = 99

        # Make call
        matches = FactQuery._select_matching_relationships(
            test_relationship_type_name,
            subject_name=test_subject_name,
            object_name=test_object_name,
            relationship_number=test_rel_number)
        # Verify result
        self.assertEqual(['one', 'two'], matches)

        # Verify mocks
        select_by_values.assert_called_once_with(
            relationship_type_name=test_relationship_type_name,
            subject_name=test_subject_name,
            object_name=test_object_name,
            relationship_number=test_rel_number)
Пример #8
0
    def test_select_by_concept_type__no_matches(self, select_relationships):
        """Verify return value of select_by_concept_type when no results are found.
        """
        select_relationships.return_value = []

        result = FactQuery._select_by_concept_type(Mock(name='concept_types'))
        self.assertEqual([], result)
Пример #9
0
    def test_find_answer(self, find_fn):
        """Verify calls made by find_answer.
        """
        # Set up mocks and test data
        find_fn.return_value = mock_fn = Mock(name='mock_fn',
                                              return_value='hi')
        mock_query = Mock(name='parsed_query')
        fact_query = FactQuery(parsed_query=mock_query)

        # Make call
        answer = fact_query.find_answer()

        # Verify result
        self.assertEqual('hi', answer)

        # Verify mocks
        self.assertEqual(1, find_fn.call_count)
Пример #10
0
 def test_concept_is_species(self, select_relationships):
     """Verify calls made by _concept_is_species.
     """
     select_relationships.return_value = mock_matches = Mock(name='matches')
     result = FactQuery._concept_is_species('birds')
     self.assertTrue(result)
     select_relationships.assert_called_once_with('is',
                                                  subject_name='birds',
                                                  object_name='species')
Пример #11
0
    def test_which_reptiles__species_subject(self, select_relationships,
                                             concept_is_species,
                                             filter_by_concept_type):
        """Scenario of relationship='eat', subject='reptiles', object='bugs'.
        """
        # Set up mocks and test data
        parsed_query = Mock(name='parsed_query',
                            text='which reptiles eat bugs',
                            subject_name='reptiles',
                            object_name='bugs',
                            relationship_type_name='eat',
                            relationship_number=3,
                            relationship_negation=False)
        fact_query = FactQuery(parsed_query=parsed_query)

        mock_match_1 = Mock(name='match_1',
                            subject=Mock(concept_name='subject_1'))
        mock_match_2 = Mock(name='match_2',
                            subject=Mock(concept_name='subject_2'))
        select_relationships.return_value = [mock_match_1, mock_match_2]
        concept_is_species.side_effect = [False, True]
        filter_by_concept_type.return_value = [mock_match_1, mock_match_2]

        # Make call
        results = fact_query._which_animal_query()

        # Verify results
        self.assertEqual(set(['subject_1', 'subject_2']), set(results))

        # Verify mocks
        select_relationships.assert_called_once_with('eat',
                                                     object_name='bugs',
                                                     relationship_number=3)

        call_args_list = concept_is_species.call_args_list
        self.assertEqual(2, len(call_args_list))
        self.assertEqual(call('bugs'), call_args_list[0])
        self.assertEqual(call('reptiles'), call_args_list[1])

        filter_by_concept_type.assert_called_once_with(
            [mock_match_1, mock_match_2],
            'reptiles',
            relationship_attr='subject')
Пример #12
0
    def test_find_answer__no_answer_fn(self, find_fn):
        """Verify ValueError if no answer function exists.
        """
        # Set up mocks and test data
        find_fn.return_value = None
        mock_query = Mock(name='parsed_query')
        fact_query = FactQuery(parsed_query=mock_query)

        # Make call
        self.assertRaisesRegexp(ValueError, 'No answer function found',
                                fact_query.find_answer)
Пример #13
0
    def test_animal_values_query(self, select_relationships,
                                 concept_is_species):
        """Verify _animal_values_query for non-species subject.
        """
        # Set up mocks and test data
        concept_is_species.return_value = False
        mock_1 = Mock(name='mock_1', object=Mock(concept_name='mosquitoes'))
        mock_2 = Mock(name='mock_2', object=Mock(concept_name='flies'))
        select_relationships.return_value = [mock_1, mock_2]
        fact_query = FactQuery()

        # Make call
        result = fact_query._animal_values_query(relationship_type_name='eat',
                                                 subject_name='frogs')

        # Verify result
        self.assertEqual(['flies', 'mosquitoes'], result)

        # Verify mocks
        concept_is_species.assert_called_once_with('frogs')
        select_relationships.assert_called_once_with('eat',
                                                     subject_name='frogs')
Пример #14
0
    def test_select_by_concept_type(self, select_relationships):
        """Verify calls made by select_by_concept_type.
        """
        select_relationships.return_value = [
            Mock(subject='hello'),
            Mock(subject='kitty')
        ]
        mock_concept_type = Mock(name='concept_type')

        result = FactQuery._select_by_concept_type(mock_concept_type)
        self.assertEqual(['hello', 'kitty'], result)
        select_relationships.assert_called_once_with(
            'is', object_name=mock_concept_type)
Пример #15
0
    def test_animal_attribute_query__species_subject(self,
                                                     select_relationships,
                                                     concept_is_species,
                                                     filter_by_concept_type):
        """Verify calls made by _animal_attribute_query when species is subject.
        """
        # Set up mocks and test data
        mock_1 = Mock(name='mock_1')
        mock_2 = Mock(name='mock_2')
        mock_3 = Mock(name='mock_3')
        select_relationships.side_effect = [[], [mock_1, mock_2, mock_3]]
        concept_is_species.return_value = True
        filter_by_concept_type.return_value = [mock_1, mock_2]

        parsed_query = Mock(name='parsed_query',
                            text='do birds have wings',
                            subject_name='birds',
                            object_name='wings',
                            relationship_type_name='have',
                            relationship_number=2)
        fact_query = FactQuery(parsed_query=parsed_query)

        # Make call
        result = fact_query._animal_attribute_query()

        # Verify results
        self.assertEqual('yes', result)

        # Verify mocks
        call_args_list = select_relationships.call_args_list
        self.assertEqual(2, len(call_args_list))
        expected_calls = [
            call('have',
                 subject_name='birds',
                 object_name='wings',
                 relationship_number=2),
            call('have', object_name='wings', relationship_number=2)
        ]
        self.assertEqual(expected_calls, call_args_list)
Пример #16
0
    def test_which_animals__negation(self, select_relationships,
                                     concept_is_species,
                                     filter_by_concept_type,
                                     select_by_concept_type):
        """Scenario of relationship='eat', subject='animals', object='bugs', negation=True.
        """
        # Set up mocks and test data
        parsed_query = Mock(name='parsed_query',
                            text='which animals do not eat bugs',
                            subject_name='animals',
                            object_name='bugs',
                            relationship_type_name='eat',
                            relationship_number=3,
                            relationship_negation=True)
        fact_query = FactQuery(parsed_query=parsed_query)

        concept_1 = Mock(concept_name='subject_1')
        concept_2 = Mock(concept_name='subject_2')
        concept_3 = Mock(concept_name='subject_3')
        concept_4 = Mock(concept_name='subject_4')
        mock_match_1 = Mock(name='match_1', subject=concept_1)
        mock_match_2 = Mock(name='match_2', subject=concept_2)

        select_relationships.return_value = [mock_match_1, mock_match_2]
        concept_is_species.return_value = False
        filter_by_concept_type.return_value = [mock_match_1, mock_match_2]
        select_by_concept_type.return_value = [
            concept_1, concept_2, concept_3, concept_4
        ]

        # Make call
        results = fact_query._which_animal_query()

        # Verify results
        self.assertEqual(set(['subject_3', 'subject_4']), set(results))

        # Verify mocks
        select_by_concept_type.assert_called_once_with('animals')
Пример #17
0
 def test_concept_is_species__fail(self, select_relationships):
     """Verify _concept_is_species when no matches are found
     """
     select_relationships.return_value = []
     result = FactQuery._concept_is_species('birds')
     self.assertFalse(result)
Пример #18
0
 def test_init__default(self):
     """Verify init with no args.
     """
     fact_query = FactQuery()
     self.assertIsNone(fact_query.parsed_query)
Пример #19
0
 def test_find_answer__no_query(self):
     """Verify ValueError if no query is set.
     """
     fact_query = FactQuery()
     self.assertRaisesRegexp(ValueError, 'No query to answer',
                             fact_query.find_answer)
Пример #20
0
    def test_which_animals__species_object(self, select_relationships,
                                           concept_is_species,
                                           filter_by_concept_type):
        """Scenario of relationship='eat', subject='animals', object='reptiles'.
        """
        # Set up mocks and test data
        parsed_query = Mock(name='parsed_query',
                            text='which animals eat reptiles',
                            subject_name='animals',
                            object_name='reptiles',
                            relationship_type_name='eat',
                            relationship_number=3,
                            relationship_negation=False)
        fact_query = FactQuery(parsed_query=parsed_query)

        mock_match_1 = Mock(name='match_1',
                            subject=Mock(concept_name='subject_1'))
        mock_match_2 = Mock(name='match_2',
                            subject=Mock(concept_name='subject_2'))
        mock_match_3 = Mock(name='match_3',
                            subject=Mock(concept_name='subject_3'))
        select_relationships.side_effect = [[mock_match_1, mock_match_2],
                                            [mock_match_1, mock_match_3]]
        concept_is_species.side_effect = [True, False]
        filter_by_concept_type.side_effect = [[mock_match_1, mock_match_3],
                                              [
                                                  mock_match_1, mock_match_2,
                                                  mock_match_1, mock_match_3
                                              ]]

        # Make call
        results = fact_query._which_animal_query()

        # Verify results
        self.assertEqual(set(['subject_1', 'subject_2', 'subject_3']),
                         set(results))

        # Verify mocks
        call_args_list = select_relationships.call_args_list
        self.assertEqual(2, len(call_args_list))
        expected_calls = [
            call('eat', object_name='reptiles', relationship_number=3),
            call('eat', relationship_number=3)
        ]
        self.assertEqual(expected_calls, call_args_list)

        call_args_list = concept_is_species.call_args_list
        self.assertEqual(2, len(call_args_list))
        self.assertEqual(call('reptiles'), call_args_list[0])
        self.assertEqual(call('animals'), call_args_list[1])

        call_args_list = filter_by_concept_type.call_args_list
        self.assertEqual(2, len(call_args_list))
        expected_calls = [
            call([mock_match_1, mock_match_3],
                 'reptiles',
                 relationship_attr='object'),
            call([mock_match_1, mock_match_2, mock_match_1, mock_match_3],
                 'animals',
                 relationship_attr='subject')
        ]
        self.assertEqual(expected_calls, call_args_list)
Пример #21
0
 def test_init(self):
     """Verify init.
     """
     mock_query = Mock(name='parsed_query')
     fact_query = FactQuery(parsed_query=mock_query)
     self.assertEqual(mock_query, fact_query.parsed_query)