Skip to content

Commit 7235df2

Browse files
committed
refactor: views/helper/core/messages: Group message data in a TypedDict.
Group the following into a single piece of data, to simplify passing them as arguments across functions. - message - topic_links - message_links - time_mentions Tests updated.
1 parent 743db7d commit 7235df2

File tree

5 files changed

+145
-239
lines changed

5 files changed

+145
-239
lines changed

tests/ui_tools/test_popups.py

Lines changed: 76 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@
99
from zulipterminal.api_types import Message
1010
from zulipterminal.config.keys import is_command_key, keys_for_command
1111
from zulipterminal.config.ui_mappings import EDIT_MODE_CAPTIONS
12-
from zulipterminal.helper import CustomProfileData, TidiedUserInfo
12+
from zulipterminal.helper import (
13+
CustomProfileData,
14+
MessageInfoPopupContent,
15+
TidiedUserInfo,
16+
)
1317
from zulipterminal.ui_tools.messages import MessageBox
1418
from zulipterminal.ui_tools.views import (
1519
AboutView,
@@ -41,6 +45,16 @@
4145
# * classes derived from the base popup class, sorted alphabetically
4246

4347

48+
@pytest.fixture
49+
def msg_info_content() -> MessageInfoPopupContent:
50+
return MessageInfoPopupContent(
51+
message=Message(),
52+
topic_links=OrderedDict(),
53+
message_links=OrderedDict(),
54+
time_mentions=list(),
55+
)
56+
57+
4458
class TestPopUpConfirmationView:
4559
@pytest.fixture
4660
def popup_view(self, mocker: MockerFixture) -> PopUpConfirmationView:
@@ -490,7 +504,12 @@ def test_keypress_exit_popup_invalid_key(
490504

491505
class TestFullRenderedMsgView:
492506
@pytest.fixture(autouse=True)
493-
def mock_external_classes(self, mocker: MockerFixture, msg_box: MessageBox) -> None:
507+
def mock_external_classes(
508+
self,
509+
mocker: MockerFixture,
510+
msg_box: MessageBox,
511+
msg_info_content: MessageInfoPopupContent,
512+
) -> None:
494513
self.controller = mocker.Mock()
495514
mocker.patch.object(
496515
self.controller, "maximum_popup_dimensions", return_value=(64, 64)
@@ -499,23 +518,18 @@ def mock_external_classes(self, mocker: MockerFixture, msg_box: MessageBox) -> N
499518
# NOTE: Given that the FullRenderedMsgView just uses the message ID from
500519
# the message data currently, message_fixture is not used to avoid
501520
# adding extra test runs unnecessarily.
502-
self.message = Message(id=1)
521+
self.msg_info_content = msg_info_content
522+
self.msg_info_content["message"] = Message(id=1)
503523
self.full_rendered_message = FullRenderedMsgView(
504524
controller=self.controller,
505-
message=self.message,
506-
topic_links=OrderedDict(),
507-
message_links=OrderedDict(),
508-
time_mentions=list(),
509525
title="Full Rendered Message",
526+
msg_info_content=msg_info_content,
510527
)
511528

512529
def test_init(self, msg_box: MessageBox) -> None:
513530
assert self.full_rendered_message.title == "Full Rendered Message"
514531
assert self.full_rendered_message.controller == self.controller
515-
assert self.full_rendered_message.message == self.message
516-
assert self.full_rendered_message.topic_links == OrderedDict()
517-
assert self.full_rendered_message.message_links == OrderedDict()
518-
assert self.full_rendered_message.time_mentions == list()
532+
assert self.full_rendered_message.msg_info_content == self.msg_info_content
519533
assert self.full_rendered_message.header.widget_list == msg_box.header
520534
assert self.full_rendered_message.footer.widget_list == msg_box.footer
521535

@@ -547,23 +561,26 @@ def test_keypress_exit_popup_invalid_key(
547561
},
548562
)
549563
def test_keypress_show_msg_info(
550-
self, key: str, widget_size: Callable[[Widget], urwid_Size]
564+
self,
565+
key: str,
566+
widget_size: Callable[[Widget], urwid_Size],
567+
msg_info_content: MessageInfoPopupContent,
551568
) -> None:
552569
size = widget_size(self.full_rendered_message)
553570

554571
self.full_rendered_message.keypress(size, key)
555572

556-
self.controller.show_msg_info.assert_called_once_with(
557-
msg=self.message,
558-
topic_links=OrderedDict(),
559-
message_links=OrderedDict(),
560-
time_mentions=list(),
561-
)
573+
self.controller.show_msg_info.assert_called_once_with(self.msg_info_content)
562574

563575

564576
class TestFullRawMsgView:
565577
@pytest.fixture(autouse=True)
566-
def mock_external_classes(self, mocker: MockerFixture, msg_box: MessageBox) -> None:
578+
def mock_external_classes(
579+
self,
580+
mocker: MockerFixture,
581+
msg_box: MessageBox,
582+
msg_info_content: MessageInfoPopupContent,
583+
) -> None:
567584
self.controller = mocker.Mock()
568585
mocker.patch.object(
569586
self.controller, "maximum_popup_dimensions", return_value=(64, 64)
@@ -575,23 +592,18 @@ def mock_external_classes(self, mocker: MockerFixture, msg_box: MessageBox) -> N
575592
# NOTE: Given that the FullRawMsgView just uses the message ID from
576593
# the message data currently, message_fixture is not used to avoid
577594
# adding extra test runs unnecessarily.
578-
self.message = Message(id=1)
595+
self.msg_info_content = msg_info_content
596+
self.msg_info_content["message"] = Message(id=1)
579597
self.full_raw_message = FullRawMsgView(
580598
controller=self.controller,
581-
message=self.message,
582-
topic_links=OrderedDict(),
583-
message_links=OrderedDict(),
584-
time_mentions=list(),
585599
title="Full Raw Message",
600+
msg_info_content=self.msg_info_content,
586601
)
587602

588603
def test_init(self, msg_box: MessageBox) -> None:
589604
assert self.full_raw_message.title == "Full Raw Message"
590605
assert self.full_raw_message.controller == self.controller
591-
assert self.full_raw_message.message == self.message
592-
assert self.full_raw_message.topic_links == OrderedDict()
593-
assert self.full_raw_message.message_links == OrderedDict()
594-
assert self.full_raw_message.time_mentions == list()
606+
assert self.full_raw_message.msg_info_content == self.msg_info_content
595607
assert self.full_raw_message.header.widget_list == msg_box.header
596608
assert self.full_raw_message.footer.widget_list == msg_box.footer
597609

@@ -629,17 +641,14 @@ def test_keypress_show_msg_info(
629641

630642
self.full_raw_message.keypress(size, key)
631643

632-
self.controller.show_msg_info.assert_called_once_with(
633-
msg=self.message,
634-
topic_links=OrderedDict(),
635-
message_links=OrderedDict(),
636-
time_mentions=list(),
637-
)
644+
self.controller.show_msg_info.assert_called_once_with(self.msg_info_content)
638645

639646

640647
class TestEditHistoryView:
641648
@pytest.fixture(autouse=True)
642-
def mock_external_classes(self, mocker: MockerFixture) -> None:
649+
def mock_external_classes(
650+
self, mocker: MockerFixture, msg_info_content: MessageInfoPopupContent
651+
) -> None:
643652
self.controller = mocker.Mock()
644653
mocker.patch.object(
645654
self.controller, "maximum_popup_dimensions", return_value=(64, 64)
@@ -650,24 +659,20 @@ def mock_external_classes(self, mocker: MockerFixture) -> None:
650659
# NOTE: Given that the EditHistoryView just uses the message ID from
651660
# the message data currently, message_fixture is not used to avoid
652661
# adding extra test runs unnecessarily.
653-
self.message = Message(id=1)
662+
self.msg_info_content = msg_info_content
663+
self.msg_info_content["message"] = Message(id=1)
654664
self.edit_history_view = EditHistoryView(
655665
controller=self.controller,
656-
message=self.message,
657-
topic_links=OrderedDict(),
658-
message_links=OrderedDict(),
659-
time_mentions=list(),
660666
title="Edit History",
667+
msg_info_content=self.msg_info_content,
661668
)
662669

663670
def test_init(self) -> None:
664671
assert self.edit_history_view.controller == self.controller
665-
assert self.edit_history_view.message == self.message
666-
assert self.edit_history_view.topic_links == OrderedDict()
667-
assert self.edit_history_view.message_links == OrderedDict()
668-
assert self.edit_history_view.time_mentions == list()
672+
assert self.edit_history_view.title == "Edit History"
673+
assert self.edit_history_view.msg_info_content == self.msg_info_content
669674
self.controller.model.fetch_message_history.assert_called_once_with(
670-
message_id=self.message["id"],
675+
message_id=self.msg_info_content["message"]["id"],
671676
)
672677

673678
@pytest.mark.parametrize("key", keys_for_command("MSG_INFO"))
@@ -700,12 +705,7 @@ def test_keypress_show_msg_info(
700705

701706
self.edit_history_view.keypress(size, key)
702707

703-
self.controller.show_msg_info.assert_called_once_with(
704-
msg=self.message,
705-
topic_links=OrderedDict(),
706-
message_links=OrderedDict(),
707-
time_mentions=list(),
708-
)
708+
self.controller.show_msg_info.assert_called_once_with(self.msg_info_content)
709709

710710
@pytest.mark.parametrize(
711711
"snapshot",
@@ -958,7 +958,10 @@ def test_keypress_exit_popup(
958958
class TestMsgInfoView:
959959
@pytest.fixture(autouse=True)
960960
def mock_external_classes(
961-
self, mocker: MockerFixture, message_fixture: Message
961+
self,
962+
mocker: MockerFixture,
963+
message_fixture: Message,
964+
msg_info_content: MessageInfoPopupContent,
962965
) -> None:
963966
self.controller = mocker.Mock()
964967
mocker.patch.object(
@@ -975,32 +978,31 @@ def mock_external_classes(
975978
"Tue Mar 13 10:55:22",
976979
"Tue Mar 13 10:55:37",
977980
]
981+
self.msg_info_content = msg_info_content
982+
self.msg_info_content["message"] = message_fixture
978983
self.msg_info_view = MsgInfoView(
979984
self.controller,
980-
message_fixture,
981985
"Message Information",
982-
OrderedDict(),
983-
OrderedDict(),
984-
list(),
986+
self.msg_info_content,
985987
)
986988

987989
def test_init(self, message_fixture: Message) -> None:
988-
assert self.msg_info_view.msg == message_fixture
989-
assert self.msg_info_view.topic_links == OrderedDict()
990-
assert self.msg_info_view.message_links == OrderedDict()
991-
assert self.msg_info_view.time_mentions == list()
990+
assert self.msg_info_view.msg_info_content == self.msg_info_content
992991

993992
def test_pop_up_info_order(self, message_fixture: Message) -> None:
994993
topic_links = OrderedDict([("https://bar.com", ("topic", 1, True))])
995994
message_links = OrderedDict([("image.jpg", ("image", 1, True))])
996-
msg_info_view = MsgInfoView(
997-
self.controller,
998-
message_fixture,
999-
title="Message Information",
995+
msg_info_content = MessageInfoPopupContent(
996+
message=message_fixture,
1000997
topic_links=topic_links,
1001998
message_links=message_links,
1002999
time_mentions=list(),
10031000
)
1001+
msg_info_view = MsgInfoView(
1002+
self.controller,
1003+
title="Message Information",
1004+
msg_info_content=msg_info_content,
1005+
)
10041006
msg_links = msg_info_view.button_widgets
10051007
assert msg_links == [message_links, topic_links]
10061008

@@ -1043,22 +1045,16 @@ def test_keypress_edit_history(
10431045
}
10441046
msg_info_view = MsgInfoView(
10451047
self.controller,
1046-
message_fixture,
10471048
title="Message Information",
1048-
topic_links=OrderedDict(),
1049-
message_links=OrderedDict(),
1050-
time_mentions=list(),
1049+
msg_info_content=self.msg_info_content,
10511050
)
10521051
size = widget_size(msg_info_view)
10531052

10541053
msg_info_view.keypress(size, key)
10551054

10561055
if msg_info_view.show_edit_history_label:
10571056
self.controller.show_edit_history.assert_called_once_with(
1058-
message=message_fixture,
1059-
topic_links=OrderedDict(),
1060-
message_links=OrderedDict(),
1061-
time_mentions=list(),
1057+
self.msg_info_content
10621058
)
10631059
else:
10641060
self.controller.show_edit_history.assert_not_called()
@@ -1072,21 +1068,15 @@ def test_keypress_full_rendered_message(
10721068
) -> None:
10731069
msg_info_view = MsgInfoView(
10741070
self.controller,
1075-
message_fixture,
10761071
title="Message Information",
1077-
topic_links=OrderedDict(),
1078-
message_links=OrderedDict(),
1079-
time_mentions=list(),
1072+
msg_info_content=self.msg_info_content,
10801073
)
10811074
size = widget_size(msg_info_view)
10821075

10831076
msg_info_view.keypress(size, key)
10841077

10851078
self.controller.show_full_rendered_message.assert_called_once_with(
1086-
message=message_fixture,
1087-
topic_links=OrderedDict(),
1088-
message_links=OrderedDict(),
1089-
time_mentions=list(),
1079+
self.msg_info_content
10901080
)
10911081

10921082
@pytest.mark.parametrize("key", keys_for_command("FULL_RAW_MESSAGE"))
@@ -1098,21 +1088,15 @@ def test_keypress_full_raw_message(
10981088
) -> None:
10991089
msg_info_view = MsgInfoView(
11001090
self.controller,
1101-
message_fixture,
11021091
title="Message Information",
1103-
topic_links=OrderedDict(),
1104-
message_links=OrderedDict(),
1105-
time_mentions=list(),
1092+
msg_info_content=self.msg_info_content,
11061093
)
11071094
size = widget_size(msg_info_view)
11081095

11091096
msg_info_view.keypress(size, key)
11101097

11111098
self.controller.show_full_raw_message.assert_called_once_with(
1112-
message=message_fixture,
1113-
topic_links=OrderedDict(),
1114-
message_links=OrderedDict(),
1115-
time_mentions=list(),
1099+
self.msg_info_content
11161100
)
11171101

11181102
@pytest.mark.parametrize(
@@ -1204,16 +1188,12 @@ def test_height_reactions(
12041188
self,
12051189
message_fixture: Message,
12061190
to_vary_in_each_message: Message,
1191+
msg_info_content: MessageInfoPopupContent,
12071192
) -> None:
1208-
varied_message = message_fixture
1209-
varied_message.update(to_vary_in_each_message)
1193+
msg_info_content["message"] = message_fixture
1194+
msg_info_content["message"].update(to_vary_in_each_message)
12101195
self.msg_info_view = MsgInfoView(
1211-
self.controller,
1212-
varied_message,
1213-
"Message Information",
1214-
OrderedDict(),
1215-
OrderedDict(),
1216-
list(),
1196+
self.controller, "Message Information", msg_info_content
12171197
)
12181198
# 12 = 7 labels + 2 blank lines + 1 'Reactions' (category)
12191199
# + 4 reactions (excluding 'Message Links').

0 commit comments

Comments
 (0)