Skip to content

Commit 610499d

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 610499d

File tree

2 files changed

+75
-5
lines changed

2 files changed

+75
-5
lines changed

tests/model/test_model.py

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,13 +1145,15 @@ 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')
1150+
set_count = mocker.patch('zulipterminal.model.set_count')
11501151

11511152
model.update_message_flag_status(event)
11521153

11531154
assert model.index == dict(messages={})
11541155
model.update_rendered_view.assert_not_called()
1156+
set_count.assert_not_called()
11551157

11561158
def test_update_star_status_invalid_operation(self, mocker, model):
11571159
model.index = dict(messages={1: {'flags': None}}) # Minimal
@@ -1163,9 +1165,11 @@ def test_update_star_status_invalid_operation(self, mocker, model):
11631165
'all': False,
11641166
}
11651167
mocker.patch('zulipterminal.model.Model.update_rendered_view')
1168+
set_count = mocker.patch('zulipterminal.model.set_count')
11661169
with pytest.raises(RuntimeError):
11671170
model.update_message_flag_status(event)
11681171
model.update_rendered_view.assert_not_called()
1172+
set_count.assert_not_called()
11691173

11701174
@pytest.mark.parametrize('event_message_ids, indexed_ids', [
11711175
([1], [1]),
@@ -1199,19 +1203,80 @@ def test_update_star_status(self, mocker, model, event_op,
11991203
'all': False,
12001204
}
12011205
mocker.patch('zulipterminal.model.Model.update_rendered_view')
1206+
set_count = mocker.patch('zulipterminal.model.set_count')
12021207

12031208
model.update_message_flag_status(event)
12041209

12051210
changed_ids = set(indexed_ids) & set(event_message_ids)
12061211
for changed_id in changed_ids:
12071212
assert model.index['messages'][changed_id]['flags'] == flags_after
12081213
(model.update_rendered_view.
1209-
has_calls([mocker.call(changed_id) for changed_id in changed_ids]))
1214+
assert_has_calls([mocker.call(changed_id)
1215+
for changed_id in changed_ids]))
12101216

12111217
for unchanged_id in (set(indexed_ids) - set(event_message_ids)):
12121218
assert (model.index['messages'][unchanged_id]['flags'] ==
12131219
flags_before)
12141220

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