84 lines
2.5 KiB
Python
84 lines
2.5 KiB
Python
# tests/test_image_maker.py
|
|
|
|
import pytest
|
|
from PIL import Image
|
|
from display.image_maker import closest, eInkImage
|
|
|
|
|
|
def test_closest_math_logic():
|
|
# Test that your wind direction logic snaps to the correct cardinal degree
|
|
angles = [0, 45, 90, 135, 180, 225, 270, 315]
|
|
|
|
assert closest(angles, 10) == 0 # 10 is closest to 0
|
|
assert closest(angles, 85) == 90 # 85 is closest to 90
|
|
assert closest(angles, 190) == 180 # 190 is closest to 180
|
|
assert closest(angles, 100) == 90
|
|
|
|
|
|
def test_make_image_compilation():
|
|
"""
|
|
Tests the entire Pillow drawing loop.
|
|
If you miss a .get() check or use an invalid font size, this test will catch it.
|
|
"""
|
|
image_maker = eInkImage()
|
|
|
|
# A perfectly standard mock payload simulating SMHI and sensors
|
|
dummy_weather_data = {
|
|
"indoor_temp": 22.5,
|
|
"indoor_humidity": 45,
|
|
"pressure": 1013,
|
|
"sunrise": "06:30",
|
|
"sunset": "18:45",
|
|
"moon_illumination": 0.8,
|
|
"moon_phase": "Fullmåne",
|
|
"moon_to_full": False,
|
|
"temperature": 15.2,
|
|
"humidity": 60,
|
|
"dew": 5.0,
|
|
"uv_index": 3,
|
|
"fire_index": 1,
|
|
"weather_alerts": [],
|
|
"forecast": {
|
|
"wind": {"deg": 180, "speed": 5.0, "gust": 7.5},
|
|
"weather_symbol": 1,
|
|
},
|
|
}
|
|
|
|
try:
|
|
# Generate the image
|
|
img = image_maker.make_image(
|
|
date=("Torsdag, 19 mars 2026", "22:10"),
|
|
weather_data=dummy_weather_data,
|
|
network_status=True,
|
|
)
|
|
|
|
# Verify it successfully created an image object
|
|
assert isinstance(img, Image.Image)
|
|
|
|
# Verify the dimensions match your Waveshare 4.2inch E-ink display
|
|
assert img.size == (400, 300)
|
|
|
|
# Verify it converted it to a 1-bit color palette (pure black and white) for the e-ink screen
|
|
assert img.mode == "L"
|
|
|
|
except Exception as e:
|
|
pytest.fail(f"Image generation crashed with valid data: {e}")
|
|
|
|
|
|
def test_make_image_with_missing_data():
|
|
"""
|
|
Tests that the image maker doesn't crash if the internet is down
|
|
and the weather data is mostly empty.
|
|
"""
|
|
image_maker = eInkImage()
|
|
|
|
try:
|
|
img = image_maker.make_image(
|
|
date=("Torsdag, 19 mars 2026", "22:10"),
|
|
weather_data={},
|
|
network_status=False,
|
|
)
|
|
assert isinstance(img, Image.Image)
|
|
except Exception as e:
|
|
pytest.fail(f"Image generation crashed when weather data was missing: {e}")
|