Skip to content

Commit

Permalink
Merge pull request readthedocs#4277 from safwanrahman/insensitive
Browse files Browse the repository at this point in the history
[Fix readthedocs#2328 readthedocs#2013] Refresh search index and test for case insensitive search
  • Loading branch information
ericholscher authored and safwanrahman committed Jul 16, 2018
2 parents 8d7942b + e467224 commit 24f1404
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 9 deletions.
7 changes: 5 additions & 2 deletions readthedocs/search/documents.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,11 +96,14 @@ def update(self, thing, refresh=None, action='index', **kwargs):
# TODO: remove this overwrite when the issue has been fixed
# See below link for more information
# https://github.com/sabricot/django-elasticsearch-dsl/issues/111
if isinstance(thing, HTMLFile):
# Moreover, do not need to check if its a delete action
# Because while delete action, the object is already remove from database
if isinstance(thing, HTMLFile) and action != 'delete':
# Its a model instance.
queryset = self.get_queryset()
obj = queryset.filter(pk=thing.pk)
if not obj.exists():
return None

return super(PageDocument, self).update(thing=thing, refresh=None, action='index', **kwargs)
return super(PageDocument, self).update(thing=thing, refresh=refresh,
action=action, **kwargs)
44 changes: 39 additions & 5 deletions readthedocs/search/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from readthedocs.builds.constants import LATEST
from readthedocs.builds.models import Version
from readthedocs.projects.models import Project
from readthedocs.projects.models import Project, HTMLFile
from readthedocs.search.tests.utils import get_search_query_from_project_file


Expand Down Expand Up @@ -61,26 +61,60 @@ def test_search_project_filter_language(self, client, project):

@pytest.mark.django_db
@pytest.mark.search
class TestElasticSearch(object):
class TestPageSearch(object):
url = reverse('search')

def _get_search_result(self, url, client, search_params):
resp = client.get(url, search_params)
assert resp.status_code == 200

page = pq(resp.content)
result = page.find('.module-list-wrapper .module-item-title')
result = page.find('.module-list-wrapper .search-result-item')
return result, page

@pytest.mark.parametrize('data_type', ['content', 'headers', 'title'])
@pytest.mark.parametrize('page_num', [0, 1])
def test_search_by_file_content(self, client, project, data_type, page_num):
def test_file_search(self, client, project, data_type, page_num):
query = get_search_query_from_project_file(project_slug=project.slug, page_num=page_num,
data_type=data_type)

result, _ = self._get_search_result(url=self.url, client=client,
search_params={'q': query, 'type': 'file'})
assert len(result) == 1, ("failed"+ query)
assert len(result) == 1
assert query in result.text()

@pytest.mark.parametrize('case', ['upper', 'lower', 'title'])
def test_file_search_case_insensitive(self, client, project, case):
"""Check File search is case insensitive
It tests with uppercase, lowercase and camelcase
"""
query_text = get_search_query_from_project_file(project_slug=project.slug)

cased_query = getattr(query_text, case)
query = cased_query()

result, _ = self._get_search_result(url=self.url, client=client,
search_params={'q': query, 'type': 'file'})

assert len(result) == 1
# Check the actual text is in the result, not the cased one
assert query_text in result.text()

def test_page_search_not_return_removed_page(self, client, project):
"""Check removed page are not in the search index"""
query = get_search_query_from_project_file(project_slug=project.slug)
# Make a query to check it returns result
result, _ = self._get_search_result(url=self.url, client=client,
search_params={'q': query, 'type': 'file'})
assert len(result) == 1

# Delete all the HTML files of the project
HTMLFile.objects.filter(project=project).delete()
# Run the query again and this time there should not be any result
result, _ = self._get_search_result(url=self.url, client=client,
search_params={'q': query, 'type': 'file'})
assert len(result) == 0

def test_file_search_show_projects(self, client, all_projects):
"""Test that search result page shows list of projects while searching for files"""
Expand Down
4 changes: 2 additions & 2 deletions readthedocs/templates/search/elastic_search.html
Original file line number Diff line number Diff line change
Expand Up @@ -123,12 +123,13 @@ <h3>{% blocktrans with query=query|default:"" %}Results for {{ query }}{% endblo

<ul>
{% for result in results %}
<li class="module-item">
<li class="module-item search-result-item">
<p class="module-item-title">
{% if result.name %}

{# Project #}
<a href="{{ result.url }}">{{ result.name }}</a>
</p>
{{ result.meta.description }}
{% for fragment in result.meta.highlight.description|slice:":3" %}
<p>
Expand All @@ -150,7 +151,6 @@ <h3>{% blocktrans with query=query|default:"" %}Results for {{ query }}{% endblo
{# End File #}

{% endif %}
</p>
</li>
{% empty %}
<li class="module-item"><span class="quiet">{% trans "No results found. Bummer." %}</span></li>
Expand Down

0 comments on commit 24f1404

Please sign in to comment.