|
5 | 5 |
|
6 | 6 | from zulipterminal.config.keys import is_command_key, keys_for_command
|
7 | 7 | from zulipterminal.ui_tools.views import (
|
8 |
| - AboutView, EditHistoryView, EditModeView, HelpView, MsgInfoView, |
9 |
| - PopUpConfirmationView, PopUpView, StreamInfoView, StreamMembersView, |
| 8 | + AboutView, EditHistoryView, EditModeView, FullMsgView, HelpView, |
| 9 | + MsgInfoView, PopUpConfirmationView, PopUpView, StreamInfoView, |
| 10 | + StreamMembersView, |
10 | 11 | )
|
11 | 12 | from zulipterminal.version import MINIMUM_SUPPORTED_SERVER_VERSION, ZT_VERSION
|
12 | 13 |
|
@@ -177,6 +178,107 @@ def test_feature_level_content(self, mocker, zulip_version):
|
177 | 178 | )
|
178 | 179 |
|
179 | 180 |
|
| 181 | +class TestFullMsgView: |
| 182 | + @pytest.fixture(autouse=True) |
| 183 | + def mock_external_classes(self, mocker, msg_box): |
| 184 | + self.content = msg_box.widget_list[2].original_widget[-1] |
| 185 | + self.controller = mocker.Mock() |
| 186 | + mocker.patch.object(self.controller, 'maximum_popup_dimensions', |
| 187 | + return_value=(64, 64)) |
| 188 | + self.controller.model.client.get_raw_message = ( |
| 189 | + mocker.Mock(return_value={ |
| 190 | + 'result': 'success', |
| 191 | + "raw_content": "**Don't** forget your towel!", |
| 192 | + }) |
| 193 | + ) |
| 194 | + mocker.patch(VIEWS + '.urwid.SimpleFocusListWalker', return_value=[]) |
| 195 | + # NOTE: Given that the FullMsgView just uses the message ID from |
| 196 | + # the message data currently, message_fixture is not used to avoid |
| 197 | + # adding extra test runs unnecessarily. |
| 198 | + self.message = {'id': 1} |
| 199 | + self.full_msg_view = FullMsgView( |
| 200 | + controller=self.controller, |
| 201 | + message=self.message, |
| 202 | + message_links=OrderedDict(), |
| 203 | + time_mentions=list(), |
| 204 | + content=self.content, |
| 205 | + title='Full Message View', |
| 206 | + ) |
| 207 | + |
| 208 | + def test_init(self, msg_box): |
| 209 | + assert self.full_msg_view.controller == self.controller |
| 210 | + assert self.full_msg_view.message == self.message |
| 211 | + assert self.full_msg_view.message_links == OrderedDict() |
| 212 | + assert self.full_msg_view.time_mentions == list() |
| 213 | + assert self.full_msg_view.msg_body[0] == self.content |
| 214 | + assert len(self.full_msg_view.msg_body[1].widget_list) == 2 |
| 215 | + assert self.full_msg_view.focus_tab == 0 |
| 216 | + self.controller.model.client.get_raw_message.assert_called_once_with( |
| 217 | + self.message['id'], |
| 218 | + ) |
| 219 | + |
| 220 | + @pytest.mark.parametrize('key', keys_for_command('MSG_INFO')) |
| 221 | + def test_keypress_exit_popup(self, key, widget_size): |
| 222 | + size = widget_size(self.full_msg_view) |
| 223 | + |
| 224 | + self.full_msg_view.keypress(size, key) |
| 225 | + |
| 226 | + assert self.controller.exit_popup.called |
| 227 | + |
| 228 | + def test_keypress_exit_popup_invalid_key(self, widget_size): |
| 229 | + size = widget_size(self.full_msg_view) |
| 230 | + key = 'a' |
| 231 | + |
| 232 | + self.full_msg_view.keypress(size, key) |
| 233 | + |
| 234 | + assert not self.controller.exit_popup.called |
| 235 | + |
| 236 | + @pytest.mark.parametrize('key', {*keys_for_command('FULL_MSG_VIEW'), |
| 237 | + *keys_for_command('GO_BACK')}) |
| 238 | + def test_keypress_show_msg_info(self, key, widget_size): |
| 239 | + size = widget_size(self.full_msg_view) |
| 240 | + |
| 241 | + self.full_msg_view.keypress(size, key) |
| 242 | + |
| 243 | + self.controller.show_msg_info.assert_called_once_with( |
| 244 | + msg=self.message, |
| 245 | + message_links=OrderedDict(), |
| 246 | + time_mentions=list(), |
| 247 | + ) |
| 248 | + |
| 249 | + def test_keypress_navigation(self, mocker, widget_size, |
| 250 | + navigation_key_expected_key_pair): |
| 251 | + size = widget_size(self.full_msg_view) |
| 252 | + key, expected_key = navigation_key_expected_key_pair |
| 253 | + super_keypress = mocker.patch(VIEWS + '.urwid.ListBox.keypress') |
| 254 | + |
| 255 | + self.full_msg_view.keypress(size, key) |
| 256 | + |
| 257 | + super_keypress.assert_called_once_with(size, expected_key) |
| 258 | + |
| 259 | + @pytest.mark.parametrize('initial_foc_tab, expected_foc_tab', [ |
| 260 | + (0, 1), |
| 261 | + (1, 0), |
| 262 | + ], |
| 263 | + ids=[ |
| 264 | + 'rendered_msg_to_raw_msg', |
| 265 | + 'raw_msg_to_rendered_msg', |
| 266 | + ] |
| 267 | + ) |
| 268 | + @pytest.mark.parametrize("tab_key", |
| 269 | + keys_for_command("CYCLE_COMPOSE_FOCUS")) |
| 270 | + def test_keypress_CYCLE_COMPOSE_FOCUS(self, mocker, initial_foc_tab, |
| 271 | + expected_foc_tab, widget_size, |
| 272 | + tab_key): |
| 273 | + |
| 274 | + self.full_msg_view.focus_tab = initial_foc_tab |
| 275 | + size = widget_size(self.full_msg_view) |
| 276 | + |
| 277 | + self.full_msg_view.keypress(size, tab_key) |
| 278 | + |
| 279 | + assert self.full_msg_view.focus_tab == expected_foc_tab |
| 280 | + |
| 281 | + |
180 | 282 | class TestEditHistoryView:
|
181 | 283 | @pytest.fixture(autouse=True)
|
182 | 284 | def mock_external_classes(self, mocker):
|
|
0 commit comments