Skip to content

Commit 00537aa

Browse files
committed
Handle read events from server
Fixes #434
1 parent eed12fd commit 00537aa

File tree

2 files changed

+51
-3
lines changed

2 files changed

+51
-3
lines changed

tests/model/test_model.py

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1154,7 +1154,7 @@ def test_update_reaction_remove_reaction(self, mocker, model, response,
11541154

11551155
def test_update_star_status_no_index(self, mocker, model):
11561156
model.index = dict(messages={}) # Not indexed
1157-
event = dict(messages=[1], flag='starred', all=False)
1157+
event = dict(messages=[1], flag='starred', all=False, operation='add')
11581158
mocker.patch('zulipterminal.model.Model.update_rendered_view')
11591159

11601160
model.update_message_flag_status(event)
@@ -1221,6 +1221,51 @@ def test_update_star_status(self, mocker, model, event_op,
12211221
assert (model.index['messages'][unchanged_id]['flags'] ==
12221222
flags_before)
12231223

1224+
@pytest.mark.parametrize('event_message_ids, indexed_ids', [
1225+
([1], [1]),
1226+
([1, 2], [1]),
1227+
([1, 2], [1, 2]),
1228+
([1], [1, 2]),
1229+
([], [1, 2]),
1230+
([1, 2], []),
1231+
])
1232+
@pytest.mark.parametrize('event_op, flags_before, flags_after', [
1233+
('add', [], ['read']),
1234+
('add', ['read'], ['read']),
1235+
('add', ['starred'], ['starred', 'read']),
1236+
('add', ['read', 'starred'], ['read', 'starred']),
1237+
])
1238+
def test_update_read_status(self, mocker, model, event_op,
1239+
event_message_ids, indexed_ids,
1240+
flags_before, flags_after):
1241+
model.index = dict(messages={msg_id: {'flags': flags_before}
1242+
for msg_id in indexed_ids})
1243+
event = {
1244+
'messages': event_message_ids,
1245+
'type': 'update_message_flags',
1246+
'flag': 'read',
1247+
'operation': 'add',
1248+
'all': False,
1249+
}
1250+
1251+
mocker.patch('zulipterminal.model.Model.update_rendered_view')
1252+
set_count = mocker.patch('zulipterminal.model.set_count')
1253+
1254+
model.update_message_flag_status(event)
1255+
1256+
changed_ids = set(indexed_ids) & set(event_message_ids)
1257+
for changed_id in changed_ids:
1258+
assert model.index['messages'][changed_id]['flags'] == flags_after
1259+
(model.update_rendered_view.
1260+
has_calls([mocker.call(changed_id) for changed_id in changed_ids]))
1261+
1262+
for unchanged_id in (set(indexed_ids) - set(event_message_ids)):
1263+
assert (model.index['messages'][unchanged_id]['flags'] ==
1264+
flags_before)
1265+
1266+
set_count.assert_called_once_with(list(changed_ids),
1267+
self.controller, -1)
1268+
12241269
@pytest.mark.parametrize('narrow, event, called', [
12251270
# Not in PM Narrow
12261271
([], {}, False),

zulipterminal/model.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,6 @@ def mark_message_ids_as_read(self, id_list: List[int]) -> None:
287287
'flag': 'read',
288288
'op': 'add',
289289
})
290-
set_count(id_list, self.controller, -1) # FIXME Update?
291290

292291
def send_private_message(self, recipients: str,
293292
content: str) -> bool:
@@ -815,7 +814,7 @@ def update_message_flag_status(self, event: Event) -> None:
815814

816815
# TODO: Expand from 'starred' to also support 'read' flag changes?
817816
flag_to_change = event['flag']
818-
if flag_to_change != 'starred':
817+
if flag_to_change not in {'starred', 'read'}:
819818
return
820819

821820
indexed_message_ids = set(self.index['messages'])
@@ -835,6 +834,10 @@ def update_message_flag_status(self, event: Event) -> None:
835834
self.index['messages'][message_id] = msg
836835
self.update_rendered_view(message_id)
837836

837+
if event['operation'] == 'add' and flag_to_change == 'read':
838+
set_count(list(message_ids_to_mark & indexed_message_ids),
839+
self.controller, -1)
840+
838841
def update_rendered_view(self, msg_id: int) -> None:
839842
# Update new content in the rendered view
840843
for msg_w in self.msg_list.log:

0 commit comments

Comments
 (0)