Skip to content

Commit 950f3d2

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 950f3d2

File tree

5 files changed

+147
-233
lines changed

5 files changed

+147
-233
lines changed

tests/ui_tools/test_popups.py

+78-96
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 message_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+
message_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,20 @@ 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.message_info_content = message_info_content
522+
self.message_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+
message_info_content=message_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 (
533+
self.full_rendered_message.message_info_content == self.message_info_content
534+
)
519535
assert self.full_rendered_message.header.widget_list == msg_box.header
520536
assert self.full_rendered_message.footer.widget_list == msg_box.footer
521537

@@ -547,23 +563,26 @@ def test_keypress_exit_popup_invalid_key(
547563
},
548564
)
549565
def test_keypress_show_msg_info(
550-
self, key: str, widget_size: Callable[[Widget], urwid_Size]
566+
self,
567+
key: str,
568+
widget_size: Callable[[Widget], urwid_Size],
569+
message_info_content: MessageInfoPopupContent,
551570
) -> None:
552571
size = widget_size(self.full_rendered_message)
553572

554573
self.full_rendered_message.keypress(size, key)
555574

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-
)
575+
self.controller.show_msg_info.assert_called_once_with(self.message_info_content)
562576

563577

564578
class TestFullRawMsgView:
565579
@pytest.fixture(autouse=True)
566-
def mock_external_classes(self, mocker: MockerFixture, msg_box: MessageBox) -> None:
580+
def mock_external_classes(
581+
self,
582+
mocker: MockerFixture,
583+
msg_box: MessageBox,
584+
message_info_content: MessageInfoPopupContent,
585+
) -> None:
567586
self.controller = mocker.Mock()
568587
mocker.patch.object(
569588
self.controller, "maximum_popup_dimensions", return_value=(64, 64)
@@ -575,23 +594,18 @@ def mock_external_classes(self, mocker: MockerFixture, msg_box: MessageBox) -> N
575594
# NOTE: Given that the FullRawMsgView just uses the message ID from
576595
# the message data currently, message_fixture is not used to avoid
577596
# adding extra test runs unnecessarily.
578-
self.message = Message(id=1)
597+
self.message_info_content = message_info_content
598+
self.message_info_content["message"] = Message(id=1)
579599
self.full_raw_message = FullRawMsgView(
580600
controller=self.controller,
581-
message=self.message,
582-
topic_links=OrderedDict(),
583-
message_links=OrderedDict(),
584-
time_mentions=list(),
585601
title="Full Raw Message",
602+
message_info_content=self.message_info_content,
586603
)
587604

588605
def test_init(self, msg_box: MessageBox) -> None:
589606
assert self.full_raw_message.title == "Full Raw Message"
590607
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()
608+
assert self.full_raw_message.message_info_content == self.message_info_content
595609
assert self.full_raw_message.header.widget_list == msg_box.header
596610
assert self.full_raw_message.footer.widget_list == msg_box.footer
597611

@@ -629,17 +643,14 @@ def test_keypress_show_msg_info(
629643

630644
self.full_raw_message.keypress(size, key)
631645

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-
)
646+
self.controller.show_msg_info.assert_called_once_with(self.message_info_content)
638647

639648

640649
class TestEditHistoryView:
641650
@pytest.fixture(autouse=True)
642-
def mock_external_classes(self, mocker: MockerFixture) -> None:
651+
def mock_external_classes(
652+
self, mocker: MockerFixture, message_info_content: MessageInfoPopupContent
653+
) -> None:
643654
self.controller = mocker.Mock()
644655
mocker.patch.object(
645656
self.controller, "maximum_popup_dimensions", return_value=(64, 64)
@@ -650,24 +661,20 @@ def mock_external_classes(self, mocker: MockerFixture) -> None:
650661
# NOTE: Given that the EditHistoryView just uses the message ID from
651662
# the message data currently, message_fixture is not used to avoid
652663
# adding extra test runs unnecessarily.
653-
self.message = Message(id=1)
664+
self.message_info_content = message_info_content
665+
self.message_info_content["message"] = Message(id=1)
654666
self.edit_history_view = EditHistoryView(
655667
controller=self.controller,
656-
message=self.message,
657-
topic_links=OrderedDict(),
658-
message_links=OrderedDict(),
659-
time_mentions=list(),
660668
title="Edit History",
669+
message_info_content=self.message_info_content,
661670
)
662671

663672
def test_init(self) -> None:
664673
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()
674+
assert self.edit_history_view.title == "Edit History"
675+
assert self.edit_history_view.message_info_content == self.message_info_content
669676
self.controller.model.fetch_message_history.assert_called_once_with(
670-
message_id=self.message["id"],
677+
message_id=self.message_info_content["message"]["id"],
671678
)
672679

673680
@pytest.mark.parametrize("key", keys_for_command("MSG_INFO"))
@@ -700,12 +707,7 @@ def test_keypress_show_msg_info(
700707

701708
self.edit_history_view.keypress(size, key)
702709

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-
)
710+
self.controller.show_msg_info.assert_called_once_with(self.message_info_content)
709711

710712
@pytest.mark.parametrize(
711713
"snapshot",
@@ -958,7 +960,10 @@ def test_keypress_exit_popup(
958960
class TestMsgInfoView:
959961
@pytest.fixture(autouse=True)
960962
def mock_external_classes(
961-
self, mocker: MockerFixture, message_fixture: Message
963+
self,
964+
mocker: MockerFixture,
965+
message_fixture: Message,
966+
message_info_content: MessageInfoPopupContent,
962967
) -> None:
963968
self.controller = mocker.Mock()
964969
mocker.patch.object(
@@ -975,32 +980,31 @@ def mock_external_classes(
975980
"Tue Mar 13 10:55:22",
976981
"Tue Mar 13 10:55:37",
977982
]
983+
self.message_info_content = message_info_content
984+
self.message_info_content["message"] = message_fixture
978985
self.msg_info_view = MsgInfoView(
979986
self.controller,
980-
message_fixture,
981987
"Message Information",
982-
OrderedDict(),
983-
OrderedDict(),
984-
list(),
988+
self.message_info_content,
985989
)
986990

987991
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()
992+
assert self.msg_info_view.message_info_content == self.message_info_content
992993

993994
def test_pop_up_info_order(self, message_fixture: Message) -> None:
994995
topic_links = OrderedDict([("https://bar.com", ("topic", 1, True))])
995996
message_links = OrderedDict([("image.jpg", ("image", 1, True))])
996-
msg_info_view = MsgInfoView(
997-
self.controller,
998-
message_fixture,
999-
title="Message Information",
997+
message_info_content = MessageInfoPopupContent(
998+
message=message_fixture,
1000999
topic_links=topic_links,
10011000
message_links=message_links,
10021001
time_mentions=list(),
10031002
)
1003+
msg_info_view = MsgInfoView(
1004+
self.controller,
1005+
title="Message Information",
1006+
message_info_content=message_info_content,
1007+
)
10041008
msg_links = msg_info_view.button_widgets
10051009
assert msg_links == [message_links, topic_links]
10061010

@@ -1043,22 +1047,16 @@ def test_keypress_edit_history(
10431047
}
10441048
msg_info_view = MsgInfoView(
10451049
self.controller,
1046-
message_fixture,
10471050
title="Message Information",
1048-
topic_links=OrderedDict(),
1049-
message_links=OrderedDict(),
1050-
time_mentions=list(),
1051+
message_info_content=self.message_info_content,
10511052
)
10521053
size = widget_size(msg_info_view)
10531054

10541055
msg_info_view.keypress(size, key)
10551056

10561057
if msg_info_view.show_edit_history_label:
10571058
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(),
1059+
self.message_info_content
10621060
)
10631061
else:
10641062
self.controller.show_edit_history.assert_not_called()
@@ -1072,21 +1070,15 @@ def test_keypress_full_rendered_message(
10721070
) -> None:
10731071
msg_info_view = MsgInfoView(
10741072
self.controller,
1075-
message_fixture,
10761073
title="Message Information",
1077-
topic_links=OrderedDict(),
1078-
message_links=OrderedDict(),
1079-
time_mentions=list(),
1074+
message_info_content=self.message_info_content,
10801075
)
10811076
size = widget_size(msg_info_view)
10821077

10831078
msg_info_view.keypress(size, key)
10841079

10851080
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(),
1081+
self.message_info_content
10901082
)
10911083

10921084
@pytest.mark.parametrize("key", keys_for_command("FULL_RAW_MESSAGE"))
@@ -1098,21 +1090,15 @@ def test_keypress_full_raw_message(
10981090
) -> None:
10991091
msg_info_view = MsgInfoView(
11001092
self.controller,
1101-
message_fixture,
11021093
title="Message Information",
1103-
topic_links=OrderedDict(),
1104-
message_links=OrderedDict(),
1105-
time_mentions=list(),
1094+
message_info_content=self.message_info_content,
11061095
)
11071096
size = widget_size(msg_info_view)
11081097

11091098
msg_info_view.keypress(size, key)
11101099

11111100
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(),
1101+
self.message_info_content
11161102
)
11171103

11181104
@pytest.mark.parametrize(
@@ -1204,16 +1190,12 @@ def test_height_reactions(
12041190
self,
12051191
message_fixture: Message,
12061192
to_vary_in_each_message: Message,
1193+
message_info_content: MessageInfoPopupContent,
12071194
) -> None:
1208-
varied_message = message_fixture
1209-
varied_message.update(to_vary_in_each_message)
1195+
message_info_content["message"] = message_fixture
1196+
message_info_content["message"].update(to_vary_in_each_message)
12101197
self.msg_info_view = MsgInfoView(
1211-
self.controller,
1212-
varied_message,
1213-
"Message Information",
1214-
OrderedDict(),
1215-
OrderedDict(),
1216-
list(),
1198+
self.controller, "Message Information", message_info_content
12171199
)
12181200
# 12 = 7 labels + 2 blank lines + 1 'Reactions' (category)
12191201
# + 4 reactions (excluding 'Message Links').

0 commit comments

Comments
 (0)