mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-09 23:24:57 -04:00
Support stable identifiers for MSC2285: private read receipts. (#13273)
This adds support for the stable identifiers of MSC2285 while continuing to support the unstable identifiers behind the configuration flag. These will be removed in a future version.
This commit is contained in:
parent
e2ed1b7155
commit
ab18441573
14 changed files with 246 additions and 94 deletions
|
@ -38,7 +38,6 @@ from tests.federation.transport.test_knocking import (
|
|||
KnockingStrippedStateEventHelperMixin,
|
||||
)
|
||||
from tests.server import TimedOutException
|
||||
from tests.unittest import override_config
|
||||
|
||||
|
||||
class FilterTestCase(unittest.HomeserverTestCase):
|
||||
|
@ -390,6 +389,12 @@ class ReadReceiptsTestCase(unittest.HomeserverTestCase):
|
|||
sync.register_servlets,
|
||||
]
|
||||
|
||||
def make_homeserver(self, reactor: MemoryReactor, clock: Clock) -> HomeServer:
|
||||
config = self.default_config()
|
||||
config["experimental_features"] = {"msc2285_enabled": True}
|
||||
|
||||
return self.setup_test_homeserver(config=config)
|
||||
|
||||
def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
|
||||
self.url = "/sync?since=%s"
|
||||
self.next_batch = "s0"
|
||||
|
@ -408,15 +413,17 @@ class ReadReceiptsTestCase(unittest.HomeserverTestCase):
|
|||
# Join the second user
|
||||
self.helper.join(room=self.room_id, user=self.user2, tok=self.tok2)
|
||||
|
||||
@override_config({"experimental_features": {"msc2285_enabled": True}})
|
||||
def test_private_read_receipts(self) -> None:
|
||||
@parameterized.expand(
|
||||
[ReceiptTypes.READ_PRIVATE, ReceiptTypes.UNSTABLE_READ_PRIVATE]
|
||||
)
|
||||
def test_private_read_receipts(self, receipt_type: str) -> None:
|
||||
# Send a message as the first user
|
||||
res = self.helper.send(self.room_id, body="hello", tok=self.tok)
|
||||
|
||||
# Send a private read receipt to tell the server the first user's message was read
|
||||
channel = self.make_request(
|
||||
"POST",
|
||||
f"/rooms/{self.room_id}/receipt/org.matrix.msc2285.read.private/{res['event_id']}",
|
||||
f"/rooms/{self.room_id}/receipt/{receipt_type}/{res['event_id']}",
|
||||
{},
|
||||
access_token=self.tok2,
|
||||
)
|
||||
|
@ -425,8 +432,10 @@ class ReadReceiptsTestCase(unittest.HomeserverTestCase):
|
|||
# Test that the first user can't see the other user's private read receipt
|
||||
self.assertIsNone(self._get_read_receipt())
|
||||
|
||||
@override_config({"experimental_features": {"msc2285_enabled": True}})
|
||||
def test_public_receipt_can_override_private(self) -> None:
|
||||
@parameterized.expand(
|
||||
[ReceiptTypes.READ_PRIVATE, ReceiptTypes.UNSTABLE_READ_PRIVATE]
|
||||
)
|
||||
def test_public_receipt_can_override_private(self, receipt_type: str) -> None:
|
||||
"""
|
||||
Sending a public read receipt to the same event which has a private read
|
||||
receipt should cause that receipt to become public.
|
||||
|
@ -437,7 +446,7 @@ class ReadReceiptsTestCase(unittest.HomeserverTestCase):
|
|||
# Send a private read receipt
|
||||
channel = self.make_request(
|
||||
"POST",
|
||||
f"/rooms/{self.room_id}/receipt/{ReceiptTypes.READ_PRIVATE}/{res['event_id']}",
|
||||
f"/rooms/{self.room_id}/receipt/{receipt_type}/{res['event_id']}",
|
||||
{},
|
||||
access_token=self.tok2,
|
||||
)
|
||||
|
@ -456,8 +465,10 @@ class ReadReceiptsTestCase(unittest.HomeserverTestCase):
|
|||
# Test that we did override the private read receipt
|
||||
self.assertNotEqual(self._get_read_receipt(), None)
|
||||
|
||||
@override_config({"experimental_features": {"msc2285_enabled": True}})
|
||||
def test_private_receipt_cannot_override_public(self) -> None:
|
||||
@parameterized.expand(
|
||||
[ReceiptTypes.READ_PRIVATE, ReceiptTypes.UNSTABLE_READ_PRIVATE]
|
||||
)
|
||||
def test_private_receipt_cannot_override_public(self, receipt_type: str) -> None:
|
||||
"""
|
||||
Sending a private read receipt to the same event which has a public read
|
||||
receipt should cause no change.
|
||||
|
@ -478,7 +489,7 @@ class ReadReceiptsTestCase(unittest.HomeserverTestCase):
|
|||
# Send a private read receipt
|
||||
channel = self.make_request(
|
||||
"POST",
|
||||
f"/rooms/{self.room_id}/receipt/{ReceiptTypes.READ_PRIVATE}/{res['event_id']}",
|
||||
f"/rooms/{self.room_id}/receipt/{receipt_type}/{res['event_id']}",
|
||||
{},
|
||||
access_token=self.tok2,
|
||||
)
|
||||
|
@ -590,7 +601,10 @@ class UnreadMessagesTestCase(unittest.HomeserverTestCase):
|
|||
tok=self.tok,
|
||||
)
|
||||
|
||||
def test_unread_counts(self) -> None:
|
||||
@parameterized.expand(
|
||||
[ReceiptTypes.READ_PRIVATE, ReceiptTypes.UNSTABLE_READ_PRIVATE]
|
||||
)
|
||||
def test_unread_counts(self, receipt_type: str) -> None:
|
||||
"""Tests that /sync returns the right value for the unread count (MSC2654)."""
|
||||
|
||||
# Check that our own messages don't increase the unread count.
|
||||
|
@ -624,7 +638,7 @@ class UnreadMessagesTestCase(unittest.HomeserverTestCase):
|
|||
# Send a read receipt to tell the server we've read the latest event.
|
||||
channel = self.make_request(
|
||||
"POST",
|
||||
f"/rooms/{self.room_id}/receipt/org.matrix.msc2285.read.private/{res['event_id']}",
|
||||
f"/rooms/{self.room_id}/receipt/{receipt_type}/{res['event_id']}",
|
||||
{},
|
||||
access_token=self.tok,
|
||||
)
|
||||
|
@ -700,7 +714,7 @@ class UnreadMessagesTestCase(unittest.HomeserverTestCase):
|
|||
self._check_unread_count(5)
|
||||
res2 = self.helper.send(self.room_id, "hello", tok=self.tok2)
|
||||
|
||||
# Make sure both m.read and org.matrix.msc2285.read.private advance
|
||||
# Make sure both m.read and m.read.private advance
|
||||
channel = self.make_request(
|
||||
"POST",
|
||||
f"/rooms/{self.room_id}/receipt/m.read/{res1['event_id']}",
|
||||
|
@ -712,16 +726,22 @@ class UnreadMessagesTestCase(unittest.HomeserverTestCase):
|
|||
|
||||
channel = self.make_request(
|
||||
"POST",
|
||||
f"/rooms/{self.room_id}/receipt/org.matrix.msc2285.read.private/{res2['event_id']}",
|
||||
f"/rooms/{self.room_id}/receipt/{receipt_type}/{res2['event_id']}",
|
||||
{},
|
||||
access_token=self.tok,
|
||||
)
|
||||
self.assertEqual(channel.code, 200, channel.json_body)
|
||||
self._check_unread_count(0)
|
||||
|
||||
# We test for both receipt types that influence notification counts
|
||||
@parameterized.expand([ReceiptTypes.READ, ReceiptTypes.READ_PRIVATE])
|
||||
def test_read_receipts_only_go_down(self, receipt_type: ReceiptTypes) -> None:
|
||||
# We test for all three receipt types that influence notification counts
|
||||
@parameterized.expand(
|
||||
[
|
||||
ReceiptTypes.READ,
|
||||
ReceiptTypes.READ_PRIVATE,
|
||||
ReceiptTypes.UNSTABLE_READ_PRIVATE,
|
||||
]
|
||||
)
|
||||
def test_read_receipts_only_go_down(self, receipt_type: str) -> None:
|
||||
# Join the new user
|
||||
self.helper.join(room=self.room_id, user=self.user2, tok=self.tok2)
|
||||
|
||||
|
@ -739,11 +759,11 @@ class UnreadMessagesTestCase(unittest.HomeserverTestCase):
|
|||
self.assertEqual(channel.code, 200, channel.json_body)
|
||||
self._check_unread_count(0)
|
||||
|
||||
# Make sure neither m.read nor org.matrix.msc2285.read.private make the
|
||||
# Make sure neither m.read nor m.read.private make the
|
||||
# read receipt go up to an older event
|
||||
channel = self.make_request(
|
||||
"POST",
|
||||
f"/rooms/{self.room_id}/receipt/org.matrix.msc2285.read.private/{res1['event_id']}",
|
||||
f"/rooms/{self.room_id}/receipt/{receipt_type}/{res1['event_id']}",
|
||||
{},
|
||||
access_token=self.tok,
|
||||
)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue