Files
esphome/tests/component_tests/lvgl/test_multi_conf_validate.py
T
2026-07-29 13:08:52 -04:00

56 lines
2.0 KiB
Python

"""Tests for LVGL's multi-instance config cross-checks."""
from __future__ import annotations
import pytest
from esphome.components.lvgl import defines as df, multi_conf_validate
from esphome.components.lvgl.schemas import theme_schema
from esphome.config_validation import Invalid
def _config(displays: list[str], theme: dict | None = None) -> dict:
config = {
df.CONF_DISPLAYS: displays,
"log_level": "WARN",
"color_depth": 16,
"byte_order": "big_endian",
df.CONF_TRANSPARENCY_KEY: 0x000400,
}
if theme is not None:
config[df.CONF_THEME] = theme
return config
class TestThemeOnMultipleInstances:
def test_raises_when_two_instances_have_theme(self) -> None:
configs = [
_config(["disp_a"], theme={df.CONF_DARK_MODE: True}),
_config(["disp_b"], theme={df.CONF_DARK_MODE: False}),
]
with pytest.raises(Invalid, match="'theme' may only be set on one"):
multi_conf_validate(configs)
def test_raises_even_with_an_empty_theme_block(self) -> None:
# `theme: {}` still creates a CONF_THEME key (with dark_mode defaulted
# by the schema), so it should be treated the same as a populated one.
# Run it through the real schema rather than hand-building the dict,
# so this actually pins that defaulting behaviour.
configs = [
_config(["disp_a"], theme=theme_schema({})),
_config(["disp_b"], theme=theme_schema({})),
]
with pytest.raises(Invalid, match="'theme' may only be set on one"):
multi_conf_validate(configs)
def test_passes_when_only_one_instance_has_theme(self) -> None:
configs = [
_config(["disp_a"], theme={df.CONF_DARK_MODE: True}),
_config(["disp_b"]),
]
multi_conf_validate(configs)
def test_passes_when_no_instance_has_theme(self) -> None:
configs = [_config(["disp_a"]), _config(["disp_b"])]
multi_conf_validate(configs)