|
14 | 14 | MessageLinkButton,
|
15 | 15 | ParsedNarrowLink,
|
16 | 16 | PMButton,
|
| 17 | + SpoilerButton, |
17 | 18 | StarredButton,
|
18 | 19 | StreamButton,
|
19 | 20 | TopButton,
|
@@ -308,6 +309,75 @@ def test_keypress_USER_INFO(
|
308 | 309 | pop_up.assert_called_once_with(user_button.user_id)
|
309 | 310 |
|
310 | 311 |
|
| 312 | +class TestSpoilerButton: |
| 313 | + @pytest.fixture(autouse=True) |
| 314 | + def mock_external_classes(self, mocker: MockerFixture) -> None: |
| 315 | + self.controller = mocker.Mock() |
| 316 | + self.super_init = mocker.patch(MODULE + ".urwid.Button.__init__") |
| 317 | + self.connect_signal = mocker.patch(MODULE + ".urwid.connect_signal") |
| 318 | + |
| 319 | + def spoiler_button( |
| 320 | + self, |
| 321 | + header_len: int = 0, |
| 322 | + header: List[Any] = [""], |
| 323 | + content: List[Any] = [""], |
| 324 | + display_attr: Optional[str] = None, |
| 325 | + ) -> SpoilerButton: |
| 326 | + self.content = content |
| 327 | + self.header_len = header_len |
| 328 | + self.header = header |
| 329 | + self.display_attr = display_attr |
| 330 | + return SpoilerButton(self.controller, header_len, header, content, display_attr) |
| 331 | + |
| 332 | + def test_init(self, mocker: MockerFixture) -> None: |
| 333 | + self.update_widget = mocker.patch(MODULE + ".SpoilerButton.update_widget") |
| 334 | + |
| 335 | + mocked_button = self.spoiler_button() |
| 336 | + |
| 337 | + assert mocked_button.controller == self.controller |
| 338 | + assert mocked_button.content == self.content |
| 339 | + self.super_init.assert_called_once_with("") |
| 340 | + self.update_widget.assert_called_once_with( |
| 341 | + self.header_len, self.header, self.display_attr |
| 342 | + ) |
| 343 | + assert self.connect_signal.called |
| 344 | + |
| 345 | + @pytest.mark.parametrize( |
| 346 | + "header, header_len, expected_cursor_position", |
| 347 | + [ |
| 348 | + (["Test"], 4, 5), |
| 349 | + (["Check"], 5, 6), |
| 350 | + ], |
| 351 | + ) |
| 352 | + def test_update_widget( |
| 353 | + self, |
| 354 | + mocker: MockerFixture, |
| 355 | + header: List[Any], |
| 356 | + header_len: int, |
| 357 | + expected_cursor_position: int, |
| 358 | + display_attr: Optional[str] = None, |
| 359 | + ) -> None: |
| 360 | + self.selectable_icon = mocker.patch(MODULE + ".urwid.SelectableIcon") |
| 361 | + |
| 362 | + # The method update_widget() is called in SpoilerButton's init. |
| 363 | + mocked_button = self.spoiler_button( |
| 364 | + header=header, header_len=header_len, display_attr=display_attr |
| 365 | + ) |
| 366 | + self.selectable_icon.assert_called_once_with( |
| 367 | + header, cursor_position=expected_cursor_position |
| 368 | + ) |
| 369 | + assert isinstance(mocked_button._w, AttrMap) |
| 370 | + |
| 371 | + def test_show_spoiler(self) -> None: |
| 372 | + mocked_button = self.spoiler_button() |
| 373 | + |
| 374 | + mocked_button.show_spoiler() |
| 375 | + |
| 376 | + mocked_button.controller.show_spoiler.assert_called_once_with( |
| 377 | + mocked_button.content |
| 378 | + ) |
| 379 | + |
| 380 | + |
311 | 381 | class TestEmojiButton:
|
312 | 382 | @pytest.mark.parametrize(
|
313 | 383 | "emoji_unit, to_vary_in_message, count",
|
|
0 commit comments