test_appservice.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. # -*- coding: utf-8 -*-
  2. # Copyright 2015, 2016 OpenMarket Ltd
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. from twisted.internet import defer
  16. from .. import unittest
  17. from tests.utils import MockClock
  18. from synapse.handlers.appservice import ApplicationServicesHandler
  19. from mock import Mock
  20. class AppServiceHandlerTestCase(unittest.TestCase):
  21. """ Tests the ApplicationServicesHandler. """
  22. def setUp(self):
  23. self.mock_store = Mock()
  24. self.mock_as_api = Mock()
  25. self.mock_scheduler = Mock()
  26. hs = Mock()
  27. hs.get_datastore = Mock(return_value=self.mock_store)
  28. self.mock_store.get_received_ts.return_value = 0
  29. hs.get_application_service_api = Mock(return_value=self.mock_as_api)
  30. hs.get_application_service_scheduler = Mock(return_value=self.mock_scheduler)
  31. hs.get_clock.return_value = MockClock()
  32. self.handler = ApplicationServicesHandler(hs)
  33. @defer.inlineCallbacks
  34. def test_notify_interested_services(self):
  35. interested_service = self._mkservice(is_interested=True)
  36. services = [
  37. self._mkservice(is_interested=False),
  38. interested_service,
  39. self._mkservice(is_interested=False)
  40. ]
  41. self.mock_store.get_app_services = Mock(return_value=services)
  42. self.mock_store.get_user_by_id = Mock(return_value=[])
  43. event = Mock(
  44. sender="@someone:anywhere",
  45. type="m.room.message",
  46. room_id="!foo:bar"
  47. )
  48. self.mock_store.get_new_events_for_appservice.side_effect = [
  49. (0, [event]),
  50. (0, [])
  51. ]
  52. self.mock_as_api.push = Mock()
  53. yield self.handler.notify_interested_services(0)
  54. self.mock_scheduler.submit_event_for_as.assert_called_once_with(
  55. interested_service, event
  56. )
  57. @defer.inlineCallbacks
  58. def test_query_user_exists_unknown_user(self):
  59. user_id = "@someone:anywhere"
  60. services = [self._mkservice(is_interested=True)]
  61. services[0].is_interested_in_user = Mock(return_value=True)
  62. self.mock_store.get_app_services = Mock(return_value=services)
  63. self.mock_store.get_user_by_id = Mock(return_value=None)
  64. event = Mock(
  65. sender=user_id,
  66. type="m.room.message",
  67. room_id="!foo:bar"
  68. )
  69. self.mock_as_api.push = Mock()
  70. self.mock_as_api.query_user = Mock()
  71. self.mock_store.get_new_events_for_appservice.side_effect = [
  72. (0, [event]),
  73. (0, [])
  74. ]
  75. yield self.handler.notify_interested_services(0)
  76. self.mock_as_api.query_user.assert_called_once_with(
  77. services[0], user_id
  78. )
  79. @defer.inlineCallbacks
  80. def test_query_user_exists_known_user(self):
  81. user_id = "@someone:anywhere"
  82. services = [self._mkservice(is_interested=True)]
  83. services[0].is_interested_in_user = Mock(return_value=True)
  84. self.mock_store.get_app_services = Mock(return_value=services)
  85. self.mock_store.get_user_by_id = Mock(return_value={
  86. "name": user_id
  87. })
  88. event = Mock(
  89. sender=user_id,
  90. type="m.room.message",
  91. room_id="!foo:bar"
  92. )
  93. self.mock_as_api.push = Mock()
  94. self.mock_as_api.query_user = Mock()
  95. self.mock_store.get_new_events_for_appservice.side_effect = [
  96. (0, [event]),
  97. (0, [])
  98. ]
  99. yield self.handler.notify_interested_services(0)
  100. self.assertFalse(
  101. self.mock_as_api.query_user.called,
  102. "query_user called when it shouldn't have been."
  103. )
  104. @defer.inlineCallbacks
  105. def test_query_room_alias_exists(self):
  106. room_alias_str = "#foo:bar"
  107. room_alias = Mock()
  108. room_alias.to_string = Mock(return_value=room_alias_str)
  109. room_id = "!alpha:bet"
  110. servers = ["aperture"]
  111. interested_service = self._mkservice_alias(is_interested_in_alias=True)
  112. services = [
  113. self._mkservice_alias(is_interested_in_alias=False),
  114. interested_service,
  115. self._mkservice_alias(is_interested_in_alias=False)
  116. ]
  117. self.mock_store.get_app_services = Mock(return_value=services)
  118. self.mock_store.get_association_from_room_alias = Mock(
  119. return_value=Mock(room_id=room_id, servers=servers)
  120. )
  121. result = yield self.handler.query_room_alias_exists(room_alias)
  122. self.mock_as_api.query_alias.assert_called_once_with(
  123. interested_service,
  124. room_alias_str
  125. )
  126. self.assertEquals(result.room_id, room_id)
  127. self.assertEquals(result.servers, servers)
  128. def _mkservice(self, is_interested):
  129. service = Mock()
  130. service.is_interested = Mock(return_value=is_interested)
  131. service.token = "mock_service_token"
  132. service.url = "mock_service_url"
  133. return service
  134. def _mkservice_alias(self, is_interested_in_alias):
  135. service = Mock()
  136. service.is_interested_in_alias = Mock(return_value=is_interested_in_alias)
  137. service.token = "mock_service_token"
  138. service.url = "mock_service_url"
  139. return service