mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-10 11:15:01 -04:00
Properly update the threads table when thread events are redacted. (#14248)
When the last event in a thread is redacted we need to update the threads table: * Find the new latest event in the thread and store it into the table; or * Remove the thread from the table if it is no longer a thread (i.e. all events in the thread were redacted).
This commit is contained in:
parent
7fe3b908a5
commit
4dd7aa371b
3 changed files with 131 additions and 45 deletions
|
@ -1523,6 +1523,26 @@ class RelationRedactionTestCase(BaseRelationsTestCase):
|
|||
)
|
||||
self.assertEqual(200, channel.code, channel.json_body)
|
||||
|
||||
def _get_threads(self) -> List[Tuple[str, str]]:
|
||||
"""Request the threads in the room and returns a list of thread ID and latest event ID."""
|
||||
# Request the threads in the room.
|
||||
channel = self.make_request(
|
||||
"GET",
|
||||
f"/_matrix/client/v1/rooms/{self.room}/threads",
|
||||
access_token=self.user_token,
|
||||
)
|
||||
self.assertEquals(200, channel.code, channel.json_body)
|
||||
threads = channel.json_body["chunk"]
|
||||
return [
|
||||
(
|
||||
t["event_id"],
|
||||
t["unsigned"]["m.relations"][RelationTypes.THREAD]["latest_event"][
|
||||
"event_id"
|
||||
],
|
||||
)
|
||||
for t in threads
|
||||
]
|
||||
|
||||
def test_redact_relation_annotation(self) -> None:
|
||||
"""
|
||||
Test that annotations of an event are properly handled after the
|
||||
|
@ -1567,58 +1587,82 @@ class RelationRedactionTestCase(BaseRelationsTestCase):
|
|||
The redacted event should not be included in bundled aggregations or
|
||||
the response to relations.
|
||||
"""
|
||||
channel = self._send_relation(
|
||||
RelationTypes.THREAD,
|
||||
EventTypes.Message,
|
||||
content={"body": "reply 1", "msgtype": "m.text"},
|
||||
)
|
||||
unredacted_event_id = channel.json_body["event_id"]
|
||||
# Create a thread with a few events in it.
|
||||
thread_replies = []
|
||||
for i in range(3):
|
||||
channel = self._send_relation(
|
||||
RelationTypes.THREAD,
|
||||
EventTypes.Message,
|
||||
content={"body": f"reply {i}", "msgtype": "m.text"},
|
||||
)
|
||||
thread_replies.append(channel.json_body["event_id"])
|
||||
|
||||
# Note that the *last* event in the thread is redacted, as that gets
|
||||
# included in the bundled aggregation.
|
||||
channel = self._send_relation(
|
||||
RelationTypes.THREAD,
|
||||
EventTypes.Message,
|
||||
content={"body": "reply 2", "msgtype": "m.text"},
|
||||
)
|
||||
to_redact_event_id = channel.json_body["event_id"]
|
||||
|
||||
# Both relations exist.
|
||||
event_ids = self._get_related_events()
|
||||
##################################################
|
||||
# Check the test data is configured as expected. #
|
||||
##################################################
|
||||
self.assertEquals(self._get_related_events(), list(reversed(thread_replies)))
|
||||
relations = self._get_bundled_aggregations()
|
||||
self.assertEquals(event_ids, [to_redact_event_id, unredacted_event_id])
|
||||
self.assertDictContainsSubset(
|
||||
{
|
||||
"count": 2,
|
||||
"current_user_participated": True,
|
||||
},
|
||||
{"count": 3, "current_user_participated": True},
|
||||
relations[RelationTypes.THREAD],
|
||||
)
|
||||
# And the latest event returned is the event that will be redacted.
|
||||
# The latest event is the last sent event.
|
||||
self.assertEqual(
|
||||
relations[RelationTypes.THREAD]["latest_event"]["event_id"],
|
||||
to_redact_event_id,
|
||||
thread_replies[-1],
|
||||
)
|
||||
|
||||
# Redact one of the reactions.
|
||||
self._redact(to_redact_event_id)
|
||||
# There should be one thread, the latest event is the event that will be redacted.
|
||||
self.assertEqual(self._get_threads(), [(self.parent_id, thread_replies[-1])])
|
||||
|
||||
# The unredacted relation should still exist.
|
||||
event_ids = self._get_related_events()
|
||||
##########################
|
||||
# Redact the last event. #
|
||||
##########################
|
||||
self._redact(thread_replies.pop())
|
||||
|
||||
# The thread should still exist, but the latest event should be updated.
|
||||
self.assertEquals(self._get_related_events(), list(reversed(thread_replies)))
|
||||
relations = self._get_bundled_aggregations()
|
||||
self.assertEquals(event_ids, [unredacted_event_id])
|
||||
self.assertDictContainsSubset(
|
||||
{
|
||||
"count": 1,
|
||||
"current_user_participated": True,
|
||||
},
|
||||
{"count": 2, "current_user_participated": True},
|
||||
relations[RelationTypes.THREAD],
|
||||
)
|
||||
# And the latest event is now the unredacted event.
|
||||
# And the latest event is the last unredacted event.
|
||||
self.assertEqual(
|
||||
relations[RelationTypes.THREAD]["latest_event"]["event_id"],
|
||||
unredacted_event_id,
|
||||
thread_replies[-1],
|
||||
)
|
||||
self.assertEqual(self._get_threads(), [(self.parent_id, thread_replies[-1])])
|
||||
|
||||
###########################################
|
||||
# Redact the *first* event in the thread. #
|
||||
###########################################
|
||||
self._redact(thread_replies.pop(0))
|
||||
|
||||
# Nothing should have changed (except the thread count).
|
||||
self.assertEquals(self._get_related_events(), thread_replies)
|
||||
relations = self._get_bundled_aggregations()
|
||||
self.assertDictContainsSubset(
|
||||
{"count": 1, "current_user_participated": True},
|
||||
relations[RelationTypes.THREAD],
|
||||
)
|
||||
# And the latest event is the last unredacted event.
|
||||
self.assertEqual(
|
||||
relations[RelationTypes.THREAD]["latest_event"]["event_id"],
|
||||
thread_replies[-1],
|
||||
)
|
||||
self.assertEqual(self._get_threads(), [(self.parent_id, thread_replies[-1])])
|
||||
|
||||
####################################
|
||||
# Redact the last remaining event. #
|
||||
####################################
|
||||
self._redact(thread_replies.pop(0))
|
||||
self.assertEquals(thread_replies, [])
|
||||
|
||||
# The event should no longer be considered a thread.
|
||||
self.assertEquals(self._get_related_events(), [])
|
||||
self.assertEquals(self._get_bundled_aggregations(), {})
|
||||
self.assertEqual(self._get_threads(), [])
|
||||
|
||||
def test_redact_parent_edit(self) -> None:
|
||||
"""Test that edits of an event are redacted when the original event
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue