Skip to content
Snippets Groups Projects
test_room_list.py 2.77 KiB
Newer Older
  • Learn to ignore specific revisions
  • from http import HTTPStatus
    from typing import Optional, Set
    
    from synapse.rest import admin
    from synapse.rest.client import directory, login, room
    from synapse.types import JsonDict
    
    from tests import unittest
    
    
    class RoomListHandlerTestCase(unittest.HomeserverTestCase):
        servlets = [
            admin.register_servlets,
            login.register_servlets,
            room.register_servlets,
            directory.register_servlets,
        ]
    
        def _create_published_room(
            self, tok: str, extra_content: Optional[JsonDict] = None
        ) -> str:
            room_id = self.helper.create_room_as(tok=tok, extra_content=extra_content)
            channel = self.make_request(
                "PUT",
                f"/_matrix/client/v3/directory/list/room/{room_id}?access_token={tok}",
                content={
                    "visibility": "public",
                },
            )
            assert channel.code == HTTPStatus.OK, f"couldn't publish room: {channel.result}"
            return room_id
    
        def test_acls_applied_to_room_directory_results(self) -> None:
            """
            Creates 3 rooms. Room 2 has an ACL that only permits the homeservers
            `test` and `test2` to access it.
    
            We then simulate `test2` and `test3` requesting the room directory and assert
            that `test3` does not see room 2, but `test2` sees all 3.
            """
            self.register_user("u1", "p1")
            u1tok = self.login("u1", "p1")
            room1 = self._create_published_room(u1tok)
    
            room2 = self._create_published_room(
                u1tok,
                extra_content={
                    "initial_state": [
                        {
                            "type": "m.room.server_acl",
                            "content": {
                                "allow": ["test", "test2"],
                            },
                        }
                    ]
                },
            )
    
            room3 = self._create_published_room(u1tok)
    
            room_list = self.get_success(
                self.hs.get_room_list_handler().get_local_public_room_list(
                    limit=50, from_federation_origin="test2"
                )
            )
            room_ids_in_test2_list: Set[str] = {
                entry["room_id"] for entry in room_list["chunk"]
            }
    
            room_list = self.get_success(
                self.hs.get_room_list_handler().get_local_public_room_list(
                    limit=50, from_federation_origin="test3"
                )
            )
            room_ids_in_test3_list: Set[str] = {
                entry["room_id"] for entry in room_list["chunk"]
            }
    
            self.assertEqual(
                room_ids_in_test2_list,
                {room1, room2, room3},
                "test2 should be able to see all 3 rooms",
            )
            self.assertEqual(
                room_ids_in_test3_list,
                {room1, room3},
                "test3 should be able to see only 2 rooms",
            )