test_search.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. from django.urls import reverse
  2. from misago.categories.models import Category
  3. from misago.threads import testutils
  4. from misago.users.testutils import AuthenticatedUserTestCase
  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. response_json = response.json()
  23. self.assertIn('threads', [p['id'] for p in response_json])
  24. for provider in response_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. response_json = response.json()
  32. self.assertIn('threads', [p['id'] for p in response_json])
  33. for provider in response_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. response_json = response.json()
  44. self.assertIn('threads', [p['id'] for p in response_json])
  45. for provider in response_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. response_json = response.json()
  56. self.assertIn('threads', [p['id'] for p in response_json])
  57. for provider in response_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,
  65. message="Lorem ipsum dolor.",
  66. is_hidden=True,
  67. )
  68. self.index_post(post)
  69. response = self.client.get('%s?q=ipsum' % self.api_link)
  70. self.assertEqual(response.status_code, 200)
  71. response_json = response.json()
  72. self.assertIn('threads', [p['id'] for p in response_json])
  73. for provider in response_json:
  74. if provider['id'] == 'threads':
  75. self.assertEqual(provider['results']['results'], [])
  76. def test_unapproved_post(self):
  77. """unapproves posts are extempt from search"""
  78. thread = testutils.post_thread(self.category)
  79. post = testutils.reply_thread(
  80. thread,
  81. message="Lorem ipsum dolor.",
  82. is_unapproved=True,
  83. )
  84. self.index_post(post)
  85. response = self.client.get('%s?q=ipsum' % self.api_link)
  86. self.assertEqual(response.status_code, 200)
  87. response_json = response.json()
  88. self.assertIn('threads', [p['id'] for p in response_json])
  89. for provider in response_json:
  90. if provider['id'] == 'threads':
  91. self.assertEqual(provider['results']['results'], [])
  92. def test_query(self):
  93. """api handles search query"""
  94. thread = testutils.post_thread(self.category)
  95. post = testutils.reply_thread(thread, message="Lorem ipsum dolor.")
  96. self.index_post(post)
  97. response = self.client.get('%s?q=ipsum' % self.api_link)
  98. self.assertEqual(response.status_code, 200)
  99. response_json = response.json()
  100. self.assertIn('threads', [p['id'] for p in response_json])
  101. for provider in response_json:
  102. if provider['id'] == 'threads':
  103. results = provider['results']['results']
  104. self.assertEqual(len(results), 1)
  105. self.assertEqual(results[0]['id'], post.id)
  106. def test_thread_title_search(self):
  107. """api searches threads by title"""
  108. thread = testutils.post_thread(self.category, title="Atmosphere of mars")
  109. self.index_post(thread.first_post)
  110. post = testutils.reply_thread(thread, message="Lorem ipsum dolor.")
  111. self.index_post(post)
  112. response = self.client.get('%s?q=mars atmosphere' % self.api_link)
  113. self.assertEqual(response.status_code, 200)
  114. response_json = response.json()
  115. self.assertIn('threads', [p['id'] for p in response_json])
  116. for provider in response_json:
  117. if provider['id'] == 'threads':
  118. results = provider['results']['results']
  119. self.assertEqual(len(results), 1)
  120. self.assertEqual(results[0]['id'], thread.first_post_id)
  121. def test_complex_query(self):
  122. """api handles complex query that uses fulltext search facilities"""
  123. thread = testutils.post_thread(self.category)
  124. post = testutils.reply_thread(thread, message="Atmosphere of Mars")
  125. self.index_post(post)
  126. response = self.client.get('%s?q=Mars atmosphere' % self.api_link)
  127. self.assertEqual(response.status_code, 200)
  128. response_json = response.json()
  129. self.assertIn('threads', [p['id'] for p in response_json])
  130. for provider in response_json:
  131. if provider['id'] == 'threads':
  132. results = provider['results']['results']
  133. self.assertEqual(len(results), 1)
  134. self.assertEqual(results[0]['id'], post.id)
  135. def test_filtered_query(self):
  136. """search filters are used by search system"""
  137. thread = testutils.post_thread(self.category)
  138. post = testutils.reply_thread(
  139. thread,
  140. message="You just do MMM in 4th minute and its pwnt",
  141. )
  142. self.index_post(post)
  143. response = self.client.get('%s?q=MMM' % self.api_link)
  144. self.assertEqual(response.status_code, 200)
  145. response_json = response.json()
  146. self.assertIn('threads', [p['id'] for p in response_json])
  147. for provider in response_json:
  148. if provider['id'] == 'threads':
  149. results = provider['results']['results']
  150. self.assertEqual(len(results), 1)
  151. self.assertEqual(results[0]['id'], post.id)
  152. response = self.client.get('%s?q=Marines Medics' % self.api_link)
  153. self.assertEqual(response.status_code, 200)
  154. for provider in response_json:
  155. if provider['id'] == 'threads':
  156. results = provider['results']['results']
  157. self.assertEqual(len(results), 1)
  158. self.assertEqual(results[0]['id'], post.id)
  159. class SearchProviderApiTests(SearchApiTests):
  160. def setUp(self):
  161. super(SearchProviderApiTests, self).setUp()
  162. self.api_link = reverse(
  163. 'misago:api:search', kwargs={
  164. 'search_provider': 'threads',
  165. }
  166. )