def test_search_returns_the_right_number_of_docs_even_if_more_exist(
            self) -> None:
        elastic_search_services.add_documents_to_index([{
            'id': 'doc_id1',
            'title': 'hello world'
        }, {
            'id': 'doc_id2',
            'title': 'hello me'
        }], 'index')
        results, new_offset = elastic_search_services.search('hello',
                                                             'index', [], [],
                                                             size=1)
        self.assertEqual(len(results), 1)
        # Letting mypy know that results[0] is a dict.
        assert isinstance(results[0], dict)
        self.assertEqual(results[0]['id'], 'doc_id1')
        self.assertEqual(new_offset, '1')

        results, new_offset = elastic_search_services.search('hello',
                                                             'index', [], [],
                                                             offset='1',
                                                             size=1)
        self.assertEqual(len(results), 1)
        # Letting mypy know that results[0] is a dict.
        assert isinstance(results[0], dict)
        self.assertEqual(results[0]['id'], 'doc_id2')
        self.assertIsNone(new_offset)
    def test_delete_succeeds_when_document_exists(self) -> None:
        elastic_search_services.add_documents_to_index([{
            'id': 'doc_id',
            'title': 'hello'
        }], 'index1')
        results, _ = elastic_search_services.search('hello', 'index1', [], [])
        self.assertEqual(len(results), 1)

        # Successful deletion.
        elastic_search_services.delete_documents_from_index(['doc_id'],
                                                            'index1')
        results, _ = elastic_search_services.search('hello', 'index1', [], [])
        self.assertEqual(len(results), 0)
    def test_search_returns_none_when_response_is_empty(self):
        correct_index_name = 'index1'
        offset = 30
        size = 50

        def mock_search(body, index, params):
            self.assertEqual(
                body, {
                    'query': {
                        'bool': {
                            'filter': [],
                            'must': [{
                                'multi_match': {
                                    'query': ''
                                }
                            }]
                        }
                    }
                })
            self.assertEqual(index, correct_index_name)
            self.assertEqual(params['size'], size)
            self.assertEqual(params['from'], offset)
            return {'hits': {'hits': []}}

        swap_search = self.swap(elastic_search_services.ES, 'search',
                                mock_search)
        with swap_search:
            result, new_offset = (elastic_search_services.search(
                '',
                correct_index_name, [], [],
                offset=offset,
                size=size,
                ids_only=False))
        self.assertEqual(new_offset, None)
        self.assertEqual(result, [])
 def test_search_returns_without_error_when_index_does_not_exist(
         self
 ) -> None:
     result, new_offset = elastic_search_services.search(
         'query', 'nonexistent_index', [], [])
     self.assertEqual(result, [])
     self.assertEqual(new_offset, None)
    def test_search_returns_full_response(self) -> None:
        correct_index_name = 'index1'
        elastic_search_services.add_documents_to_index([{
            'id': 1,
            'source': {
                'param1': 1,
                'param2': 2
            }
        }, {
            'id': 12,
            'source': {
                'param1': 3,
                'param2': 4
            }
        }], correct_index_name)

        result, new_offset = elastic_search_services.search(
            '', correct_index_name, [], [], offset='0', size=50, ids_only=False)
        self.assertEqual(result, [{
            'id': 1,
            'source': {
                'param1': 1,
                'param2': 2
            }
        }, {
            'id': 12,
            'source': {
                'param1': 3,
                'param2': 4
            }
        }])
        self.assertIsNone(new_offset)
    def test_search_returns_none_when_response_is_empty(self):
        query = {'match_all': {}}
        correct_index_name = 'index1'
        json_str = json.dumps(query)
        offset = 30
        size = 50

        def mock_search(body, index, params):
            self.assertEqual(body, query)
            self.assertEqual(index, correct_index_name)
            self.assertEqual(params['size'], size)
            self.assertEqual(params['from'], offset)
            return {'hits': {'hits': []}}

        swap_search = self.swap(elastic_search_services.ES, 'search',
                                mock_search)
        with swap_search:
            result, new_offset = (elastic_search_services.search(
                json_str,
                correct_index_name,
                offset=offset,
                size=size,
                ids_only=False))
        self.assertEqual(new_offset, None)
        self.assertEqual(result, [])
    def test_search_constructs_query_with_categories_and_languages(self):
        correct_index_name = 'index1'

        def mock_search(body, index, params):
            self.assertEqual(
                body, {
                    'query': {
                        'bool': {
                            'filter': [{
                                'match': {
                                    'category': '"my_category"',
                                }
                            }, {
                                'match': {
                                    'language_code': '"en" "es"'
                                }
                            }],
                            'must': [],
                        }
                    }
                })
            self.assertEqual(index, correct_index_name)
            self.assertEqual(params, {'from': 0, 'size': 21})
            return {'hits': {'hits': []}}

        swap_search = self.swap(elastic_search_services.ES, 'search',
                                mock_search)
        with swap_search:
            result, new_offset = (elastic_search_services.search(
                '', correct_index_name, ['my_category'], ['en', 'es']))
        self.assertEqual(result, [])
        self.assertIsNone(new_offset)
 def test_search_returns_none_when_response_is_empty(self) -> None:
     result, new_offset = elastic_search_services.search('',
                                                         'index', [], [],
                                                         offset='0',
                                                         size=50,
                                                         ids_only=False)
     self.assertEqual(new_offset, None)
     self.assertEqual(result, [])
    def test_search_constructs_nonempty_query_with_categories_and_langs(
            self
    ) -> None:
        correct_index_name = 'index1'

        # In the type annotation below Dict[str, Any] is used for body
        # because this mocks the behavior of elastic_search_services.ES.search
        # and in the type stubs the type is Any.
        def mock_search(
                body: Dict[str, Any], index: str, params: Dict[str, int]
        ) -> Dict[str, Dict[str, List[str]]]:
            self.assertEqual(body, {
                'query': {
                    'bool': {
                        'must': [{
                            'multi_match': {
                                'query': 'query'
                            }
                        }],
                        'filter': [{
                            'match': {
                                'category': '"my_category"',
                            }
                        }, {
                            'match': {
                                'language_code': '"en" "es"'
                            }
                        }]
                    }
                },
                'sort': [{
                    'rank': {
                        'order': 'desc',
                        'missing': '_last',
                        'unmapped_type': 'float'
                    }
                }]
            })
            self.assertEqual(index, correct_index_name)
            self.assertEqual(params, {
                'from': 0,
                'size': 21
            })
            return {
                'hits': {
                    'hits': []
                }
            }

        swap_search = self.swap(
            elastic_search_services.ES, 'search', mock_search)
        with swap_search:
            result, new_offset = (
                elastic_search_services.search(
                    'query', correct_index_name, ['my_category'], ['en', 'es']))
        self.assertEqual(result, [])
        self.assertIsNone(new_offset)
    def test_search_returns_full_response(self):
        correct_index_name = 'index1'
        offset = 30
        size = 50
        documents = [{
            '_id': 1,
            '_source': {
                'param1': 1,
                'param2': 2
            }
        }, {
            '_id': 12,
            '_source': {
                'param1': 3,
                'param2': 4
            }
        }]

        def mock_search(body, index, params):
            self.assertEqual(
                body, {
                    'query': {
                        'bool': {
                            'filter': [],
                            'must': [{
                                'multi_match': {
                                    'query': ''
                                }
                            }]
                        }
                    }
                })
            self.assertEqual(index, correct_index_name)
            self.assertEqual(params['size'], size)
            self.assertEqual(params['from'], offset)
            return {'hits': {'hits': documents}}

        swap_search = self.swap(elastic_search_services.ES, 'search',
                                mock_search)
        with swap_search:
            result, new_offset = (elastic_search_services.search(
                '',
                correct_index_name, [], [],
                offset=offset,
                size=size,
                ids_only=False))
        self.assertEqual(new_offset, offset + size)
        self.assertEqual(result,
                         [document['_source'] for document in documents])
    def test_search_returns_full_response(self):
        query = {'match_all': {}}
        correct_index_name = 'index1'
        json_str = json.dumps(query)
        offset = 30
        size = 50
        documents = [{
            '_id': 1,
            '_source': {
                'param1': 1,
                'param2': 2
            }
        }, {
            '_id': 12,
            '_source': {
                'param1': 3,
                'param2': 4
            }
        }]

        def mock_search(body, index, params):
            self.assertEqual(body, query)
            self.assertEqual(index, correct_index_name)
            self.assertEqual(params['size'], size)
            self.assertEqual(params['from'], offset)
            return {'hits': {'hits': documents}}

        swap_search = self.swap(elastic_search_services.ES, 'search',
                                mock_search)
        with swap_search:
            result, new_offset = (elastic_search_services.search(
                json_str,
                correct_index_name,
                offset=offset,
                size=size,
                ids_only=False))
        self.assertEqual(new_offset, offset + size)
        self.assertEqual(result,
                         [document['_source'] for document in documents])