Skip to content

Commit 8db6a79

Browse files
committed
model: Handle read events for indexed messages.
Modified update_message_flag_status to update read flags. These work only for indexed messages, for now. Added tests for read flag status. Amended star flag status tests.
1 parent a1faf08 commit 8db6a79

File tree

2 files changed

+69
-4
lines changed

2 files changed

+69
-4
lines changed

tests/model/test_model.py

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

11461146
def test_update_star_status_no_index(self, mocker, model):
11471147
model.index = dict(messages={}) # Not indexed
1148-
event = dict(messages=[1], flag='starred', all=False)
1148+
event = dict(messages=[1], flag='starred', all=False, operation='add')
11491149
mocker.patch('zulipterminal.model.Model.update_rendered_view')
11501150

11511151
model.update_message_flag_status(event)
@@ -1199,6 +1199,7 @@ def test_update_star_status(self, mocker, model, event_op,
11991199
'all': False,
12001200
}
12011201
mocker.patch('zulipterminal.model.Model.update_rendered_view')
1202+
set_count = mocker.patch('zulipterminal.model.set_count')
12021203

12031204
model.update_message_flag_status(event)
12041205

@@ -1212,6 +1213,65 @@ def test_update_star_status(self, mocker, model, event_op,
12121213
assert (model.index['messages'][unchanged_id]['flags'] ==
12131214
flags_before)
12141215

1216+
set_count.assert_not_called()
1217+
1218+
@pytest.mark.parametrize('event_message_ids, indexed_ids', [
1219+
([1], [1]),
1220+
([1, 2], [1]),
1221+
([1, 2], [1, 2]),
1222+
([1], [1, 2]),
1223+
([], [1, 2]),
1224+
([1, 2], []),
1225+
])
1226+
@pytest.mark.parametrize('event_op, flags_before, flags_after', [
1227+
('add', [], ['read']),
1228+
('add', ['read'], ['read']),
1229+
('add', ['starred'], ['starred', 'read']),
1230+
('add', ['read', 'starred'], ['read', 'starred']),
1231+
('remove', [], []),
1232+
('remove', ['read'], ['read']), # msg cannot be marked 'unread'
1233+
('remove', ['starred'], ['starred']),
1234+
('remove', ['starred', 'read'], ['starred', 'read']),
1235+
('remove', ['read', 'starred'], ['read', 'starred']),
1236+
])
1237+
def test_update_read_status(self, mocker, model, event_op,
1238+
event_message_ids, indexed_ids,
1239+
flags_before, flags_after):
1240+
model.index = dict(messages={msg_id: {'flags': flags_before}
1241+
for msg_id in indexed_ids})
1242+
event = {
1243+
'messages': event_message_ids,
1244+
'type': 'update_message_flags',
1245+
'flag': 'read',
1246+
'operation': event_op,
1247+
'all': False,
1248+
}
1249+
1250+
mocker.patch('zulipterminal.model.Model.update_rendered_view')
1251+
set_count = mocker.patch('zulipterminal.model.set_count')
1252+
1253+
model.update_message_flag_status(event)
1254+
1255+
changed_ids = set(indexed_ids) & set(event_message_ids)
1256+
for changed_id in changed_ids:
1257+
assert model.index['messages'][changed_id]['flags'] == flags_after
1258+
1259+
if event_op == 'add':
1260+
model.update_rendered_view.assert_has_calls(
1261+
[mocker.call(changed_id)])
1262+
elif event_op == 'remove':
1263+
model.update_rendered_view.assert_not_called()
1264+
1265+
for unchanged_id in (set(indexed_ids) - set(event_message_ids)):
1266+
assert (model.index['messages'][unchanged_id]['flags'] ==
1267+
flags_before)
1268+
1269+
if event_op == 'add':
1270+
set_count.assert_called_once_with(list(changed_ids),
1271+
self.controller, -1)
1272+
elif event_op == 'remove':
1273+
set_count.assert_not_called()
1274+
12151275
@pytest.mark.parametrize('narrow, event, called', [
12161276
# Not in PM Narrow
12171277
([], {}, False),

zulipterminal/model.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,6 @@ def mark_message_ids_as_read(self, id_list: List[int]) -> None:
285285
'flag': 'read',
286286
'op': 'add',
287287
})
288-
set_count(id_list, self.controller, -1) # FIXME Update?
289288

290289
def send_private_message(self, recipients: str,
291290
content: str) -> bool:
@@ -811,9 +810,11 @@ def update_message_flag_status(self, event: Event) -> None:
811810
if event['all']: # FIXME Should handle eventually
812811
return
813812

814-
# TODO: Expand from 'starred' to also support 'read' flag changes?
815813
flag_to_change = event['flag']
816-
if flag_to_change != 'starred':
814+
if flag_to_change not in {'starred', 'read'}:
815+
return
816+
817+
if flag_to_change == 'read' and event['operation'] == 'remove':
817818
return
818819

819820
indexed_message_ids = set(self.index['messages'])
@@ -833,6 +834,10 @@ def update_message_flag_status(self, event: Event) -> None:
833834
self.index['messages'][message_id] = msg
834835
self.update_rendered_view(message_id)
835836

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+
836841
def update_rendered_view(self, msg_id: int) -> None:
837842
# Update new content in the rendered view
838843
for msg_w in self.msg_list.log:

0 commit comments

Comments
 (0)