1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
from unittest import skipUnless
from PIL import Image as PILImage
from PIL import ImageOps
from tests.data import TEST_IMAGE, TEXTUAL_ENABLED
from tests.utils import load_non_seekable_bytes_io
@skipUnless(TEXTUAL_ENABLED, "Textual support disabled")
async def test_app() -> None:
from textual.app import App, ComposeResult
from textual_image.widget import Image
class TestApp(App[None]):
CSS = """
.auto {
width: auto;
height: auto;
}
.fixed {
width: 10;
height: 10;
}
"""
def compose(self) -> ComposeResult:
yield Image(TEST_IMAGE)
yield Image(TEST_IMAGE, classes="auto")
yield Image(TEST_IMAGE, classes="fixed")
yield Image()
yield Image(classes="auto")
app = TestApp()
# Not testing too much reasonable stuff, but, well, at least the code gets executed
async with app.run_test():
with PILImage.open(TEST_IMAGE) as test_image:
app.query_one(Image).image = ImageOps.flip(test_image)
assert app.query_one(Image).image != TEST_IMAGE
@skipUnless(TEXTUAL_ENABLED, "Textual support disabled")
async def test_unseekable_stream() -> None:
from textual.app import App, ComposeResult
from textual_image.widget import Image
image = Image(load_non_seekable_bytes_io(TEST_IMAGE))
class TestApp(App[None]):
def compose(self) -> ComposeResult:
yield image
yield image
yield image
app = TestApp()
# Not testing too much reasonable stuff, but, well, at least the code gets executed
async with app.run_test():
with PILImage.open(TEST_IMAGE) as test_image:
app.query_one(Image).image = ImageOps.flip(test_image)
assert app.query_one(Image).image != TEST_IMAGE
@skipUnless(TEXTUAL_ENABLED, "Textual support disabled")
def test_render_without_image() -> None:
from textual_image.widget import Image
assert Image().render() == ""
|