mirror of
https://github.com/esphome/esphome.git
synced 2026-10-02 09:20:22 +00:00
Merge remote-tracking branch 'upstream/fix-slow-serial-log-test' into integration
# Conflicts: # .github/workflows/ci.yml # esphome/components/esp32_ble_server/ble_server.cpp # esphome/components/mqtt/mqtt_backend_esp32.cpp # script/cpp_benchmark.py # script/determine-jobs.py
This commit is contained in:
@@ -2,7 +2,104 @@
|
||||
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
from esphome.loader import ComponentManifest
|
||||
from esphome.loader import ComponentManifest, _replace_component_manifest, get_component
|
||||
from tests.testing_helpers import ComponentManifestOverride
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# ComponentManifestOverride
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
def _make_manifest(*, to_code=None, dependencies=None) -> ComponentManifest:
|
||||
"""Return a ComponentManifest backed by a minimal mock module."""
|
||||
mod = MagicMock()
|
||||
mod.to_code = to_code
|
||||
mod.DEPENDENCIES = dependencies or []
|
||||
return ComponentManifest(mod)
|
||||
|
||||
|
||||
def test_testing_manifest_delegates_to_wrapped() -> None:
|
||||
"""Unoverridden attributes fall through to the wrapped manifest."""
|
||||
inner = _make_manifest(dependencies=["wifi"])
|
||||
tm = ComponentManifestOverride(inner)
|
||||
assert tm.dependencies == ["wifi"]
|
||||
|
||||
|
||||
def test_testing_manifest_override_shadows_wrapped() -> None:
|
||||
"""An assigned attribute shadows the wrapped value."""
|
||||
inner = _make_manifest(dependencies=["wifi"])
|
||||
tm = ComponentManifestOverride(inner)
|
||||
tm.dependencies = ["ble"]
|
||||
assert tm.dependencies == ["ble"]
|
||||
# Wrapped value unchanged
|
||||
assert inner.dependencies == ["wifi"]
|
||||
|
||||
|
||||
def test_testing_manifest_to_code_suppression() -> None:
|
||||
"""Setting to_code=None suppresses code generation."""
|
||||
|
||||
async def real_to_code(config):
|
||||
pass
|
||||
|
||||
inner = _make_manifest(to_code=real_to_code)
|
||||
tm = ComponentManifestOverride(inner)
|
||||
tm.to_code = None
|
||||
assert tm.to_code is None
|
||||
|
||||
|
||||
def test_testing_manifest_enable_codegen_removes_suppression() -> None:
|
||||
"""enable_codegen() removes the to_code override, restoring the original."""
|
||||
|
||||
async def real_to_code(config):
|
||||
pass
|
||||
|
||||
inner = _make_manifest(to_code=real_to_code)
|
||||
tm = ComponentManifestOverride(inner)
|
||||
tm.to_code = None
|
||||
assert tm.to_code is None
|
||||
|
||||
tm.enable_codegen()
|
||||
assert tm.to_code is real_to_code
|
||||
|
||||
|
||||
def test_testing_manifest_enable_codegen_preserves_other_overrides() -> None:
|
||||
"""enable_codegen() only removes to_code; other overrides survive."""
|
||||
inner = _make_manifest(dependencies=["wifi"])
|
||||
tm = ComponentManifestOverride(inner)
|
||||
tm.to_code = None
|
||||
tm.dependencies = ["ble"]
|
||||
|
||||
tm.enable_codegen()
|
||||
|
||||
assert tm.to_code is inner.to_code
|
||||
assert tm.dependencies == ["ble"]
|
||||
|
||||
|
||||
def test_testing_manifest_restore_clears_all_overrides() -> None:
|
||||
"""restore() removes every override, reverting all attributes to wrapped values."""
|
||||
|
||||
async def real_to_code(config):
|
||||
pass
|
||||
|
||||
inner = _make_manifest(to_code=real_to_code, dependencies=["wifi"])
|
||||
tm = ComponentManifestOverride(inner)
|
||||
tm.to_code = None
|
||||
tm.dependencies = ["ble"]
|
||||
|
||||
tm.restore()
|
||||
|
||||
assert tm.to_code is real_to_code
|
||||
assert tm.dependencies == ["wifi"]
|
||||
|
||||
|
||||
def test_replace_component_manifest_installs_override() -> None:
|
||||
"""_replace_component_manifest replaces the cached manifest for a domain."""
|
||||
inner = _make_manifest()
|
||||
override = ComponentManifestOverride(inner)
|
||||
|
||||
_replace_component_manifest("_test_dummy_domain", override)
|
||||
|
||||
assert get_component("_test_dummy_domain") is override
|
||||
|
||||
|
||||
def test_component_manifest_resources_with_filter_source_files() -> None:
|
||||
|
||||
@@ -167,6 +167,13 @@ def mock_run_miniterm() -> Generator[Mock]:
|
||||
yield mock
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_wait_for_serial_port() -> Generator[Mock]:
|
||||
"""Mock _wait_for_serial_port for testing."""
|
||||
with patch("esphome.__main__._wait_for_serial_port") as mock:
|
||||
yield mock
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_upload_using_esptool() -> Generator[Mock]:
|
||||
"""Mock upload_using_esptool for testing."""
|
||||
@@ -1706,6 +1713,7 @@ def test_show_logs_serial(
|
||||
mock_get_port_type: Mock,
|
||||
mock_check_permissions: Mock,
|
||||
mock_run_miniterm: Mock,
|
||||
mock_wait_for_serial_port: Mock,
|
||||
) -> None:
|
||||
"""Test show_logs with serial port."""
|
||||
setup_core(config={"logger": {}}, platform=PLATFORM_ESP32)
|
||||
|
||||
Reference in New Issue
Block a user