Skip to content

Commit 1760aab

Browse files
committed
model: Support updated subscription op=peer_* events for ZFL35+.
Previously these events contained single stream and user ids, but now instead contain lists of each to reduce the numbers of events required for cases where users join or leave large numbers of streams. Tests added & updated.
1 parent 1e8bb5f commit 1760aab

File tree

2 files changed

+43
-13
lines changed

2 files changed

+43
-13
lines changed

tests/model/test_model.py

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1633,37 +1633,60 @@ def set_from_list_of_dict(data):
16331633
update_left_panel.assert_called_once_with()
16341634
model.controller.update_screen.assert_called_once_with()
16351635

1636-
@pytest.mark.parametrize('event, expected_subscribers', [
1636+
@pytest.mark.parametrize(['event', 'feature_level',
1637+
'stream_id', 'expected_subscribers'], [
16371638
({'type': 'subscription', 'op': 'peer_add',
1638-
'stream_id': 99, 'user_id': 12}, [1001, 11, 12]),
1639+
'stream_id': 99, 'user_id': 12}, None, 99, [1001, 11, 12]),
1640+
({'type': 'subscription', 'op': 'peer_add',
1641+
'stream_id': 99, 'user_id': 12}, 34, 99, [1001, 11, 12]),
1642+
({'type': 'subscription', 'op': 'peer_add',
1643+
'stream_ids': [99], 'user_ids': [12]}, 35, 99, [1001, 11, 12]),
1644+
({'type': 'subscription', 'op': 'peer_remove',
1645+
'stream_id': 2, 'user_id': 12}, None, 2, [1001, 11]),
16391646
({'type': 'subscription', 'op': 'peer_remove',
1640-
'stream_id': 2, 'user_id': 12}, [1001, 11]),
1647+
'stream_id': 2, 'user_id': 12}, 34, 2, [1001, 11]),
1648+
({'type': 'subscription', 'op': 'peer_remove',
1649+
'stream_ids': [2], 'user_ids': [12]}, 35, 2, [1001, 11]),
16411650
], ids=[
1642-
'user_subscribed_to_stream',
1643-
'user_unsubscribed_from_stream',
1651+
'user_subscribed_to_stream:ZFLNone',
1652+
'user_subscribed_to_stream:ZFL34',
1653+
'user_subscribed_to_stream:ZFL35',
1654+
'user_unsubscribed_from_stream:ZFLNone',
1655+
'user_unsubscribed_from_stream:ZFL34',
1656+
'user_unsubscribed_from_stream:ZFL35',
16441657
])
16451658
def test__handle_subscription_event_subscribers(self, model, mocker,
1646-
stream_dict, event,
1659+
stream_dict,
1660+
event, feature_level,
1661+
stream_id,
16471662
expected_subscribers):
16481663
model.stream_dict = stream_dict
1664+
model.server_feature_level = feature_level
16491665

16501666
model._handle_subscription_event(event)
16511667

1652-
new_subscribers = model.stream_dict[event['stream_id']]['subscribers']
1668+
new_subscribers = model.stream_dict[stream_id]['subscribers']
16531669
assert new_subscribers == expected_subscribers
16541670

1655-
@pytest.mark.parametrize('event', [
1671+
@pytest.mark.parametrize('event, feature_level', [
1672+
({'type': 'subscription', 'op': 'peer_add',
1673+
'stream_id': 462, 'user_id': 12}, 34),
16561674
({'type': 'subscription', 'op': 'peer_add',
1657-
'stream_id': 462, 'user_id': 12}),
1675+
'stream_ids': [462], 'user_ids': [12]}, 35),
1676+
({'type': 'subscription', 'op': 'peer_remove',
1677+
'stream_id': 462, 'user_id': 12}, 34),
16581678
({'type': 'subscription', 'op': 'peer_remove',
1659-
'stream_id': 462, 'user_id': 12}),
1679+
'stream_ids': [462], 'user_ids': [12]}, 35),
16601680
], ids=[
16611681
'peer_subscribed_to_stream_that_user_is_unsubscribed_to',
1682+
'peer_subscribed_to_stream_that_user_is_unsubscribed_to:ZFL35+',
16621683
'peer_unsubscribed_from_stream_that_user_is_unsubscribed_to',
1684+
'peer_unsubscribed_from_stream_that_user_is_unsubscribed_to:ZFL35+',
16631685
])
16641686
def test__handle_subscription_event_subscribers_to_unsubscribed_streams(
1665-
self, model, mocker, stream_dict, event):
1687+
self, model, mocker, stream_dict, event, feature_level):
16661688
model.stream_dict = deepcopy(stream_dict)
1689+
model.server_feature_level = feature_level
16671690

16681691
model._handle_subscription_event(event)
16691692

zulipterminal/model.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@
4949
# subscription:
5050
'property': str,
5151
'user_id': int, # Present when a streams subscribers are updated.
52+
'user_ids': List[int], # NOTE: replaces 'user_id' in ZFL 35
5253
'stream_id': int,
54+
'stream_ids': List[int], # NOTE: replaces 'stream_id' in ZFL 35 for peer*
5355
'value': bool,
5456
'message_ids': List[int] # Present when subject of msg(s) is updated
5557
}, total=False) # Each Event will only have a subset of these
@@ -786,8 +788,13 @@ def get_stream_by_id(streams: List[StreamData], stream_id: int
786788
elif event['op'] in ('peer_add', 'peer_remove'):
787789
action_map = dict(peer_add='append', peer_remove='remove')
788790
peers_action = action_map[event['op']]
789-
stream_ids = [event['stream_id']]
790-
user_ids = [event['user_id']]
791+
if (self.server_feature_level is None
792+
or self.server_feature_level < 35):
793+
stream_ids = [event['stream_id']]
794+
user_ids = [event['user_id']]
795+
else:
796+
stream_ids = event['stream_ids']
797+
user_ids = event['user_ids']
791798
for stream_id in stream_ids:
792799
if self.is_user_subscribed_to_stream(stream_id):
793800
peers = self.stream_dict[stream_id]['subscribers']

0 commit comments

Comments
 (0)