Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Add a linearizer on (appservice, stream) when handling ephemeral events. #11207

Merged
33 changes: 33 additions & 0 deletions tests/handlers/test_appservice.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def setUp(self):
hs.get_application_service_scheduler.return_value = self.mock_scheduler
hs.get_clock.return_value = MockClock()
self.handler = ApplicationServicesHandler(hs)
self.event_source = hs.get_event_sources()

def test_notify_interested_services(self):
interested_service = self._mkservice(is_interested=True)
Expand Down Expand Up @@ -252,6 +253,38 @@ async def get_3pe_protocol(service, unusedProtocol):
},
)

def test_notify_interested_services_ephemeral(self):
anoadragon453 marked this conversation as resolved.
Show resolved Hide resolved
interested_service = self._mkservice(is_interested=True)
services = [interested_service]

self.mock_store.get_app_services.return_value = services
self.mock_store.get_type_stream_id_for_appservice.return_value = make_awaitable(579)

event = Mock(event_id="event_1")
self.event_source.sources.receipt.get_new_events_as.return_value = make_awaitable(([event], None))

self.handler.notify_interested_services_ephemeral("receipt_key", 580)
self.mock_scheduler.submit_ephemeral_events_for_as.assert_called_once_with(
interested_service, [event]
)
self.mock_store.set_type_stream_id_for_appservice.assert_called_once_with(
interested_service, "read_receipt", 580,
)

def test_notify_interested_services_ephemeral_out_of_order(self):
interested_service = self._mkservice(is_interested=True)
services = [interested_service]

self.mock_store.get_app_services.return_value = services
self.mock_store.get_type_stream_id_for_appservice.return_value = make_awaitable(580)

event = Mock(event_id="event_1")
self.event_source.sources.receipt.get_new_events_as.return_value = make_awaitable(([event], None))

self.handler.notify_interested_services_ephemeral("receipt_key", 579)
self.mock_scheduler.submit_ephemeral_events_for_as.assert_not_called()
self.mock_store.set_type_stream_id_for_appservice.assert_not_called()

def _mkservice(self, is_interested, protocols=None):
service = Mock()
service.is_interested.return_value = make_awaitable(is_interested)
Expand Down