class TestMsgInfoView: @pytest.fixture(autouse=True) def mock_external_classes(self, mocker, monkeypatch, message_fixture): self.controller = mocker.Mock() mocker.patch.object(self.controller, "maximum_popup_dimensions", return_value=(64, 64)) mocker.patch(VIEWS + ".urwid.SimpleFocusListWalker", return_value=[]) # The subsequent patches (index and initial_data) set # show_edit_history_label to False for this autoused fixture. self.controller.model.index = {"edited_messages": set()} self.controller.model.initial_data = { "realm_allow_edit_history": False, } self.controller.model.formatted_local_time.side_effect = [ "Tue Mar 13 10:55:22", "Tue Mar 13 10:55:37", ] self.msg_info_view = MsgInfoView( self.controller, message_fixture, "Message Information", OrderedDict(), OrderedDict(), list(), ) def test_init(self, message_fixture): 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() def test_keypress_any_key(self, widget_size): key = "a" size = widget_size(self.msg_info_view) self.msg_info_view.keypress(size, key) assert not self.controller.exit_popup.called @pytest.mark.parametrize("key", keys_for_command("EDIT_HISTORY")) @pytest.mark.parametrize("realm_allow_edit_history", [True, False]) @pytest.mark.parametrize( "edited_message_id", [ 537286, 537287, 537288, ], ids=[ "stream_message_id", "pm_message_id", "group_pm_message_id", ], ) def test_keypress_edit_history( self, message_fixture, key, widget_size, realm_allow_edit_history, edited_message_id, ): self.controller.model.index = { "edited_messages": set([edited_message_id]), } self.controller.model.initial_data = { "realm_allow_edit_history": realm_allow_edit_history, } msg_info_view = MsgInfoView( self.controller, message_fixture, title="Message Information", topic_links=OrderedDict(), message_links=OrderedDict(), time_mentions=list(), ) 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(), ) else: self.controller.show_edit_history.assert_not_called() @pytest.mark.parametrize( "key", {*keys_for_command("GO_BACK"), *keys_for_command("MSG_INFO")}) def test_keypress_exit_popup(self, key, widget_size): size = widget_size(self.msg_info_view) self.msg_info_view.keypress(size, key) assert self.controller.exit_popup.called def test_height_noreactions(self): expected_height = 3 assert self.msg_info_view.height == expected_height # FIXME This is the same parametrize as MessageBox:test_reactions_view @pytest.mark.parametrize( "to_vary_in_each_message", [{ "reactions": [ { "emoji_name": "thumbs_up", "emoji_code": "1f44d", "user": { "email": "*****@*****.**", "full_name": "Iago", "id": 5, }, "reaction_type": "unicode_emoji", }, { "emoji_name": "zulip", "emoji_code": "zulip", "user": { "email": "*****@*****.**", "full_name": "Iago", "id": 5, }, "reaction_type": "zulip_extra_emoji", }, { "emoji_name": "zulip", "emoji_code": "zulip", "user": { "email": "*****@*****.**", "full_name": "aaron", "id": 1, }, "reaction_type": "zulip_extra_emoji", }, { "emoji_name": "heart", "emoji_code": "2764", "user": { "email": "*****@*****.**", "full_name": "Iago", "id": 5, }, "reaction_type": "unicode_emoji", }, ] }], ) def test_height_reactions(self, message_fixture, to_vary_in_each_message): varied_message = dict(message_fixture, **to_vary_in_each_message) self.msg_info_view = MsgInfoView( self.controller, varied_message, "Message Information", OrderedDict(), OrderedDict(), list(), ) # 9 = 3 labels + 1 blank line + 1 'Reactions' (category) + 4 reactions. expected_height = 9 assert self.msg_info_view.height == expected_height @pytest.mark.parametrize( [ "initial_link", "expected_text", "expected_attr_map", "expected_focus_map", "expected_link_width", ], [ ( OrderedDict([("https://bar.com", ("Foo", 1, True))]), "1: Foo\nhttps://bar.com", { None: "popup_contrast" }, { None: "selected" }, 15, ), ( OrderedDict([("https://foo.com", ("", 1, True))]), "1: https://foo.com", { None: "popup_contrast" }, { None: "selected" }, 18, ), ], ids=[ "link_with_link_text", "link_without_link_text", ], ) def test_create_link_buttons( self, initial_link, expected_text, expected_attr_map, expected_focus_map, expected_link_width, ): [link_w], link_width = self.msg_info_view.create_link_buttons( self.controller, initial_link) assert [link_w.link] == list(initial_link) assert link_w._wrapped_widget.original_widget.text == expected_text assert link_w._wrapped_widget.focus_map == expected_focus_map assert link_w._wrapped_widget.attr_map == expected_attr_map assert link_width == expected_link_width def test_keypress_navigation(self, mocker, widget_size, navigation_key_expected_key_pair): key, expected_key = navigation_key_expected_key_pair size = widget_size(self.msg_info_view) super_keypress = mocker.patch(VIEWS + ".urwid.ListBox.keypress") self.msg_info_view.keypress(size, key) super_keypress.assert_called_once_with(size, expected_key)
class TestMsgInfoView: @pytest.fixture(autouse=True) def mock_external_classes(self, mocker, monkeypatch, message_fixture): self.controller = mocker.Mock() mocker.patch.object(self.controller, 'maximum_popup_dimensions', return_value=(64, 64)) mocker.patch(VIEWS + ".urwid.SimpleFocusListWalker", return_value=[]) # The subsequent patches (index and initial_data) set # show_edit_history_label to False for this autoused fixture. self.controller.model.index = {'edited_messages': set()} self.controller.model.initial_data = { 'realm_allow_edit_history': False, } self.controller.model.formatted_local_time.side_effect = [ "Tue Mar 13 10:55:22", "Tue Mar 13 10:55:37", ] self.msg_info_view = MsgInfoView(self.controller, message_fixture, 'Message Information', OrderedDict(), OrderedDict(), list()) def test_init(self, message_fixture): 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() def test_keypress_any_key(self, widget_size): key = "a" size = widget_size(self.msg_info_view) self.msg_info_view.keypress(size, key) assert not self.controller.exit_popup.called @pytest.mark.parametrize('key', keys_for_command('EDIT_HISTORY')) @pytest.mark.parametrize('realm_allow_edit_history', [True, False]) @pytest.mark.parametrize('edited_message_id', [ 537286, 537287, 537288, ], ids=[ 'stream_message_id', 'pm_message_id', 'group_pm_message_id', ]) def test_keypress_edit_history(self, message_fixture, key, widget_size, realm_allow_edit_history, edited_message_id): self.controller.model.index = { 'edited_messages': set([edited_message_id]), } self.controller.model.initial_data = { 'realm_allow_edit_history': realm_allow_edit_history, } msg_info_view = MsgInfoView(self.controller, message_fixture, title='Message Information', topic_links=OrderedDict(), message_links=OrderedDict(), time_mentions=list()) 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(), ) else: self.controller.show_edit_history.assert_not_called() @pytest.mark.parametrize( 'key', {*keys_for_command('GO_BACK'), *keys_for_command('MSG_INFO')}) def test_keypress_exit_popup(self, key, widget_size): size = widget_size(self.msg_info_view) self.msg_info_view.keypress(size, key) assert self.controller.exit_popup.called def test_height_noreactions(self): expected_height = 3 assert self.msg_info_view.height == expected_height # FIXME This is the same parametrize as MessageBox:test_reactions_view @pytest.mark.parametrize('to_vary_in_each_message', [{ 'reactions': [{ 'emoji_name': 'thumbs_up', 'emoji_code': '1f44d', 'user': { 'email': '*****@*****.**', 'full_name': 'Iago', 'id': 5, }, 'reaction_type': 'unicode_emoji' }, { 'emoji_name': 'zulip', 'emoji_code': 'zulip', 'user': { 'email': '*****@*****.**', 'full_name': 'Iago', 'id': 5, }, 'reaction_type': 'zulip_extra_emoji' }, { 'emoji_name': 'zulip', 'emoji_code': 'zulip', 'user': { 'email': '*****@*****.**', 'full_name': 'aaron', 'id': 1, }, 'reaction_type': 'zulip_extra_emoji' }, { 'emoji_name': 'heart', 'emoji_code': '2764', 'user': { 'email': '*****@*****.**', 'full_name': 'Iago', 'id': 5, }, 'reaction_type': 'unicode_emoji' }] }]) def test_height_reactions(self, message_fixture, to_vary_in_each_message): varied_message = dict(message_fixture, **to_vary_in_each_message) self.msg_info_view = MsgInfoView(self.controller, varied_message, 'Message Information', OrderedDict(), OrderedDict(), list()) # 9 = 3 labels + 1 blank line + 1 'Reactions' (category) + 4 reactions. expected_height = 9 assert self.msg_info_view.height == expected_height @pytest.mark.parametrize([ 'initial_link', 'expected_text', 'expected_attr_map', 'expected_focus_map', 'expected_link_width' ], [( OrderedDict([('https://bar.com', ('Foo', 1, True))]), '1: Foo\nhttps://bar.com', { None: 'popup_contrast' }, { None: 'selected' }, 15, ), ( OrderedDict([('https://foo.com', ('', 1, True))]), '1: https://foo.com', { None: 'popup_contrast' }, { None: 'selected' }, 18, )], ids=[ 'link_with_link_text', 'link_without_link_text', ]) def test_create_link_buttons(self, initial_link, expected_text, expected_attr_map, expected_focus_map, expected_link_width): [link_w], link_width = self.msg_info_view.create_link_buttons( self.controller, initial_link, ) assert [link_w.link] == list(initial_link) assert (link_w._wrapped_widget.original_widget.text == expected_text) assert (link_w._wrapped_widget.focus_map == expected_focus_map) assert (link_w._wrapped_widget.attr_map == expected_attr_map) assert link_width == expected_link_width def test_keypress_navigation(self, mocker, widget_size, navigation_key_expected_key_pair): key, expected_key = navigation_key_expected_key_pair size = widget_size(self.msg_info_view) super_keypress = mocker.patch(VIEWS + '.urwid.ListBox.keypress') self.msg_info_view.keypress(size, key) super_keypress.assert_called_once_with(size, expected_key)