mirror of
https://github.com/element-hq/synapse
synced 2024-07-04 08:43:29 +00:00
Passing current tests
This commit is contained in:
parent
eb159c11cd
commit
ba56350642
|
@ -18,7 +18,6 @@
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
import logging
|
import logging
|
||||||
from collections import defaultdict
|
|
||||||
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, Tuple
|
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, Tuple
|
||||||
|
|
||||||
import attr
|
import attr
|
||||||
|
@ -48,7 +47,9 @@ if TYPE_CHECKING:
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def filter_membership_for_sync(*, membership: str, user_id: str, sender: str) -> bool:
|
def filter_membership_for_sync(
|
||||||
|
*, membership: str, user_id: str, sender: Optional[str]
|
||||||
|
) -> bool:
|
||||||
"""
|
"""
|
||||||
Returns True if the membership event should be included in the sync response,
|
Returns True if the membership event should be included in the sync response,
|
||||||
otherwise False.
|
otherwise False.
|
||||||
|
@ -65,6 +66,11 @@ def filter_membership_for_sync(*, membership: str, user_id: str, sender: str) ->
|
||||||
#
|
#
|
||||||
# This logic includes kicks (leave events where the sender is not the same user) and
|
# This logic includes kicks (leave events where the sender is not the same user) and
|
||||||
# can be read as "anything that isn't a leave or a leave with a different sender".
|
# can be read as "anything that isn't a leave or a leave with a different sender".
|
||||||
|
#
|
||||||
|
# When `sender=None` and `membership=Membership.LEAVE`, it means that a state reset
|
||||||
|
# happened that removed the user from the room, or the user was the last person
|
||||||
|
# locally to leave the room which caused the server to leave the room. In both
|
||||||
|
# cases, TODO
|
||||||
return membership != Membership.LEAVE or sender != user_id
|
return membership != Membership.LEAVE or sender != user_id
|
||||||
|
|
||||||
|
|
||||||
|
@ -99,10 +105,10 @@ class _RoomMembershipForUser:
|
||||||
range
|
range
|
||||||
"""
|
"""
|
||||||
|
|
||||||
event_id: str
|
event_id: Optional[str]
|
||||||
event_pos: PersistedEventPosition
|
event_pos: PersistedEventPosition
|
||||||
membership: str
|
membership: str
|
||||||
sender: str
|
sender: Optional[str]
|
||||||
newly_joined: bool
|
newly_joined: bool
|
||||||
|
|
||||||
def copy_and_replace(self, **kwds: Any) -> "_RoomMembershipForUser":
|
def copy_and_replace(self, **kwds: Any) -> "_RoomMembershipForUser":
|
||||||
|
@ -540,9 +546,11 @@ class SlidingSyncHandler:
|
||||||
first_membership_change_by_room_id_in_from_to_range: Dict[
|
first_membership_change_by_room_id_in_from_to_range: Dict[
|
||||||
str, CurrentStateDeltaMembership
|
str, CurrentStateDeltaMembership
|
||||||
] = {}
|
] = {}
|
||||||
non_join_event_ids_by_room_id_in_from_to_range: Dict[str, List[str]] = (
|
# Keep track if the room has a non-join event in the token range so we can later
|
||||||
defaultdict(list)
|
# tell if it was a `newly_joined` room. If the last membership event in the
|
||||||
)
|
# token range is a join and there is also some non-join in the range, we know
|
||||||
|
# they `newly_joined`.
|
||||||
|
has_non_join_event_by_room_id_in_from_to_range: Dict[str, bool] = {}
|
||||||
for (
|
for (
|
||||||
membership_change
|
membership_change
|
||||||
) in current_state_delta_membership_changes_in_from_to_range:
|
) in current_state_delta_membership_changes_in_from_to_range:
|
||||||
|
@ -551,16 +559,13 @@ class SlidingSyncHandler:
|
||||||
last_membership_change_by_room_id_in_from_to_range[room_id] = (
|
last_membership_change_by_room_id_in_from_to_range[room_id] = (
|
||||||
membership_change
|
membership_change
|
||||||
)
|
)
|
||||||
|
|
||||||
# Only set if we haven't already set it
|
# Only set if we haven't already set it
|
||||||
first_membership_change_by_room_id_in_from_to_range.setdefault(
|
first_membership_change_by_room_id_in_from_to_range.setdefault(
|
||||||
room_id, membership_change
|
room_id, membership_change
|
||||||
)
|
)
|
||||||
|
|
||||||
if membership_change.membership != Membership.JOIN:
|
if membership_change.membership != Membership.JOIN:
|
||||||
non_join_event_ids_by_room_id_in_from_to_range[room_id].append(
|
has_non_join_event_by_room_id_in_from_to_range[room_id] = True
|
||||||
membership_change.event_id
|
|
||||||
)
|
|
||||||
|
|
||||||
# 2) Fixup
|
# 2) Fixup
|
||||||
#
|
#
|
||||||
|
@ -574,6 +579,7 @@ class SlidingSyncHandler:
|
||||||
) in last_membership_change_by_room_id_in_from_to_range.values():
|
) in last_membership_change_by_room_id_in_from_to_range.values():
|
||||||
room_id = last_membership_change_in_from_to_range.room_id
|
room_id = last_membership_change_in_from_to_range.room_id
|
||||||
|
|
||||||
|
# 3)
|
||||||
if last_membership_change_in_from_to_range.membership == Membership.JOIN:
|
if last_membership_change_in_from_to_range.membership == Membership.JOIN:
|
||||||
possibly_newly_joined_room_ids.add(room_id)
|
possibly_newly_joined_room_ids.add(room_id)
|
||||||
|
|
||||||
|
@ -592,10 +598,14 @@ class SlidingSyncHandler:
|
||||||
# 3) Figure out `newly_joined`
|
# 3) Figure out `newly_joined`
|
||||||
prev_event_ids_before_token_range: List[str] = []
|
prev_event_ids_before_token_range: List[str] = []
|
||||||
for possibly_newly_joined_room_id in possibly_newly_joined_room_ids:
|
for possibly_newly_joined_room_id in possibly_newly_joined_room_ids:
|
||||||
non_joins_for_room = non_join_event_ids_by_room_id_in_from_to_range[
|
has_non_join_in_from_to_range = (
|
||||||
possibly_newly_joined_room_id
|
has_non_join_event_by_room_id_in_from_to_range.get(
|
||||||
]
|
possibly_newly_joined_room_id, False
|
||||||
if len(non_joins_for_room) > 0:
|
)
|
||||||
|
)
|
||||||
|
# If the last membership event in the token range is a join and there is
|
||||||
|
# also some non-join in the range, we know they `newly_joined`.
|
||||||
|
if has_non_join_in_from_to_range:
|
||||||
# We found a `newly_joined` room (we left and joined within the token range)
|
# We found a `newly_joined` room (we left and joined within the token range)
|
||||||
filtered_sync_room_id_set[room_id] = filtered_sync_room_id_set[
|
filtered_sync_room_id_set[room_id] = filtered_sync_room_id_set[
|
||||||
room_id
|
room_id
|
||||||
|
@ -968,6 +978,10 @@ class SlidingSyncHandler:
|
||||||
Membership.INVITE,
|
Membership.INVITE,
|
||||||
Membership.KNOCK,
|
Membership.KNOCK,
|
||||||
):
|
):
|
||||||
|
# This should never happen. If someone is invited/knocked on room, then
|
||||||
|
# there should be an event for it.
|
||||||
|
assert rooms_membership_for_user_at_to_token.event_id is not None
|
||||||
|
|
||||||
invite_or_knock_event = await self.store.get_event(
|
invite_or_knock_event = await self.store.get_event(
|
||||||
rooms_membership_for_user_at_to_token.event_id
|
rooms_membership_for_user_at_to_token.event_id
|
||||||
)
|
)
|
||||||
|
|
|
@ -390,7 +390,7 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
|
||||||
|
|
||||||
# Leave during the from_token/to_token range (newly_left)
|
# Leave during the from_token/to_token range (newly_left)
|
||||||
room_id2 = self.helper.create_room_as(user1_id, tok=user1_tok)
|
room_id2 = self.helper.create_room_as(user1_id, tok=user1_tok)
|
||||||
leave_response = self.helper.leave(room_id2, user1_id, tok=user1_tok)
|
_leave_response2 = self.helper.leave(room_id2, user1_id, tok=user1_tok)
|
||||||
|
|
||||||
after_room2_token = self.event_sources.get_current_token()
|
after_room2_token = self.event_sources.get_current_token()
|
||||||
|
|
||||||
|
@ -404,10 +404,13 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
|
||||||
|
|
||||||
# Only the newly_left room should show up
|
# Only the newly_left room should show up
|
||||||
self.assertEqual(room_id_results.keys(), {room_id2})
|
self.assertEqual(room_id_results.keys(), {room_id2})
|
||||||
# It should be pointing to the latest membership event in the from/to range
|
# It should be pointing to the latest membership event in the from/to range but
|
||||||
|
# the `event_id` is `None` because we left the room causing the server to leave
|
||||||
|
# the room because no other local users are in it (quirk of the
|
||||||
|
# `current_state_delta_stream` table that we source things from)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
room_id_results[room_id2].event_id,
|
room_id_results[room_id2].event_id,
|
||||||
leave_response["event_id"],
|
None, # _leave_response2["event_id"],
|
||||||
)
|
)
|
||||||
# We should *NOT* be `newly_joined` because we are instead `newly_left`
|
# We should *NOT* be `newly_joined` because we are instead `newly_left`
|
||||||
self.assertEqual(room_id_results[room_id2].newly_joined, False)
|
self.assertEqual(room_id_results[room_id2].newly_joined, False)
|
||||||
|
|
Loading…
Reference in a new issue