event_injection.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. # -*- coding: utf-8 -*-
  2. # Copyright 2018 New Vector Ltd
  3. # Copyright 2020 The Matrix.org Foundation C.I.C
  4. #
  5. # Licensed under the Apache License, Version 2.0 (the "License");
  6. # you may not use this file except in compliance with the License.
  7. # You may obtain a copy of the License at
  8. #
  9. # http://www.apache.org/licenses/LICENSE-2.0
  10. #
  11. # Unless required by applicable law or agreed to in writing, software
  12. # distributed under the License is distributed on an "AS IS" BASIS,
  13. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. # See the License for the specific language governing permissions and
  15. # limitations under the License.
  16. from typing import Optional, Tuple
  17. import synapse.server
  18. from synapse.api.constants import EventTypes
  19. from synapse.api.room_versions import KNOWN_ROOM_VERSIONS
  20. from synapse.events import EventBase
  21. from synapse.events.snapshot import EventContext
  22. from synapse.types import Collection
  23. from tests.test_utils import get_awaitable_result
  24. """
  25. Utility functions for poking events into the storage of the server under test.
  26. """
  27. def inject_member_event(
  28. hs: synapse.server.HomeServer,
  29. room_id: str,
  30. sender: str,
  31. membership: str,
  32. target: Optional[str] = None,
  33. extra_content: Optional[dict] = None,
  34. **kwargs
  35. ) -> EventBase:
  36. """Inject a membership event into a room."""
  37. if target is None:
  38. target = sender
  39. content = {"membership": membership}
  40. if extra_content:
  41. content.update(extra_content)
  42. return inject_event(
  43. hs,
  44. room_id=room_id,
  45. type=EventTypes.Member,
  46. sender=sender,
  47. state_key=target,
  48. content=content,
  49. **kwargs
  50. )
  51. def inject_event(
  52. hs: synapse.server.HomeServer,
  53. room_version: Optional[str] = None,
  54. prev_event_ids: Optional[Collection[str]] = None,
  55. **kwargs
  56. ) -> EventBase:
  57. """Inject a generic event into a room
  58. Args:
  59. hs: the homeserver under test
  60. room_version: the version of the room we're inserting into.
  61. if not specified, will be looked up
  62. prev_event_ids: prev_events for the event. If not specified, will be looked up
  63. kwargs: fields for the event to be created
  64. """
  65. test_reactor = hs.get_reactor()
  66. event, context = create_event(hs, room_version, prev_event_ids, **kwargs)
  67. d = hs.get_storage().persistence.persist_event(event, context)
  68. test_reactor.advance(0)
  69. get_awaitable_result(d)
  70. return event
  71. def create_event(
  72. hs: synapse.server.HomeServer,
  73. room_version: Optional[str] = None,
  74. prev_event_ids: Optional[Collection[str]] = None,
  75. **kwargs
  76. ) -> Tuple[EventBase, EventContext]:
  77. test_reactor = hs.get_reactor()
  78. if room_version is None:
  79. d = hs.get_datastore().get_room_version_id(kwargs["room_id"])
  80. test_reactor.advance(0)
  81. room_version = get_awaitable_result(d)
  82. builder = hs.get_event_builder_factory().for_room_version(
  83. KNOWN_ROOM_VERSIONS[room_version], kwargs
  84. )
  85. d = hs.get_event_creation_handler().create_new_client_event(
  86. builder, prev_event_ids=prev_event_ids
  87. )
  88. test_reactor.advance(0)
  89. event, context = get_awaitable_result(d)
  90. return event, context