From 908498933e24c43958b621c0c8e74615c607cfd4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Bedna=C5=99=C3=ADk?= <jan.bednarik@gmail.com>
Date: Sat, 10 Nov 2018 21:44:39 +0100
Subject: [PATCH] Search of reports into one parametrized function

---
 openlobby/core/api/schema.py |  2 +-
 openlobby/core/api/types.py  |  2 +-
 openlobby/core/search.py     | 20 +++++++++-----------
 tests/test_search.py         | 22 +++++++++++-----------
 4 files changed, 22 insertions(+), 24 deletions(-)

diff --git a/openlobby/core/api/schema.py b/openlobby/core/api/schema.py
index 9aab7ee..4864d20 100644
--- a/openlobby/core/api/schema.py
+++ b/openlobby/core/api/schema.py
@@ -87,7 +87,7 @@ class Query:
         query = kwargs.get("query", "")
         query = extract_text(query)
         params = {"highlight": kwargs.get("highlight")}
-        response = search.query_reports(query, paginator, **params)
+        response = search.search_reports(paginator, query=query, **params)
         total = response.hits.total
         page_info = paginator.get_page_info(total)
 
diff --git a/openlobby/core/api/types.py b/openlobby/core/api/types.py
index d0644aa..722a3bc 100644
--- a/openlobby/core/api/types.py
+++ b/openlobby/core/api/types.py
@@ -171,7 +171,7 @@ class Author(graphene.ObjectType):
 
     def resolve_reports(self, info, **kwargs):
         paginator = Paginator(**kwargs)
-        response = search.reports_by_author(self.id, paginator)
+        response = search.search_reports(paginator, author_id=self.id)
         total = response.hits.total
         page_info = paginator.get_page_info(total)
 
diff --git a/openlobby/core/search.py b/openlobby/core/search.py
index c72d581..b9b2df0 100644
--- a/openlobby/core/search.py
+++ b/openlobby/core/search.py
@@ -8,7 +8,7 @@ HIGHLIGHT_PARAMS = {
 }
 
 
-def query_reports(query, paginator, *, highlight=False):
+def search_reports(paginator, *, query=None, highlight=False, author_id=None):
     fields = [
         "title",
         "body",
@@ -18,22 +18,20 @@ def query_reports(query, paginator, *, highlight=False):
         "other_participants",
     ]
     s = ReportDoc.search()
+
     s = s.exclude("term", is_draft=True)
     s = s.exclude("exists", field="superseded_by_id")
-    if query != "":
+
+    if author_id:
+        s = s.filter("term", author_id=author_id)
+
+    if query:
         s = s.query("multi_match", query=query, fields=fields)
+
     if highlight:
         s = s.highlight(*fields, **HIGHLIGHT_PARAMS)
-    s = s.sort("-published")
-    s = s[paginator.slice_from : paginator.slice_to]
-    return s.execute()
-
 
-def reports_by_author(author_id, paginator):
-    s = ReportDoc.search()
-    s = s.exclude("term", is_draft=True)
-    s = s.exclude("exists", field="superseded_by_id")
-    s = s.filter("term", author_id=author_id)
     s = s.sort("-published")
+
     s = s[paginator.slice_from : paginator.slice_to]
     return s.execute()
diff --git a/tests/test_search.py b/tests/test_search.py
index 27c7770..aadd37d 100644
--- a/tests/test_search.py
+++ b/tests/test_search.py
@@ -1,7 +1,7 @@
 import pytest
 
 from openlobby.core.api.paginator import Paginator, encode_cursor
-from openlobby.core.search import query_reports, reports_by_author
+from openlobby.core.search import search_reports
 
 from .dummy import prepare_reports
 
@@ -13,18 +13,18 @@ pytestmark = [pytest.mark.django_db, pytest.mark.usefixtures("django_es")]
     "query, expected_ids",
     [("", [3, 2, 1]), ("sauron", [3, 2]), ("towers", [2]), ("Aragorn Gandalf", [3, 1])],
 )
-def test_query_reports(query, expected_ids):
+def test_search_reports(query, expected_ids):
     prepare_reports()
     paginator = Paginator()
-    response = query_reports(query, paginator)
+    response = search_reports(paginator, query=query)
     assert expected_ids == [int(r.meta.id) for r in response]
 
 
-def test_query_reports__highlight():
+def test_search_reports__highlight():
     prepare_reports()
     paginator = Paginator()
     query = "King"
-    response = query_reports(query, paginator, highlight=True)
+    response = search_reports(paginator, query=query, highlight=True)
     doc = response.hits[0]
     assert "<mark>King</mark>" in doc.meta.highlight.title[0]
     assert "<mark>King</mark>" in doc.meta.highlight.body[0]
@@ -33,28 +33,28 @@ def test_query_reports__highlight():
 @pytest.mark.parametrize(
     "first, after, expected_ids", [(2, None, [3, 2]), (2, encode_cursor(1), [2, 1])]
 )
-def test_query_reports__pagination(first, after, expected_ids):
+def test_search_reports__pagination(first, after, expected_ids):
     prepare_reports()
     query = ""
     paginator = Paginator(first=first, after=after)
-    response = query_reports(query, paginator)
+    response = search_reports(paginator, query=query)
     assert expected_ids == [int(r.meta.id) for r in response]
 
 
-def test_reports_by_author():
+def test_search_reports__by_author():
     prepare_reports()
     author_id = 1
     paginator = Paginator()
-    response = reports_by_author(author_id, paginator)
+    response = search_reports(paginator, author_id=author_id)
     assert [3, 1] == [int(r.meta.id) for r in response]
 
 
 @pytest.mark.parametrize(
     "first, after, expected_ids", [(1, None, [3]), (1, encode_cursor(1), [1])]
 )
-def test_reports_by_author__pagination(first, after, expected_ids):
+def test_search_reports__by_author__pagination(first, after, expected_ids):
     prepare_reports()
     author_id = 1
     paginator = Paginator(first=first, after=after)
-    response = reports_by_author(author_id, paginator)
+    response = search_reports(paginator, author_id=author_id)
     assert expected_ids == [int(r.meta.id) for r in response]
-- 
GitLab