test_typing.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. # -*- coding: utf-8 -*-
  2. # Copyright 2014 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. """Tests REST events for /rooms paths."""
  16. # twisted imports
  17. from twisted.internet import defer
  18. import synapse.rest.client.v1.room
  19. from synapse.types import UserID
  20. from ....utils import MockHttpResource, MockClock, setup_test_homeserver
  21. from .utils import RestTestCase
  22. from mock import Mock, NonCallableMock
  23. PATH_PREFIX = "/_matrix/client/api/v1"
  24. class RoomTypingTestCase(RestTestCase):
  25. """ Tests /rooms/$room_id/typing/$user_id REST API. """
  26. user_id = "@sid:red"
  27. user = UserID.from_string(user_id)
  28. @defer.inlineCallbacks
  29. def setUp(self):
  30. self.clock = MockClock()
  31. self.mock_resource = MockHttpResource(prefix=PATH_PREFIX)
  32. self.auth_user_id = self.user_id
  33. hs = yield setup_test_homeserver(
  34. "red",
  35. clock=self.clock,
  36. http_client=None,
  37. replication_layer=Mock(),
  38. ratelimiter=NonCallableMock(spec_set=[
  39. "send_message",
  40. ]),
  41. )
  42. self.hs = hs
  43. self.event_source = hs.get_event_sources().sources["typing"]
  44. self.ratelimiter = hs.get_ratelimiter()
  45. self.ratelimiter.send_message.return_value = (True, 0)
  46. hs.get_handlers().federation_handler = Mock()
  47. def _get_user_by_access_token(token=None):
  48. return {
  49. "user": UserID.from_string(self.auth_user_id),
  50. "token_id": 1,
  51. }
  52. hs.get_v1auth()._get_user_by_access_token = _get_user_by_access_token
  53. def _insert_client_ip(*args, **kwargs):
  54. return defer.succeed(None)
  55. hs.get_datastore().insert_client_ip = _insert_client_ip
  56. def get_room_members(room_id):
  57. if room_id == self.room_id:
  58. return defer.succeed([self.user])
  59. else:
  60. return defer.succeed([])
  61. @defer.inlineCallbacks
  62. def fetch_room_distributions_into(room_id, localusers=None,
  63. remotedomains=None, ignore_user=None):
  64. members = yield get_room_members(room_id)
  65. for member in members:
  66. if ignore_user is not None and member == ignore_user:
  67. continue
  68. if hs.is_mine(member):
  69. if localusers is not None:
  70. localusers.add(member)
  71. else:
  72. if remotedomains is not None:
  73. remotedomains.add(member.domain)
  74. hs.get_handlers().room_member_handler.fetch_room_distributions_into = (
  75. fetch_room_distributions_into)
  76. synapse.rest.client.v1.room.register_servlets(hs, self.mock_resource)
  77. self.room_id = yield self.create_room_as(self.user_id)
  78. # Need another user to make notifications actually work
  79. yield self.join(self.room_id, user="@jim:red")
  80. def tearDown(self):
  81. self.hs.get_handlers().typing_notification_handler.tearDown()
  82. @defer.inlineCallbacks
  83. def test_set_typing(self):
  84. (code, _) = yield self.mock_resource.trigger("PUT",
  85. "/rooms/%s/typing/%s" % (self.room_id, self.user_id),
  86. '{"typing": true, "timeout": 30000}'
  87. )
  88. self.assertEquals(200, code)
  89. self.assertEquals(self.event_source.get_current_key(), 1)
  90. events = yield self.event_source.get_new_events_for_user(self.user, 0, None)
  91. self.assertEquals(
  92. events[0],
  93. [
  94. {"type": "m.typing",
  95. "room_id": self.room_id,
  96. "content": {
  97. "user_ids": [self.user_id],
  98. }},
  99. ]
  100. )
  101. @defer.inlineCallbacks
  102. def test_set_not_typing(self):
  103. (code, _) = yield self.mock_resource.trigger("PUT",
  104. "/rooms/%s/typing/%s" % (self.room_id, self.user_id),
  105. '{"typing": false}'
  106. )
  107. self.assertEquals(200, code)
  108. @defer.inlineCallbacks
  109. def test_typing_timeout(self):
  110. (code, _) = yield self.mock_resource.trigger("PUT",
  111. "/rooms/%s/typing/%s" % (self.room_id, self.user_id),
  112. '{"typing": true, "timeout": 30000}'
  113. )
  114. self.assertEquals(200, code)
  115. self.assertEquals(self.event_source.get_current_key(), 1)
  116. self.clock.advance_time(31);
  117. self.assertEquals(self.event_source.get_current_key(), 2)
  118. (code, _) = yield self.mock_resource.trigger("PUT",
  119. "/rooms/%s/typing/%s" % (self.room_id, self.user_id),
  120. '{"typing": true, "timeout": 30000}'
  121. )
  122. self.assertEquals(200, code)
  123. self.assertEquals(self.event_source.get_current_key(), 3)