From b1eada003b869d1344c50bcf1fc7ac06163370c2 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Fri, 26 May 2017 10:57:00 +0200 Subject: [PATCH 1/5] Check behaviour with collections prior to activation --- .travis.yml | 1 + dev-requirements.txt | 1 + kinto_elasticsearch/views.py | 10 ++++++++++ tests/__init__.py | 2 ++ tests/test_elasticsearch.py | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 47 insertions(+) diff --git a/.travis.yml b/.travis.yml index 91dbc68..66d3ab4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,7 @@ addons: packages: - oracle-java8-set-default - elasticsearch + postgresql: "9.5" services: - elasticsearch env: diff --git a/dev-requirements.txt b/dev-requirements.txt index ff5d08f..0379f6f 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -7,3 +7,4 @@ pytest-capturelog mock unittest2 webtest +kinto[postgresql] diff --git a/kinto_elasticsearch/views.py b/kinto_elasticsearch/views.py index 89e3d10..f16f298 100644 --- a/kinto_elasticsearch/views.py +++ b/kinto_elasticsearch/views.py @@ -33,7 +33,14 @@ def search_view(request, **kwargs): indexer = request.registry.indexer try: results = indexer.search(bucket_id, collection_id, **kwargs) + + except elasticsearch.NotFoundError as e: + # If plugin was enabled after the creation of the collection. + indexer.create_index(bucket_id, collection_id) + results = indexer.search(bucket_id, collection_id, **kwargs) + except elasticsearch.RequestError as e: + # Malformed query. message = e.info["error"]["reason"] details = e.info["error"]["root_cause"][0] response = http_error(httpexceptions.HTTPBadRequest(), @@ -41,9 +48,12 @@ def search_view(request, **kwargs): message=message, details=details) raise response + except elasticsearch.ElasticsearchException as e: + # General failure. logger.exception("Index query failed.") results = {} + return results diff --git a/tests/__init__.py b/tests/__init__.py index 0861193..7ab88dc 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -28,4 +28,6 @@ def get_app_settings(cls, extras=None): config = configparser.ConfigParser() config.read(ini_path) settings = dict(config.items('app:main')) + if extras: + settings.update(extras) return settings diff --git a/tests/test_elasticsearch.py b/tests/test_elasticsearch.py index 2139dd6..c54a74a 100644 --- a/tests/test_elasticsearch.py +++ b/tests/test_elasticsearch.py @@ -39,6 +39,39 @@ def test_returns_false_if_connection_fails(self): assert not resp.json["elasticsearch"] +class PostActivation(BaseWebTest, unittest.TestCase): + + @classmethod + def get_app_settings(cls, extras=None): + settings = super().get_app_settings(extras) + settings['storage_backend'] = 'kinto.core.storage.postgresql' + settings['storage_url'] = 'postgres://postgres:postgres@localhost:5432/postgres' + settings['permission_backend'] = 'kinto.core.permission.postgresql' + settings['permission_url'] = settings['storage_url'] + return settings + + def setUp(self): + app = self.make_app(settings={"kinto.includes": ""}) + capabilities = app.get("/").json["capabilities"] + assert "elasticsearch" not in capabilities + + app.put("/buckets/bid", headers=self.headers) + app.put("/buckets/bid/collections/cid", headers=self.headers) + app.post_json("/buckets/bid/collections/cid/records", + {"data": {"before": "indexing"}}, + headers=self.headers) + + def test_search_does_not_fail_after_plugin_activation(self): + resp = self.app.get("/buckets/bid/collections/cid/records", + headers=self.headers) + assert len(resp.json["data"]) == 1 + + resp = self.app.get("/buckets/bid/collections/cid/search", + headers=self.headers) + results = resp.json + assert len(results["hits"]["hits"]) == 0 + + class RecordIndexing(BaseWebTest, unittest.TestCase): def setUp(self): From 35f1c18756e493fa295e8828c092465577a0b194 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Fri, 26 May 2017 11:39:45 +0200 Subject: [PATCH 2/5] Update changelog --- CHANGELOG.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 4d85a30..922648c 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -19,6 +19,7 @@ Changelog - Only index records if the storage transaction is committed (fixes #15) - Do not allow to search if no read permission on collection or bucket (fixes #7) +- Fix empty results response when plugin was enabled after collection creation (ref #20) **Internal changes** From c998a90917981d8ed473e2c89ea6a27c48676fc6 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Fri, 26 May 2017 11:55:50 +0200 Subject: [PATCH 3/5] Fix postgresql install --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 66d3ab4..8d2f979 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,4 @@ +dist: trusty language: python python: 3.5 sudo: false From 1b6f593faf09184332a03e547cd16cbbba4f397b Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Fri, 26 May 2017 11:59:38 +0200 Subject: [PATCH 4/5] Test record creation also --- tests/test_elasticsearch.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/test_elasticsearch.py b/tests/test_elasticsearch.py index c54a74a..48b63c4 100644 --- a/tests/test_elasticsearch.py +++ b/tests/test_elasticsearch.py @@ -61,15 +61,21 @@ def setUp(self): {"data": {"before": "indexing"}}, headers=self.headers) - def test_search_does_not_fail_after_plugin_activation(self): + def test_search_does_not_fail(self): resp = self.app.get("/buckets/bid/collections/cid/records", headers=self.headers) assert len(resp.json["data"]) == 1 + def test_record_creation_does_not_fail(self): + self.app.post_json("/buckets/bid/collections/cid/records", + {"data": {"after": "indexing"}}, + headers=self.headers) + resp = self.app.get("/buckets/bid/collections/cid/search", headers=self.headers) results = resp.json - assert len(results["hits"]["hits"]) == 0 + assert len(results["hits"]["hits"]) == 1 + assert results["hits"]["hits"][0]["_source"]["after"] == "indexing" class RecordIndexing(BaseWebTest, unittest.TestCase): From 3400b9af0f786452f1b86731cea1a6b027303009 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Fri, 26 May 2017 12:11:03 +0200 Subject: [PATCH 5/5] Fix coverage --- tests/test_elasticsearch.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/test_elasticsearch.py b/tests/test_elasticsearch.py index 48b63c4..369e7b6 100644 --- a/tests/test_elasticsearch.py +++ b/tests/test_elasticsearch.py @@ -66,6 +66,11 @@ def test_search_does_not_fail(self): headers=self.headers) assert len(resp.json["data"]) == 1 + resp = self.app.get("/buckets/bid/collections/cid/search", + headers=self.headers) + results = resp.json + assert len(results["hits"]["hits"]) == 0 + def test_record_creation_does_not_fail(self): self.app.post_json("/buckets/bid/collections/cid/records", {"data": {"after": "indexing"}},