Skip to content
Snippets Groups Projects
event_injection.py 3.15 KiB
Newer Older
  • Learn to ignore specific revisions
  • # -*- coding: utf-8 -*-
    # 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 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
    
    from synapse.types import Collection
    
    from tests.test_utils import get_awaitable_result
    
    
    """
    Utility functions for poking events into the storage of the server under test.
    """
    
    
    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 inject_event(
            hs,
            room_id=room_id,
            type=EventTypes.Member,
            sender=sender,
            state_key=target,
            content=content,
            **kwargs
        )
    
    
    def inject_event(
        hs: synapse.server.HomeServer,
        room_version: Optional[str] = None,
        prev_event_ids: Optional[Collection[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
        """
        test_reactor = hs.get_reactor()
    
    
        event, context = create_event(hs, room_version, prev_event_ids, **kwargs)
    
        d = hs.get_storage().persistence.persist_event(event, context)
        test_reactor.advance(0)
        get_awaitable_result(d)
    
        return event
    
    
    def create_event(
        hs: synapse.server.HomeServer,
        room_version: Optional[str] = None,
        prev_event_ids: Optional[Collection[str]] = None,
        **kwargs
    ) -> Tuple[EventBase, EventContext]:
        test_reactor = hs.get_reactor()
    
    
        if room_version is None:
            d = hs.get_datastore().get_room_version_id(kwargs["room_id"])
            test_reactor.advance(0)
            room_version = get_awaitable_result(d)
    
        builder = hs.get_event_builder_factory().for_room_version(
            KNOWN_ROOM_VERSIONS[room_version], kwargs
        )
        d = hs.get_event_creation_handler().create_new_client_event(
            builder, prev_event_ids=prev_event_ids
        )
        test_reactor.advance(0)
        event, context = get_awaitable_result(d)
    
    
        return event, context