test_search.py 7.5 KB

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