Skip to content

Commit 4dd1121

Browse files
committed
refactor: boxes/buttons/helper/model/ui: Hook semantic style helpers.
This commit replaces those instances of `set_footer_text` with new helpers, that notify user of a success/error/warning response. Tests amended. Fixes #782.
1 parent 7129c77 commit 4dd1121

File tree

11 files changed

+46
-49
lines changed

11 files changed

+46
-49
lines changed

tests/core/test_core.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -278,26 +278,26 @@ def test_narrow_to_all_mentions(self, mocker, controller, index_all_mentions):
278278
def test_open_in_browser_success(self, mocker, controller, url):
279279
# Set DISPLAY environ to be able to run test in CI
280280
os.environ["DISPLAY"] = ":0"
281-
controller.view.set_footer_text = mocker.Mock()
281+
controller.report_success = mocker.Mock()
282282
mock_get = mocker.patch(CORE + ".webbrowser.get")
283283
mock_open = mock_get.return_value.open
284284

285285
controller.open_in_browser(url)
286286

287287
mock_open.assert_called_once_with(url)
288-
controller.view.set_footer_text.assert_called_once_with(
289-
f"The link was successfully opened using {mock_get.return_value.name}", 3
288+
controller.report_success.assert_called_once_with(
289+
f"The link was successfully opened using {mock_get.return_value.name}"
290290
)
291291

292292
def test_open_in_browser_fail__no_browser_controller(self, mocker, controller):
293293
os.environ["DISPLAY"] = ":0"
294294
error = "No runnable browser found"
295-
controller.view.set_footer_text = mocker.Mock()
295+
controller.report_error = mocker.Mock()
296296
mocker.patch(CORE + ".webbrowser.get").side_effect = webbrowser.Error(error)
297297

298298
controller.open_in_browser("https://chat.zulip.org/#narrow/stream/test")
299299

300-
controller.view.set_footer_text.assert_called_once_with(f"ERROR: {error}", 3)
300+
controller.report_error.assert_called_once_with(f"ERROR: {error}")
301301

302302
def test_main(self, mocker, controller):
303303
controller.view.palette = {"default": "theme_properties"}

tests/helper/test_helper.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -343,14 +343,14 @@ def test_notify_quotes(monkeypatch, mocker, OS, cmd_length, title, text):
343343
)
344344
def test_display_error_if_present(mocker, response, footer_updated):
345345
controller = mocker.Mock()
346-
set_footer_text = controller.view.set_footer_text
346+
report_error = controller.report_error
347347

348348
display_error_if_present(response, controller)
349349

350350
if footer_updated:
351-
set_footer_text.assert_called_once_with(response["msg"], 3)
351+
report_error.assert_called_once_with(response["msg"])
352352
else:
353-
set_footer_text.assert_not_called()
353+
report_error.assert_not_called()
354354

355355

356356
@pytest.mark.parametrize(
@@ -424,17 +424,17 @@ def test_display_error_if_present(mocker, response, footer_updated):
424424
)
425425
def test_notify_if_message_sent_outside_narrow(mocker, req, narrow, footer_updated):
426426
controller = mocker.Mock()
427-
set_footer_text = controller.view.set_footer_text
427+
report_success = controller.report_success
428428
controller.model.narrow = narrow
429429

430430
notify_if_message_sent_outside_narrow(req, controller)
431431

432432
if footer_updated:
433-
set_footer_text.assert_called_once_with(
434-
"Message is sent outside of current narrow.", 3
433+
report_success.assert_called_once_with(
434+
"Message is sent outside of current narrow."
435435
)
436436
else:
437-
set_footer_text.assert_not_called()
437+
report_success.assert_not_called()
438438

439439

440440
@pytest.mark.parametrize(

tests/model/test_model.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -667,11 +667,11 @@ def test_update_stream_message(
667667
self.client.update_message.assert_called_once_with(req)
668668
assert result == return_value
669669
self.display_error_if_present.assert_called_once_with(response, self.controller)
670-
set_footer_text = model.controller.view.set_footer_text
670+
report_success = model.controller.report_success
671671
if result and footer_updated:
672-
set_footer_text.assert_called_once_with("You changed a message's topic.", 3)
672+
report_success.assert_called_once_with("You changed a message's topic.")
673673
else:
674-
set_footer_text.assert_not_called()
674+
report_success.assert_not_called()
675675

676676
# NOTE: This tests only getting next-unread, not a fixed anchor
677677
def test_success_get_messages(

tests/ui/test_ui.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ def test_keypress_autohide_streams(self, view, mocker, autohide, key, widget_siz
356356
def test_keypress_OPEN_DRAFT(self, view, mocker, draft, key, widget_size):
357357
view.body = mocker.Mock()
358358
view.middle_column = mocker.Mock()
359-
view.set_footer_text = mocker.Mock()
359+
view.controller.report_error = mocker.Mock()
360360
view.controller.is_in_editor_mode = lambda: False
361361
view.model.stream_id_from_name.return_value = 10
362362
view.model.session_draft_message.return_value = draft
@@ -383,8 +383,8 @@ def test_keypress_OPEN_DRAFT(self, view, mocker, draft, key, widget_size):
383383
assert view.write_box.msg_write_box.edit_pos == len(draft["content"])
384384
view.middle_column.set_focus.assert_called_once_with("footer")
385385
else:
386-
view.set_footer_text.assert_called_once_with(
387-
"No draft message was saved in this session.", 3
386+
view.controller.report_error.assert_called_once_with(
387+
"No draft message was saved in this session."
388388
)
389389

390390
@pytest.mark.parametrize("key", keys_for_command("SEARCH_PEOPLE"))

tests/ui_tools/test_buttons.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -853,7 +853,7 @@ def test__switch_narrow_to(
853853
assert mocked_button.controller.narrow_to_topic.called == narrow_to_topic_called
854854

855855
@pytest.mark.parametrize(
856-
"error, set_footer_text_called, _switch_narrow_to_called, exit_popup_called",
856+
"error, report_error_called, _switch_narrow_to_called, exit_popup_called",
857857
[
858858
("Some Validation Error", True, False, False),
859859
("", False, True, True),
@@ -867,7 +867,7 @@ def test_handle_narrow_link(
867867
self,
868868
mocker,
869869
error,
870-
set_footer_text_called,
870+
report_error_called,
871871
_switch_narrow_to_called,
872872
exit_popup_called,
873873
):
@@ -883,6 +883,6 @@ def test_handle_narrow_link(
883883

884884
assert mocked_button._parse_narrow_link.called
885885
assert mocked_button._validate_narrow_link.called
886-
assert mocked_button.view.set_footer_text.called == set_footer_text_called
886+
assert mocked_button.controller.report_error.called == report_error_called
887887
assert mocked_button._switch_narrow_to.called == _switch_narrow_to_called
888888
assert mocked_button.controller.exit_popup.called == exit_popup_called

zulipterminal/core.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -313,10 +313,9 @@ def open_in_browser(self, url: str) -> None:
313313
# Don't try to open web browser if running without a GUI
314314
# TODO: Explore and eventually support opening links in text-browsers.
315315
if LINUX and not os.environ.get("DISPLAY") and os.environ.get("TERM"):
316-
self.view.set_footer_text(
316+
self.report_error(
317317
"No DISPLAY environment variable specified. This could "
318-
"likely mean the ZT host is running without a GUI.",
319-
3,
318+
"likely mean the ZT host is running without a GUI."
320319
)
321320
return
322321
try:
@@ -326,13 +325,12 @@ def open_in_browser(self, url: str) -> None:
326325
# Suppress stdout and stderr when opening browser
327326
with suppress_output():
328327
browser_controller.open(url)
329-
self.view.set_footer_text(
330-
f"The link was successfully opened using {browser_controller.name}",
331-
3,
328+
self.report_success(
329+
f"The link was successfully opened using {browser_controller.name}"
332330
)
333331
except webbrowser.Error as e:
334332
# Set a footer text if no runnable browser is located
335-
self.view.set_footer_text(f"ERROR: {e}", 3)
333+
self.report_error(f"ERROR: {e}")
336334

337335
def report_error(self, text: str) -> None:
338336
"""

zulipterminal/helper.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,7 @@ def notify(title: str, html_text: str) -> str:
661661

662662
def display_error_if_present(response: Dict[str, Any], controller: Any) -> None:
663663
if response["result"] == "error" and hasattr(controller, "view"):
664-
controller.view.set_footer_text(response["msg"], 3)
664+
controller.report_error(response["msg"])
665665

666666

667667
def check_narrow_and_notify(
@@ -674,7 +674,7 @@ def check_narrow_and_notify(
674674
and current_narrow != outer_narrow
675675
and current_narrow != inner_narrow
676676
):
677-
controller.view.set_footer_text("Message is sent outside of current narrow.", 3)
677+
controller.report_success("Message is sent outside of current narrow.")
678678

679679

680680
def notify_if_message_sent_outside_narrow(

zulipterminal/model.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ def session_draft_message(self) -> Optional[Composition]:
376376

377377
def save_draft(self, draft: Composition) -> None:
378378
self._draft = deepcopy(draft)
379-
self.controller.view.set_footer_text("Saved message as draft", 3)
379+
self.controller.report_success("Saved message as draft")
380380

381381
@asynch
382382
def toggle_message_star_status(self, message: Message) -> None:
@@ -471,9 +471,8 @@ def update_stream_message(
471471
if response["result"] == "success":
472472
old_topic = self.index["messages"][message_id].get("subject", None)
473473
new_topic = request["topic"]
474-
view = self.controller.view
475474
if old_topic != new_topic:
476-
view.set_footer_text("You changed a message's topic.", 3)
475+
self.controller.report_success("You changed a message's topic.")
477476

478477
return response["result"] == "success"
479478

zulipterminal/ui.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,9 @@ def keypress(self, size: urwid_Box, key: str) -> Optional[str]:
269269
self.body.focus_col = 1
270270
self.middle_column.set_focus("footer")
271271
else:
272-
self.set_footer_text("No draft message was saved in this session.", 3)
272+
self.controller.report_error(
273+
"No draft message was saved in this session."
274+
)
273275
return key
274276
elif is_command_key("ABOUT", key):
275277
self.controller.show_about()

zulipterminal/ui_tools/boxes.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -568,8 +568,8 @@ def keypress(self, size: urwid_Size, key: str) -> Optional[str]:
568568
content=self.msg_write_box.edit_text,
569569
)
570570
else:
571-
self.view.set_footer_text(
572-
"Cannot send message without specifying recipients.", 3
571+
self.view.controller.report_error(
572+
"Cannot send message without specifying recipients."
573573
)
574574
success = None
575575
if success:
@@ -624,7 +624,7 @@ def keypress(self, size: urwid_Size, key: str) -> Optional[str]:
624624
primary_key_for_command("AUTOCOMPLETE_REVERSE"),
625625
)
626626
)
627-
self.view.set_footer_text(invalid_stream_error, 3)
627+
self.view.controller.report_error(invalid_stream_error)
628628
return key
629629
user_ids = self.model.get_other_subscribers_in_stream(
630630
stream_name=stream_name
@@ -658,7 +658,7 @@ def keypress(self, size: urwid_Size, key: str) -> Optional[str]:
658658
invalid_emails_error = (
659659
f"Invalid recipient(s) - {', '.join(invalid_emails)}"
660660
)
661-
self.view.set_footer_text(invalid_emails_error, 3)
661+
self.view.controller.report_error(invalid_emails_error)
662662
return key
663663
users = self.model.user_dict
664664
self.recipient_user_ids = [
@@ -1443,7 +1443,8 @@ def mouse_event(
14431443
"Try pressing ",
14441444
("footer_contrast", f" {selection_key} "),
14451445
" and dragging to select text.",
1446-
]
1446+
],
1447+
"task:warning",
14471448
)
14481449
self.displaying_selection_hint = True
14491450
elif event == "mouse release" and self.displaying_selection_hint:
@@ -1569,15 +1570,13 @@ def keypress(self, size: urwid_Size, key: str) -> Optional[str]:
15691570
self.model.controller.view.middle_column.set_focus("footer")
15701571
elif is_command_key("EDIT_MESSAGE", key):
15711572
if self.message["sender_id"] != self.model.user_id:
1572-
self.model.controller.view.set_footer_text(
1573-
" You can't edit messages sent by other users.", 3
1573+
self.model.controller.report_error(
1574+
" You can't edit messages sent by other users."
15741575
)
15751576
return key
15761577
# Check if editing is allowed in the realm
15771578
elif not self.model.initial_data["realm_allow_message_editing"]:
1578-
self.model.controller.view.set_footer_text(
1579-
" Editing sent message is disabled.", 3
1580-
)
1579+
self.model.controller.report_error(" Editing sent message is disabled.")
15811580
return key
15821581
# Check if message is still editable, i.e. within
15831582
# the time limit. A limit of 0 signifies no limit
@@ -1590,16 +1589,15 @@ def keypress(self, size: urwid_Size, key: str) -> Optional[str]:
15901589
]
15911590
if time_since_msg_sent >= edit_time_limit:
15921591
if self.message["type"] == "private":
1593-
self.model.controller.view.set_footer_text(
1594-
" Time Limit for editing the message has been exceeded.", 3
1592+
self.model.controller.report_error(
1593+
" Time Limit for editing the message has been exceeded."
15951594
)
15961595
return key
15971596
elif self.message["type"] == "stream":
1598-
self.model.controller.view.set_footer_text(
1597+
self.model.controller.report_warning(
15991598
" Only topic editing allowed."
16001599
" Time Limit for editing the message body has"
16011600
" been exceeded.",
1602-
3,
16031601
)
16041602
msg_body_edit_enabled = False
16051603

0 commit comments

Comments
 (0)