Start testing for the correct room membership (failing)

This commit is contained in:
Eric Eastwood 2024-06-25 15:27:43 -05:00
parent 303d834b78
commit 4c22131442

View file

@ -63,6 +63,7 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
self.sliding_sync_handler = self.hs.get_sliding_sync_handler()
self.store = self.hs.get_datastores().main
self.event_sources = hs.get_event_sources()
self.storage_controllers = hs.get_storage_controllers()
def test_no_rooms(self) -> None:
"""
@ -90,10 +91,13 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
"""
user1_id = self.register_user("user1", "pass")
user1_tok = self.login(user1_id, "pass")
user2_id = self.register_user("user2", "pass")
user2_tok = self.login(user2_id, "pass")
before_room_token = self.event_sources.get_current_token()
room_id = self.helper.create_room_as(user1_id, tok=user1_tok, is_public=True)
room_id = self.helper.create_room_as(user2_id, tok=user2_tok)
join_response = self.helper.join(room_id, user1_id, tok=user1_tok)
after_room_token = self.event_sources.get_current_token()
@ -106,6 +110,12 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
)
self.assertEqual(room_id_results.keys(), {room_id})
# It should be pointing to the join event (latest membership event in the
# from/to range)
self.assertEqual(
room_id_results[room_id].event_id,
join_response["event_id"],
)
def test_get_already_joined_room(self) -> None:
"""
@ -113,8 +123,11 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
"""
user1_id = self.register_user("user1", "pass")
user1_tok = self.login(user1_id, "pass")
user2_id = self.register_user("user2", "pass")
user2_tok = self.login(user2_id, "pass")
room_id = self.helper.create_room_as(user1_id, tok=user1_tok, is_public=True)
room_id = self.helper.create_room_as(user2_id, tok=user2_tok)
join_response = self.helper.join(room_id, user1_id, tok=user1_tok)
after_room_token = self.event_sources.get_current_token()
@ -127,6 +140,12 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
)
self.assertEqual(room_id_results.keys(), {room_id})
# It should be pointing to the join event (latest membership event in the
# from/to range)
self.assertEqual(
room_id_results[room_id].event_id,
join_response["event_id"],
)
def test_get_invited_banned_knocked_room(self) -> None:
"""
@ -142,14 +161,18 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
# Setup the invited room (user2 invites user1 to the room)
invited_room_id = self.helper.create_room_as(user2_id, tok=user2_tok)
self.helper.invite(invited_room_id, targ=user1_id, tok=user2_tok)
invite_response = self.helper.invite(
invited_room_id, targ=user1_id, tok=user2_tok
)
# Setup the ban room (user2 bans user1 from the room)
ban_room_id = self.helper.create_room_as(
user2_id, tok=user2_tok, is_public=True
)
self.helper.join(ban_room_id, user1_id, tok=user1_tok)
self.helper.ban(ban_room_id, src=user2_id, targ=user1_id, tok=user2_tok)
ban_response = self.helper.ban(
ban_room_id, src=user2_id, targ=user1_id, tok=user2_tok
)
# Setup the knock room (user1 knocks on the room)
knock_room_id = self.helper.create_room_as(
@ -162,13 +185,19 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
tok=user2_tok,
)
# User1 knocks on the room
channel = self.make_request(
knock_channel = self.make_request(
"POST",
"/_matrix/client/r0/knock/%s" % (knock_room_id,),
b"{}",
user1_tok,
)
self.assertEqual(channel.code, 200, channel.result)
self.assertEqual(knock_channel.code, 200, knock_channel.result)
knock_room_membership_state_event = self.get_success(
self.storage_controllers.state.get_current_state_event(
knock_room_id, EventTypes.Member, user1_id
)
)
assert knock_room_membership_state_event is not None
after_room_token = self.event_sources.get_current_token()
@ -189,6 +218,20 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
knock_room_id,
},
)
# It should be pointing to the the respective membership event (latest
# membership event in the from/to range)
self.assertEqual(
room_id_results[invited_room_id].event_id,
invite_response["event_id"],
)
self.assertEqual(
room_id_results[ban_room_id].event_id,
ban_response["event_id"],
)
self.assertEqual(
room_id_results[knock_room_id].event_id,
knock_room_membership_state_event.event_id,
)
def test_get_kicked_room(self) -> None:
"""
@ -206,7 +249,7 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
)
self.helper.join(kick_room_id, user1_id, tok=user1_tok)
# Kick user1 from the room
self.helper.change_membership(
kick_response = self.helper.change_membership(
room=kick_room_id,
src=user2_id,
targ=user1_id,
@ -229,6 +272,11 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
# The kicked room should show up
self.assertEqual(room_id_results.keys(), {kick_room_id})
# It should be pointing to the latest membership event in the from/to range
self.assertEqual(
room_id_results[kick_room_id].event_id,
kick_response["event_id"],
)
def test_forgotten_rooms(self) -> None:
"""
@ -329,7 +377,7 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
# Leave during the from_token/to_token range (newly_left)
room_id2 = self.helper.create_room_as(user1_id, tok=user1_tok)
self.helper.leave(room_id2, user1_id, tok=user1_tok)
leave_response = self.helper.leave(room_id2, user1_id, tok=user1_tok)
after_room2_token = self.event_sources.get_current_token()
@ -343,6 +391,11 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
# Only the newly_left room should show up
self.assertEqual(room_id_results.keys(), {room_id2})
# It should be pointing to the latest membership event in the from/to range
self.assertEqual(
room_id_results[room_id2].event_id,
leave_response["event_id"],
)
def test_no_joins_after_to_token(self) -> None:
"""
@ -351,16 +404,19 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
"""
user1_id = self.register_user("user1", "pass")
user1_tok = self.login(user1_id, "pass")
user2_id = self.register_user("user2", "pass")
user2_tok = self.login(user2_id, "pass")
before_room1_token = self.event_sources.get_current_token()
room_id1 = self.helper.create_room_as(user1_id, tok=user1_tok)
room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
join_response1 = self.helper.join(room_id1, user1_id, tok=user1_tok)
after_room1_token = self.event_sources.get_current_token()
# Room join after after our `to_token` shouldn't show up
room_id2 = self.helper.create_room_as(user1_id, tok=user1_tok)
_ = room_id2
# Room join after our `to_token` shouldn't show up
room_id2 = self.helper.create_room_as(user2_id, tok=user2_tok)
self.helper.join(room_id2, user1_id, tok=user1_tok)
room_id_results = self.get_success(
self.sliding_sync_handler.get_sync_room_ids_for_user(
@ -371,6 +427,11 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
)
self.assertEqual(room_id_results.keys(), {room_id1})
# It should be pointing to the latest membership event in the from/to range
self.assertEqual(
room_id_results[room_id1].event_id,
join_response1["event_id"],
)
def test_join_during_range_and_left_room_after_to_token(self) -> None:
"""
@ -380,15 +441,18 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
"""
user1_id = self.register_user("user1", "pass")
user1_tok = self.login(user1_id, "pass")
user2_id = self.register_user("user2", "pass")
user2_tok = self.login(user2_id, "pass")
before_room1_token = self.event_sources.get_current_token()
room_id1 = self.helper.create_room_as(user1_id, tok=user1_tok)
room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
join_response = self.helper.join(room_id1, user1_id, tok=user1_tok)
after_room1_token = self.event_sources.get_current_token()
# Leave the room after we already have our tokens
self.helper.leave(room_id1, user1_id, tok=user1_tok)
leave_response = self.helper.leave(room_id1, user1_id, tok=user1_tok)
room_id_results = self.get_success(
self.sliding_sync_handler.get_sync_room_ids_for_user(
@ -401,6 +465,18 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
# We should still see the room because we were joined during the
# from_token/to_token time period.
self.assertEqual(room_id_results.keys(), {room_id1})
# It should be pointing to the latest membership event in the from/to range
self.assertEqual(
room_id_results[room_id1].event_id,
join_response["event_id"],
"Corresponding map to disambiguate the opaque event IDs: "
+ str(
{
"join_response": join_response["event_id"],
"leave_response": leave_response["event_id"],
}
),
)
def test_join_before_range_and_left_room_after_to_token(self) -> None:
"""
@ -410,13 +486,16 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
"""
user1_id = self.register_user("user1", "pass")
user1_tok = self.login(user1_id, "pass")
user2_id = self.register_user("user2", "pass")
user2_tok = self.login(user2_id, "pass")
room_id1 = self.helper.create_room_as(user1_id, tok=user1_tok)
room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok)
join_response = self.helper.join(room_id1, user1_id, tok=user1_tok)
after_room1_token = self.event_sources.get_current_token()
# Leave the room after we already have our tokens
self.helper.leave(room_id1, user1_id, tok=user1_tok)
leave_response = self.helper.leave(room_id1, user1_id, tok=user1_tok)
room_id_results = self.get_success(
self.sliding_sync_handler.get_sync_room_ids_for_user(
@ -428,6 +507,18 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
# We should still see the room because we were joined before the `from_token`
self.assertEqual(room_id_results.keys(), {room_id1})
# It should be pointing to the latest membership event in the from/to range
self.assertEqual(
room_id_results[room_id1].event_id,
join_response["event_id"],
"Corresponding map to disambiguate the opaque event IDs: "
+ str(
{
"join_response": join_response["event_id"],
"leave_response": leave_response["event_id"],
}
),
)
def test_kicked_before_range_and_left_after_to_token(self) -> None:
"""
@ -444,9 +535,9 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
kick_room_id = self.helper.create_room_as(
user2_id, tok=user2_tok, is_public=True
)
self.helper.join(kick_room_id, user1_id, tok=user1_tok)
join_response1 = self.helper.join(kick_room_id, user1_id, tok=user1_tok)
# Kick user1 from the room
self.helper.change_membership(
kick_response = self.helper.change_membership(
room=kick_room_id,
src=user2_id,
targ=user1_id,
@ -463,8 +554,8 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
#
# We have to join before we can leave (leave -> leave isn't a valid transition
# or at least it doesn't work in Synapse, 403 forbidden)
self.helper.join(kick_room_id, user1_id, tok=user1_tok)
self.helper.leave(kick_room_id, user1_id, tok=user1_tok)
join_response2 = self.helper.join(kick_room_id, user1_id, tok=user1_tok)
leave_response = self.helper.leave(kick_room_id, user1_id, tok=user1_tok)
room_id_results = self.get_success(
self.sliding_sync_handler.get_sync_room_ids_for_user(
@ -476,6 +567,20 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
# We shouldn't see the room because it was forgotten
self.assertEqual(room_id_results.keys(), {kick_room_id})
# It should be pointing to the latest membership event in the from/to range
self.assertEqual(
room_id_results[kick_room_id].event_id,
kick_response["event_id"],
"Corresponding map to disambiguate the opaque event IDs: "
+ str(
{
"join_response1": join_response1["event_id"],
"kick_response": kick_response["event_id"],
"join_response2": join_response2["event_id"],
"leave_response": leave_response["event_id"],
}
),
)
def test_newly_left_during_range_and_join_leave_after_to_token(self) -> None:
"""
@ -494,14 +599,14 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
# leave and can still re-join.
room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok, is_public=True)
# Join and leave the room during the from/to range
self.helper.join(room_id1, user1_id, tok=user1_tok)
self.helper.leave(room_id1, user1_id, tok=user1_tok)
join_response1 = self.helper.join(room_id1, user1_id, tok=user1_tok)
leave_response1 = self.helper.leave(room_id1, user1_id, tok=user1_tok)
after_room1_token = self.event_sources.get_current_token()
# Join and leave the room after we already have our tokens
self.helper.join(room_id1, user1_id, tok=user1_tok)
self.helper.leave(room_id1, user1_id, tok=user1_tok)
join_response2 = self.helper.join(room_id1, user1_id, tok=user1_tok)
leave_response2 = self.helper.leave(room_id1, user1_id, tok=user1_tok)
room_id_results = self.get_success(
self.sliding_sync_handler.get_sync_room_ids_for_user(
@ -513,6 +618,20 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
# Room should still show up because it's newly_left during the from/to range
self.assertEqual(room_id_results.keys(), {room_id1})
# It should be pointing to the latest membership event in the from/to range
self.assertEqual(
room_id_results[room_id1].event_id,
leave_response1["event_id"],
"Corresponding map to disambiguate the opaque event IDs: "
+ str(
{
"join_response1": join_response1["event_id"],
"leave_response1": leave_response1["event_id"],
"join_response2": join_response2["event_id"],
"leave_response2": leave_response2["event_id"],
}
),
)
def test_newly_left_during_range_and_join_after_to_token(self) -> None:
"""
@ -531,13 +650,13 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
# leave and can still re-join.
room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok, is_public=True)
# Join and leave the room during the from/to range
self.helper.join(room_id1, user1_id, tok=user1_tok)
self.helper.leave(room_id1, user1_id, tok=user1_tok)
join_response1 = self.helper.join(room_id1, user1_id, tok=user1_tok)
leave_response1 = self.helper.leave(room_id1, user1_id, tok=user1_tok)
after_room1_token = self.event_sources.get_current_token()
# Join the room after we already have our tokens
self.helper.join(room_id1, user1_id, tok=user1_tok)
join_response2 = self.helper.join(room_id1, user1_id, tok=user1_tok)
room_id_results = self.get_success(
self.sliding_sync_handler.get_sync_room_ids_for_user(
@ -549,11 +668,24 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
# Room should still show up because it's newly_left during the from/to range
self.assertEqual(room_id_results.keys(), {room_id1})
# It should be pointing to the latest membership event in the from/to range
self.assertEqual(
room_id_results[room_id1].event_id,
leave_response1["event_id"],
"Corresponding map to disambiguate the opaque event IDs: "
+ str(
{
"join_response1": join_response1["event_id"],
"leave_response1": leave_response1["event_id"],
"join_response2": join_response2["event_id"],
}
),
)
def test_no_from_token(self) -> None:
"""
Test that if we don't provide a `from_token`, we get all the rooms that we we're
joined to up to the `to_token`.
joined up to the `to_token`.
Providing `from_token` only really has the effect that it adds `newly_left`
rooms to the response.
@ -569,7 +701,7 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
room_id2 = self.helper.create_room_as(user2_id, tok=user2_tok, is_public=True)
# Join room1
self.helper.join(room_id1, user1_id, tok=user1_tok)
join_response1 = self.helper.join(room_id1, user1_id, tok=user1_tok)
# Join and leave the room2 before the `to_token`
self.helper.join(room_id2, user1_id, tok=user1_tok)
@ -590,6 +722,11 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
# Only rooms we were joined to before the `to_token` should show up
self.assertEqual(room_id_results.keys(), {room_id1})
# It should be pointing to the latest membership event in the from/to range
self.assertEqual(
room_id_results[room_id1].event_id,
join_response1["event_id"],
)
def test_from_token_ahead_of_to_token(self) -> None:
"""
@ -609,7 +746,7 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
room_id4 = self.helper.create_room_as(user2_id, tok=user2_tok, is_public=True)
# Join room1 before `before_room_token`
self.helper.join(room_id1, user1_id, tok=user1_tok)
join_response1 = self.helper.join(room_id1, user1_id, tok=user1_tok)
# Join and leave the room2 before `before_room_token`
self.helper.join(room_id2, user1_id, tok=user1_tok)
@ -651,6 +788,11 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
# There won't be any newly_left rooms because the `from_token` is ahead of the
# `to_token` and that range will give no membership changes to check.
self.assertEqual(room_id_results.keys(), {room_id1})
# It should be pointing to the latest membership event in the from/to range
self.assertEqual(
room_id_results[room_id1].event_id,
join_response1["event_id"],
)
def test_leave_before_range_and_join_leave_after_to_token(self) -> None:
"""
@ -741,16 +883,16 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
# leave and can still re-join.
room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok, is_public=True)
# Join, leave, join back to the room before the from/to range
self.helper.join(room_id1, user1_id, tok=user1_tok)
self.helper.leave(room_id1, user1_id, tok=user1_tok)
self.helper.join(room_id1, user1_id, tok=user1_tok)
join_response1 = self.helper.join(room_id1, user1_id, tok=user1_tok)
leave_response1 = self.helper.leave(room_id1, user1_id, tok=user1_tok)
join_response2 = self.helper.join(room_id1, user1_id, tok=user1_tok)
after_room1_token = self.event_sources.get_current_token()
# Leave and Join the room multiple times after we already have our tokens
self.helper.leave(room_id1, user1_id, tok=user1_tok)
self.helper.join(room_id1, user1_id, tok=user1_tok)
self.helper.leave(room_id1, user1_id, tok=user1_tok)
leave_response2 = self.helper.leave(room_id1, user1_id, tok=user1_tok)
join_response3 = self.helper.join(room_id1, user1_id, tok=user1_tok)
leave_response3 = self.helper.leave(room_id1, user1_id, tok=user1_tok)
room_id_results = self.get_success(
self.sliding_sync_handler.get_sync_room_ids_for_user(
@ -762,6 +904,22 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
# Room should show up because it was newly_left and joined during the from/to range
self.assertEqual(room_id_results.keys(), {room_id1})
# It should be pointing to the latest membership event in the from/to range
self.assertEqual(
room_id_results[room_id1].event_id,
join_response2["event_id"],
"Corresponding map to disambiguate the opaque event IDs: "
+ str(
{
"join_response1": join_response1["event_id"],
"leave_response1": leave_response1["event_id"],
"join_response2": join_response2["event_id"],
"leave_response2": leave_response2["event_id"],
"join_response3": join_response3["event_id"],
"leave_response3": leave_response3["event_id"],
}
),
)
def test_join_leave_multiple_times_before_range_and_after_to_token(
self,
@ -781,16 +939,16 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
# leave and can still re-join.
room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok, is_public=True)
# Join, leave, join back to the room before the from/to range
self.helper.join(room_id1, user1_id, tok=user1_tok)
self.helper.leave(room_id1, user1_id, tok=user1_tok)
self.helper.join(room_id1, user1_id, tok=user1_tok)
join_response1 = self.helper.join(room_id1, user1_id, tok=user1_tok)
leave_response1 = self.helper.leave(room_id1, user1_id, tok=user1_tok)
join_response2 = self.helper.join(room_id1, user1_id, tok=user1_tok)
after_room1_token = self.event_sources.get_current_token()
# Leave and Join the room multiple times after we already have our tokens
self.helper.leave(room_id1, user1_id, tok=user1_tok)
self.helper.join(room_id1, user1_id, tok=user1_tok)
self.helper.leave(room_id1, user1_id, tok=user1_tok)
leave_response2 = self.helper.leave(room_id1, user1_id, tok=user1_tok)
join_response3 = self.helper.join(room_id1, user1_id, tok=user1_tok)
leave_response3 = self.helper.leave(room_id1, user1_id, tok=user1_tok)
room_id_results = self.get_success(
self.sliding_sync_handler.get_sync_room_ids_for_user(
@ -802,6 +960,22 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
# Room should show up because we were joined before the from/to range
self.assertEqual(room_id_results.keys(), {room_id1})
# It should be pointing to the latest membership event in the from/to range
self.assertEqual(
room_id_results[room_id1].event_id,
join_response2["event_id"],
"Corresponding map to disambiguate the opaque event IDs: "
+ str(
{
"join_response1": join_response1["event_id"],
"leave_response1": leave_response1["event_id"],
"join_response2": join_response2["event_id"],
"leave_response2": leave_response2["event_id"],
"join_response3": join_response3["event_id"],
"leave_response3": leave_response3["event_id"],
}
),
)
def test_invite_before_range_and_join_leave_after_to_token(
self,
@ -821,13 +995,15 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok, is_public=True)
# Invited to the room before the token
self.helper.invite(room_id1, src=user2_id, targ=user1_id, tok=user2_tok)
invite_response = self.helper.invite(
room_id1, src=user2_id, targ=user1_id, tok=user2_tok
)
after_room1_token = self.event_sources.get_current_token()
# Join and leave the room after we already have our tokens
self.helper.join(room_id1, user1_id, tok=user1_tok)
self.helper.leave(room_id1, user1_id, tok=user1_tok)
join_respsonse = self.helper.join(room_id1, user1_id, tok=user1_tok)
leave_response = self.helper.leave(room_id1, user1_id, tok=user1_tok)
room_id_results = self.get_success(
self.sliding_sync_handler.get_sync_room_ids_for_user(
@ -839,6 +1015,217 @@ class GetSyncRoomIdsForUserTestCase(HomeserverTestCase):
# Room should show up because we were invited before the from/to range
self.assertEqual(room_id_results.keys(), {room_id1})
# It should be pointing to the latest membership event in the from/to range
self.assertEqual(
room_id_results[room_id1].event_id,
invite_response["event_id"],
"Corresponding map to disambiguate the opaque event IDs: "
+ str(
{
"invite_response": invite_response["event_id"],
"join_respsonse": join_respsonse["event_id"],
"leave_response": leave_response["event_id"],
}
),
)
def test_display_name_changes(
self,
) -> None:
"""
Test that we point to the correct membership event within the from/to range even
if there are multiple `join` membership events in a row indicating
`displayname`/`avatar_url` updates.
"""
user1_id = self.register_user("user1", "pass")
user1_tok = self.login(user1_id, "pass")
user2_id = self.register_user("user2", "pass")
user2_tok = self.login(user2_id, "pass")
before_room1_token = self.event_sources.get_current_token()
# We create the room with user2 so the room isn't left with no members when we
# leave and can still re-join.
room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok, is_public=True)
join_response = self.helper.join(room_id1, user1_id, tok=user1_tok)
# Update the displayname during the token range
displayname_change_during_token_range_response = self.helper.send_state(
room_id1,
event_type=EventTypes.Member,
state_key=user1_id,
body={
"membership": Membership.JOIN,
"displayname": "displayname during token range",
},
tok=user1_tok,
)
after_room1_token = self.event_sources.get_current_token()
# Update the displayname after the token range
displayname_change_after_token_range_response = self.helper.send_state(
room_id1,
event_type=EventTypes.Member,
state_key=user1_id,
body={
"membership": Membership.JOIN,
"displayname": "displayname after token range",
},
tok=user1_tok,
)
room_id_results = self.get_success(
self.sliding_sync_handler.get_sync_room_ids_for_user(
UserID.from_string(user1_id),
from_token=before_room1_token,
to_token=after_room1_token,
)
)
# Room should show up because we were joined during the from/to range
self.assertEqual(room_id_results.keys(), {room_id1})
# It should be pointing to the latest membership event in the from/to range
self.assertEqual(
room_id_results[room_id1].event_id,
displayname_change_during_token_range_response["event_id"],
"Corresponding map to disambiguate the opaque event IDs: "
+ str(
{
"join_response": join_response["event_id"],
"displayname_change_during_token_range_response": displayname_change_during_token_range_response[
"event_id"
],
"displayname_change_after_token_range_response": displayname_change_after_token_range_response[
"event_id"
],
}
),
)
def test_display_name_changes_leave_after_token_range(
self,
) -> None:
"""
Test that we point to the correct membership event within the from/to range even
if there are multiple `join` membership events in a row indicating
`displayname`/`avatar_url` updates and we leave after the `to_token`.
See condition "1a)" comments in the `get_sync_room_ids_for_user()` method.
"""
user1_id = self.register_user("user1", "pass")
user1_tok = self.login(user1_id, "pass")
user2_id = self.register_user("user2", "pass")
user2_tok = self.login(user2_id, "pass")
before_room1_token = self.event_sources.get_current_token()
# We create the room with user2 so the room isn't left with no members when we
# leave and can still re-join.
room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok, is_public=True)
join_response = self.helper.join(room_id1, user1_id, tok=user1_tok)
# Update the displayname during the token range
displayname_change_during_token_range_response = self.helper.send_state(
room_id1,
event_type=EventTypes.Member,
state_key=user1_id,
body={
"membership": Membership.JOIN,
"displayname": "displayname during token range",
},
tok=user1_tok,
)
after_room1_token = self.event_sources.get_current_token()
# Update the displayname after the token range
displayname_change_after_token_range_response = self.helper.send_state(
room_id1,
event_type=EventTypes.Member,
state_key=user1_id,
body={
"membership": Membership.JOIN,
"displayname": "displayname after token range",
},
tok=user1_tok,
)
# Leave after the token
self.helper.leave(room_id1, user1_id, tok=user1_tok)
room_id_results = self.get_success(
self.sliding_sync_handler.get_sync_room_ids_for_user(
UserID.from_string(user1_id),
from_token=before_room1_token,
to_token=after_room1_token,
)
)
# Room should show up because we were joined during the from/to range
self.assertEqual(room_id_results.keys(), {room_id1})
# It should be pointing to the latest membership event in the from/to range
self.assertEqual(
room_id_results[room_id1].event_id,
displayname_change_during_token_range_response["event_id"],
"Corresponding map to disambiguate the opaque event IDs: "
+ str(
{
"join_response": join_response["event_id"],
"displayname_change_during_token_range_response": displayname_change_during_token_range_response[
"event_id"
],
"displayname_change_after_token_range_response": displayname_change_after_token_range_response[
"event_id"
],
}
),
)
def test_display_name_changes_join_after_token_range(
self,
) -> None:
"""
Test that multiple `join` membership events (after the `to_token`) in a row
indicating `displayname`/`avatar_url` updates doesn't affect the results (we
joined after the token range so it shouldn't show up)
See condition "1b)" comments in the `get_sync_room_ids_for_user()` method.
"""
user1_id = self.register_user("user1", "pass")
user1_tok = self.login(user1_id, "pass")
user2_id = self.register_user("user2", "pass")
user2_tok = self.login(user2_id, "pass")
before_room1_token = self.event_sources.get_current_token()
# We create the room with user2 so the room isn't left with no members when we
# leave and can still re-join.
room_id1 = self.helper.create_room_as(user2_id, tok=user2_tok, is_public=True)
after_room1_token = self.event_sources.get_current_token()
self.helper.join(room_id1, user1_id, tok=user1_tok)
# Update the displayname after the token range
self.helper.send_state(
room_id1,
event_type=EventTypes.Member,
state_key=user1_id,
body={
"membership": Membership.JOIN,
"displayname": "displayname after token range",
},
tok=user1_tok,
)
room_id_results = self.get_success(
self.sliding_sync_handler.get_sync_room_ids_for_user(
UserID.from_string(user1_id),
from_token=before_room1_token,
to_token=after_room1_token,
)
)
# Room shouldn't show up because we joined after the from/to range
self.assertEqual(room_id_results.keys(), set())
def test_multiple_rooms_are_not_confused(
self,