mirror of
https://github.com/esphome/esphome.git
synced 2025-09-02 03:12:20 +01:00
59 lines
2.2 KiB
Python
59 lines
2.2 KiB
Python
"""Integration test for API batch_delay: 0 with rapid state transitions."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import asyncio
|
|
import time
|
|
|
|
from aioesphomeapi import BinarySensorInfo, BinarySensorState, EntityState
|
|
import pytest
|
|
|
|
from .types import APIClientConnectedFactory, RunCompiledFunction
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_batch_delay_zero_rapid_transitions(
|
|
yaml_config: str,
|
|
run_compiled: RunCompiledFunction,
|
|
api_client_connected: APIClientConnectedFactory,
|
|
) -> None:
|
|
"""Test that rapid binary sensor transitions are preserved with batch_delay: 0ms."""
|
|
async with run_compiled(yaml_config), api_client_connected() as client:
|
|
# Track state changes
|
|
state_changes: list[tuple[bool, float]] = []
|
|
|
|
def on_state(state: EntityState) -> None:
|
|
"""Track state changes with timestamps."""
|
|
if isinstance(state, BinarySensorState):
|
|
state_changes.append((state.state, time.monotonic()))
|
|
|
|
# Subscribe to state changes
|
|
client.subscribe_states(on_state)
|
|
|
|
# Wait for entity info
|
|
entity_info, _ = await client.list_entities_services()
|
|
binary_sensors = [e for e in entity_info if isinstance(e, BinarySensorInfo)]
|
|
assert len(binary_sensors) == 1, "Expected 1 binary sensor"
|
|
|
|
# Collect states for 2 seconds
|
|
await asyncio.sleep(2.1)
|
|
|
|
# Count ON->OFF transitions
|
|
on_off_count = 0
|
|
for i in range(1, len(state_changes)):
|
|
if state_changes[i - 1][0] and not state_changes[i][0]: # ON to OFF
|
|
on_off_count += 1
|
|
|
|
# With batch_delay: 0, we should capture rapid transitions
|
|
# The test timing can be variable in CI, so we're being conservative
|
|
# We mainly want to verify that we capture multiple rapid transitions
|
|
assert on_off_count >= 5, (
|
|
f"Expected at least 5 ON->OFF transitions with batch_delay: 0ms, got {on_off_count}. "
|
|
"Rapid transitions may have been lost."
|
|
)
|
|
|
|
# Also verify that state changes are happening frequently
|
|
assert len(state_changes) >= 10, (
|
|
f"Expected at least 10 state changes, got {len(state_changes)}"
|
|
)
|