test_search.py 5.0 KB

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