Skip to content

Commit

Permalink
refactor: views/helper/core/messages: Group message data in a TypedDict.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Niloth-p committed Jul 22, 2024
1 parent 743db7d commit 950f3d2
Show file tree
Hide file tree
Showing 5 changed files with 147 additions and 233 deletions.
174 changes: 78 additions & 96 deletions tests/ui_tools/test_popups.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@
from zulipterminal.api_types import Message
from zulipterminal.config.keys import is_command_key, keys_for_command
from zulipterminal.config.ui_mappings import EDIT_MODE_CAPTIONS
from zulipterminal.helper import CustomProfileData, TidiedUserInfo
from zulipterminal.helper import (
CustomProfileData,
MessageInfoPopupContent,
TidiedUserInfo,
)
from zulipterminal.ui_tools.messages import MessageBox
from zulipterminal.ui_tools.views import (
AboutView,
Expand Down Expand Up @@ -41,6 +45,16 @@
# * classes derived from the base popup class, sorted alphabetically


@pytest.fixture
def message_info_content() -> MessageInfoPopupContent:
return MessageInfoPopupContent(
message=Message(),
topic_links=OrderedDict(),
message_links=OrderedDict(),
time_mentions=list(),
)


class TestPopUpConfirmationView:
@pytest.fixture
def popup_view(self, mocker: MockerFixture) -> PopUpConfirmationView:
Expand Down Expand Up @@ -490,7 +504,12 @@ def test_keypress_exit_popup_invalid_key(

class TestFullRenderedMsgView:
@pytest.fixture(autouse=True)
def mock_external_classes(self, mocker: MockerFixture, msg_box: MessageBox) -> None:
def mock_external_classes(
self,
mocker: MockerFixture,
msg_box: MessageBox,
message_info_content: MessageInfoPopupContent,
) -> None:
self.controller = mocker.Mock()
mocker.patch.object(
self.controller, "maximum_popup_dimensions", return_value=(64, 64)
Expand All @@ -499,23 +518,20 @@ def mock_external_classes(self, mocker: MockerFixture, msg_box: MessageBox) -> N
# NOTE: Given that the FullRenderedMsgView just uses the message ID from
# the message data currently, message_fixture is not used to avoid
# adding extra test runs unnecessarily.
self.message = Message(id=1)
self.message_info_content = message_info_content
self.message_info_content["message"] = Message(id=1)
self.full_rendered_message = FullRenderedMsgView(
controller=self.controller,
message=self.message,
topic_links=OrderedDict(),
message_links=OrderedDict(),
time_mentions=list(),
title="Full Rendered Message",
message_info_content=message_info_content,
)

def test_init(self, msg_box: MessageBox) -> None:
assert self.full_rendered_message.title == "Full Rendered Message"
assert self.full_rendered_message.controller == self.controller
assert self.full_rendered_message.message == self.message
assert self.full_rendered_message.topic_links == OrderedDict()
assert self.full_rendered_message.message_links == OrderedDict()
assert self.full_rendered_message.time_mentions == list()
assert (
self.full_rendered_message.message_info_content == self.message_info_content
)
assert self.full_rendered_message.header.widget_list == msg_box.header
assert self.full_rendered_message.footer.widget_list == msg_box.footer

Expand Down Expand Up @@ -547,23 +563,26 @@ def test_keypress_exit_popup_invalid_key(
},
)
def test_keypress_show_msg_info(
self, key: str, widget_size: Callable[[Widget], urwid_Size]
self,
key: str,
widget_size: Callable[[Widget], urwid_Size],
message_info_content: MessageInfoPopupContent,
) -> None:
size = widget_size(self.full_rendered_message)

self.full_rendered_message.keypress(size, key)

self.controller.show_msg_info.assert_called_once_with(
msg=self.message,
topic_links=OrderedDict(),
message_links=OrderedDict(),
time_mentions=list(),
)
self.controller.show_msg_info.assert_called_once_with(self.message_info_content)


class TestFullRawMsgView:
@pytest.fixture(autouse=True)
def mock_external_classes(self, mocker: MockerFixture, msg_box: MessageBox) -> None:
def mock_external_classes(
self,
mocker: MockerFixture,
msg_box: MessageBox,
message_info_content: MessageInfoPopupContent,
) -> None:
self.controller = mocker.Mock()
mocker.patch.object(
self.controller, "maximum_popup_dimensions", return_value=(64, 64)
Expand All @@ -575,23 +594,18 @@ def mock_external_classes(self, mocker: MockerFixture, msg_box: MessageBox) -> N
# NOTE: Given that the FullRawMsgView just uses the message ID from
# the message data currently, message_fixture is not used to avoid
# adding extra test runs unnecessarily.
self.message = Message(id=1)
self.message_info_content = message_info_content
self.message_info_content["message"] = Message(id=1)
self.full_raw_message = FullRawMsgView(
controller=self.controller,
message=self.message,
topic_links=OrderedDict(),
message_links=OrderedDict(),
time_mentions=list(),
title="Full Raw Message",
message_info_content=self.message_info_content,
)

def test_init(self, msg_box: MessageBox) -> None:
assert self.full_raw_message.title == "Full Raw Message"
assert self.full_raw_message.controller == self.controller
assert self.full_raw_message.message == self.message
assert self.full_raw_message.topic_links == OrderedDict()
assert self.full_raw_message.message_links == OrderedDict()
assert self.full_raw_message.time_mentions == list()
assert self.full_raw_message.message_info_content == self.message_info_content
assert self.full_raw_message.header.widget_list == msg_box.header
assert self.full_raw_message.footer.widget_list == msg_box.footer

Expand Down Expand Up @@ -629,17 +643,14 @@ def test_keypress_show_msg_info(

self.full_raw_message.keypress(size, key)

self.controller.show_msg_info.assert_called_once_with(
msg=self.message,
topic_links=OrderedDict(),
message_links=OrderedDict(),
time_mentions=list(),
)
self.controller.show_msg_info.assert_called_once_with(self.message_info_content)


class TestEditHistoryView:
@pytest.fixture(autouse=True)
def mock_external_classes(self, mocker: MockerFixture) -> None:
def mock_external_classes(
self, mocker: MockerFixture, message_info_content: MessageInfoPopupContent
) -> None:
self.controller = mocker.Mock()
mocker.patch.object(
self.controller, "maximum_popup_dimensions", return_value=(64, 64)
Expand All @@ -650,24 +661,20 @@ def mock_external_classes(self, mocker: MockerFixture) -> None:
# NOTE: Given that the EditHistoryView just uses the message ID from
# the message data currently, message_fixture is not used to avoid
# adding extra test runs unnecessarily.
self.message = Message(id=1)
self.message_info_content = message_info_content
self.message_info_content["message"] = Message(id=1)
self.edit_history_view = EditHistoryView(
controller=self.controller,
message=self.message,
topic_links=OrderedDict(),
message_links=OrderedDict(),
time_mentions=list(),
title="Edit History",
message_info_content=self.message_info_content,
)

def test_init(self) -> None:
assert self.edit_history_view.controller == self.controller
assert self.edit_history_view.message == self.message
assert self.edit_history_view.topic_links == OrderedDict()
assert self.edit_history_view.message_links == OrderedDict()
assert self.edit_history_view.time_mentions == list()
assert self.edit_history_view.title == "Edit History"
assert self.edit_history_view.message_info_content == self.message_info_content
self.controller.model.fetch_message_history.assert_called_once_with(
message_id=self.message["id"],
message_id=self.message_info_content["message"]["id"],
)

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

self.edit_history_view.keypress(size, key)

self.controller.show_msg_info.assert_called_once_with(
msg=self.message,
topic_links=OrderedDict(),
message_links=OrderedDict(),
time_mentions=list(),
)
self.controller.show_msg_info.assert_called_once_with(self.message_info_content)

@pytest.mark.parametrize(
"snapshot",
Expand Down Expand Up @@ -958,7 +960,10 @@ def test_keypress_exit_popup(
class TestMsgInfoView:
@pytest.fixture(autouse=True)
def mock_external_classes(
self, mocker: MockerFixture, message_fixture: Message
self,
mocker: MockerFixture,
message_fixture: Message,
message_info_content: MessageInfoPopupContent,
) -> None:
self.controller = mocker.Mock()
mocker.patch.object(
Expand All @@ -975,32 +980,31 @@ def mock_external_classes(
"Tue Mar 13 10:55:22",
"Tue Mar 13 10:55:37",
]
self.message_info_content = message_info_content
self.message_info_content["message"] = message_fixture
self.msg_info_view = MsgInfoView(
self.controller,
message_fixture,
"Message Information",
OrderedDict(),
OrderedDict(),
list(),
self.message_info_content,
)

def test_init(self, message_fixture: Message) -> None:
assert self.msg_info_view.msg == message_fixture
assert self.msg_info_view.topic_links == OrderedDict()
assert self.msg_info_view.message_links == OrderedDict()
assert self.msg_info_view.time_mentions == list()
assert self.msg_info_view.message_info_content == self.message_info_content

def test_pop_up_info_order(self, message_fixture: Message) -> None:
topic_links = OrderedDict([("https://bar.com", ("topic", 1, True))])
message_links = OrderedDict([("image.jpg", ("image", 1, True))])
msg_info_view = MsgInfoView(
self.controller,
message_fixture,
title="Message Information",
message_info_content = MessageInfoPopupContent(
message=message_fixture,
topic_links=topic_links,
message_links=message_links,
time_mentions=list(),
)
msg_info_view = MsgInfoView(
self.controller,
title="Message Information",
message_info_content=message_info_content,
)
msg_links = msg_info_view.button_widgets
assert msg_links == [message_links, topic_links]

Expand Down Expand Up @@ -1043,22 +1047,16 @@ def test_keypress_edit_history(
}
msg_info_view = MsgInfoView(
self.controller,
message_fixture,
title="Message Information",
topic_links=OrderedDict(),
message_links=OrderedDict(),
time_mentions=list(),
message_info_content=self.message_info_content,
)
size = widget_size(msg_info_view)

msg_info_view.keypress(size, key)

if msg_info_view.show_edit_history_label:
self.controller.show_edit_history.assert_called_once_with(
message=message_fixture,
topic_links=OrderedDict(),
message_links=OrderedDict(),
time_mentions=list(),
self.message_info_content
)
else:
self.controller.show_edit_history.assert_not_called()
Expand All @@ -1072,21 +1070,15 @@ def test_keypress_full_rendered_message(
) -> None:
msg_info_view = MsgInfoView(
self.controller,
message_fixture,
title="Message Information",
topic_links=OrderedDict(),
message_links=OrderedDict(),
time_mentions=list(),
message_info_content=self.message_info_content,
)
size = widget_size(msg_info_view)

msg_info_view.keypress(size, key)

self.controller.show_full_rendered_message.assert_called_once_with(
message=message_fixture,
topic_links=OrderedDict(),
message_links=OrderedDict(),
time_mentions=list(),
self.message_info_content
)

@pytest.mark.parametrize("key", keys_for_command("FULL_RAW_MESSAGE"))
Expand All @@ -1098,21 +1090,15 @@ def test_keypress_full_raw_message(
) -> None:
msg_info_view = MsgInfoView(
self.controller,
message_fixture,
title="Message Information",
topic_links=OrderedDict(),
message_links=OrderedDict(),
time_mentions=list(),
message_info_content=self.message_info_content,
)
size = widget_size(msg_info_view)

msg_info_view.keypress(size, key)

self.controller.show_full_raw_message.assert_called_once_with(
message=message_fixture,
topic_links=OrderedDict(),
message_links=OrderedDict(),
time_mentions=list(),
self.message_info_content
)

@pytest.mark.parametrize(
Expand Down Expand Up @@ -1204,16 +1190,12 @@ def test_height_reactions(
self,
message_fixture: Message,
to_vary_in_each_message: Message,
message_info_content: MessageInfoPopupContent,
) -> None:
varied_message = message_fixture
varied_message.update(to_vary_in_each_message)
message_info_content["message"] = message_fixture
message_info_content["message"].update(to_vary_in_each_message)
self.msg_info_view = MsgInfoView(
self.controller,
varied_message,
"Message Information",
OrderedDict(),
OrderedDict(),
list(),
self.controller, "Message Information", message_info_content
)
# 12 = 7 labels + 2 blank lines + 1 'Reactions' (category)
# + 4 reactions (excluding 'Message Links').
Expand Down
Loading

0 comments on commit 950f3d2

Please sign in to comment.