diff --git a/tests/handlers/test_presence.py b/tests/handlers/test_presence.py
index 4583ff8bc6..8506961d2d 100644
--- a/tests/handlers/test_presence.py
+++ b/tests/handlers/test_presence.py
@@ -118,7 +118,9 @@ class PresenceStateTestCase(unittest.TestCase):
room_member_handler.get_room_members = get_room_members
def user_rooms_intersect(userlist):
- shared = all(map(lambda u: u in self.room_members, userlist))
+ room_member_ids = map(lambda u: u.to_string(), self.room_members)
+
+ shared = all(map(lambda i: i in room_member_ids, userlist))
return defer.succeed(shared)
self.datastore.user_rooms_intersect = user_rooms_intersect
@@ -562,6 +564,13 @@ class PresencePushTestCase(unittest.TestCase):
return defer.succeed([])
self.datastore.get_joined_hosts_for_room = get_room_hosts
+ def user_rooms_intersect(userlist):
+ room_member_ids = map(lambda u: u.to_string(), self.room_members)
+
+ shared = all(map(lambda i: i in room_member_ids, userlist))
+ return defer.succeed(shared)
+ self.datastore.user_rooms_intersect = user_rooms_intersect
+
@defer.inlineCallbacks
def fetch_room_distributions_into(room_id, localusers=None,
remotedomains=None, ignore_user=None):
@@ -604,6 +613,7 @@ class PresencePushTestCase(unittest.TestCase):
self.u_apple = hs.parse_userid("@apple:test")
self.u_banana = hs.parse_userid("@banana:test")
self.u_clementine = hs.parse_userid("@clementine:test")
+ self.u_durian = hs.parse_userid("@durian:test")
self.u_elderberry = hs.parse_userid("@elderberry:test")
# Remote user
@@ -632,6 +642,7 @@ class PresencePushTestCase(unittest.TestCase):
{"presence": ONLINE}
)
+ # Apple sees self-reflection
(events, _) = yield self.event_source.get_new_events_for_user(
self.u_apple, 0, None
)
@@ -647,6 +658,55 @@ class PresencePushTestCase(unittest.TestCase):
"last_active_ago": 0,
}},
],
+ msg="Presence event should be visible to self-reflection"
+ )
+
+ # Banana sees it because of presence subscription
+ (events, _) = yield self.event_source.get_new_events_for_user(
+ self.u_banana, 0, None
+ )
+
+ self.assertEquals(self.event_source.get_current_key(), 1)
+ self.assertEquals(events,
+ [
+ {"type": "m.presence",
+ "content": {
+ "user_id": "@apple:test",
+ "presence": ONLINE,
+ "state": ONLINE,
+ "last_active_ago": 0,
+ }},
+ ],
+ msg="Presence event should be visible to explicit subscribers"
+ )
+
+ # Elderberry sees it because of same room
+ (events, _) = yield self.event_source.get_new_events_for_user(
+ self.u_elderberry, 0, None
+ )
+
+ self.assertEquals(self.event_source.get_current_key(), 1)
+ self.assertEquals(events,
+ [
+ {"type": "m.presence",
+ "content": {
+ "user_id": "@apple:test",
+ "presence": ONLINE,
+ "state": ONLINE,
+ "last_active_ago": 0,
+ }},
+ ],
+ msg="Presence event should be visible to other room members"
+ )
+
+ # Durian is not in the room, should not see this event
+ (events, _) = yield self.event_source.get_new_events_for_user(
+ self.u_durian, 0, None
+ )
+
+ self.assertEquals(self.event_source.get_current_key(), 1)
+ self.assertEquals(events, [],
+ msg="Presence event should not be visible to others"
)
presence = yield self.handler.get_presence_list(
@@ -664,6 +724,10 @@ class PresencePushTestCase(unittest.TestCase):
presence
)
+ # TODO(paul): Gut-wrenching
+ banana_set = self.handler._local_pushmap.setdefault("banana", set())
+ banana_set.add(self.u_apple)
+
yield self.handler.set_state(self.u_banana, self.u_banana,
{"presence": ONLINE}
)
@@ -825,6 +889,8 @@ class PresencePushTestCase(unittest.TestCase):
"a-room"
)
+ self.room_members.append(self.u_clementine)
+
(events, _) = yield self.event_source.get_new_events_for_user(
self.u_apple, 0, None
)
diff --git a/tests/rest/test_presence.py b/tests/rest/test_presence.py
index e2cdd80e07..df8dd74151 100644
--- a/tests/rest/test_presence.py
+++ b/tests/rest/test_presence.py
@@ -269,11 +269,16 @@ class PresenceEventStreamTestCase(unittest.TestCase):
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([]))
+ hs.handlers.room_member_handler = Mock(spec=[])
+
+ self.room_members = []
+
+ def get_rooms_for_user(user):
+ if user in self.room_members:
+ return ["a-room"]
+ else:
+ return []
+ hs.handlers.room_member_handler.get_rooms_for_user = get_rooms_for_user
self.mock_datastore = hs.get_datastore()
@@ -285,6 +290,17 @@ class PresenceEventStreamTestCase(unittest.TestCase):
return defer.succeed(None)
self.mock_datastore.get_profile_avatar_url = get_profile_avatar_url
+ def user_rooms_intersect(user_list):
+ room_member_ids = map(lambda u: u.to_string(), self.room_members)
+
+ shared = all(map(lambda i: i in room_member_ids, user_list))
+ return defer.succeed(shared)
+ self.mock_datastore.user_rooms_intersect = user_rooms_intersect
+
+ def get_joined_hosts_for_room(room_id):
+ return []
+ self.mock_datastore.get_joined_hosts_for_room = get_joined_hosts_for_room
+
self.presence = hs.get_handlers().presence_handler
self.u_apple = hs.parse_userid("@apple:test")
@@ -292,6 +308,8 @@ class PresenceEventStreamTestCase(unittest.TestCase):
@defer.inlineCallbacks
def test_shortpoll(self):
+ self.room_members = [self.u_apple, self.u_banana]
+
self.mock_datastore.set_presence_state.return_value = defer.succeed(
{"state": ONLINE})
self.mock_datastore.get_presence_list.return_value = defer.succeed(
|