You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
spiel/tests/widgets/test_slide_widget.py

90 lines
2.0 KiB
Python

import pytest
from pytest import FixtureRequest
from pytest_mock import MockerFixture
from rich.console import RenderableType
from rich.panel import Panel
from rich.text import Text
from spiel import Slide
from spiel.widgets.slide import SlideWidget
@pytest.fixture(params=["", Text()])
def slide(request: FixtureRequest) -> Slide:
def content() -> RenderableType:
return request.param
return Slide(content=content)
@pytest.fixture
def error_slide() -> Slide:
def content() -> RenderableType:
raise Exception()
return Slide(content=content)
@pytest.fixture
def unrenderable_slide() -> Slide:
def content() -> None:
return None
return Slide(content=content) # type: ignore[arg-type]
def mock(mocker: MockerFixture, slide: Slide) -> SlideWidget:
sw = SlideWidget()
mocker.patch.object(
type(sw),
"current_slide",
new_callable=mocker.PropertyMock,
return_value=slide,
)
assert sw.current_slide is slide
return sw
def test_render(mocker: MockerFixture, slide: Slide) -> None:
sw = mock(mocker, slide)
assert sw.render() == slide.render(triggers=sw.triggers)
assert "error" not in sw.classes
def test_render_raises_exception(mocker: MockerFixture, error_slide: Slide) -> None:
sw = mock(mocker, error_slide)
error = sw.render()
assert isinstance(error, Panel)
assert error.title == "Slide content failed to render"
assert "error" in sw.classes
def test_render_content_not_renderable(mocker: MockerFixture, unrenderable_slide: Slide) -> None:
sw = mock(mocker, unrenderable_slide)
error = sw.render()
assert isinstance(error, Panel)
assert error.title == "Slide content failed to render"
assert "error" in sw.classes
def test_update_triggers() -> None:
sw = SlideWidget()
initial_triggers = sw.triggers
sw.update_triggers()
assert initial_triggers.now <= sw.triggers.now
assert list(initial_triggers) == list(sw.triggers)