test_search.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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. 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(thread, message="Lorem ipsum dolor.", is_hidden=True)
  64. self.index_post(post)
  65. response = self.client.get('%s?q=ipsum' % self.api_link)
  66. self.assertEqual(response.status_code, 200)
  67. reponse_json = response.json()
  68. self.assertIn('threads', [p['id'] for p in reponse_json])
  69. for provider in reponse_json:
  70. if provider['id'] == 'threads':
  71. self.assertEqual(provider['results']['results'], [])
  72. def test_unapproved_post(self):
  73. """unapproves posts are extempt from search"""
  74. thread = testutils.post_thread(self.category)
  75. post = testutils.reply_thread(thread, message="Lorem ipsum dolor.", is_unapproved=True)
  76. self.index_post(post)
  77. response = self.client.get('%s?q=ipsum' % self.api_link)
  78. self.assertEqual(response.status_code, 200)
  79. reponse_json = response.json()
  80. self.assertIn('threads', [p['id'] for p in reponse_json])
  81. for provider in reponse_json:
  82. if provider['id'] == 'threads':
  83. self.assertEqual(provider['results']['results'], [])
  84. def test_query(self):
  85. """api handles search query"""
  86. thread = testutils.post_thread(self.category)
  87. post = testutils.reply_thread(thread, message="Lorem ipsum dolor.")
  88. self.index_post(post)
  89. response = self.client.get('%s?q=ipsum' % self.api_link)
  90. self.assertEqual(response.status_code, 200)
  91. reponse_json = response.json()
  92. self.assertIn('threads', [p['id'] for p in reponse_json])
  93. for provider in reponse_json:
  94. if provider['id'] == 'threads':
  95. results = provider['results']['results']
  96. self.assertEqual(len(results), 1)
  97. self.assertEqual(results[0]['id'], post.id)
  98. def test_thread_title_search(self):
  99. """api searches threads by title"""
  100. thread = testutils.post_thread(self.category, title="Atmosphere of mars")
  101. self.index_post(thread.first_post)
  102. post = testutils.reply_thread(thread, message="Lorem ipsum dolor.")
  103. self.index_post(post)
  104. response = self.client.get('%s?q=mars atmosphere' % self.api_link)
  105. self.assertEqual(response.status_code, 200)
  106. reponse_json = response.json()
  107. self.assertIn('threads', [p['id'] for p in reponse_json])
  108. for provider in reponse_json:
  109. if provider['id'] == 'threads':
  110. results = provider['results']['results']
  111. self.assertEqual(len(results), 1)
  112. self.assertEqual(results[0]['id'], thread.first_post_id)
  113. def test_complex_query(self):
  114. """api handles complex query that uses fulltext search facilities"""
  115. thread = testutils.post_thread(self.category)
  116. post = testutils.reply_thread(thread, message="Atmosphere of Mars")
  117. self.index_post(post)
  118. response = self.client.get('%s?q=Mars atmosphere' % self.api_link)
  119. self.assertEqual(response.status_code, 200)
  120. reponse_json = response.json()
  121. self.assertIn('threads', [p['id'] for p in reponse_json])
  122. for provider in reponse_json:
  123. if provider['id'] == 'threads':
  124. results = provider['results']['results']
  125. self.assertEqual(len(results), 1)
  126. self.assertEqual(results[0]['id'], post.id)
  127. class SearchProviderApiTests(SearchApiTests):
  128. def setUp(self):
  129. super(SearchProviderApiTests, self).setUp()
  130. self.api_link = reverse('misago:api:search', kwargs={'search_provider': 'threads'})