def setUp(self): from adhocracy_core.websockets.server import ClientTracker app_root = testing.DummyResource() app_root['child'] = testing.DummyResource() self._child = app_root['child'] self._tracker = ClientTracker()
class ClientTrackerUnitTests(unittest.TestCase): def _make_client(self): return object() def setUp(self): from adhocracy_core.websockets.server import ClientTracker app_root = testing.DummyResource() app_root['child'] = testing.DummyResource() self._child = app_root['child'] self._tracker = ClientTracker() def _make_child2(self): result = self._child.__parent__['child2'] = testing.DummyResource() return result def test_subscribe(self): client = self._make_client() resource = self._child result = self._tracker.subscribe(client, resource) assert result is True assert len(self._tracker._clients2resource_paths) == 1 assert len(self._tracker._resource_paths2clients) == 1 assert self._tracker._clients2resource_paths[client] == {'/child'} assert self._tracker._resource_paths2clients['/child'] == {client} def test_subscribe_redundant(self): """Test client subscribing same resource twice.""" client = self._make_client() resource = self._child self._tracker.subscribe(client, resource) result = self._tracker.subscribe(client, resource) assert result is False def test_subscribe_two_resources(self): """Test client subscribing to two resources.""" client = self._make_client() resource1 = self._child resource2 = self._make_child2() result1 = self._tracker.subscribe(client, resource1) result2 = self._tracker.subscribe(client, resource2) assert result1 is True assert result2 is True assert len(self._tracker._clients2resource_paths) == 1 assert len(self._tracker._resource_paths2clients) == 2 assert self._tracker._clients2resource_paths[client] == { '/child', '/child2' } assert self._tracker._resource_paths2clients['/child'] == {client} assert self._tracker._resource_paths2clients['/child2'] == {client} def test_subscribe_two_clients(self): """Test two clients subscribing to same resource.""" client1 = self._make_client() client2 = self._make_client() resource = self._child result1 = self._tracker.subscribe(client1, resource) result2 = self._tracker.subscribe(client2, resource) assert result1 is True assert result2 is True assert len(self._tracker._clients2resource_paths) == 2 assert len(self._tracker._resource_paths2clients) == 1 assert self._tracker._clients2resource_paths[client1] == {'/child'} assert self._tracker._clients2resource_paths[client2] == {'/child'} assert self._tracker._resource_paths2clients['/child'] == { client1, client2 } def test_unsubscribe(self): client = self._make_client() resource = self._child self._tracker.subscribe(client, resource) result = self._tracker.unsubscribe(client, resource) assert result is True assert len(self._tracker._clients2resource_paths) == 0 assert len(self._tracker._resource_paths2clients) == 0 def test_unsubscribe_redundant(self): """Test client unsubscribing from the same resource twice.""" client = self._make_client() resource = self._child self._tracker.subscribe(client, resource) self._tracker.unsubscribe(client, resource) result = self._tracker.unsubscribe(client, resource) assert result is False def test_delete_subscriptions_for_client_empty(self): """Test deleting all subscriptions for a client that has none.""" client = self._make_client() self._tracker.delete_subscriptions_for_client(client) assert len(self._tracker._clients2resource_paths) == 0 assert len(self._tracker._resource_paths2clients) == 0 def test_delete_subscriptions_for_client_two_resources(self): """Test deleting all subscriptions for a client that has two.""" client = self._make_client() resource1 = self._child resource2 = self._make_child2() self._tracker.subscribe(client, resource1) self._tracker.subscribe(client, resource2) self._tracker.delete_subscriptions_for_client(client) assert len(self._tracker._clients2resource_paths) == 0 assert len(self._tracker._resource_paths2clients) == 0 def test_delete_subscriptions_for_client_two_clients(self): """Test deleting all subscriptions for one client subscribed to the same resource as another one. """ client1 = self._make_client() client2 = self._make_client() resource = self._child self._tracker.subscribe(client1, resource) self._tracker.subscribe(client2, resource) self._tracker.delete_subscriptions_for_client(client1) assert len(self._tracker._clients2resource_paths) == 1 assert len(self._tracker._resource_paths2clients) == 1 assert self._tracker._clients2resource_paths[client2] == {'/child'} assert self._tracker._resource_paths2clients['/child'] == {client2} assert client1 not in self._tracker._clients2resource_paths def test_delete_subscriptions_to_resource_empty(self): """Test deleting all subscriptions to a resource that has none.""" resource = self._child self._tracker.delete_subscriptions_to_resource(resource) assert len(self._tracker._clients2resource_paths) == 0 assert len(self._tracker._resource_paths2clients) == 0 def test_delete_subscriptions_to_resource_two_clients(self): """Test deleting all subscriptions to a resource that has two.""" client1 = self._make_client() client2 = self._make_client() resource = self._child assert len(self._tracker._clients2resource_paths) == 0 assert len(self._tracker._resource_paths2clients) == 0 self._tracker.subscribe(client1, resource) self._tracker.subscribe(client2, resource) self._tracker.delete_subscriptions_to_resource(resource) assert len(self._tracker._clients2resource_paths) == 0 assert len(self._tracker._resource_paths2clients) == 0 def test_delete_subscriptions_to_resource_two_resources(self): """Test deleting all subscriptions to a resource if the client has multiple subscriptions. """ client = self._make_client() resource1 = self._child resource2 = self._make_child2() self._tracker.subscribe(client, resource1) self._tracker.subscribe(client, resource2) self._tracker.delete_subscriptions_to_resource(resource1) assert len(self._tracker._clients2resource_paths) == 1 assert len(self._tracker._resource_paths2clients) == 1 assert self._tracker._clients2resource_paths[client] == {'/child2'} assert self._tracker._resource_paths2clients['/child2'] == {client} def test_iterate_subscribers_empty(self): """Test iterating subscribers for a resource that has none.""" resource = self._child result = list(self._tracker.iterate_subscribers(resource)) assert len(result) == 0 assert len(self._tracker._clients2resource_paths) == 0 assert len(self._tracker._resource_paths2clients) == 0 def test_iterate_subscribers_two(self): """Test iterating subscribers for a resource that has two.""" client1 = self._make_client() client2 = self._make_client() resource = self._child self._tracker.subscribe(client1, resource) self._tracker.subscribe(client2, resource) result = list(self._tracker.iterate_subscribers(resource)) assert len(result) == 2 assert client1 in result assert client2 in result
class ClientTrackerUnitTests(unittest.TestCase): def _make_client(self): return object() def setUp(self): from adhocracy_core.websockets.server import ClientTracker app_root = testing.DummyResource() app_root['child'] = testing.DummyResource() self._child = app_root['child'] self._tracker = ClientTracker() def _make_child2(self): result = self._child.__parent__['child2'] = testing.DummyResource() return result def test_subscribe(self): client = self._make_client() resource = self._child result = self._tracker.subscribe(client, resource) assert result is True assert len(self._tracker._clients2resource_paths) == 1 assert len(self._tracker._resource_paths2clients) == 1 assert self._tracker._clients2resource_paths[client] == {'/child'} assert self._tracker._resource_paths2clients['/child'] == {client} def test_subscribe_redundant(self): """Test client subscribing same resource twice.""" client = self._make_client() resource = self._child self._tracker.subscribe(client, resource) result = self._tracker.subscribe(client, resource) assert result is False def test_subscribe_two_resources(self): """Test client subscribing to two resources.""" client = self._make_client() resource1 = self._child resource2 = self._make_child2() result1 = self._tracker.subscribe(client, resource1) result2 = self._tracker.subscribe(client, resource2) assert result1 is True assert result2 is True assert len(self._tracker._clients2resource_paths) == 1 assert len(self._tracker._resource_paths2clients) == 2 assert self._tracker._clients2resource_paths[client] == {'/child', '/child2'} assert self._tracker._resource_paths2clients['/child'] == {client} assert self._tracker._resource_paths2clients['/child2'] == {client} def test_subscribe_two_clients(self): """Test two clients subscribing to same resource.""" client1 = self._make_client() client2 = self._make_client() resource = self._child result1 = self._tracker.subscribe(client1, resource) result2 = self._tracker.subscribe(client2, resource) assert result1 is True assert result2 is True assert len(self._tracker._clients2resource_paths) == 2 assert len(self._tracker._resource_paths2clients) == 1 assert self._tracker._clients2resource_paths[client1] == {'/child'} assert self._tracker._clients2resource_paths[client2] == {'/child'} assert self._tracker._resource_paths2clients['/child'] == {client1, client2} def test_unsubscribe(self): client = self._make_client() resource = self._child self._tracker.subscribe(client, resource) result = self._tracker.unsubscribe(client, resource) assert result is True assert len(self._tracker._clients2resource_paths) == 0 assert len(self._tracker._resource_paths2clients) == 0 def test_unsubscribe_redundant(self): """Test client unsubscribing from the same resource twice.""" client = self._make_client() resource = self._child self._tracker.subscribe(client, resource) self._tracker.unsubscribe(client, resource) result = self._tracker.unsubscribe(client, resource) assert result is False def test_delete_subscriptions_for_client_empty(self): """Test deleting all subscriptions for a client that has none.""" client = self._make_client() self._tracker.delete_subscriptions_for_client(client) assert len(self._tracker._clients2resource_paths) == 0 assert len(self._tracker._resource_paths2clients) == 0 def test_delete_subscriptions_for_client_two_resources(self): """Test deleting all subscriptions for a client that has two.""" client = self._make_client() resource1 = self._child resource2 = self._make_child2() self._tracker.subscribe(client, resource1) self._tracker.subscribe(client, resource2) self._tracker.delete_subscriptions_for_client(client) assert len(self._tracker._clients2resource_paths) == 0 assert len(self._tracker._resource_paths2clients) == 0 def test_delete_subscriptions_for_client_two_clients(self): """Test deleting all subscriptions for one client subscribed to the same resource as another one. """ client1 = self._make_client() client2 = self._make_client() resource = self._child self._tracker.subscribe(client1, resource) self._tracker.subscribe(client2, resource) self._tracker.delete_subscriptions_for_client(client1) assert len(self._tracker._clients2resource_paths) == 1 assert len(self._tracker._resource_paths2clients) == 1 assert self._tracker._clients2resource_paths[client2] == {'/child'} assert self._tracker._resource_paths2clients['/child'] == {client2} assert client1 not in self._tracker._clients2resource_paths def test_delete_subscriptions_to_resource_empty(self): """Test deleting all subscriptions to a resource that has none.""" resource = self._child self._tracker.delete_subscriptions_to_resource(resource) assert len(self._tracker._clients2resource_paths) == 0 assert len(self._tracker._resource_paths2clients) == 0 def test_delete_subscriptions_to_resource_two_clients(self): """Test deleting all subscriptions to a resource that has two.""" client1 = self._make_client() client2 = self._make_client() resource = self._child assert len(self._tracker._clients2resource_paths) == 0 assert len(self._tracker._resource_paths2clients) == 0 self._tracker.subscribe(client1, resource) self._tracker.subscribe(client2, resource) self._tracker.delete_subscriptions_to_resource(resource) assert len(self._tracker._clients2resource_paths) == 0 assert len(self._tracker._resource_paths2clients) == 0 def test_delete_subscriptions_to_resource_two_resources(self): """Test deleting all subscriptions to a resource if the client has multiple subscriptions. """ client = self._make_client() resource1 = self._child resource2 = self._make_child2() self._tracker.subscribe(client, resource1) self._tracker.subscribe(client, resource2) self._tracker.delete_subscriptions_to_resource(resource1) assert len(self._tracker._clients2resource_paths) == 1 assert len(self._tracker._resource_paths2clients) == 1 assert self._tracker._clients2resource_paths[client] == {'/child2'} assert self._tracker._resource_paths2clients['/child2'] == {client} def test_iterate_subscribers_empty(self): """Test iterating subscribers for a resource that has none.""" resource = self._child result = list(self._tracker.iterate_subscribers(resource)) assert len(result) == 0 assert len(self._tracker._clients2resource_paths) == 0 assert len(self._tracker._resource_paths2clients) == 0 def test_iterate_subscribers_two(self): """Test iterating subscribers for a resource that has two.""" client1 = self._make_client() client2 = self._make_client() resource = self._child self._tracker.subscribe(client1, resource) self._tracker.subscribe(client2, resource) result = list(self._tracker.iterate_subscribers(resource)) assert len(result) == 2 assert client1 in result assert client2 in result