100 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
| # Copyright 2018 New Vector Ltd
 | |
| # Copyright 2020 The Matrix.org Foundation C.I.C
 | |
| #
 | |
| # Licensed under the Apache License, Version 2.0 (the "License");
 | |
| # you may not use this file except in compliance with the License.
 | |
| # You may obtain a copy of the License at
 | |
| #
 | |
| #     http://www.apache.org/licenses/LICENSE-2.0
 | |
| #
 | |
| # Unless required by applicable law or agreed to in writing, software
 | |
| # distributed under the License is distributed on an "AS IS" BASIS,
 | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| # See the License for the specific language governing permissions and
 | |
| # limitations under the License.
 | |
| from typing import List, Optional, Tuple
 | |
| 
 | |
| import synapse.server
 | |
| from synapse.api.constants import EventTypes
 | |
| from synapse.api.room_versions import KNOWN_ROOM_VERSIONS
 | |
| from synapse.events import EventBase
 | |
| from synapse.events.snapshot import EventContext
 | |
| 
 | |
| """
 | |
| Utility functions for poking events into the storage of the server under test.
 | |
| """
 | |
| 
 | |
| 
 | |
| async def inject_member_event(
 | |
|     hs: synapse.server.HomeServer,
 | |
|     room_id: str,
 | |
|     sender: str,
 | |
|     membership: str,
 | |
|     target: Optional[str] = None,
 | |
|     extra_content: Optional[dict] = None,
 | |
|     **kwargs,
 | |
| ) -> EventBase:
 | |
|     """Inject a membership event into a room."""
 | |
|     if target is None:
 | |
|         target = sender
 | |
| 
 | |
|     content = {"membership": membership}
 | |
|     if extra_content:
 | |
|         content.update(extra_content)
 | |
| 
 | |
|     return await inject_event(
 | |
|         hs,
 | |
|         room_id=room_id,
 | |
|         type=EventTypes.Member,
 | |
|         sender=sender,
 | |
|         state_key=target,
 | |
|         content=content,
 | |
|         **kwargs,
 | |
|     )
 | |
| 
 | |
| 
 | |
| async def inject_event(
 | |
|     hs: synapse.server.HomeServer,
 | |
|     room_version: Optional[str] = None,
 | |
|     prev_event_ids: Optional[List[str]] = None,
 | |
|     **kwargs,
 | |
| ) -> EventBase:
 | |
|     """Inject a generic event into a room
 | |
| 
 | |
|     Args:
 | |
|         hs: the homeserver under test
 | |
|         room_version: the version of the room we're inserting into.
 | |
|             if not specified, will be looked up
 | |
|         prev_event_ids: prev_events for the event. If not specified, will be looked up
 | |
|         kwargs: fields for the event to be created
 | |
|     """
 | |
|     event, context = await create_event(hs, room_version, prev_event_ids, **kwargs)
 | |
| 
 | |
|     persistence = hs.get_storage().persistence
 | |
|     assert persistence is not None
 | |
| 
 | |
|     await persistence.persist_event(event, context)
 | |
| 
 | |
|     return event
 | |
| 
 | |
| 
 | |
| async def create_event(
 | |
|     hs: synapse.server.HomeServer,
 | |
|     room_version: Optional[str] = None,
 | |
|     prev_event_ids: Optional[List[str]] = None,
 | |
|     **kwargs,
 | |
| ) -> Tuple[EventBase, EventContext]:
 | |
|     if room_version is None:
 | |
|         room_version = await hs.get_datastores().main.get_room_version_id(
 | |
|             kwargs["room_id"]
 | |
|         )
 | |
| 
 | |
|     builder = hs.get_event_builder_factory().for_room_version(
 | |
|         KNOWN_ROOM_VERSIONS[room_version], kwargs
 | |
|     )
 | |
|     event, context = await hs.get_event_creation_handler().create_new_client_event(
 | |
|         builder, prev_event_ids=prev_event_ids
 | |
|     )
 | |
| 
 | |
|     return event, context
 |