diff options
Diffstat (limited to 'tests/rest/test_presence.py')
-rw-r--r-- | tests/rest/test_presence.py | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/tests/rest/test_presence.py b/tests/rest/test_presence.py new file mode 100644 index 0000000000..3a2e86e5c4 --- /dev/null +++ b/tests/rest/test_presence.py @@ -0,0 +1,241 @@ +# -*- coding: utf-8 -*- +"""Tests REST events for /presence paths.""" + +from twisted.trial import unittest +from twisted.internet import defer + +from mock import Mock +import logging + +from ..utils import MockHttpServer + +from synapse.api.constants import PresenceState +from synapse.server import HomeServer + + +logging.getLogger().addHandler(logging.NullHandler()) + + +OFFLINE = PresenceState.OFFLINE +BUSY = PresenceState.BUSY +ONLINE = PresenceState.ONLINE + + +myid = "@apple:test" +PATH_PREFIX = "/matrix/client/api/v1" + + +class PresenceStateTestCase(unittest.TestCase): + + def setUp(self): + self.mock_server = MockHttpServer(prefix=PATH_PREFIX) + self.mock_handler = Mock(spec=[ + "get_state", + "set_state", + ]) + + hs = HomeServer("test", + db_pool=None, + http_client=None, + http_server=self.mock_server, + ) + + def _get_user_by_token(token=None): + return hs.parse_userid(myid) + + hs.get_auth().get_user_by_token = _get_user_by_token + + hs.get_handlers().presence_handler = self.mock_handler + + hs.register_servlets() + + self.u_apple = hs.parse_userid(myid) + + @defer.inlineCallbacks + def test_get_my_status(self): + mocked_get = self.mock_handler.get_state + mocked_get.return_value = defer.succeed( + {"state": 2, "status_msg": "Available"}) + + (code, response) = yield self.mock_server.trigger("GET", + "/presence/%s/status" % (myid), None) + + self.assertEquals(200, code) + self.assertEquals({"state": ONLINE, "status_msg": "Available"}, + response) + mocked_get.assert_called_with(target_user=self.u_apple, + auth_user=self.u_apple) + + @defer.inlineCallbacks + def test_set_my_status(self): + mocked_set = self.mock_handler.set_state + mocked_set.return_value = defer.succeed(()) + + (code, response) = yield self.mock_server.trigger("PUT", + "/presence/%s/status" % (myid), + '{"state": 1, "status_msg": "Away"}') + + self.assertEquals(200, code) + mocked_set.assert_called_with(target_user=self.u_apple, + auth_user=self.u_apple, + state={"state": 1, "status_msg": "Away"}) + + +class PresenceListTestCase(unittest.TestCase): + + def setUp(self): + self.mock_server = MockHttpServer(prefix=PATH_PREFIX) + self.mock_handler = Mock(spec=[ + "get_presence_list", + "send_invite", + "drop", + ]) + + hs = HomeServer("test", + db_pool=None, + http_client=None, + http_server=self.mock_server, + ) + + def _get_user_by_token(token=None): + return hs.parse_userid(myid) + + hs.get_auth().get_user_by_token = _get_user_by_token + + hs.get_handlers().presence_handler = self.mock_handler + + hs.register_servlets() + + self.u_apple = hs.parse_userid("@apple:test") + self.u_banana = hs.parse_userid("@banana:test") + + @defer.inlineCallbacks + def test_get_my_list(self): + self.mock_handler.get_presence_list.return_value = defer.succeed( + [{"observed_user": self.u_banana}] + ) + + (code, response) = yield self.mock_server.trigger("GET", + "/presence_list/%s" % (myid), None) + + self.assertEquals(200, code) + self.assertEquals([{"user_id": "@banana:test"}], response) + + @defer.inlineCallbacks + def test_invite(self): + self.mock_handler.send_invite.return_value = defer.succeed(()) + + (code, response) = yield self.mock_server.trigger("POST", + "/presence_list/%s" % (myid), + """{ + "invite": ["@banana:test"] + }""") + + self.assertEquals(200, code) + + self.mock_handler.send_invite.assert_called_with( + observer_user=self.u_apple, observed_user=self.u_banana) + + @defer.inlineCallbacks + def test_drop(self): + self.mock_handler.drop.return_value = defer.succeed(()) + + (code, response) = yield self.mock_server.trigger("POST", + "/presence_list/%s" % (myid), + """{ + "drop": ["@banana:test"] + }""") + + self.assertEquals(200, code) + + self.mock_handler.drop.assert_called_with( + observer_user=self.u_apple, observed_user=self.u_banana) + + +class PresenceEventStreamTestCase(unittest.TestCase): + def setUp(self): + self.mock_server = MockHttpServer(prefix=PATH_PREFIX) + + # TODO: mocked data store + + # HIDEOUS HACKERY + # TODO(paul): This should be injected in via the HomeServer DI system + from synapse.handlers.events import EventStreamHandler + from synapse.handlers.presence import PresenceStreamData + EventStreamHandler.stream_data_classes = [ + PresenceStreamData + ] + + hs = HomeServer("test", + db_pool=None, + http_client=None, + http_server=self.mock_server, + datastore=Mock(spec=[ + "set_presence_state", + "get_presence_list", + ]), + clock=Mock(spec=[ + "call_later", + "cancel_call_later", + "time_msec", + ]), + ) + + hs.get_clock().time_msec.return_value = 1000000 + + def _get_user_by_req(req=None): + return hs.parse_userid(myid) + + hs.get_auth().get_user_by_req = _get_user_by_req + + hs.register_servlets() + + hs.handlers.room_member_handler = Mock(spec=[ + "get_rooms_for_user", + ]) + hs.handlers.room_member_handler.get_rooms_for_user = ( + lambda u: defer.succeed([])) + + self.mock_datastore = hs.get_datastore() + self.presence = hs.get_handlers().presence_handler + + self.u_apple = hs.parse_userid("@apple:test") + self.u_banana = hs.parse_userid("@banana:test") + + @defer.inlineCallbacks + def test_shortpoll(self): + self.mock_datastore.set_presence_state.return_value = defer.succeed( + {"state": ONLINE}) + self.mock_datastore.get_presence_list.return_value = defer.succeed( + []) + + (code, response) = yield self.mock_server.trigger("GET", + "/events?timeout=0", None) + + self.assertEquals(200, code) + + # We've forced there to be only one data stream so the tokens will + # all be ours + + # I'll already get my own presence state change + self.assertEquals({"start": "0", "end": "1", "chunk": [ + {"type": "m.presence", + "content": {"user_id": "@apple:test", "state": 2}}, + ]}, response) + + self.mock_datastore.set_presence_state.return_value = defer.succeed( + {"state": ONLINE}) + self.mock_datastore.get_presence_list.return_value = defer.succeed( + []) + + yield self.presence.set_state(self.u_banana, self.u_banana, + state={"state": ONLINE}) + + (code, response) = yield self.mock_server.trigger("GET", + "/events?from=1&timeout=0", None) + + self.assertEquals(200, code) + self.assertEquals({"start": "1", "end": "2", "chunk": [ + {"type": "m.presence", + "content": {"user_id": "@banana:test", "state": 2}}, + ]}, response) |