test_search.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. from django.urls import reverse
  2. from misago.acl.test import patch_user_acl
  3. from misago.users.testutils import AuthenticatedUserTestCase, create_test_user
  4. class SearchApiTests(AuthenticatedUserTestCase):
  5. def setUp(self):
  6. super().setUp()
  7. self.api_link = reverse("misago:api:search")
  8. @patch_user_acl({"can_search_users": 0})
  9. def test_no_permission(self):
  10. """api respects permission to search users"""
  11. response = self.client.get(self.api_link)
  12. self.assertEqual(response.status_code, 200)
  13. self.assertNotIn("users", [p["id"] for p in response.json()])
  14. def test_no_query(self):
  15. """api handles no search query"""
  16. response = self.client.get(self.api_link)
  17. self.assertEqual(response.status_code, 200)
  18. response_json = response.json()
  19. self.assertIn("users", [p["id"] for p in response_json])
  20. for provider in response_json:
  21. if provider["id"] == "users":
  22. self.assertEqual(provider["results"]["results"], [])
  23. def test_empty_query(self):
  24. """api handles empty search query"""
  25. response = self.client.get("%s?q=" % self.api_link)
  26. self.assertEqual(response.status_code, 200)
  27. response_json = response.json()
  28. self.assertIn("users", [p["id"] for p in response_json])
  29. for provider in response_json:
  30. if provider["id"] == "users":
  31. self.assertEqual(provider["results"]["results"], [])
  32. def test_short_query(self):
  33. """api handles short search query"""
  34. response = self.client.get("%s?q=%s" % (self.api_link, self.user.username[0]))
  35. self.assertEqual(response.status_code, 200)
  36. response_json = response.json()
  37. self.assertIn("users", [p["id"] for p in response_json])
  38. for provider in response_json:
  39. if provider["id"] == "users":
  40. results = provider["results"]["results"]
  41. self.assertEqual(len(results), 1)
  42. self.assertEqual(results[0]["id"], self.user.id)
  43. def test_exact_match(self):
  44. """api handles exact search query"""
  45. response = self.client.get("%s?q=%s" % (self.api_link, self.user.username))
  46. self.assertEqual(response.status_code, 200)
  47. response_json = response.json()
  48. self.assertIn("users", [p["id"] for p in response_json])
  49. for provider in response_json:
  50. if provider["id"] == "users":
  51. results = provider["results"]["results"]
  52. self.assertEqual(len(results), 1)
  53. self.assertEqual(results[0]["id"], self.user.id)
  54. def test_tail_match(self):
  55. """api handles last three chars match query"""
  56. response = self.client.get("%s?q=%s" % (self.api_link, self.user.username[-3:]))
  57. self.assertEqual(response.status_code, 200)
  58. response_json = response.json()
  59. self.assertIn("users", [p["id"] for p in response_json])
  60. for provider in response_json:
  61. if provider["id"] == "users":
  62. results = provider["results"]["results"]
  63. self.assertEqual(len(results), 1)
  64. self.assertEqual(results[0]["id"], self.user.id)
  65. def test_no_match(self):
  66. """api handles no match"""
  67. response = self.client.get("%s?q=BobBoberson" % self.api_link)
  68. self.assertEqual(response.status_code, 200)
  69. response_json = response.json()
  70. self.assertIn("users", [p["id"] for p in response_json])
  71. for provider in response_json:
  72. if provider["id"] == "users":
  73. self.assertEqual(provider["results"]["results"], [])
  74. def test_search_disabled_user(self):
  75. """api respects disabled users visibility"""
  76. disabled_user = create_test_user(
  77. "DisabledUser", "disableduser@example.com", is_active=False
  78. )
  79. response = self.client.get("%s?q=DisabledUser" % self.api_link)
  80. self.assertEqual(response.status_code, 200)
  81. response_json = response.json()
  82. self.assertIn("users", [p["id"] for p in response_json])
  83. for provider in response_json:
  84. if provider["id"] == "users":
  85. self.assertEqual(provider["results"]["results"], [])
  86. # user shows in searchech performed by staff
  87. self.user.is_staff = True
  88. self.user.save()
  89. response = self.client.get("%s?q=DisabledUser" % self.api_link)
  90. self.assertEqual(response.status_code, 200)
  91. response_json = response.json()
  92. self.assertIn("users", [p["id"] for p in response_json])
  93. for provider in response_json:
  94. if provider["id"] == "users":
  95. results = provider["results"]["results"]
  96. self.assertEqual(len(results), 1)
  97. self.assertEqual(results[0]["id"], disabled_user.id)
  98. class SearchProviderApiTests(SearchApiTests):
  99. def setUp(self):
  100. super().setUp()
  101. self.api_link = reverse(
  102. "misago:api:search", kwargs={"search_provider": "users"}
  103. )