Test that room membership is replicated

This commit is contained in:
Mark Haines 2016-04-06 16:17:15 +01:00
parent e815763b7f
commit 6bfec56796
2 changed files with 67 additions and 11 deletions

View File

@ -71,9 +71,6 @@ class SlavedEventStore(BaseSlavedStore):
get_current_state = DataStore.get_current_state.__func__ get_current_state = DataStore.get_current_state.__func__
get_current_state_for_key = DataStore.get_current_state_for_key.__func__ get_current_state_for_key = DataStore.get_current_state_for_key.__func__
_get_rooms_for_user_where_membership_is_txn = (
DataStore._get_rooms_for_user_where_membership_is_txn.__func__
)
get_rooms_for_user_where_membership_is = ( get_rooms_for_user_where_membership_is = (
DataStore.get_rooms_for_user_where_membership_is.__func__ DataStore.get_rooms_for_user_where_membership_is.__func__
) )
@ -95,6 +92,10 @@ class SlavedEventStore(BaseSlavedStore):
_fetch_events_txn = DataStore._fetch_events_txn.__func__ _fetch_events_txn = DataStore._fetch_events_txn.__func__
_fetch_event_rows = DataStore._fetch_event_rows.__func__ _fetch_event_rows = DataStore._fetch_event_rows.__func__
_get_event_from_row_txn = DataStore._get_event_from_row_txn.__func__ _get_event_from_row_txn = DataStore._get_event_from_row_txn.__func__
_get_rooms_for_user_where_membership_is_txn = (
DataStore._get_rooms_for_user_where_membership_is_txn.__func__
)
_get_members_rows_txn = DataStore._get_members_rows_txn.__func__
def stream_positions(self): def stream_positions(self):
result = super(SlavedEventStore, self).stream_positions() result = super(SlavedEventStore, self).stream_positions()

View File

@ -14,14 +14,14 @@
from ._base import BaseSlavedStoreTestCase from ._base import BaseSlavedStoreTestCase
from synapse.types import UserID
from synapse.events import FrozenEvent from synapse.events import FrozenEvent
from synapse.events.snapshot import EventContext from synapse.events.snapshot import EventContext
from synapse.storage.roommember import RoomsForUser
from twisted.internet import defer from twisted.internet import defer
USER_ID = "@feeling:blue" USER_ID = "@feeling:blue"
USER = UserID.from_string(USER_ID) USER_ID_2 = "@bright:blue"
OUTLIER = {"outlier": True} OUTLIER = {"outlier": True}
ROOM_ID = "!room:blue" ROOM_ID = "!room:blue"
@ -69,16 +69,66 @@ class SlavedEventStoreTestCase(BaseSlavedStoreTestCase):
"get_room_name_and_aliases", (ROOM_ID,), (None, []) "get_room_name_and_aliases", (ROOM_ID,), (None, [])
) )
@defer.inlineCallbacks
def test_room_members(self):
create = yield self.persist(type="m.room.create", key="", creator=USER_ID)
yield self.replicate()
yield self.check("get_rooms_for_user", (USER_ID,), [])
yield self.check("get_users_in_room", (ROOM_ID,), [])
# Join the room.
join = yield self.persist(type="m.room.member", key=USER_ID, membership="join")
yield self.replicate()
yield self.check("get_rooms_for_user", (USER_ID,), [RoomsForUser(
room_id=ROOM_ID,
sender=USER_ID,
membership="join",
event_id=join.event_id,
stream_ordering=join.internal_metadata.stream_ordering,
)])
yield self.check("get_users_in_room", (ROOM_ID,), [USER_ID])
# Leave the room.
yield self.persist(type="m.room.member", key=USER_ID, membership="leave")
yield self.replicate()
yield self.check("get_rooms_for_user", (USER_ID,), [])
yield self.check("get_users_in_room", (ROOM_ID,), [])
# Add some other user to the room.
join = yield self.persist(type="m.room.member", key=USER_ID_2, membership="join")
yield self.replicate()
yield self.check("get_rooms_for_user", (USER_ID_2,), [RoomsForUser(
room_id=ROOM_ID,
sender=USER_ID,
membership="join",
event_id=join.event_id,
stream_ordering=join.internal_metadata.stream_ordering,
)])
yield self.check("get_users_in_room", (ROOM_ID,), [USER_ID_2])
# Join the room clobbering the state.
# This should remove any evidence of the other user being in the room.
yield self.persist(
type="m.room.member", key=USER_ID, membership="join",
reset_state=[create]
)
yield self.replicate()
yield self.check("get_users_in_room", (ROOM_ID,), [USER_ID])
yield self.check("get_rooms_for_user", (USER_ID_2,), [])
event_id = 0 event_id = 0
@defer.inlineCallbacks @defer.inlineCallbacks
def persist( def persist(
self, sender=USER_ID, room_id=ROOM_ID, type={}, key=None, self, sender=USER_ID, room_id=ROOM_ID, type={}, key=None, internal={},
internal={}, state=None, reset_state=False, backfill=False,
state=None, reset_state=False, backfill=False, depth=None, prev_events=[], auth_events=[], prev_state=[],
depth=None, prev_events=[], auth_events=[], prev_state=[], **content
**content
): ):
"""
Returns:
synapse.events.FrozenEvent: The event that was persisted.
"""
if depth is None: if depth is None:
depth = self.event_id depth = self.event_id
@ -103,12 +153,17 @@ class SlavedEventStoreTestCase(BaseSlavedStoreTestCase):
context = EventContext(current_state=state) context = EventContext(current_state=state)
ordering = None
if backfill: if backfill:
yield self.master_store.persist_events( yield self.master_store.persist_events(
[(event, context)], backfilled=True [(event, context)], backfilled=True
) )
else: else:
yield self.master_store.persist_event( ordering, _ = yield self.master_store.persist_event(
event, context, current_state=reset_state event, context, current_state=reset_state
) )
if ordering:
event.internal_metadata.stream_ordering = ordering
defer.returnValue(event) defer.returnValue(event)