test_typing.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. # -*- coding: utf-8 -*-
  2. # Copyright 2014-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. """Tests REST events for /rooms paths."""
  16. from mock import Mock, NonCallableMock
  17. # twisted imports
  18. from twisted.internet import defer
  19. import synapse.rest.client.v1.room
  20. from synapse.types import UserID
  21. from ....utils import MockClock, MockHttpResource, setup_test_homeserver
  22. from .utils import RestTestCase
  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. self.addCleanup,
  35. "red",
  36. clock=self.clock,
  37. http_client=None,
  38. federation_client=Mock(),
  39. ratelimiter=NonCallableMock(spec_set=["send_message"]),
  40. )
  41. self.hs = hs
  42. self.event_source = hs.get_event_sources().sources["typing"]
  43. self.ratelimiter = hs.get_ratelimiter()
  44. self.ratelimiter.send_message.return_value = (True, 0)
  45. hs.get_handlers().federation_handler = Mock()
  46. def get_user_by_access_token(token=None, allow_guest=False):
  47. return {
  48. "user": UserID.from_string(self.auth_user_id),
  49. "token_id": 1,
  50. "is_guest": False,
  51. }
  52. hs.get_auth().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(
  63. room_id, localusers=None, remotedomains=None, ignore_user=None
  64. ):
  65. members = yield get_room_members(room_id)
  66. for member in members:
  67. if ignore_user is not None and member == ignore_user:
  68. continue
  69. if hs.is_mine(member):
  70. if localusers is not None:
  71. localusers.add(member)
  72. else:
  73. if remotedomains is not None:
  74. remotedomains.add(member.domain)
  75. hs.get_room_member_handler().fetch_room_distributions_into = (
  76. fetch_room_distributions_into
  77. )
  78. synapse.rest.client.v1.room.register_servlets(hs, self.mock_resource)
  79. self.room_id = yield self.create_room_as(self.user_id)
  80. # Need another user to make notifications actually work
  81. yield self.join(self.room_id, user="@jim:red")
  82. @defer.inlineCallbacks
  83. def test_set_typing(self):
  84. (code, _) = yield self.mock_resource.trigger(
  85. "PUT",
  86. "/rooms/%s/typing/%s" % (self.room_id, self.user_id),
  87. '{"typing": true, "timeout": 30000}',
  88. )
  89. self.assertEquals(200, code)
  90. self.assertEquals(self.event_source.get_current_key(), 1)
  91. events = yield self.event_source.get_new_events(
  92. from_key=0, room_ids=[self.room_id]
  93. )
  94. self.assertEquals(
  95. events[0],
  96. [
  97. {
  98. "type": "m.typing",
  99. "room_id": self.room_id,
  100. "content": {"user_ids": [self.user_id]},
  101. }
  102. ],
  103. )
  104. @defer.inlineCallbacks
  105. def test_set_not_typing(self):
  106. (code, _) = yield self.mock_resource.trigger(
  107. "PUT",
  108. "/rooms/%s/typing/%s" % (self.room_id, self.user_id),
  109. '{"typing": false}',
  110. )
  111. self.assertEquals(200, code)
  112. @defer.inlineCallbacks
  113. def test_typing_timeout(self):
  114. (code, _) = yield self.mock_resource.trigger(
  115. "PUT",
  116. "/rooms/%s/typing/%s" % (self.room_id, self.user_id),
  117. '{"typing": true, "timeout": 30000}',
  118. )
  119. self.assertEquals(200, code)
  120. self.assertEquals(self.event_source.get_current_key(), 1)
  121. self.clock.advance_time(36)
  122. self.assertEquals(self.event_source.get_current_key(), 2)
  123. (code, _) = yield self.mock_resource.trigger(
  124. "PUT",
  125. "/rooms/%s/typing/%s" % (self.room_id, self.user_id),
  126. '{"typing": true, "timeout": 30000}',
  127. )
  128. self.assertEquals(200, code)
  129. self.assertEquals(self.event_source.get_current_key(), 3)