mirror of https://github.com/JoshKarpel/spiel
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.
90 lines
2.0 KiB
Python
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)
|