Example #1
0
def app_search(ENDPOINT,PRIVATE_KEY):
    client = Client(
        base_endpoint=ENDPOINT,
        api_key=PRIVATE_KEY,
        use_https=True
    )
    rpt = client.list_engines(current=1, size=20)
    print("\nClient list engines")
    print_json(rpt)
    rpt = client.get_search_settings(engine_name='sunat-ruc')
    print("\nEngine Name:")
    print_json(rpt)
    return client
Example #2
0
class TestClient(TestCase):

    def setUp(self):
        self.engine_name = 'some-engine-name'
        self.client = Client('host_identifier', 'api_key')

        self.document_index_url = "{}/{}".format(
            self.client.session.base_url,
            "engines/{}/documents".format(self.engine_name)
        )

    def test_deprecated_init_support_with_old_names(self):
        self.client = Client(
            account_host_key='host_identifier', api_key='api_key')
        self.assertEqual(self.client.account_host_key, 'host_identifier')

    def test_deprecated_init_support_with_new_names(self):
        self.client = Client(
            host_identifier='host_identifier', api_key='api_key')
        self.assertEqual(self.client.account_host_key, 'host_identifier')

    def test_deprecated_init_support_with_positional(self):
        self.client = Client('host_identifier', 'api_key',
                             'example.com', False)
        self.assertEqual(self.client.account_host_key, 'host_identifier')

    def test_host_identifier_is_optional(self):
        client = Client('', 'api_key', 'localhost:3002/api/as/v1', False)
        query = 'query'

        with requests_mock.Mocker() as m:
            url = "http://localhost:3002/api/as/v1/engines/some-engine-name/search"
            m.register_uri('GET', url, json={}, status_code=200)
            client.search(self.engine_name, query, {})

    def test_index_document_processing_error(self):
        invalid_document = {'id': 'something', 'bad': {'no': 'nested'}}
        error = 'some processing error'
        stubbed_return = [{'id': 'something', 'errors': [error]}]
        with requests_mock.Mocker() as m:
            m.register_uri('POST', self.document_index_url,
                           json=stubbed_return, status_code=200)

            with self.assertRaises(InvalidDocument) as context:
                self.client.index_document(self.engine_name, invalid_document)
                self.assertEqual(str(context.exception), error)

    def test_index_document_no_error_key_in_response(self):
        document_without_id = {'body': 'some value'}
        stubbed_return = [{'id': 'auto generated', 'errors': []}]

        with requests_mock.Mocker() as m:
            m.register_uri('POST', self.document_index_url,
                           json=stubbed_return, status_code=200)
            response = self.client.index_document(
                self.engine_name, document_without_id)
            self.assertEqual(response, {'id': 'auto generated'})

    def test_index_documents(self):
        id = 'INscMGmhmX4'
        valid_document = {'id': id}
        other_document = {'body': 'some value'}

        expected_return = [
            {'id': id, 'errors': []},
            {'id': 'some autogenerated id', 'errors': []}
        ]

        with requests_mock.Mocker() as m:
            m.register_uri('POST', self.document_index_url,
                           json=expected_return, status_code=200)
            response = self.client.index_documents(
                self.engine_name, [valid_document, other_document])
            self.assertEqual(response, expected_return)

    def test_update_documents(self):
        id = 'INscMGmhmX4'
        valid_document = {'id': id}
        other_document = {'body': 'some value'}

        expected_return = [
            {'id': id, 'errors': []},
            {'id': 'some autogenerated id', 'errors': []}
        ]

        with requests_mock.Mocker() as m:
            m.register_uri('PATCH', self.document_index_url,
                           json=expected_return, status_code=200)
            response = self.client.update_documents(
                self.engine_name, [valid_document, other_document])
            self.assertEqual(response, expected_return)

    def test_get_documents(self):
        id = 'INscMGmhmX4'
        expected_return = [
            {
                'id': id,
                'url': 'http://www.youtube.com/watch?v=v1uyQZNg2vE',
                'title': 'The Original Grumpy Cat',
                'body': 'this is a test'
            }
        ]

        with requests_mock.Mocker() as m:
            m.register_uri('GET', self.document_index_url,
                           json=expected_return, status_code=200)
            response = self.client.get_documents(self.engine_name, [id])
            self.assertEqual(response, expected_return)

    def test_list_documents(self):
        expected_return = {
            'meta': {
                'page': {'current': 1, 'total_results': 1, 'total_pages': 1, 'size': 20},
                'results': [
                    {'body': 'this is a test', 'id': '1'},
                    {'body': 'this is also a test', 'id': '2'}
                ]
            }
        }

        def match_request_text(request):
            data = json.loads(request.text)
            return data["page"]["current"] == 1 and data["page"]["size"] == 20

        with requests_mock.Mocker() as m:
            url = "{}/engines/{}/documents/list".format(
                self.client.session.base_url, self.engine_name)
            m.register_uri('GET',
                           url,
                           additional_matcher=match_request_text,
                           json=expected_return,
                           status_code=200
                           )

            response = self.client.list_documents(self.engine_name)
            self.assertEqual(response, expected_return)

    def test_destroy_documents(self):
        id = 'INscMGmhmX4'
        expected_return = [
            {'id': id, 'result': True}
        ]

        with requests_mock.Mocker() as m:
            m.register_uri('DELETE', self.document_index_url,
                           json=expected_return, status_code=200)
            response = self.client.destroy_documents(self.engine_name, [id])
            self.assertEqual(response, expected_return)

    def test_get_schema(self):
        expected_return = {
            'square_km': 'text'
        }

        with requests_mock.Mocker() as m:
            url = "{}/engines/{}/schema".format(
                self.client.session.base_url, self.engine_name)
            m.register_uri('GET',
                           url,
                           json=expected_return,
                           status_code=200
                           )

            response = self.client.get_schema(self.engine_name)
            self.assertEqual(response, expected_return)

    def test_update_schema(self):
        expected_return = {
            'square_mi': 'number',
            'square_km': 'number'
        }

        with requests_mock.Mocker() as m:
            url = "{}/engines/{}/schema".format(
                self.client.session.base_url, self.engine_name)
            m.register_uri('POST',
                           url,
                           json=expected_return,
                           status_code=200
                           )

            response = self.client.update_schema(
                self.engine_name, expected_return)
            self.assertEqual(response, expected_return)

    def test_list_engines(self):
        expected_return = [
            {'name': 'myawesomeengine'}
        ]

        def match_request_text(request):
            data = json.loads(request.text)
            return data["page"]["current"] == 1 and data["page"]["size"] == 20

        with requests_mock.Mocker() as m:
            url = "{}/{}".format(self.client.session.base_url, 'engines')
            m.register_uri('GET',
                           url,
                           additional_matcher=match_request_text,
                           json=expected_return,
                           status_code=200
                           )
            response = self.client.list_engines()
            self.assertEqual(response, expected_return)

    def test_list_engines_with_paging(self):
        expected_return = [
            {'name': 'myawesomeengine'}
        ]

        def match_request_text(request):
            data = json.loads(request.text)
            return data["page"]["current"] == 10 and data["page"]["size"] == 2

        with requests_mock.Mocker() as m:
            url = "{}/{}".format(self.client.session.base_url, 'engines')
            m.register_uri(
                'GET',
                url,
                additional_matcher=match_request_text,
                json=expected_return,
                status_code=200
            )
            response = self.client.list_engines(current=10, size=2)
            self.assertEqual(response, expected_return)

    def test_get_engine(self):
        engine_name = 'myawesomeengine'
        expected_return = [
            {'name': engine_name}
        ]

        with requests_mock.Mocker() as m:
            url = "{}/{}/{}".format(self.client.session.base_url,
                                    'engines',
                                    engine_name)
            m.register_uri('GET', url, json=expected_return, status_code=200)
            response = self.client.get_engine(engine_name)
            self.assertEqual(response, expected_return)

    def test_create_engine(self):
        engine_name = 'myawesomeengine'
        expected_return = {'name': engine_name, 'language': 'en'}

        with requests_mock.Mocker() as m:
            url = "{}/{}".format(self.client.session.base_url, 'engines')
            m.register_uri('POST', url, json=expected_return, status_code=200)
            response = self.client.create_engine(
                engine_name=engine_name, language='en')
            self.assertEqual(response, expected_return)

    def test_create_engine_with_options(self):
        engine_name = 'myawesomeengine'
        expected_return = {'name': engine_name, 'type': 'meta',
                           'source_engines': [
                               'source-engine-1',
                               'source-engine-2'
                           ]}

        with requests_mock.Mocker() as m:
            url = "{}/{}".format(self.client.session.base_url, 'engines')
            m.register_uri('POST', url, json=expected_return, status_code=200)
            response = self.client.create_engine(
                engine_name=engine_name, options={
                    'type': 'meta',
                    'source_engines': [
                        'source-engine-1',
                        'source-engine-2'
                    ]
                })
            self.assertEqual(response, expected_return)

    def test_destroy_engine(self):
        engine_name = 'myawesomeengine'
        expected_return = {'deleted': True}

        with requests_mock.Mocker() as m:
            url = "{}/{}/{}".format(self.client.session.base_url,
                                    'engines',
                                    engine_name)
            m.register_uri('DELETE', url, json=expected_return,
                           status_code=200)
            response = self.client.destroy_engine(engine_name)
            self.assertEqual(response, expected_return)

    def test_list_synonym_sets(self):
        expected_return = {
            'meta': {
                'page': {
                    'current': 1,
                    'total_pages': 1,
                    'total_results': 3,
                    'size': 20
                }
            },
            'results': [
                {
                    'id': 'syn-5b11ac66c9f9292013220ad3',
                    'synonyms': [
                        'park',
                        'trail'
                    ]
                },
                {
                    'id': 'syn-5b11ac72c9f9296b35220ac9',
                    'synonyms': [
                        'protected',
                        'heritage'
                    ]
                },
                {
                    'id': 'syn-5b11ac66c9f9292013220ad3',
                    'synonyms': [
                        'hectares',
                        'acres'
                    ]
                }
            ]
        }

        with requests_mock.Mocker() as m:
            url = "{}/engines/{}/synonyms".format(
                self.client.session.base_url,
                self.engine_name
            )

            def match_request_text(request):
                data = json.loads(request.text)
                return data["page"]["current"] == 1 and data["page"]["size"] == 20

            m.register_uri(
                'GET',
                url,
                additional_matcher=match_request_text,
                json=expected_return,
                status_code=200
            )

            response = self.client.list_synonym_sets(self.engine_name)

    def test_get_synonym_set(self):
        synonym_id = 'syn-5b11ac66c9f9292013220ad3'
        expected_return = {
            'id': synonym_id,
            'synonyms': [
                'park',
                'trail'
            ]
        }

        with requests_mock.Mocker() as m:
            url = "{}/engines/{}/synonyms/{}".format(
                self.client.session.base_url,
                self.engine_name,
                synonym_id
            )
            m.register_uri(
                'GET',
                url,
                json=expected_return,
                status_code=200
            )

            response = self.client.get_synonym_set(
                self.engine_name,
                synonym_id
            )
            self.assertEqual(response, expected_return)

    def test_create_synonym_set(self):
        synonym_set = ['park', 'trail']
        expected_return = {
            'id': 'syn-5b11ac72c9f9296b35220ac9',
            'synonyms': [
                'park',
                'trail'
            ]
        }

        with requests_mock.Mocker() as m:
            url = "{}/engines/{}/synonyms".format(
                self.client.session.base_url,
                self.engine_name
            )
            m.register_uri(
                'POST',
                url,
                json=expected_return,
                status_code=200
            )

            response = self.client.create_synonym_set(
                self.engine_name,
                synonym_set
            )
            self.assertEqual(response, expected_return)

    def test_update_synonym_set(self):
        synonym_id = 'syn-5b11ac72c9f9296b35220ac9'
        synonym_set = ['park', 'trail', 'ground']
        expected_return = {
            'id': synonym_id,
            'synonyms': [
                'park',
                'trail',
                'ground'
            ]
        }

        with requests_mock.Mocker() as m:
            url = "{}/engines/{}/synonyms/{}".format(
                self.client.session.base_url,
                self.engine_name,
                synonym_id
            )
            m.register_uri(
                'PUT',
                url,
                json=expected_return,
                status_code=200
            )

            response = self.client.update_synonym_set(
                self.engine_name,
                synonym_id,
                synonym_set
            )
            self.assertEqual(response, expected_return)

    def test_destroy_synonym_set(self):
        synonym_id = 'syn-5b11ac66c9f9292013220ad3'
        expected_return = {
            'deleted': True
        }

        with requests_mock.Mocker() as m:
            url = "{}/engines/{}/synonyms/{}".format(
                self.client.session.base_url,
                self.engine_name,
                synonym_id
            )
            m.register_uri(
                'DELETE',
                url,
                json=expected_return,
                status_code=200
            )

            response = self.client.destroy_synonym_set(
                self.engine_name,
                synonym_id
            )
            self.assertEqual(response, expected_return)

    def test_search(self):
        query = 'query'
        expected_return = {'meta': {}, 'results': []}

        with requests_mock.Mocker() as m:
            url = "{}/{}".format(
                self.client.session.base_url,
                "engines/{}/search".format(self.engine_name)
            )
            m.register_uri('GET', url, json=expected_return, status_code=200)
            response = self.client.search(self.engine_name, query, {})
            self.assertEqual(response, expected_return)

    def test_multi_search(self):
        expected_return = [{'meta': {}, 'results': []},
                           {'meta': {}, 'results': []}]

        with requests_mock.Mocker() as m:
            url = "{}/{}".format(
                self.client.session.base_url,
                "engines/{}/multi_search".format(self.engine_name)
            )
            m.register_uri('GET', url, json=expected_return, status_code=200)
            response = self.client.multi_search(self.engine_name, {})
            self.assertEqual(response, expected_return)

    def test_query_suggestion(self):
        query = 'query'
        expected_return = {'meta': {}, 'results': {}}

        with requests_mock.Mocker() as m:
            url = "{}/{}".format(
                self.client.session.base_url,
                "engines/{}/query_suggestion".format(self.engine_name)
            )
            m.register_uri('GET', url, json=expected_return, status_code=200)
            response = self.client.query_suggestion(
                self.engine_name, query, {})
            self.assertEqual(response, expected_return)

    def test_click(self):
        with requests_mock.Mocker() as m:
            url = "{}/{}".format(
                self.client.session.base_url,
                "engines/{}/click".format(self.engine_name)
            )
            m.register_uri('POST', url, json={}, status_code=200)
            self.client.click(self.engine_name, {
                              'query': 'cat', 'document_id': 'INscMGmhmX4'})

    def test_create_meta_engine(self):
        source_engines = ['source-engine-1', 'source-engine-2']
        expected_return = {'source_engines': source_engines,
                           'type': 'meta', 'name': self.engine_name}

        with requests_mock.Mocker() as m:
            url = "{}/{}".format(self.client.session.base_url, 'engines')
            m.register_uri('POST', url, json=expected_return, status_code=200)
            response = self.client.create_meta_engine(
                self.engine_name, source_engines)
            self.assertEqual(response, expected_return)

    def test_add_meta_engine_sources(self):
        target_source_engine_name = 'source-engine-3'
        expected_return = {'source_engines': [
            'source-engine-1', 'source-engine-2', target_source_engine_name], 'type': 'meta', 'name': self.engine_name}

        with requests_mock.Mocker() as m:
            url = "{}/{}".format(
                self.client.session.base_url,
                "engines/{}/source_engines".format(self.engine_name)
            )
            m.register_uri('POST', url, json=expected_return, status_code=200)
            response = self.client.add_meta_engine_sources(
                self.engine_name, [target_source_engine_name])
            self.assertEqual(response, expected_return)

    def test_delete_meta_engine_sources(self):
        source_engine_name = 'source-engine-3'
        expected_return = {'source_engines': [
            'source-engine-1', 'source-engine-2'], 'type': 'meta', 'name': self.engine_name}

        with requests_mock.Mocker() as m:
            url = "{}/{}".format(
                self.client.session.base_url,
                "engines/{}/source_engines".format(self.engine_name)
            )
            m.register_uri('DELETE', url, json=expected_return,
                           status_code=200)
            response = self.client.delete_meta_engine_sources(
                self.engine_name, [source_engine_name])
            self.assertEqual(response, expected_return)

    def test_get_api_logs(self):
        expected_return = {'meta': {}, 'results': []}

        with requests_mock.Mocker() as m:
            url = "{}/{}".format(
                self.client.session.base_url,
                "engines/{}/logs/api".format(self.engine_name)
            )
            m.register_uri('GET', url, json=expected_return, status_code=200)
            response = self.client.get_api_logs(self.engine_name, options={})
            self.assertEqual(response, expected_return)

    def test_get_search_settings(self):
        expected_return = {
            "search_fields": {
                "name": {
                    "weight": 1
                },
                "description": {
                    "weight": 1
                }
            },
            "result_fields": {
                "name": {
                    "raw": {}
                },
                "description": {
                    "raw": {}
                }
            },
            "boosts": {}
        }

        with requests_mock.Mocker() as m:
            url = "{}/engines/{}/search_settings".format(
                self.client.session.base_url,
                self.engine_name
            )
            m.register_uri('GET', url, json=expected_return, status_code=200)
            response = self.client.get_search_settings(self.engine_name)
            self.assertEqual(response, expected_return)

    def test_update_search_settings(self):
        expected_return = {
            "search_fields": {
                "name": {
                    "weight": 2
                },
                "description": {
                    "weight": 1
                }
            },
            "result_fields": {
                "name": {
                    "raw": {}
                },
                "description": {
                    "raw": {}
                }
            },
            "boosts": {}
        }

        with requests_mock.Mocker() as m:
            url = "{}/engines/{}/search_settings".format(
                self.client.session.base_url,
                self.engine_name
            )
            m.register_uri('PUT', url, json=expected_return, status_code=200)
            response = self.client.update_search_settings(
                engine_name=self.engine_name,
                search_settings=expected_return
            )
            self.assertEqual(response, expected_return)

    def test_reset_search_settings(self):
        expected_return = {
            "search_fields": {
                "name": {
                    "weight": 1
                },
                "description": {
                    "weight": 1
                }
            },
            "result_fields": {
                "name": {
                    "raw": {}
                },
                "description": {
                    "raw": {}
                }
            },
            "boosts": {}
        }

        with requests_mock.Mocker() as m:
            url = "{}/engines/{}/search_settings/reset".format(
                self.client.session.base_url,
                self.engine_name
            )
            m.register_uri('POST', url, json=expected_return, status_code=200)
            response = self.client.reset_search_settings(
                engine_name=self.engine_name
            )
            self.assertEqual(response, expected_return)