From 83f031207e3ff1ceaacccaf83df76ea67aeefb1b Mon Sep 17 00:00:00 2001
From: "Paul \"LeoNerd\" Evans" <paul@matrix.org>
Date: Mon, 18 Aug 2014 16:43:18 +0100
Subject: [PATCH] Implement and test presence dropping of remote users

---
 synapse/handlers/presence.py    | 8 ++++++--
 tests/handlers/test_presence.py | 8 ++++++++
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/synapse/handlers/presence.py b/synapse/handlers/presence.py
index e8cb83eddb..73ec45c9cb 100644
--- a/synapse/handlers/presence.py
+++ b/synapse/handlers/presence.py
@@ -463,9 +463,13 @@ class PresenceHandler(BaseHandler):
         deferreds = []
 
         if target_user:
-            raise NotImplementedError("TODO: remove one user")
+            if target_user not in self._remote_recvmap:
+                return
+            target_users = set([target_user])
+        else:
+            target_users = self._remote_recvmap.keys()
 
-        remoteusers = [u for u in self._remote_recvmap
+        remoteusers = [u for u in target_users
                        if user in self._remote_recvmap[u]]
         remoteusers_by_domain = partition(remoteusers, lambda u: u.domain)
 
diff --git a/tests/handlers/test_presence.py b/tests/handlers/test_presence.py
index 86bd8bb3f2..a1856e46e2 100644
--- a/tests/handlers/test_presence.py
+++ b/tests/handlers/test_presence.py
@@ -383,6 +383,14 @@ class PresenceInvitesTestCase(unittest.TestCase):
         self.mock_stop.assert_called_with(
                 self.u_apple, target_user=self.u_banana)
 
+    @defer.inlineCallbacks
+    def test_drop_remote(self):
+        yield self.handler.drop(
+                observer_user=self.u_apple, observed_user=self.u_cabbage)
+
+        self.datastore.del_presence_list.assert_called_with(
+                "apple", "@cabbage:elsewhere")
+
     @defer.inlineCallbacks
     def test_get_presence_list(self):
         self.datastore.get_presence_list.return_value = defer.succeed(