mirror of https://github.com/JoshKarpel/spiel
Catch un-renderable slide content at runtime (#202)
parent
de3a57d9ce
commit
99961a38b2
@ -0,0 +1,51 @@
|
||||
from collections.abc import Iterable
|
||||
from itertools import combinations_with_replacement
|
||||
|
||||
import pytest
|
||||
from hypothesis import given
|
||||
from hypothesis.strategies import lists, sampled_from
|
||||
|
||||
import spiel.constants
|
||||
from spiel.app import SpielApp
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def app() -> SpielApp:
|
||||
return SpielApp(deck_path=spiel.constants.DEMO_FILE)
|
||||
|
||||
|
||||
KEYS = [
|
||||
"right",
|
||||
"left",
|
||||
"d",
|
||||
"t",
|
||||
"enter",
|
||||
"up",
|
||||
"down",
|
||||
"escape",
|
||||
"question_mark",
|
||||
]
|
||||
|
||||
|
||||
@pytest.mark.slow
|
||||
@given(keys=lists(elements=sampled_from(KEYS), max_size=100))
|
||||
async def test_hammer_on_the_keyboard_long_random(keys: Iterable[str]) -> None:
|
||||
app = SpielApp(deck_path=spiel.constants.DEMO_FILE)
|
||||
async with app.run_test() as pilot:
|
||||
await pilot.press(*keys)
|
||||
|
||||
|
||||
@pytest.mark.slow
|
||||
@pytest.mark.parametrize("keys", combinations_with_replacement(KEYS, 3))
|
||||
async def test_hammer_on_the_keyboard_short_exhaustive(app: SpielApp, keys: Iterable[str]) -> None:
|
||||
async with app.run_test() as pilot:
|
||||
await pilot.press(*keys)
|
||||
|
||||
|
||||
async def test_advance_through_demo_slides(app: SpielApp) -> None:
|
||||
async with app.run_test() as pilot:
|
||||
keys = ("right",) * (len(app.deck) + 1)
|
||||
|
||||
await pilot.press(*keys)
|
||||
|
||||
assert app.current_slide_idx == len(app.deck) - 1
|
@ -0,0 +1,89 @@
|
||||
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)
|
Loading…
Reference in New Issue