You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

686 lines
26 KiB

  1. # Copyright 2018 New Vector
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. from unittest.mock import Mock
  15. from twisted.internet import defer
  16. import synapse.rest.admin
  17. from synapse.api.constants import EventTypes, RoomEncryptionAlgorithms, UserTypes
  18. from synapse.api.room_versions import RoomVersion, RoomVersions
  19. from synapse.rest.client import login, room, user_directory
  20. from synapse.storage.roommember import ProfileInfo
  21. from tests import unittest
  22. from tests.unittest import override_config
  23. class UserDirectoryTestCase(unittest.HomeserverTestCase):
  24. """
  25. Tests the UserDirectoryHandler.
  26. """
  27. servlets = [
  28. login.register_servlets,
  29. synapse.rest.admin.register_servlets_for_client_rest_resource,
  30. room.register_servlets,
  31. ]
  32. def make_homeserver(self, reactor, clock):
  33. config = self.default_config()
  34. config["update_user_directory"] = True
  35. return self.setup_test_homeserver(config=config)
  36. def prepare(self, reactor, clock, hs):
  37. self.store = hs.get_datastore()
  38. self.handler = hs.get_user_directory_handler()
  39. self.event_builder_factory = self.hs.get_event_builder_factory()
  40. self.event_creation_handler = self.hs.get_event_creation_handler()
  41. def test_handle_local_profile_change_with_support_user(self):
  42. support_user_id = "@support:test"
  43. self.get_success(
  44. self.store.register_user(
  45. user_id=support_user_id, password_hash=None, user_type=UserTypes.SUPPORT
  46. )
  47. )
  48. regular_user_id = "@regular:test"
  49. self.get_success(
  50. self.store.register_user(user_id=regular_user_id, password_hash=None)
  51. )
  52. self.get_success(
  53. self.handler.handle_local_profile_change(support_user_id, None)
  54. )
  55. profile = self.get_success(self.store.get_user_in_directory(support_user_id))
  56. self.assertTrue(profile is None)
  57. display_name = "display_name"
  58. profile_info = ProfileInfo(avatar_url="avatar_url", display_name=display_name)
  59. self.get_success(
  60. self.handler.handle_local_profile_change(regular_user_id, profile_info)
  61. )
  62. profile = self.get_success(self.store.get_user_in_directory(regular_user_id))
  63. self.assertTrue(profile["display_name"] == display_name)
  64. def test_handle_local_profile_change_with_deactivated_user(self):
  65. # create user
  66. r_user_id = "@regular:test"
  67. self.get_success(
  68. self.store.register_user(user_id=r_user_id, password_hash=None)
  69. )
  70. # update profile
  71. display_name = "Regular User"
  72. profile_info = ProfileInfo(avatar_url="avatar_url", display_name=display_name)
  73. self.get_success(
  74. self.handler.handle_local_profile_change(r_user_id, profile_info)
  75. )
  76. # profile is in directory
  77. profile = self.get_success(self.store.get_user_in_directory(r_user_id))
  78. self.assertTrue(profile["display_name"] == display_name)
  79. # deactivate user
  80. self.get_success(self.store.set_user_deactivated_status(r_user_id, True))
  81. self.get_success(self.handler.handle_user_deactivated(r_user_id))
  82. # profile is not in directory
  83. profile = self.get_success(self.store.get_user_in_directory(r_user_id))
  84. self.assertTrue(profile is None)
  85. # update profile after deactivation
  86. self.get_success(
  87. self.handler.handle_local_profile_change(r_user_id, profile_info)
  88. )
  89. # profile is furthermore not in directory
  90. profile = self.get_success(self.store.get_user_in_directory(r_user_id))
  91. self.assertTrue(profile is None)
  92. def test_handle_user_deactivated_support_user(self):
  93. s_user_id = "@support:test"
  94. self.get_success(
  95. self.store.register_user(
  96. user_id=s_user_id, password_hash=None, user_type=UserTypes.SUPPORT
  97. )
  98. )
  99. self.store.remove_from_user_dir = Mock(return_value=defer.succeed(None))
  100. self.get_success(self.handler.handle_user_deactivated(s_user_id))
  101. self.store.remove_from_user_dir.not_called()
  102. def test_handle_user_deactivated_regular_user(self):
  103. r_user_id = "@regular:test"
  104. self.get_success(
  105. self.store.register_user(user_id=r_user_id, password_hash=None)
  106. )
  107. self.store.remove_from_user_dir = Mock(return_value=defer.succeed(None))
  108. self.get_success(self.handler.handle_user_deactivated(r_user_id))
  109. self.store.remove_from_user_dir.called_once_with(r_user_id)
  110. def test_private_room(self):
  111. """
  112. A user can be searched for only by people that are either in a public
  113. room, or that share a private chat.
  114. """
  115. u1 = self.register_user("user1", "pass")
  116. u1_token = self.login(u1, "pass")
  117. u2 = self.register_user("user2", "pass")
  118. u2_token = self.login(u2, "pass")
  119. u3 = self.register_user("user3", "pass")
  120. # We do not add users to the directory until they join a room.
  121. s = self.get_success(self.handler.search_users(u1, "user2", 10))
  122. self.assertEqual(len(s["results"]), 0)
  123. room = self.helper.create_room_as(u1, is_public=False, tok=u1_token)
  124. self.helper.invite(room, src=u1, targ=u2, tok=u1_token)
  125. self.helper.join(room, user=u2, tok=u2_token)
  126. # Check we have populated the database correctly.
  127. shares_private = self.get_users_who_share_private_rooms()
  128. public_users = self.get_users_in_public_rooms()
  129. self.assertEqual(
  130. self._compress_shared(shares_private), {(u1, u2, room), (u2, u1, room)}
  131. )
  132. self.assertEqual(public_users, [])
  133. # We get one search result when searching for user2 by user1.
  134. s = self.get_success(self.handler.search_users(u1, "user2", 10))
  135. self.assertEqual(len(s["results"]), 1)
  136. # We get NO search results when searching for user2 by user3.
  137. s = self.get_success(self.handler.search_users(u3, "user2", 10))
  138. self.assertEqual(len(s["results"]), 0)
  139. # We get NO search results when searching for user3 by user1.
  140. s = self.get_success(self.handler.search_users(u1, "user3", 10))
  141. self.assertEqual(len(s["results"]), 0)
  142. # User 2 then leaves.
  143. self.helper.leave(room, user=u2, tok=u2_token)
  144. # Check we have removed the values.
  145. shares_private = self.get_users_who_share_private_rooms()
  146. public_users = self.get_users_in_public_rooms()
  147. self.assertEqual(self._compress_shared(shares_private), set())
  148. self.assertEqual(public_users, [])
  149. # User1 now gets no search results for any of the other users.
  150. s = self.get_success(self.handler.search_users(u1, "user2", 10))
  151. self.assertEqual(len(s["results"]), 0)
  152. s = self.get_success(self.handler.search_users(u1, "user3", 10))
  153. self.assertEqual(len(s["results"]), 0)
  154. @override_config({"encryption_enabled_by_default_for_room_type": "all"})
  155. def test_encrypted_by_default_config_option_all(self):
  156. """Tests that invite-only and non-invite-only rooms have encryption enabled by
  157. default when the config option encryption_enabled_by_default_for_room_type is "all".
  158. """
  159. # Create a user
  160. user = self.register_user("user", "pass")
  161. user_token = self.login(user, "pass")
  162. # Create an invite-only room as that user
  163. room_id = self.helper.create_room_as(user, is_public=False, tok=user_token)
  164. # Check that the room has an encryption state event
  165. event_content = self.helper.get_state(
  166. room_id=room_id,
  167. event_type=EventTypes.RoomEncryption,
  168. tok=user_token,
  169. )
  170. self.assertEqual(event_content, {"algorithm": RoomEncryptionAlgorithms.DEFAULT})
  171. # Create a non invite-only room as that user
  172. room_id = self.helper.create_room_as(user, is_public=True, tok=user_token)
  173. # Check that the room has an encryption state event
  174. event_content = self.helper.get_state(
  175. room_id=room_id,
  176. event_type=EventTypes.RoomEncryption,
  177. tok=user_token,
  178. )
  179. self.assertEqual(event_content, {"algorithm": RoomEncryptionAlgorithms.DEFAULT})
  180. @override_config({"encryption_enabled_by_default_for_room_type": "invite"})
  181. def test_encrypted_by_default_config_option_invite(self):
  182. """Tests that only new, invite-only rooms have encryption enabled by default when
  183. the config option encryption_enabled_by_default_for_room_type is "invite".
  184. """
  185. # Create a user
  186. user = self.register_user("user", "pass")
  187. user_token = self.login(user, "pass")
  188. # Create an invite-only room as that user
  189. room_id = self.helper.create_room_as(user, is_public=False, tok=user_token)
  190. # Check that the room has an encryption state event
  191. event_content = self.helper.get_state(
  192. room_id=room_id,
  193. event_type=EventTypes.RoomEncryption,
  194. tok=user_token,
  195. )
  196. self.assertEqual(event_content, {"algorithm": RoomEncryptionAlgorithms.DEFAULT})
  197. # Create a non invite-only room as that user
  198. room_id = self.helper.create_room_as(user, is_public=True, tok=user_token)
  199. # Check that the room does not have an encryption state event
  200. self.helper.get_state(
  201. room_id=room_id,
  202. event_type=EventTypes.RoomEncryption,
  203. tok=user_token,
  204. expect_code=404,
  205. )
  206. @override_config({"encryption_enabled_by_default_for_room_type": "off"})
  207. def test_encrypted_by_default_config_option_off(self):
  208. """Tests that neither new invite-only nor non-invite-only rooms have encryption
  209. enabled by default when the config option
  210. encryption_enabled_by_default_for_room_type is "off".
  211. """
  212. # Create a user
  213. user = self.register_user("user", "pass")
  214. user_token = self.login(user, "pass")
  215. # Create an invite-only room as that user
  216. room_id = self.helper.create_room_as(user, is_public=False, tok=user_token)
  217. # Check that the room does not have an encryption state event
  218. self.helper.get_state(
  219. room_id=room_id,
  220. event_type=EventTypes.RoomEncryption,
  221. tok=user_token,
  222. expect_code=404,
  223. )
  224. # Create a non invite-only room as that user
  225. room_id = self.helper.create_room_as(user, is_public=True, tok=user_token)
  226. # Check that the room does not have an encryption state event
  227. self.helper.get_state(
  228. room_id=room_id,
  229. event_type=EventTypes.RoomEncryption,
  230. tok=user_token,
  231. expect_code=404,
  232. )
  233. def test_spam_checker(self):
  234. """
  235. A user which fails the spam checks will not appear in search results.
  236. """
  237. u1 = self.register_user("user1", "pass")
  238. u1_token = self.login(u1, "pass")
  239. u2 = self.register_user("user2", "pass")
  240. u2_token = self.login(u2, "pass")
  241. # We do not add users to the directory until they join a room.
  242. s = self.get_success(self.handler.search_users(u1, "user2", 10))
  243. self.assertEqual(len(s["results"]), 0)
  244. room = self.helper.create_room_as(u1, is_public=False, tok=u1_token)
  245. self.helper.invite(room, src=u1, targ=u2, tok=u1_token)
  246. self.helper.join(room, user=u2, tok=u2_token)
  247. # Check we have populated the database correctly.
  248. shares_private = self.get_users_who_share_private_rooms()
  249. public_users = self.get_users_in_public_rooms()
  250. self.assertEqual(
  251. self._compress_shared(shares_private), {(u1, u2, room), (u2, u1, room)}
  252. )
  253. self.assertEqual(public_users, [])
  254. # We get one search result when searching for user2 by user1.
  255. s = self.get_success(self.handler.search_users(u1, "user2", 10))
  256. self.assertEqual(len(s["results"]), 1)
  257. async def allow_all(user_profile):
  258. # Allow all users.
  259. return False
  260. # Configure a spam checker that does not filter any users.
  261. spam_checker = self.hs.get_spam_checker()
  262. spam_checker._check_username_for_spam_callbacks = [allow_all]
  263. # The results do not change:
  264. # We get one search result when searching for user2 by user1.
  265. s = self.get_success(self.handler.search_users(u1, "user2", 10))
  266. self.assertEqual(len(s["results"]), 1)
  267. # Configure a spam checker that filters all users.
  268. async def block_all(user_profile):
  269. # All users are spammy.
  270. return True
  271. spam_checker._check_username_for_spam_callbacks = [block_all]
  272. # User1 now gets no search results for any of the other users.
  273. s = self.get_success(self.handler.search_users(u1, "user2", 10))
  274. self.assertEqual(len(s["results"]), 0)
  275. def test_legacy_spam_checker(self):
  276. """
  277. A spam checker without the expected method should be ignored.
  278. """
  279. u1 = self.register_user("user1", "pass")
  280. u1_token = self.login(u1, "pass")
  281. u2 = self.register_user("user2", "pass")
  282. u2_token = self.login(u2, "pass")
  283. # We do not add users to the directory until they join a room.
  284. s = self.get_success(self.handler.search_users(u1, "user2", 10))
  285. self.assertEqual(len(s["results"]), 0)
  286. room = self.helper.create_room_as(u1, is_public=False, tok=u1_token)
  287. self.helper.invite(room, src=u1, targ=u2, tok=u1_token)
  288. self.helper.join(room, user=u2, tok=u2_token)
  289. # Check we have populated the database correctly.
  290. shares_private = self.get_users_who_share_private_rooms()
  291. public_users = self.get_users_in_public_rooms()
  292. self.assertEqual(
  293. self._compress_shared(shares_private), {(u1, u2, room), (u2, u1, room)}
  294. )
  295. self.assertEqual(public_users, [])
  296. # Configure a spam checker.
  297. spam_checker = self.hs.get_spam_checker()
  298. # The spam checker doesn't need any methods, so create a bare object.
  299. spam_checker.spam_checker = object()
  300. # We get one search result when searching for user2 by user1.
  301. s = self.get_success(self.handler.search_users(u1, "user2", 10))
  302. self.assertEqual(len(s["results"]), 1)
  303. def _compress_shared(self, shared):
  304. """
  305. Compress a list of users who share rooms dicts to a list of tuples.
  306. """
  307. r = set()
  308. for i in shared:
  309. r.add((i["user_id"], i["other_user_id"], i["room_id"]))
  310. return r
  311. def get_users_in_public_rooms(self):
  312. r = self.get_success(
  313. self.store.db_pool.simple_select_list(
  314. "users_in_public_rooms", None, ("user_id", "room_id")
  315. )
  316. )
  317. retval = []
  318. for i in r:
  319. retval.append((i["user_id"], i["room_id"]))
  320. return retval
  321. def get_users_who_share_private_rooms(self):
  322. return self.get_success(
  323. self.store.db_pool.simple_select_list(
  324. "users_who_share_private_rooms",
  325. None,
  326. ["user_id", "other_user_id", "room_id"],
  327. )
  328. )
  329. def _add_background_updates(self):
  330. """
  331. Add the background updates we need to run.
  332. """
  333. # Ugh, have to reset this flag
  334. self.store.db_pool.updates._all_done = False
  335. self.get_success(
  336. self.store.db_pool.simple_insert(
  337. "background_updates",
  338. {
  339. "update_name": "populate_user_directory_createtables",
  340. "progress_json": "{}",
  341. },
  342. )
  343. )
  344. self.get_success(
  345. self.store.db_pool.simple_insert(
  346. "background_updates",
  347. {
  348. "update_name": "populate_user_directory_process_rooms",
  349. "progress_json": "{}",
  350. "depends_on": "populate_user_directory_createtables",
  351. },
  352. )
  353. )
  354. self.get_success(
  355. self.store.db_pool.simple_insert(
  356. "background_updates",
  357. {
  358. "update_name": "populate_user_directory_process_users",
  359. "progress_json": "{}",
  360. "depends_on": "populate_user_directory_process_rooms",
  361. },
  362. )
  363. )
  364. self.get_success(
  365. self.store.db_pool.simple_insert(
  366. "background_updates",
  367. {
  368. "update_name": "populate_user_directory_cleanup",
  369. "progress_json": "{}",
  370. "depends_on": "populate_user_directory_process_users",
  371. },
  372. )
  373. )
  374. def test_initial(self):
  375. """
  376. The user directory's initial handler correctly updates the search tables.
  377. """
  378. u1 = self.register_user("user1", "pass")
  379. u1_token = self.login(u1, "pass")
  380. u2 = self.register_user("user2", "pass")
  381. u2_token = self.login(u2, "pass")
  382. u3 = self.register_user("user3", "pass")
  383. u3_token = self.login(u3, "pass")
  384. room = self.helper.create_room_as(u1, is_public=True, tok=u1_token)
  385. self.helper.invite(room, src=u1, targ=u2, tok=u1_token)
  386. self.helper.join(room, user=u2, tok=u2_token)
  387. private_room = self.helper.create_room_as(u1, is_public=False, tok=u1_token)
  388. self.helper.invite(private_room, src=u1, targ=u3, tok=u1_token)
  389. self.helper.join(private_room, user=u3, tok=u3_token)
  390. self.get_success(self.store.update_user_directory_stream_pos(None))
  391. self.get_success(self.store.delete_all_from_user_dir())
  392. shares_private = self.get_users_who_share_private_rooms()
  393. public_users = self.get_users_in_public_rooms()
  394. # Nothing updated yet
  395. self.assertEqual(shares_private, [])
  396. self.assertEqual(public_users, [])
  397. # Do the initial population of the user directory via the background update
  398. self._add_background_updates()
  399. while not self.get_success(
  400. self.store.db_pool.updates.has_completed_background_updates()
  401. ):
  402. self.get_success(
  403. self.store.db_pool.updates.do_next_background_update(100), by=0.1
  404. )
  405. shares_private = self.get_users_who_share_private_rooms()
  406. public_users = self.get_users_in_public_rooms()
  407. # User 1 and User 2 are in the same public room
  408. self.assertEqual(set(public_users), {(u1, room), (u2, room)})
  409. # User 1 and User 3 share private rooms
  410. self.assertEqual(
  411. self._compress_shared(shares_private),
  412. {(u1, u3, private_room), (u3, u1, private_room)},
  413. )
  414. def test_initial_share_all_users(self):
  415. """
  416. Search all users = True means that a user does not have to share a
  417. private room with the searching user or be in a public room to be search
  418. visible.
  419. """
  420. self.handler.search_all_users = True
  421. self.hs.config.user_directory_search_all_users = True
  422. u1 = self.register_user("user1", "pass")
  423. self.register_user("user2", "pass")
  424. u3 = self.register_user("user3", "pass")
  425. # Wipe the user dir
  426. self.get_success(self.store.update_user_directory_stream_pos(None))
  427. self.get_success(self.store.delete_all_from_user_dir())
  428. # Do the initial population of the user directory via the background update
  429. self._add_background_updates()
  430. while not self.get_success(
  431. self.store.db_pool.updates.has_completed_background_updates()
  432. ):
  433. self.get_success(
  434. self.store.db_pool.updates.do_next_background_update(100), by=0.1
  435. )
  436. shares_private = self.get_users_who_share_private_rooms()
  437. public_users = self.get_users_in_public_rooms()
  438. # No users share rooms
  439. self.assertEqual(public_users, [])
  440. self.assertEqual(self._compress_shared(shares_private), set())
  441. # Despite not sharing a room, search_all_users means we get a search
  442. # result.
  443. s = self.get_success(self.handler.search_users(u1, u3, 10))
  444. self.assertEqual(len(s["results"]), 1)
  445. # We can find the other two users
  446. s = self.get_success(self.handler.search_users(u1, "user", 10))
  447. self.assertEqual(len(s["results"]), 2)
  448. # Registering a user and then searching for them works.
  449. u4 = self.register_user("user4", "pass")
  450. s = self.get_success(self.handler.search_users(u1, u4, 10))
  451. self.assertEqual(len(s["results"]), 1)
  452. @override_config(
  453. {
  454. "user_directory": {
  455. "enabled": True,
  456. "search_all_users": True,
  457. "prefer_local_users": True,
  458. }
  459. }
  460. )
  461. def test_prefer_local_users(self):
  462. """Tests that local users are shown higher in search results when
  463. user_directory.prefer_local_users is True.
  464. """
  465. # Create a room and few users to test the directory with
  466. searching_user = self.register_user("searcher", "password")
  467. searching_user_tok = self.login("searcher", "password")
  468. room_id = self.helper.create_room_as(
  469. searching_user,
  470. room_version=RoomVersions.V1.identifier,
  471. tok=searching_user_tok,
  472. )
  473. # Create a few local users and join them to the room
  474. local_user_1 = self.register_user("user_xxxxx", "password")
  475. local_user_2 = self.register_user("user_bbbbb", "password")
  476. local_user_3 = self.register_user("user_zzzzz", "password")
  477. self._add_user_to_room(room_id, RoomVersions.V1, local_user_1)
  478. self._add_user_to_room(room_id, RoomVersions.V1, local_user_2)
  479. self._add_user_to_room(room_id, RoomVersions.V1, local_user_3)
  480. # Create a few "remote" users and join them to the room
  481. remote_user_1 = "@user_aaaaa:remote_server"
  482. remote_user_2 = "@user_yyyyy:remote_server"
  483. remote_user_3 = "@user_ccccc:remote_server"
  484. self._add_user_to_room(room_id, RoomVersions.V1, remote_user_1)
  485. self._add_user_to_room(room_id, RoomVersions.V1, remote_user_2)
  486. self._add_user_to_room(room_id, RoomVersions.V1, remote_user_3)
  487. local_users = [local_user_1, local_user_2, local_user_3]
  488. remote_users = [remote_user_1, remote_user_2, remote_user_3]
  489. # Populate the user directory via background update
  490. self._add_background_updates()
  491. while not self.get_success(
  492. self.store.db_pool.updates.has_completed_background_updates()
  493. ):
  494. self.get_success(
  495. self.store.db_pool.updates.do_next_background_update(100), by=0.1
  496. )
  497. # The local searching user searches for the term "user", which other users have
  498. # in their user id
  499. results = self.get_success(
  500. self.handler.search_users(searching_user, "user", 20)
  501. )["results"]
  502. received_user_id_ordering = [result["user_id"] for result in results]
  503. # Typically we'd expect Synapse to return users in lexicographical order,
  504. # assuming they have similar User IDs/display names, and profile information.
  505. # Check that the order of returned results using our module is as we expect,
  506. # i.e our local users show up first, despite all users having lexographically mixed
  507. # user IDs.
  508. [self.assertIn(user, local_users) for user in received_user_id_ordering[:3]]
  509. [self.assertIn(user, remote_users) for user in received_user_id_ordering[3:]]
  510. def _add_user_to_room(
  511. self,
  512. room_id: str,
  513. room_version: RoomVersion,
  514. user_id: str,
  515. ):
  516. # Add a user to the room.
  517. builder = self.event_builder_factory.for_room_version(
  518. room_version,
  519. {
  520. "type": "m.room.member",
  521. "sender": user_id,
  522. "state_key": user_id,
  523. "room_id": room_id,
  524. "content": {"membership": "join"},
  525. },
  526. )
  527. event, context = self.get_success(
  528. self.event_creation_handler.create_new_client_event(builder)
  529. )
  530. self.get_success(
  531. self.hs.get_storage().persistence.persist_event(event, context)
  532. )
  533. class TestUserDirSearchDisabled(unittest.HomeserverTestCase):
  534. user_id = "@test:test"
  535. servlets = [
  536. user_directory.register_servlets,
  537. room.register_servlets,
  538. login.register_servlets,
  539. synapse.rest.admin.register_servlets_for_client_rest_resource,
  540. ]
  541. def make_homeserver(self, reactor, clock):
  542. config = self.default_config()
  543. config["update_user_directory"] = True
  544. hs = self.setup_test_homeserver(config=config)
  545. self.config = hs.config
  546. return hs
  547. def test_disabling_room_list(self):
  548. self.config.user_directory_search_enabled = True
  549. # First we create a room with another user so that user dir is non-empty
  550. # for our user
  551. self.helper.create_room_as(self.user_id)
  552. u2 = self.register_user("user2", "pass")
  553. room = self.helper.create_room_as(self.user_id)
  554. self.helper.join(room, user=u2)
  555. # Assert user directory is not empty
  556. channel = self.make_request(
  557. "POST", b"user_directory/search", b'{"search_term":"user2"}'
  558. )
  559. self.assertEquals(200, channel.code, channel.result)
  560. self.assertTrue(len(channel.json_body["results"]) > 0)
  561. # Disable user directory and check search returns nothing
  562. self.config.user_directory_search_enabled = False
  563. channel = self.make_request(
  564. "POST", b"user_directory/search", b'{"search_term":"user2"}'
  565. )
  566. self.assertEquals(200, channel.code, channel.result)
  567. self.assertTrue(len(channel.json_body["results"]) == 0)