Do not use a naive datetime.now() in BraviaTV (#179806)

This commit is contained in:
Maciej Bieniek
2026-08-22 13:55:39 +02:00
committed by GitHub
parent a3bb68c87e
commit 923ad9d320
2 changed files with 56 additions and 5 deletions
@@ -23,6 +23,7 @@ from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryAuthFailed, HomeAssistantError
from homeassistant.helpers.debounce import Debouncer
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from homeassistant.util import dt as dt_util
from .const import (
CONF_NICKNAME,
@@ -240,11 +241,13 @@ class BraviaTVCoordinator(DataUpdateCoordinator[None]):
self.source = None
if start_datetime := playing_info.get("startDateTime"):
start_datetime = datetime.fromisoformat(start_datetime)
current_datetime = datetime.now().replace(tzinfo=start_datetime.tzinfo) # pylint: disable=home-assistant-enforce-naive-now
self.media_position = int(
(current_datetime - start_datetime).total_seconds()
)
self.media_position_updated_at = datetime.now() # pylint: disable=home-assistant-enforce-naive-now
if start_datetime.tzinfo is None:
start_datetime = start_datetime.replace(
tzinfo=dt_util.get_default_time_zone()
)
now = dt_util.utcnow()
self.media_position = int((now - start_datetime).total_seconds())
self.media_position_updated_at = now
else:
self.media_position = None
self.media_position_updated_at = None
@@ -0,0 +1,48 @@
"""Test the BraviaTV coordinator."""
from datetime import UTC, datetime
from unittest.mock import AsyncMock
import pytest
from homeassistant.components.braviatv.const import CONF_USE_PSK, DOMAIN
from homeassistant.components.braviatv.coordinator import BraviaTVCoordinator
from homeassistant.const import CONF_HOST, CONF_MAC, CONF_PIN
from homeassistant.core import HomeAssistant
from tests.common import MockConfigEntry
@pytest.mark.parametrize(
"start_datetime",
[
"2026-08-22T12:00:00", # naive, treated as local time (CEST UTC+2)
"2026-08-22T12:00:00+02:00", # aware
],
)
@pytest.mark.freeze_time("2026-08-22T12:00:00+00:00")
async def test_async_update_playing(
hass: HomeAssistant,
start_datetime: str,
) -> None:
"""Test updating playing info with a start datetime."""
await hass.config.async_set_time_zone("Europe/Warsaw")
config_entry = MockConfigEntry(
domain=DOMAIN,
data={
CONF_HOST: "localhost",
CONF_MAC: "AA:BB:CC:DD:EE:FF",
CONF_USE_PSK: True,
CONF_PIN: "12345qwerty",
},
)
client = AsyncMock()
client.get_playing_info.return_value = {"startDateTime": start_datetime}
coordinator = BraviaTVCoordinator(hass, config_entry, client)
await coordinator.async_update_playing()
assert coordinator.media_position == 7200
assert coordinator.media_position_updated_at == datetime(
2026, 8, 22, 12, 0, 0, tzinfo=UTC
)