2020-04-29 14:30:36 +03:00
|
|
|
# -*- 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.
|
2020-05-05 16:17:27 +03:00
|
|
|
from typing import Optional, Tuple
|
2020-04-29 14:30:36 +03:00
|
|
|
|
|
|
|
import synapse.server
|
|
|
|
from synapse.api.constants import EventTypes
|
|
|
|
from synapse.api.room_versions import KNOWN_ROOM_VERSIONS
|
|
|
|
from synapse.events import EventBase
|
2020-05-05 16:17:27 +03:00
|
|
|
from synapse.events.snapshot import EventContext
|
2020-04-29 14:30:36 +03:00
|
|
|
from synapse.types import Collection
|
|
|
|
|
|
|
|
"""
|
|
|
|
Utility functions for poking events into the storage of the server under test.
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
2020-07-22 19:29:15 +03:00
|
|
|
async def inject_member_event(
|
2020-04-29 14:30:36 +03:00
|
|
|
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)
|
|
|
|
|
2020-07-22 19:29:15 +03:00
|
|
|
return await inject_event(
|
2020-04-29 14:30:36 +03:00
|
|
|
hs,
|
|
|
|
room_id=room_id,
|
|
|
|
type=EventTypes.Member,
|
|
|
|
sender=sender,
|
|
|
|
state_key=target,
|
|
|
|
content=content,
|
|
|
|
**kwargs
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2020-07-22 19:29:15 +03:00
|
|
|
async def inject_event(
|
2020-04-29 14:30:36 +03:00
|
|
|
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
|
|
|
|
"""
|
2020-07-22 19:29:15 +03:00
|
|
|
event, context = await create_event(hs, room_version, prev_event_ids, **kwargs)
|
2020-05-05 16:17:27 +03:00
|
|
|
|
2020-07-22 19:29:15 +03:00
|
|
|
await hs.get_storage().persistence.persist_event(event, context)
|
2020-05-05 16:17:27 +03:00
|
|
|
|
|
|
|
return event
|
|
|
|
|
|
|
|
|
2020-07-22 19:29:15 +03:00
|
|
|
async def create_event(
|
2020-05-05 16:17:27 +03:00
|
|
|
hs: synapse.server.HomeServer,
|
|
|
|
room_version: Optional[str] = None,
|
|
|
|
prev_event_ids: Optional[Collection[str]] = None,
|
|
|
|
**kwargs
|
|
|
|
) -> Tuple[EventBase, EventContext]:
|
2020-04-29 14:30:36 +03:00
|
|
|
if room_version is None:
|
2020-07-22 19:29:15 +03:00
|
|
|
room_version = await hs.get_datastore().get_room_version_id(kwargs["room_id"])
|
2020-04-29 14:30:36 +03:00
|
|
|
|
|
|
|
builder = hs.get_event_builder_factory().for_room_version(
|
|
|
|
KNOWN_ROOM_VERSIONS[room_version], kwargs
|
|
|
|
)
|
2020-07-22 19:29:15 +03:00
|
|
|
event, context = await hs.get_event_creation_handler().create_new_client_event(
|
2020-04-29 14:30:36 +03:00
|
|
|
builder, prev_event_ids=prev_event_ids
|
|
|
|
)
|
|
|
|
|
2020-05-05 16:17:27 +03:00
|
|
|
return event, context
|