class AppServiceHandlerTestCase(unittest.TestCase): """ Tests the ApplicationServicesHandler. """ def setUp(self): self.mock_store = Mock() self.mock_as_api = Mock() hs = Mock() hs.get_datastore = Mock(return_value=self.mock_store) self.handler = ApplicationServicesHandler(hs, self.mock_as_api) @defer.inlineCallbacks def test_notify_interested_services(self): interested_service = self._mkservice(is_interested=True) services = [ self._mkservice(is_interested=False), interested_service, self._mkservice(is_interested=False) ] self.mock_store.get_app_services = Mock(return_value=services) self.mock_store.get_user_by_id = Mock(return_value=[]) event = Mock(sender="@someone:anywhere", type="m.room.message", room_id="!foo:bar") self.mock_as_api.push = Mock() yield self.handler.notify_interested_services(event) self.mock_as_api.push.assert_called_once_with(interested_service, event) @defer.inlineCallbacks def test_query_room_alias_exists(self): room_alias_str = "#foo:bar" room_alias = Mock() room_alias.to_string = Mock(return_value=room_alias_str) room_id = "!alpha:bet" servers = ["aperture"] interested_service = self._mkservice(is_interested=True) services = [ self._mkservice(is_interested=False), interested_service, self._mkservice(is_interested=False) ] self.mock_store.get_app_services = Mock(return_value=services) self.mock_store.get_association_from_room_alias = Mock( return_value=Mock(room_id=room_id, servers=servers)) result = yield self.handler.query_room_alias_exists(room_alias) self.mock_as_api.query_alias.assert_called_once_with( interested_service, room_alias_str) self.assertEquals(result.room_id, room_id) self.assertEquals(result.servers, servers) def _mkservice(self, is_interested): service = Mock() service.is_interested = Mock(return_value=is_interested) service.token = "mock_service_token" service.url = "mock_service_url" return service
def setUp(self): self.mock_store = Mock() self.mock_as_api = Mock() self.mock_scheduler = Mock() hs = Mock() hs.get_datastore = Mock(return_value=self.mock_store) self.handler = ApplicationServicesHandler(hs, self.mock_as_api, self.mock_scheduler)
def setUp(self): self.mock_store = Mock() self.mock_as_api = Mock() self.mock_scheduler = Mock() hs = Mock() hs.get_datastore = Mock(return_value=self.mock_store) hs.get_application_service_api = Mock(return_value=self.mock_as_api) hs.get_application_service_scheduler = Mock(return_value=self.mock_scheduler) hs.get_clock.return_value = MockClock() self.handler = ApplicationServicesHandler(hs)
def setUp(self): self.mock_store = Mock() self.mock_as_api = Mock() self.mock_scheduler = Mock() hs = Mock() hs.get_datastore.return_value = self.mock_store self.mock_store.get_received_ts.return_value = make_awaitable(0) self.mock_store.set_appservice_last_pos.return_value = make_awaitable(None) hs.get_application_service_api.return_value = self.mock_as_api hs.get_application_service_scheduler.return_value = self.mock_scheduler hs.get_clock.return_value = MockClock() self.handler = ApplicationServicesHandler(hs)
def setUp(self): self.mock_store = Mock() self.mock_as_api = Mock() self.mock_scheduler = Mock() hs = Mock() hs.get_datastore = Mock(return_value=self.mock_store) self.mock_store.get_received_ts.return_value = 0 hs.get_application_service_api = Mock(return_value=self.mock_as_api) hs.get_application_service_scheduler = Mock(return_value=self.mock_scheduler) hs.get_clock.return_value = MockClock() self.handler = ApplicationServicesHandler(hs)
def build_application_service_handler(self): return ApplicationServicesHandler(self)
def get_application_service_handler(self) -> ApplicationServicesHandler: return ApplicationServicesHandler(self)
class AppServiceHandlerTestCase(unittest.TestCase): """Tests the ApplicationServicesHandler.""" def setUp(self): self.mock_store = Mock() self.mock_as_api = Mock() self.mock_scheduler = Mock() hs = Mock() hs.get_datastores.return_value = Mock(main=self.mock_store) self.mock_store.get_received_ts.return_value = make_awaitable(0) self.mock_store.set_appservice_last_pos.return_value = make_awaitable( None) self.mock_store.set_appservice_stream_type_pos.return_value = make_awaitable( None) hs.get_application_service_api.return_value = self.mock_as_api 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_in_event=True) services = [ self._mkservice(is_interested_in_event=False), interested_service, self._mkservice(is_interested_in_event=False), ] self.mock_as_api.query_user.return_value = make_awaitable(True) self.mock_store.get_app_services.return_value = services self.mock_store.get_user_by_id.return_value = make_awaitable([]) event = Mock(sender="@someone:anywhere", type="m.room.message", room_id="!foo:bar") self.mock_store.get_new_events_for_appservice.side_effect = [ make_awaitable((0, [])), make_awaitable((1, [event])), ] self.handler.notify_interested_services(RoomStreamToken(None, 1)) self.mock_scheduler.enqueue_for_appservice.assert_called_once_with( interested_service, events=[event]) def test_query_user_exists_unknown_user(self): user_id = "@someone:anywhere" services = [self._mkservice(is_interested_in_event=True)] services[0].is_interested_in_user.return_value = True self.mock_store.get_app_services.return_value = services self.mock_store.get_user_by_id.return_value = make_awaitable(None) event = Mock(sender=user_id, type="m.room.message", room_id="!foo:bar") self.mock_as_api.query_user.return_value = make_awaitable(True) self.mock_store.get_new_events_for_appservice.side_effect = [ make_awaitable((0, [event])), ] self.handler.notify_interested_services(RoomStreamToken(None, 0)) self.mock_as_api.query_user.assert_called_once_with( services[0], user_id) def test_query_user_exists_known_user(self): user_id = "@someone:anywhere" services = [self._mkservice(is_interested_in_event=True)] services[0].is_interested_in_user.return_value = True self.mock_store.get_app_services.return_value = services self.mock_store.get_user_by_id.return_value = make_awaitable( {"name": user_id}) event = Mock(sender=user_id, type="m.room.message", room_id="!foo:bar") self.mock_as_api.query_user.return_value = make_awaitable(True) self.mock_store.get_new_events_for_appservice.side_effect = [ make_awaitable((0, [event])), ] self.handler.notify_interested_services(RoomStreamToken(None, 0)) self.assertFalse( self.mock_as_api.query_user.called, "query_user called when it shouldn't have been.", ) def test_query_room_alias_exists(self): room_alias_str = "#foo:bar" room_alias = Mock() room_alias.to_string.return_value = room_alias_str room_id = "!alpha:bet" servers = ["aperture"] interested_service = self._mkservice_alias( is_room_alias_in_namespace=True) services = [ self._mkservice_alias(is_room_alias_in_namespace=False), interested_service, self._mkservice_alias(is_room_alias_in_namespace=False), ] self.mock_as_api.query_alias.return_value = make_awaitable(True) self.mock_store.get_app_services.return_value = services self.mock_store.get_association_from_room_alias.return_value = make_awaitable( Mock(room_id=room_id, servers=servers)) result = self.successResultOf( defer.ensureDeferred( self.handler.query_room_alias_exists(room_alias))) self.mock_as_api.query_alias.assert_called_once_with( interested_service, room_alias_str) self.assertEqual(result.room_id, room_id) self.assertEqual(result.servers, servers) def test_get_3pe_protocols_no_appservices(self): self.mock_store.get_app_services.return_value = [] response = self.successResultOf( defer.ensureDeferred( self.handler.get_3pe_protocols("my-protocol"))) self.mock_as_api.get_3pe_protocol.assert_not_called() self.assertEqual(response, {}) def test_get_3pe_protocols_no_protocols(self): service = self._mkservice(False, []) self.mock_store.get_app_services.return_value = [service] response = self.successResultOf( defer.ensureDeferred(self.handler.get_3pe_protocols())) self.mock_as_api.get_3pe_protocol.assert_not_called() self.assertEqual(response, {}) def test_get_3pe_protocols_protocol_no_response(self): service = self._mkservice(False, ["my-protocol"]) self.mock_store.get_app_services.return_value = [service] self.mock_as_api.get_3pe_protocol.return_value = make_awaitable(None) response = self.successResultOf( defer.ensureDeferred(self.handler.get_3pe_protocols())) self.mock_as_api.get_3pe_protocol.assert_called_once_with( service, "my-protocol") self.assertEqual(response, {}) def test_get_3pe_protocols_select_one_protocol(self): service = self._mkservice(False, ["my-protocol"]) self.mock_store.get_app_services.return_value = [service] self.mock_as_api.get_3pe_protocol.return_value = make_awaitable({ "x-protocol-data": 42, "instances": [] }) response = self.successResultOf( defer.ensureDeferred( self.handler.get_3pe_protocols("my-protocol"))) self.mock_as_api.get_3pe_protocol.assert_called_once_with( service, "my-protocol") self.assertEqual( response, {"my-protocol": { "x-protocol-data": 42, "instances": [] }}) def test_get_3pe_protocols_one_protocol(self): service = self._mkservice(False, ["my-protocol"]) self.mock_store.get_app_services.return_value = [service] self.mock_as_api.get_3pe_protocol.return_value = make_awaitable({ "x-protocol-data": 42, "instances": [] }) response = self.successResultOf( defer.ensureDeferred(self.handler.get_3pe_protocols())) self.mock_as_api.get_3pe_protocol.assert_called_once_with( service, "my-protocol") self.assertEqual( response, {"my-protocol": { "x-protocol-data": 42, "instances": [] }}) def test_get_3pe_protocols_multiple_protocol(self): service_one = self._mkservice(False, ["my-protocol"]) service_two = self._mkservice(False, ["other-protocol"]) self.mock_store.get_app_services.return_value = [ service_one, service_two ] self.mock_as_api.get_3pe_protocol.return_value = make_awaitable({ "x-protocol-data": 42, "instances": [] }) response = self.successResultOf( defer.ensureDeferred(self.handler.get_3pe_protocols())) self.mock_as_api.get_3pe_protocol.assert_called() self.assertEqual( response, { "my-protocol": { "x-protocol-data": 42, "instances": [] }, "other-protocol": { "x-protocol-data": 42, "instances": [] }, }, ) def test_get_3pe_protocols_multiple_info(self): service_one = self._mkservice(False, ["my-protocol"]) service_two = self._mkservice(False, ["my-protocol"]) async def get_3pe_protocol(service, unusedProtocol): if service == service_one: return { "x-protocol-data": 42, "instances": [{ "desc": "Alice's service" }], } if service == service_two: return { "x-protocol-data": 36, "x-not-used": 45, "instances": [{ "desc": "Bob's service" }], } raise Exception("Unexpected service") self.mock_store.get_app_services.return_value = [ service_one, service_two ] self.mock_as_api.get_3pe_protocol = get_3pe_protocol response = self.successResultOf( defer.ensureDeferred(self.handler.get_3pe_protocols())) # It's expected that the second service's data doesn't appear in the response self.assertEqual( response, { "my-protocol": { "x-protocol-data": 42, "instances": [ { "desc": "Alice's service", }, { "desc": "Bob's service" }, ], }, }, ) def test_notify_interested_services_ephemeral(self): """ Test sending ephemeral events to the appservice handler are scheduled to be pushed out to interested appservices, and that the stream ID is updated accordingly. """ interested_service = self._mkservice(is_interested_in_event=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, ["@fakerecipient:example.com"]) self.mock_scheduler.enqueue_for_appservice.assert_called_once_with( interested_service, ephemeral=[event]) self.mock_store.set_appservice_stream_type_pos.assert_called_once_with( interested_service, "read_receipt", 580, ) def test_notify_interested_services_ephemeral_out_of_order(self): """ Test sending out of order ephemeral events to the appservice handler are ignored. """ interested_service = self._mkservice(is_interested_in_event=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", 580, ["@fakerecipient:example.com"]) # This method will be called, but with an empty list of events self.mock_scheduler.enqueue_for_appservice.assert_called_once_with( interested_service, ephemeral=[]) def _mkservice(self, is_interested_in_event: bool, protocols: Optional[Iterable] = None) -> Mock: """ Create a new mock representing an ApplicationService. Args: is_interested_in_event: Whether this application service will be considered interested in all events. protocols: The third-party protocols that this application service claims to support. Returns: A mock representing the ApplicationService. """ service = Mock() service.is_interested_in_event.return_value = make_awaitable( is_interested_in_event) service.token = "mock_service_token" service.url = "mock_service_url" service.protocols = protocols return service def _mkservice_alias(self, is_room_alias_in_namespace: bool) -> Mock: """ Create a new mock representing an ApplicationService that is or is not interested any given room aliase. Args: is_room_alias_in_namespace: If true, the application service will be interested in all room aliases that are queried against it. If false, the application service will not be interested in any room aliases. Returns: A mock representing the ApplicationService. """ service = Mock() service.is_room_alias_in_namespace.return_value = is_room_alias_in_namespace service.token = "mock_service_token" service.url = "mock_service_url" return service
class AppServiceHandlerTestCase(unittest.TestCase): """ Tests the ApplicationServicesHandler. """ def setUp(self): self.mock_store = Mock() self.mock_as_api = Mock() self.mock_scheduler = Mock() hs = Mock() hs.get_datastore.return_value = self.mock_store self.mock_store.get_received_ts.return_value = defer.succeed(0) self.mock_store.set_appservice_last_pos.return_value = defer.succeed( None) hs.get_application_service_api.return_value = self.mock_as_api hs.get_application_service_scheduler.return_value = self.mock_scheduler hs.get_clock.return_value = MockClock() self.handler = ApplicationServicesHandler(hs) @defer.inlineCallbacks def test_notify_interested_services(self): interested_service = self._mkservice(is_interested=True) services = [ self._mkservice(is_interested=False), interested_service, self._mkservice(is_interested=False), ] self.mock_as_api.query_user.return_value = defer.succeed(True) self.mock_store.get_app_services.return_value = services self.mock_store.get_user_by_id.return_value = defer.succeed([]) event = Mock(sender="@someone:anywhere", type="m.room.message", room_id="!foo:bar") self.mock_store.get_new_events_for_appservice.side_effect = [ defer.succeed((0, [event])), defer.succeed((0, [])), ] yield defer.ensureDeferred( self.handler.notify_interested_services(RoomStreamToken(None, 0))) self.mock_scheduler.submit_event_for_as.assert_called_once_with( interested_service, event) @defer.inlineCallbacks def test_query_user_exists_unknown_user(self): user_id = "@someone:anywhere" services = [self._mkservice(is_interested=True)] services[0].is_interested_in_user.return_value = True self.mock_store.get_app_services.return_value = services self.mock_store.get_user_by_id.return_value = defer.succeed(None) event = Mock(sender=user_id, type="m.room.message", room_id="!foo:bar") self.mock_as_api.query_user.return_value = defer.succeed(True) self.mock_store.get_new_events_for_appservice.side_effect = [ defer.succeed((0, [event])), defer.succeed((0, [])), ] yield defer.ensureDeferred( self.handler.notify_interested_services(RoomStreamToken(None, 0))) self.mock_as_api.query_user.assert_called_once_with( services[0], user_id) @defer.inlineCallbacks def test_query_user_exists_known_user(self): user_id = "@someone:anywhere" services = [self._mkservice(is_interested=True)] services[0].is_interested_in_user.return_value = True self.mock_store.get_app_services.return_value = services self.mock_store.get_user_by_id.return_value = defer.succeed( {"name": user_id}) event = Mock(sender=user_id, type="m.room.message", room_id="!foo:bar") self.mock_as_api.query_user.return_value = defer.succeed(True) self.mock_store.get_new_events_for_appservice.side_effect = [ defer.succeed((0, [event])), defer.succeed((0, [])), ] yield defer.ensureDeferred( self.handler.notify_interested_services(RoomStreamToken(None, 0))) self.assertFalse( self.mock_as_api.query_user.called, "query_user called when it shouldn't have been.", ) @defer.inlineCallbacks def test_query_room_alias_exists(self): room_alias_str = "#foo:bar" room_alias = Mock() room_alias.to_string.return_value = room_alias_str room_id = "!alpha:bet" servers = ["aperture"] interested_service = self._mkservice_alias(is_interested_in_alias=True) services = [ self._mkservice_alias(is_interested_in_alias=False), interested_service, self._mkservice_alias(is_interested_in_alias=False), ] self.mock_as_api.query_alias.return_value = make_awaitable(True) self.mock_store.get_app_services.return_value = services self.mock_store.get_association_from_room_alias.return_value = make_awaitable( Mock(room_id=room_id, servers=servers)) result = yield defer.ensureDeferred( self.handler.query_room_alias_exists(room_alias)) self.mock_as_api.query_alias.assert_called_once_with( interested_service, room_alias_str) self.assertEquals(result.room_id, room_id) self.assertEquals(result.servers, servers) def _mkservice(self, is_interested): service = Mock() service.is_interested.return_value = make_awaitable(is_interested) service.token = "mock_service_token" service.url = "mock_service_url" return service def _mkservice_alias(self, is_interested_in_alias): service = Mock() service.is_interested_in_alias.return_value = is_interested_in_alias service.token = "mock_service_token" service.url = "mock_service_url" return service
class AppServiceHandlerTestCase(unittest.TestCase): """ Tests the ApplicationServicesHandler. """ def setUp(self): self.mock_store = Mock() self.mock_as_api = Mock() self.mock_scheduler = Mock() hs = Mock() hs.get_datastore = Mock(return_value=self.mock_store) self.handler = ApplicationServicesHandler( hs, self.mock_as_api, self.mock_scheduler ) @defer.inlineCallbacks def test_notify_interested_services(self): interested_service = self._mkservice(is_interested=True) services = [ self._mkservice(is_interested=False), interested_service, self._mkservice(is_interested=False) ] self.mock_store.get_app_services = Mock(return_value=services) self.mock_store.get_user_by_id = Mock(return_value=[]) event = Mock( sender="@someone:anywhere", type="m.room.message", room_id="!foo:bar" ) self.mock_as_api.push = Mock() yield self.handler.notify_interested_services(event) self.mock_scheduler.submit_event_for_as.assert_called_once_with( interested_service, event ) @defer.inlineCallbacks def test_query_user_exists_unknown_user(self): user_id = "@someone:anywhere" services = [self._mkservice(is_interested=True)] services[0].is_interested_in_user = Mock(return_value=True) self.mock_store.get_app_services = Mock(return_value=services) self.mock_store.get_user_by_id = Mock(return_value=None) event = Mock( sender=user_id, type="m.room.message", room_id="!foo:bar" ) self.mock_as_api.push = Mock() self.mock_as_api.query_user = Mock() yield self.handler.notify_interested_services(event) self.mock_as_api.query_user.assert_called_once_with( services[0], user_id ) @defer.inlineCallbacks def test_query_user_exists_known_user(self): user_id = "@someone:anywhere" services = [self._mkservice(is_interested=True)] services[0].is_interested_in_user = Mock(return_value=True) self.mock_store.get_app_services = Mock(return_value=services) self.mock_store.get_user_by_id = Mock(return_value={ "name": user_id }) event = Mock( sender=user_id, type="m.room.message", room_id="!foo:bar" ) self.mock_as_api.push = Mock() self.mock_as_api.query_user = Mock() yield self.handler.notify_interested_services(event) self.assertFalse( self.mock_as_api.query_user.called, "query_user called when it shouldn't have been." ) @defer.inlineCallbacks def test_query_room_alias_exists(self): room_alias_str = "#foo:bar" room_alias = Mock() room_alias.to_string = Mock(return_value=room_alias_str) room_id = "!alpha:bet" servers = ["aperture"] interested_service = self._mkservice(is_interested=True) services = [ self._mkservice(is_interested=False), interested_service, self._mkservice(is_interested=False) ] self.mock_store.get_app_services = Mock(return_value=services) self.mock_store.get_association_from_room_alias = Mock( return_value=Mock(room_id=room_id, servers=servers) ) result = yield self.handler.query_room_alias_exists(room_alias) self.mock_as_api.query_alias.assert_called_once_with( interested_service, room_alias_str ) self.assertEquals(result.room_id, room_id) self.assertEquals(result.servers, servers) def _mkservice(self, is_interested): service = Mock() service.is_interested = Mock(return_value=is_interested) service.token = "mock_service_token" service.url = "mock_service_url" return service
class AppServiceHandlerTestCase(unittest.TestCase): """Tests the ApplicationServicesHandler.""" def setUp(self): self.mock_store = Mock() self.mock_as_api = Mock() self.mock_scheduler = Mock() hs = Mock() hs.get_datastore.return_value = self.mock_store self.mock_store.get_received_ts.return_value = make_awaitable(0) self.mock_store.set_appservice_last_pos.return_value = make_awaitable( None) hs.get_application_service_api.return_value = self.mock_as_api hs.get_application_service_scheduler.return_value = self.mock_scheduler hs.get_clock.return_value = MockClock() self.handler = ApplicationServicesHandler(hs) def test_notify_interested_services(self): interested_service = self._mkservice(is_interested=True) services = [ self._mkservice(is_interested=False), interested_service, self._mkservice(is_interested=False), ] self.mock_as_api.query_user.return_value = make_awaitable(True) self.mock_store.get_app_services.return_value = services self.mock_store.get_user_by_id.return_value = make_awaitable([]) event = Mock(sender="@someone:anywhere", type="m.room.message", room_id="!foo:bar") self.mock_store.get_new_events_for_appservice.side_effect = [ make_awaitable((0, [])), make_awaitable((1, [event])), ] self.handler.notify_interested_services(RoomStreamToken(None, 1)) self.mock_scheduler.submit_event_for_as.assert_called_once_with( interested_service, event) def test_query_user_exists_unknown_user(self): user_id = "@someone:anywhere" services = [self._mkservice(is_interested=True)] services[0].is_interested_in_user.return_value = True self.mock_store.get_app_services.return_value = services self.mock_store.get_user_by_id.return_value = make_awaitable(None) event = Mock(sender=user_id, type="m.room.message", room_id="!foo:bar") self.mock_as_api.query_user.return_value = make_awaitable(True) self.mock_store.get_new_events_for_appservice.side_effect = [ make_awaitable((0, [event])), ] self.handler.notify_interested_services(RoomStreamToken(None, 0)) self.mock_as_api.query_user.assert_called_once_with( services[0], user_id) def test_query_user_exists_known_user(self): user_id = "@someone:anywhere" services = [self._mkservice(is_interested=True)] services[0].is_interested_in_user.return_value = True self.mock_store.get_app_services.return_value = services self.mock_store.get_user_by_id.return_value = make_awaitable( {"name": user_id}) event = Mock(sender=user_id, type="m.room.message", room_id="!foo:bar") self.mock_as_api.query_user.return_value = make_awaitable(True) self.mock_store.get_new_events_for_appservice.side_effect = [ make_awaitable((0, [event])), ] self.handler.notify_interested_services(RoomStreamToken(None, 0)) self.assertFalse( self.mock_as_api.query_user.called, "query_user called when it shouldn't have been.", ) def test_query_room_alias_exists(self): room_alias_str = "#foo:bar" room_alias = Mock() room_alias.to_string.return_value = room_alias_str room_id = "!alpha:bet" servers = ["aperture"] interested_service = self._mkservice_alias(is_interested_in_alias=True) services = [ self._mkservice_alias(is_interested_in_alias=False), interested_service, self._mkservice_alias(is_interested_in_alias=False), ] self.mock_as_api.query_alias.return_value = make_awaitable(True) self.mock_store.get_app_services.return_value = services self.mock_store.get_association_from_room_alias.return_value = make_awaitable( Mock(room_id=room_id, servers=servers)) result = self.successResultOf( defer.ensureDeferred( self.handler.query_room_alias_exists(room_alias))) self.mock_as_api.query_alias.assert_called_once_with( interested_service, room_alias_str) self.assertEquals(result.room_id, room_id) self.assertEquals(result.servers, servers) def test_get_3pe_protocols_no_appservices(self): self.mock_store.get_app_services.return_value = [] response = self.successResultOf( defer.ensureDeferred( self.handler.get_3pe_protocols("my-protocol"))) self.mock_as_api.get_3pe_protocol.assert_not_called() self.assertEquals(response, {}) def test_get_3pe_protocols_no_protocols(self): service = self._mkservice(False, []) self.mock_store.get_app_services.return_value = [service] response = self.successResultOf( defer.ensureDeferred(self.handler.get_3pe_protocols())) self.mock_as_api.get_3pe_protocol.assert_not_called() self.assertEquals(response, {}) def test_get_3pe_protocols_protocol_no_response(self): service = self._mkservice(False, ["my-protocol"]) self.mock_store.get_app_services.return_value = [service] self.mock_as_api.get_3pe_protocol.return_value = make_awaitable(None) response = self.successResultOf( defer.ensureDeferred(self.handler.get_3pe_protocols())) self.mock_as_api.get_3pe_protocol.assert_called_once_with( service, "my-protocol") self.assertEquals(response, {}) def test_get_3pe_protocols_select_one_protocol(self): service = self._mkservice(False, ["my-protocol"]) self.mock_store.get_app_services.return_value = [service] self.mock_as_api.get_3pe_protocol.return_value = make_awaitable({ "x-protocol-data": 42, "instances": [] }) response = self.successResultOf( defer.ensureDeferred( self.handler.get_3pe_protocols("my-protocol"))) self.mock_as_api.get_3pe_protocol.assert_called_once_with( service, "my-protocol") self.assertEquals( response, {"my-protocol": { "x-protocol-data": 42, "instances": [] }}) def test_get_3pe_protocols_one_protocol(self): service = self._mkservice(False, ["my-protocol"]) self.mock_store.get_app_services.return_value = [service] self.mock_as_api.get_3pe_protocol.return_value = make_awaitable({ "x-protocol-data": 42, "instances": [] }) response = self.successResultOf( defer.ensureDeferred(self.handler.get_3pe_protocols())) self.mock_as_api.get_3pe_protocol.assert_called_once_with( service, "my-protocol") self.assertEquals( response, {"my-protocol": { "x-protocol-data": 42, "instances": [] }}) def test_get_3pe_protocols_multiple_protocol(self): service_one = self._mkservice(False, ["my-protocol"]) service_two = self._mkservice(False, ["other-protocol"]) self.mock_store.get_app_services.return_value = [ service_one, service_two ] self.mock_as_api.get_3pe_protocol.return_value = make_awaitable({ "x-protocol-data": 42, "instances": [] }) response = self.successResultOf( defer.ensureDeferred(self.handler.get_3pe_protocols())) self.mock_as_api.get_3pe_protocol.assert_called() self.assertEquals( response, { "my-protocol": { "x-protocol-data": 42, "instances": [] }, "other-protocol": { "x-protocol-data": 42, "instances": [] }, }, ) def test_get_3pe_protocols_multiple_info(self): service_one = self._mkservice(False, ["my-protocol"]) service_two = self._mkservice(False, ["my-protocol"]) async def get_3pe_protocol(service, unusedProtocol): if service == service_one: return { "x-protocol-data": 42, "instances": [{ "desc": "Alice's service" }], } if service == service_two: return { "x-protocol-data": 36, "x-not-used": 45, "instances": [{ "desc": "Bob's service" }], } raise Exception("Unexpected service") self.mock_store.get_app_services.return_value = [ service_one, service_two ] self.mock_as_api.get_3pe_protocol = get_3pe_protocol response = self.successResultOf( defer.ensureDeferred(self.handler.get_3pe_protocols())) # It's expected that the second service's data doesn't appear in the response self.assertEquals( response, { "my-protocol": { "x-protocol-data": 42, "instances": [ { "desc": "Alice's service", }, { "desc": "Bob's service" }, ], }, }, ) def _mkservice(self, is_interested, protocols=None): service = Mock() service.is_interested.return_value = make_awaitable(is_interested) service.token = "mock_service_token" service.url = "mock_service_url" service.protocols = protocols return service def _mkservice_alias(self, is_interested_in_alias): service = Mock() service.is_interested_in_alias.return_value = is_interested_in_alias service.token = "mock_service_token" service.url = "mock_service_url" return service
class AppServiceHandlerTestCase(unittest.TestCase): """ Tests the ApplicationServicesHandler. """ def setUp(self): self.mock_store = Mock() self.mock_as_api = Mock() self.mock_scheduler = Mock() hs = Mock() hs.get_datastore = Mock(return_value=self.mock_store) hs.get_application_service_api = Mock(return_value=self.mock_as_api) hs.get_application_service_scheduler = Mock( return_value=self.mock_scheduler) hs.get_clock.return_value = MockClock() self.handler = ApplicationServicesHandler(hs) @defer.inlineCallbacks def test_notify_interested_services(self): interested_service = self._mkservice(is_interested=True) services = [ self._mkservice(is_interested=False), interested_service, self._mkservice(is_interested=False) ] self.mock_store.get_app_services = Mock(return_value=services) self.mock_store.get_user_by_id = Mock(return_value=[]) event = Mock(sender="@someone:anywhere", type="m.room.message", room_id="!foo:bar") self.mock_store.get_new_events_for_appservice.return_value = (0, [event]) self.mock_as_api.push = Mock() yield self.handler.notify_interested_services(0) self.mock_scheduler.submit_event_for_as.assert_called_once_with( interested_service, event) @defer.inlineCallbacks def test_query_user_exists_unknown_user(self): user_id = "@someone:anywhere" services = [self._mkservice(is_interested=True)] services[0].is_interested_in_user = Mock(return_value=True) self.mock_store.get_app_services = Mock(return_value=services) self.mock_store.get_user_by_id = Mock(return_value=None) event = Mock(sender=user_id, type="m.room.message", room_id="!foo:bar") self.mock_as_api.push = Mock() self.mock_as_api.query_user = Mock() self.mock_store.get_new_events_for_appservice.return_value = (0, [event]) yield self.handler.notify_interested_services(0) self.mock_as_api.query_user.assert_called_once_with( services[0], user_id) @defer.inlineCallbacks def test_query_user_exists_known_user(self): user_id = "@someone:anywhere" services = [self._mkservice(is_interested=True)] services[0].is_interested_in_user = Mock(return_value=True) self.mock_store.get_app_services = Mock(return_value=services) self.mock_store.get_user_by_id = Mock(return_value={"name": user_id}) event = Mock(sender=user_id, type="m.room.message", room_id="!foo:bar") self.mock_as_api.push = Mock() self.mock_as_api.query_user = Mock() self.mock_store.get_new_events_for_appservice.return_value = (0, [event]) yield self.handler.notify_interested_services(0) self.assertFalse(self.mock_as_api.query_user.called, "query_user called when it shouldn't have been.") @defer.inlineCallbacks def test_query_room_alias_exists(self): room_alias_str = "#foo:bar" room_alias = Mock() room_alias.to_string = Mock(return_value=room_alias_str) room_id = "!alpha:bet" servers = ["aperture"] interested_service = self._mkservice_alias(is_interested_in_alias=True) services = [ self._mkservice_alias(is_interested_in_alias=False), interested_service, self._mkservice_alias(is_interested_in_alias=False) ] self.mock_store.get_app_services = Mock(return_value=services) self.mock_store.get_association_from_room_alias = Mock( return_value=Mock(room_id=room_id, servers=servers)) result = yield self.handler.query_room_alias_exists(room_alias) self.mock_as_api.query_alias.assert_called_once_with( interested_service, room_alias_str) self.assertEquals(result.room_id, room_id) self.assertEquals(result.servers, servers) def _mkservice(self, is_interested): service = Mock() service.is_interested = Mock(return_value=is_interested) service.token = "mock_service_token" service.url = "mock_service_url" return service def _mkservice_alias(self, is_interested_in_alias): service = Mock() service.is_interested_in_alias = Mock( return_value=is_interested_in_alias) service.token = "mock_service_token" service.url = "mock_service_url" return service