test_search.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. from django.urls import reverse
  2. from misago.categories.models import Category
  3. from misago.users.testutils import AuthenticatedUserTestCase
  4. from .. import testutils
  5. class SearchApiTests(AuthenticatedUserTestCase):
  6. def setUp(self):
  7. super(SearchApiTests, self).setUp()
  8. self.category = Category.objects.get(slug='first-category')
  9. self.api_link = reverse('misago:api:search')
  10. def index_post(self, post):
  11. if post.id == post.thread.first_post_id:
  12. post.set_search_document(post.thread.title)
  13. else:
  14. post.set_search_document()
  15. post.save(update_fields=['search_document'])
  16. post.update_search_vector()
  17. post.save(update_fields=['search_vector'])
  18. def test_no_query(self):
  19. """api handles no search query"""
  20. response = self.client.get(self.api_link)
  21. self.assertEqual(response.status_code, 200)
  22. reponse_json = response.json()
  23. self.assertIn('threads', [p['id'] for p in reponse_json])
  24. for provider in reponse_json:
  25. if provider['id'] == 'threads':
  26. self.assertEqual(provider['results']['results'], [])
  27. def test_empty_query(self):
  28. """api handles empty search query"""
  29. response = self.client.get('%s?q=' % self.api_link)
  30. self.assertEqual(response.status_code, 200)
  31. reponse_json = response.json()
  32. self.assertIn('threads', [p['id'] for p in reponse_json])
  33. for provider in reponse_json:
  34. if provider['id'] == 'threads':
  35. self.assertEqual(provider['results']['results'], [])
  36. def test_short_query(self):
  37. """api handles short search query"""
  38. thread = testutils.post_thread(self.category)
  39. post = testutils.reply_thread(thread, message="Lorem ipsum dolor.")
  40. self.index_post(post)
  41. response = self.client.get('%s?q=ip' % self.api_link)
  42. self.assertEqual(response.status_code, 200)
  43. reponse_json = response.json()
  44. self.assertIn('threads', [p['id'] for p in reponse_json])
  45. for provider in reponse_json:
  46. if provider['id'] == 'threads':
  47. self.assertEqual(provider['results']['results'], [])
  48. def test_wrong_query(self):
  49. """api handles query miss"""
  50. thread = testutils.post_thread(self.category)
  51. post = testutils.reply_thread(thread, message="Lorem ipsum dolor.")
  52. self.index_post(post)
  53. response = self.client.get('%s?q=elit' % self.api_link)
  54. self.assertEqual(response.status_code, 200)
  55. reponse_json = response.json()
  56. self.assertIn('threads', [p['id'] for p in reponse_json])
  57. for provider in reponse_json:
  58. if provider['id'] == 'threads':
  59. self.assertEqual(provider['results']['results'], [])
  60. def test_hidden_post(self):
  61. """hidden posts are extempt from search"""
  62. thread = testutils.post_thread(self.category)
  63. post = testutils.reply_thread(
  64. thread, message="Lorem ipsum dolor.", is_hidden=True)
  65. self.index_post(post)
  66. response = self.client.get('%s?q=ipsum' % self.api_link)
  67. self.assertEqual(response.status_code, 200)
  68. reponse_json = response.json()
  69. self.assertIn('threads', [p['id'] for p in reponse_json])
  70. for provider in reponse_json:
  71. if provider['id'] == 'threads':
  72. self.assertEqual(provider['results']['results'], [])
  73. def test_unapproved_post(self):
  74. """unapproves posts are extempt from search"""
  75. thread = testutils.post_thread(self.category)
  76. post = testutils.reply_thread(
  77. thread, message="Lorem ipsum dolor.", is_unapproved=True)
  78. self.index_post(post)
  79. response = self.client.get('%s?q=ipsum' % self.api_link)
  80. self.assertEqual(response.status_code, 200)
  81. reponse_json = response.json()
  82. self.assertIn('threads', [p['id'] for p in reponse_json])
  83. for provider in reponse_json:
  84. if provider['id'] == 'threads':
  85. self.assertEqual(provider['results']['results'], [])
  86. def test_query(self):
  87. """api handles search query"""
  88. thread = testutils.post_thread(self.category)
  89. post = testutils.reply_thread(thread, message="Lorem ipsum dolor.")
  90. self.index_post(post)
  91. response = self.client.get('%s?q=ipsum' % self.api_link)
  92. self.assertEqual(response.status_code, 200)
  93. reponse_json = response.json()
  94. self.assertIn('threads', [p['id'] for p in reponse_json])
  95. for provider in reponse_json:
  96. if provider['id'] == 'threads':
  97. results = provider['results']['results']
  98. self.assertEqual(len(results), 1)
  99. self.assertEqual(results[0]['id'], post.id)
  100. def test_thread_title_search(self):
  101. """api searches threads by title"""
  102. thread = testutils.post_thread(self.category, title="Atmosphere of mars")
  103. testutils.reply_thread(thread, message="Lorem ipsum dolor.")
  104. self.index_post(post)
  105. response = self.client.get('%s?q=mars atmosphere' % self.api_link)
  106. self.assertEqual(response.status_code, 200)
  107. reponse_json = response.json()
  108. self.assertIn('threads', [p['id'] for p in reponse_json])
  109. for provider in reponse_json:
  110. if provider['id'] == 'threads':
  111. results = provider['results']['results']
  112. self.assertEqual(len(results), 1)
  113. self.assertEqual(results[0]['id'], thread.first_post_id)
  114. def test_complex_query(self):
  115. """api handles complex query that uses fulltext search facilities"""
  116. thread = testutils.post_thread(self.category)
  117. post = testutils.reply_thread(thread, message="Atmosphere of Mars")
  118. self.index_post(post)
  119. response = self.client.get('%s?q=Mars atmosphere' % self.api_link)
  120. self.assertEqual(response.status_code, 200)
  121. reponse_json = response.json()
  122. self.assertIn('threads', [p['id'] for p in reponse_json])
  123. for provider in reponse_json:
  124. if provider['id'] == 'threads':
  125. results = provider['results']['results']
  126. self.assertEqual(len(results), 1)
  127. self.assertEqual(results[0]['id'], post.id)
  128. class SearchProviderApiTests(SearchApiTests):
  129. def setUp(self):
  130. super(SearchProviderApiTests, self).setUp()
  131. self.api_link = reverse('misago:api:search', kwargs={
  132. 'search_provider': 'threads'
  133. })