diff --git a/tests/common.py b/tests/common.py index 140f4060d00..b1eec13a851 100644 --- a/tests/common.py +++ b/tests/common.py @@ -380,10 +380,35 @@ fire_mqtt_message = threadsafe_callback_factory(async_fire_mqtt_message) @ha.callback -def async_fire_time_changed( - hass: HomeAssistant, datetime_: datetime = None, fire_all: bool = False +def async_fire_time_changed_exact( + hass: HomeAssistant, datetime_: datetime | None = None, fire_all: bool = False ) -> None: - """Fire a time changed event.""" + """Fire a time changed event at an exact microsecond. + + Consider that its not possible to actually achieve an exact microsecond + in production as the event loop is not precise enough. If your code + relies on this level of precision, consider a different approach + as this is only for testing. + """ + if datetime_ is None: + utc_datetime = date_util.utcnow() + else: + utc_datetime = date_util.as_utc(datetime_) + + _async_fire_time_changed(hass, utc_datetime, fire_all) + + +@ha.callback +def async_fire_time_changed( + hass: HomeAssistant, datetime_: datetime | None = None, fire_all: bool = False +) -> None: + """Fire a time changed event. + + This function will ensure microseconds at at least 500000 + to account for the synchronization repeating listeners. + + If you need to fire an exact microsecond, use async_fire_time_changed_exact. + """ if datetime_ is None: utc_datetime = date_util.utcnow() else: @@ -396,8 +421,14 @@ def async_fire_time_changed( # staggering to avoid thundering herd. utc_datetime = utc_datetime.replace(microsecond=500000) - timestamp = date_util.utc_to_timestamp(utc_datetime) + _async_fire_time_changed(hass, utc_datetime, fire_all) + +@ha.callback +def _async_fire_time_changed( + hass: HomeAssistant, utc_datetime: datetime | None, fire_all: bool +) -> None: + timestamp = date_util.utc_to_timestamp(utc_datetime) for task in list(hass.loop._scheduled): if not isinstance(task, asyncio.TimerHandle): continue diff --git a/tests/components/litejet/test_trigger.py b/tests/components/litejet/test_trigger.py index a06d490cea6..152d11b0c23 100644 --- a/tests/components/litejet/test_trigger.py +++ b/tests/components/litejet/test_trigger.py @@ -12,7 +12,7 @@ import homeassistant.util.dt as dt_util from . import async_init_integration -from tests.common import async_fire_time_changed, async_mock_service +from tests.common import async_fire_time_changed_exact, async_mock_service from tests.components.blueprint.conftest import stub_blueprint_populate # noqa: F401 _LOGGER = logging.getLogger(__name__) @@ -66,7 +66,7 @@ async def simulate_time(hass, mock_litejet, delta): return_value=mock_litejet.start_time + delta, ): _LOGGER.info("now=%s", dt_util.utcnow()) - async_fire_time_changed(hass, mock_litejet.start_time + delta) + async_fire_time_changed_exact(hass, mock_litejet.start_time + delta) await hass.async_block_till_done() _LOGGER.info("done with now=%s", dt_util.utcnow())