Always setup demo platforms with device support from config entry (#94586)

* Always setup demo platforms with device support from config entry

* Adjust test fixutres

* Update tests depending on the demo integration
This commit is contained in:
Erik Montnemery 2023-06-14 16:50:35 +02:00 committed by GitHub
parent 1b8c72e644
commit 9a3077d64a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
54 changed files with 491 additions and 351 deletions

View file

@ -63,9 +63,6 @@ CONFIG_SCHEMA = cv.empty_config_schema(DOMAIN)
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
"""Set up the demo environment.""" """Set up the demo environment."""
if DOMAIN not in config:
return True
if not hass.config_entries.async_entries(DOMAIN): if not hass.config_entries.async_entries(DOMAIN):
hass.async_create_task( hass.async_create_task(
hass.config_entries.flow.async_init( hass.config_entries.flow.async_init(
@ -73,6 +70,9 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
) )
) )
if DOMAIN not in config:
return True
# Set up demo platforms # Set up demo platforms
for platform in COMPONENTS_WITH_DEMO_PLATFORM: for platform in COMPONENTS_WITH_DEMO_PLATFORM:
hass.async_create_task(async_load_platform(hass, platform, DOMAIN, {}, config)) hass.async_create_task(async_load_platform(hass, platform, DOMAIN, {}, config))

View file

@ -9,18 +9,16 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from . import DOMAIN from . import DOMAIN
async def async_setup_platform( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config: ConfigType, config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None,
) -> None: ) -> None:
"""Set up the Demo binary sensor platform.""" """Set up the demo binary sensor platform."""
async_add_entities( async_add_entities(
[ [
DemoBinarySensor( DemoBinarySensor(
@ -36,42 +34,30 @@ async def async_setup_platform(
) )
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the Demo config entry."""
await async_setup_platform(hass, {}, async_add_entities)
class DemoBinarySensor(BinarySensorEntity): class DemoBinarySensor(BinarySensorEntity):
"""representation of a Demo binary sensor.""" """representation of a Demo binary sensor."""
_attr_has_entity_name = True
_attr_should_poll = False _attr_should_poll = False
def __init__( def __init__(
self, self,
unique_id: str, unique_id: str,
name: str, device_name: str,
state: bool, state: bool,
device_class: BinarySensorDeviceClass, device_class: BinarySensorDeviceClass,
) -> None: ) -> None:
"""Initialize the demo sensor.""" """Initialize the demo sensor."""
self._unique_id = unique_id self._unique_id = unique_id
self._attr_name = name self._attr_name = None
self._state = state self._state = state
self._attr_device_class = device_class self._attr_device_class = device_class
self._attr_device_info = DeviceInfo(
@property
def device_info(self) -> DeviceInfo:
"""Return device info."""
return DeviceInfo(
identifiers={ identifiers={
# Serial numbers are unique identifiers within a specific domain # Serial numbers are unique identifiers within a specific domain
(DOMAIN, self.unique_id) (DOMAIN, self.unique_id)
}, },
name=self.name, name=device_name,
) )
@property @property

View file

@ -4,59 +4,47 @@ from __future__ import annotations
from homeassistant.components import persistent_notification from homeassistant.components import persistent_notification
from homeassistant.components.button import ButtonEntity from homeassistant.components.button import ButtonEntity
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import DEVICE_DEFAULT_NAME
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from . import DOMAIN from . import DOMAIN
async def async_setup_platform(
hass: HomeAssistant,
config: ConfigType,
async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None,
) -> None:
"""Set up the demo Button entity."""
async_add_entities(
[
DemoButton(
unique_id="push",
name="Push",
icon="mdi:gesture-tap-button",
),
]
)
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up the Demo config entry.""" """Set up the demo button platform."""
await async_setup_platform(hass, {}, async_add_entities) async_add_entities(
[
DemoButton(
unique_id="push",
device_name="Push",
icon="mdi:gesture-tap-button",
),
]
)
class DemoButton(ButtonEntity): class DemoButton(ButtonEntity):
"""Representation of a demo button entity.""" """Representation of a demo button entity."""
_attr_has_entity_name = True
_attr_should_poll = False _attr_should_poll = False
def __init__( def __init__(
self, self,
unique_id: str, unique_id: str,
name: str, device_name: str,
icon: str, icon: str,
) -> None: ) -> None:
"""Initialize the Demo button entity.""" """Initialize the Demo button entity."""
self._attr_unique_id = unique_id self._attr_unique_id = unique_id
self._attr_name = name or DEVICE_DEFAULT_NAME
self._attr_icon = icon self._attr_icon = icon
self._attr_device_info = { self._attr_device_info = {
"identifiers": {(DOMAIN, unique_id)}, "identifiers": {(DOMAIN, unique_id)},
"name": name, "name": device_name,
} }
async def async_press(self) -> None: async def async_press(self) -> None:

View file

@ -7,22 +7,6 @@ from homeassistant.components.camera import Camera, CameraEntityFeature
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
async def async_setup_platform(
hass: HomeAssistant,
config: ConfigType,
async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None,
) -> None:
"""Set up the Demo camera platform."""
async_add_entities(
[
DemoCamera("Demo camera", "image/jpg"),
DemoCamera("Demo camera png", "image/png"),
]
)
async def async_setup_entry( async def async_setup_entry(
@ -31,7 +15,12 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up the Demo config entry.""" """Set up the Demo config entry."""
await async_setup_platform(hass, {}, async_add_entities) async_add_entities(
[
DemoCamera("Demo camera", "image/jpg"),
DemoCamera("Demo camera png", "image/png"),
]
)
class DemoCamera(Camera): class DemoCamera(Camera):

View file

@ -14,27 +14,24 @@ from homeassistant.components.climate import (
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ATTR_TEMPERATURE, UnitOfTemperature from homeassistant.const import ATTR_TEMPERATURE, UnitOfTemperature
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from . import DOMAIN from . import DOMAIN
SUPPORT_FLAGS = ClimateEntityFeature(0) SUPPORT_FLAGS = ClimateEntityFeature(0)
async def async_setup_platform( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config: ConfigType, config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None,
) -> None: ) -> None:
"""Set up the Demo climate devices.""" """Set up the demo climate platform."""
async_add_entities( async_add_entities(
[ [
DemoClimate( DemoClimate(
unique_id="climate_1", unique_id="climate_1",
name="HeatPump", device_name="HeatPump",
target_temperature=68, target_temperature=68,
unit_of_measurement=UnitOfTemperature.FAHRENHEIT, unit_of_measurement=UnitOfTemperature.FAHRENHEIT,
preset=None, preset=None,
@ -52,7 +49,7 @@ async def async_setup_platform(
), ),
DemoClimate( DemoClimate(
unique_id="climate_2", unique_id="climate_2",
name="Hvac", device_name="Hvac",
target_temperature=21, target_temperature=21,
unit_of_measurement=UnitOfTemperature.CELSIUS, unit_of_measurement=UnitOfTemperature.CELSIUS,
preset=None, preset=None,
@ -70,7 +67,7 @@ async def async_setup_platform(
), ),
DemoClimate( DemoClimate(
unique_id="climate_3", unique_id="climate_3",
name="Ecobee", device_name="Ecobee",
target_temperature=None, target_temperature=None,
unit_of_measurement=UnitOfTemperature.CELSIUS, unit_of_measurement=UnitOfTemperature.CELSIUS,
preset="home", preset="home",
@ -91,25 +88,17 @@ async def async_setup_platform(
) )
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the Demo climate devices config entry."""
await async_setup_platform(hass, {}, async_add_entities)
class DemoClimate(ClimateEntity): class DemoClimate(ClimateEntity):
"""Representation of a demo climate device.""" """Representation of a demo climate device."""
_attr_has_entity_name = True
_attr_should_poll = False _attr_should_poll = False
_attr_translation_key = "ubercool" _attr_translation_key = "ubercool"
def __init__( def __init__(
self, self,
unique_id: str, unique_id: str,
name: str, device_name: str,
target_temperature: float | None, target_temperature: float | None,
unit_of_measurement: str, unit_of_measurement: str,
preset: str | None, preset: str | None,
@ -128,7 +117,6 @@ class DemoClimate(ClimateEntity):
) -> None: ) -> None:
"""Initialize the climate device.""" """Initialize the climate device."""
self._unique_id = unique_id self._unique_id = unique_id
self._attr_name = name
self._attr_supported_features = SUPPORT_FLAGS self._attr_supported_features = SUPPORT_FLAGS
if target_temperature is not None: if target_temperature is not None:
self._attr_supported_features |= ClimateEntityFeature.TARGET_TEMPERATURE self._attr_supported_features |= ClimateEntityFeature.TARGET_TEMPERATURE
@ -163,17 +151,10 @@ class DemoClimate(ClimateEntity):
self._swing_modes = ["auto", "1", "2", "3", "off"] self._swing_modes = ["auto", "1", "2", "3", "off"]
self._target_temperature_high = target_temp_high self._target_temperature_high = target_temp_high
self._target_temperature_low = target_temp_low self._target_temperature_low = target_temp_low
self._attr_device_info = {
@property "identifiers": {(DOMAIN, unique_id)},
def device_info(self) -> DeviceInfo: "name": device_name,
"""Return device info.""" }
return DeviceInfo(
identifiers={
# Serial numbers are unique identifiers within a specific domain
(DOMAIN, self.unique_id)
},
name=self.name,
)
@property @property
def unique_id(self) -> str: def unique_id(self) -> str:

View file

@ -16,18 +16,16 @@ from homeassistant.core import CALLBACK_TYPE, HomeAssistant, callback
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.event import async_track_utc_time_change from homeassistant.helpers.event import async_track_utc_time_change
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from . import DOMAIN from . import DOMAIN
async def async_setup_platform( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config: ConfigType, config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None,
) -> None: ) -> None:
"""Set up the Demo covers.""" """Set up the demo cover platform."""
async_add_entities( async_add_entities(
[ [
DemoCover(hass, "cover_1", "Kitchen Window"), DemoCover(hass, "cover_1", "Kitchen Window"),
@ -56,25 +54,17 @@ async def async_setup_platform(
) )
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the Demo config entry."""
await async_setup_platform(hass, {}, async_add_entities)
class DemoCover(CoverEntity): class DemoCover(CoverEntity):
"""Representation of a demo cover.""" """Representation of a demo cover."""
_attr_has_entity_name = True
_attr_should_poll = False _attr_should_poll = False
def __init__( def __init__(
self, self,
hass: HomeAssistant, hass: HomeAssistant,
unique_id: str, unique_id: str,
name: str, device_name: str,
position: int | None = None, position: int | None = None,
tilt_position: int | None = None, tilt_position: int | None = None,
device_class: CoverDeviceClass | None = None, device_class: CoverDeviceClass | None = None,
@ -83,7 +73,6 @@ class DemoCover(CoverEntity):
"""Initialize the cover.""" """Initialize the cover."""
self.hass = hass self.hass = hass
self._unique_id = unique_id self._unique_id = unique_id
self._attr_name = name
self._position = position self._position = position
self._attr_device_class = device_class self._attr_device_class = device_class
self._attr_supported_features = supported_features self._attr_supported_features = supported_features
@ -101,15 +90,12 @@ class DemoCover(CoverEntity):
else: else:
self._closed = position <= 0 self._closed = position <= 0
@property self._attr_device_info = DeviceInfo(
def device_info(self) -> DeviceInfo:
"""Return device info."""
return DeviceInfo(
identifiers={ identifiers={
# Serial numbers are unique identifiers within a specific domain # Serial numbers are unique identifiers within a specific domain
(DOMAIN, self.unique_id) (DOMAIN, self.unique_id)
}, },
name=self.name, name=device_name,
) )
@property @property

View file

@ -5,22 +5,19 @@ from datetime import date
from homeassistant.components.date import DateEntity from homeassistant.components.date import DateEntity
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import DEVICE_DEFAULT_NAME
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from . import DOMAIN from . import DOMAIN
async def async_setup_platform( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config: ConfigType, config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None,
) -> None: ) -> None:
"""Set up the Demo date entity.""" """Set up the demo date platform."""
async_add_entities( async_add_entities(
[ [
DemoDate( DemoDate(
@ -34,24 +31,16 @@ async def async_setup_platform(
) )
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the Demo config entry."""
await async_setup_platform(hass, {}, async_add_entities)
class DemoDate(DateEntity): class DemoDate(DateEntity):
"""Representation of a Demo date entity.""" """Representation of a Demo date entity."""
_attr_has_entity_name = True
_attr_should_poll = False _attr_should_poll = False
def __init__( def __init__(
self, self,
unique_id: str, unique_id: str,
name: str, device_name: str,
state: date, state: date,
icon: str, icon: str,
assumed_state: bool, assumed_state: bool,
@ -59,12 +48,11 @@ class DemoDate(DateEntity):
"""Initialize the Demo date entity.""" """Initialize the Demo date entity."""
self._attr_assumed_state = assumed_state self._attr_assumed_state = assumed_state
self._attr_icon = icon self._attr_icon = icon
self._attr_name = name or DEVICE_DEFAULT_NAME
self._attr_native_value = state self._attr_native_value = state
self._attr_unique_id = unique_id self._attr_unique_id = unique_id
self._attr_device_info = DeviceInfo( self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, unique_id)}, name=self.name identifiers={(DOMAIN, unique_id)}, name=device_name
) )
async def async_set_value(self, value: date) -> None: async def async_set_value(self, value: date) -> None:

View file

@ -5,22 +5,19 @@ from datetime import datetime, timezone
from homeassistant.components.datetime import DateTimeEntity from homeassistant.components.datetime import DateTimeEntity
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import DEVICE_DEFAULT_NAME
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from . import DOMAIN from . import DOMAIN
async def async_setup_platform( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config: ConfigType, config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None,
) -> None: ) -> None:
"""Set up the Demo date/time entity.""" """Set up the demo datetime platform."""
async_add_entities( async_add_entities(
[ [
DemoDateTime( DemoDateTime(
@ -34,24 +31,16 @@ async def async_setup_platform(
) )
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the Demo config entry."""
await async_setup_platform(hass, {}, async_add_entities)
class DemoDateTime(DateTimeEntity): class DemoDateTime(DateTimeEntity):
"""Representation of a Demo date/time entity.""" """Representation of a Demo date/time entity."""
_attr_has_entity_name = True
_attr_should_poll = False _attr_should_poll = False
def __init__( def __init__(
self, self,
unique_id: str, unique_id: str,
name: str, device_name: str,
state: datetime, state: datetime,
icon: str, icon: str,
assumed_state: bool, assumed_state: bool,
@ -59,7 +48,6 @@ class DemoDateTime(DateTimeEntity):
"""Initialize the Demo date/time entity.""" """Initialize the Demo date/time entity."""
self._attr_assumed_state = assumed_state self._attr_assumed_state = assumed_state
self._attr_icon = icon self._attr_icon = icon
self._attr_name = name or DEVICE_DEFAULT_NAME
self._attr_native_value = state self._attr_native_value = state
self._attr_unique_id = unique_id self._attr_unique_id = unique_id
@ -68,7 +56,7 @@ class DemoDateTime(DateTimeEntity):
# Serial numbers are unique identifiers within a specific domain # Serial numbers are unique identifiers within a specific domain
(DOMAIN, unique_id) (DOMAIN, unique_id)
}, },
name=self.name, name=device_name,
) )
async def async_set_value(self, value: datetime) -> None: async def async_set_value(self, value: datetime) -> None:

View file

@ -20,7 +20,6 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from . import DOMAIN from . import DOMAIN
@ -34,11 +33,10 @@ SUPPORT_DEMO = {ColorMode.HS, ColorMode.COLOR_TEMP}
SUPPORT_DEMO_HS_WHITE = {ColorMode.HS, ColorMode.WHITE} SUPPORT_DEMO_HS_WHITE = {ColorMode.HS, ColorMode.WHITE}
async def async_setup_platform( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config: ConfigType, config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None,
) -> None: ) -> None:
"""Set up the demo light platform.""" """Set up the demo light platform."""
async_add_entities( async_add_entities(
@ -47,28 +45,28 @@ async def async_setup_platform(
available=True, available=True,
effect_list=LIGHT_EFFECT_LIST, effect_list=LIGHT_EFFECT_LIST,
effect=LIGHT_EFFECT_LIST[0], effect=LIGHT_EFFECT_LIST[0],
name="Bed Light", device_name="Bed Light",
state=False, state=False,
unique_id="light_1", unique_id="light_1",
), ),
DemoLight( DemoLight(
available=True, available=True,
ct=LIGHT_TEMPS[1], ct=LIGHT_TEMPS[1],
name="Ceiling Lights", device_name="Ceiling Lights",
state=True, state=True,
unique_id="light_2", unique_id="light_2",
), ),
DemoLight( DemoLight(
available=True, available=True,
hs_color=LIGHT_COLORS[1], hs_color=LIGHT_COLORS[1],
name="Kitchen Lights", device_name="Kitchen Lights",
state=True, state=True,
unique_id="light_3", unique_id="light_3",
), ),
DemoLight( DemoLight(
available=True, available=True,
ct=LIGHT_TEMPS[1], ct=LIGHT_TEMPS[1],
name="Office RGBW Lights", device_name="Office RGBW Lights",
rgbw_color=(255, 0, 0, 255), rgbw_color=(255, 0, 0, 255),
state=True, state=True,
supported_color_modes={ColorMode.RGBW}, supported_color_modes={ColorMode.RGBW},
@ -76,7 +74,7 @@ async def async_setup_platform(
), ),
DemoLight( DemoLight(
available=True, available=True,
name="Living Room RGBWW Lights", device_name="Living Room RGBWW Lights",
rgbww_color=(255, 0, 0, 255, 0), rgbww_color=(255, 0, 0, 255, 0),
state=True, state=True,
supported_color_modes={ColorMode.RGBWW}, supported_color_modes={ColorMode.RGBWW},
@ -84,7 +82,7 @@ async def async_setup_platform(
), ),
DemoLight( DemoLight(
available=True, available=True,
name="Entrance Color + White Lights", device_name="Entrance Color + White Lights",
hs_color=LIGHT_COLORS[1], hs_color=LIGHT_COLORS[1],
state=True, state=True,
supported_color_modes=SUPPORT_DEMO_HS_WHITE, supported_color_modes=SUPPORT_DEMO_HS_WHITE,
@ -94,24 +92,16 @@ async def async_setup_platform(
) )
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the Demo config entry."""
await async_setup_platform(hass, {}, async_add_entities)
class DemoLight(LightEntity): class DemoLight(LightEntity):
"""Representation of a demo light.""" """Representation of a demo light."""
_attr_has_entity_name = True
_attr_should_poll = False _attr_should_poll = False
def __init__( def __init__(
self, self,
unique_id: str, unique_id: str,
name: str, device_name: str,
state: bool, state: bool,
available: bool = False, available: bool = False,
brightness: int = 180, brightness: int = 180,
@ -130,7 +120,6 @@ class DemoLight(LightEntity):
self._effect = effect self._effect = effect
self._effect_list = effect_list self._effect_list = effect_list
self._hs_color = hs_color self._hs_color = hs_color
self._attr_name = name
self._rgbw_color = rgbw_color self._rgbw_color = rgbw_color
self._rgbww_color = rgbww_color self._rgbww_color = rgbww_color
self._state = state self._state = state
@ -148,16 +137,12 @@ class DemoLight(LightEntity):
self._color_modes = supported_color_modes self._color_modes = supported_color_modes
if self._effect_list is not None: if self._effect_list is not None:
self._attr_supported_features |= LightEntityFeature.EFFECT self._attr_supported_features |= LightEntityFeature.EFFECT
self._attr_device_info = DeviceInfo(
@property
def device_info(self) -> DeviceInfo:
"""Return device info."""
return DeviceInfo(
identifiers={ identifiers={
# Serial numbers are unique identifiers within a specific domain # Serial numbers are unique identifiers within a specific domain
(DOMAIN, self.unique_id) (DOMAIN, self.unique_id)
}, },
name=self.name, name=device_name,
) )
@property @property

View file

@ -3,22 +3,20 @@ from __future__ import annotations
from homeassistant.components.number import NumberDeviceClass, NumberEntity, NumberMode from homeassistant.components.number import NumberDeviceClass, NumberEntity, NumberMode
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import DEVICE_DEFAULT_NAME, UnitOfTemperature from homeassistant.const import UnitOfTemperature
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from . import DOMAIN from . import DOMAIN
async def async_setup_platform( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config: ConfigType, config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None,
) -> None: ) -> None:
"""Set up the demo Number entity.""" """Set up the demo number platform."""
async_add_entities( async_add_entities(
[ [
DemoNumber( DemoNumber(
@ -77,24 +75,16 @@ async def async_setup_platform(
) )
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the Demo config entry."""
await async_setup_platform(hass, {}, async_add_entities)
class DemoNumber(NumberEntity): class DemoNumber(NumberEntity):
"""Representation of a demo Number entity.""" """Representation of a demo Number entity."""
_attr_has_entity_name = True
_attr_should_poll = False _attr_should_poll = False
def __init__( def __init__(
self, self,
unique_id: str, unique_id: str,
name: str, device_name: str,
state: float, state: float,
icon: str, icon: str,
assumed_state: bool, assumed_state: bool,
@ -111,7 +101,6 @@ class DemoNumber(NumberEntity):
self._attr_device_class = device_class self._attr_device_class = device_class
self._attr_icon = icon self._attr_icon = icon
self._attr_mode = mode self._attr_mode = mode
self._attr_name = name or DEVICE_DEFAULT_NAME
self._attr_native_unit_of_measurement = unit_of_measurement self._attr_native_unit_of_measurement = unit_of_measurement
self._attr_native_value = state self._attr_native_value = state
self._attr_unique_id = unique_id self._attr_unique_id = unique_id
@ -128,7 +117,7 @@ class DemoNumber(NumberEntity):
# Serial numbers are unique identifiers within a specific domain # Serial numbers are unique identifiers within a specific domain
(DOMAIN, unique_id) (DOMAIN, unique_id)
}, },
name=self.name, name=device_name,
) )
async def async_set_native_value(self, value: float) -> None: async def async_set_native_value(self, value: float) -> None:

View file

@ -3,27 +3,24 @@ from __future__ import annotations
from homeassistant.components.select import SelectEntity from homeassistant.components.select import SelectEntity
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import DEVICE_DEFAULT_NAME
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from . import DOMAIN from . import DOMAIN
async def async_setup_platform( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config: ConfigType, config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None,
) -> None: ) -> None:
"""Set up the demo Select entity.""" """Set up the demo select platform."""
async_add_entities( async_add_entities(
[ [
DemoSelect( DemoSelect(
unique_id="speed", unique_id="speed",
name="Speed", device_name="Speed",
icon="mdi:speedometer", icon="mdi:speedometer",
current_option="ridiculous_speed", current_option="ridiculous_speed",
options=[ options=[
@ -37,24 +34,16 @@ async def async_setup_platform(
) )
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the Demo config entry."""
await async_setup_platform(hass, {}, async_add_entities)
class DemoSelect(SelectEntity): class DemoSelect(SelectEntity):
"""Representation of a demo select entity.""" """Representation of a demo select entity."""
_attr_has_entity_name = True
_attr_should_poll = False _attr_should_poll = False
def __init__( def __init__(
self, self,
unique_id: str, unique_id: str,
name: str, device_name: str,
icon: str, icon: str,
current_option: str | None, current_option: str | None,
options: list[str], options: list[str],
@ -62,14 +51,13 @@ class DemoSelect(SelectEntity):
) -> None: ) -> None:
"""Initialize the Demo select entity.""" """Initialize the Demo select entity."""
self._attr_unique_id = unique_id self._attr_unique_id = unique_id
self._attr_name = name or DEVICE_DEFAULT_NAME
self._attr_current_option = current_option self._attr_current_option = current_option
self._attr_icon = icon self._attr_icon = icon
self._attr_options = options self._attr_options = options
self._attr_translation_key = translation_key self._attr_translation_key = translation_key
self._attr_device_info = DeviceInfo( self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, unique_id)}, identifiers={(DOMAIN, unique_id)},
name=name, name=device_name,
) )
async def async_select_option(self, option: str) -> None: async def async_select_option(self, option: str) -> None:

View file

@ -25,18 +25,17 @@ from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.event import async_track_time_interval from homeassistant.helpers.event import async_track_time_interval
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, StateType from homeassistant.helpers.typing import StateType
from . import DOMAIN from . import DOMAIN
async def async_setup_platform( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config: ConfigType, config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None,
) -> None: ) -> None:
"""Set up the Demo sensors.""" """Set up the demo sensor platform."""
async_add_entities( async_add_entities(
[ [
DemoSensor( DemoSensor(
@ -126,7 +125,7 @@ async def async_setup_platform(
), ),
DemoSensor( DemoSensor(
unique_id="sensor_10", unique_id="sensor_10",
name=None, device_name="Thermostat",
state="eco", state="eco",
device_class=SensorDeviceClass.ENUM, device_class=SensorDeviceClass.ENUM,
state_class=None, state_class=None,
@ -139,24 +138,16 @@ async def async_setup_platform(
) )
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the Demo config entry."""
await async_setup_platform(hass, {}, async_add_entities)
class DemoSensor(SensorEntity): class DemoSensor(SensorEntity):
"""Representation of a Demo sensor.""" """Representation of a Demo sensor."""
_attr_has_entity_name = True
_attr_should_poll = False _attr_should_poll = False
def __init__( def __init__(
self, self,
unique_id: str, unique_id: str,
name: str | None, device_name: str | None,
state: StateType, state: StateType,
device_class: SensorDeviceClass, device_class: SensorDeviceClass,
state_class: SensorStateClass | None, state_class: SensorStateClass | None,
@ -167,10 +158,6 @@ class DemoSensor(SensorEntity):
) -> None: ) -> None:
"""Initialize the sensor.""" """Initialize the sensor."""
self._attr_device_class = device_class self._attr_device_class = device_class
if name is not None:
self._attr_name = name
else:
self._attr_has_entity_name = True
self._attr_native_unit_of_measurement = unit_of_measurement self._attr_native_unit_of_measurement = unit_of_measurement
self._attr_native_value = state self._attr_native_value = state
self._attr_state_class = state_class self._attr_state_class = state_class
@ -180,7 +167,7 @@ class DemoSensor(SensorEntity):
self._attr_device_info = DeviceInfo( self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, unique_id)}, identifiers={(DOMAIN, unique_id)},
name=name, name=device_name,
) )
if battery: if battery:
@ -196,7 +183,7 @@ class DemoSumSensor(RestoreSensor):
def __init__( def __init__(
self, self,
unique_id: str, unique_id: str,
name: str, device_name: str,
five_minute_increase: float, five_minute_increase: float,
device_class: SensorDeviceClass, device_class: SensorDeviceClass,
state_class: SensorStateClass | None, state_class: SensorStateClass | None,
@ -207,7 +194,6 @@ class DemoSumSensor(RestoreSensor):
"""Initialize the sensor.""" """Initialize the sensor."""
self.entity_id = f"{SENSOR_DOMAIN}.{suggested_entity_id}" self.entity_id = f"{SENSOR_DOMAIN}.{suggested_entity_id}"
self._attr_device_class = device_class self._attr_device_class = device_class
self._attr_name = name
self._attr_native_unit_of_measurement = unit_of_measurement self._attr_native_unit_of_measurement = unit_of_measurement
self._attr_native_value = 0 self._attr_native_value = 0
self._attr_state_class = state_class self._attr_state_class = state_class
@ -216,7 +202,7 @@ class DemoSumSensor(RestoreSensor):
self._attr_device_info = DeviceInfo( self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, unique_id)}, identifiers={(DOMAIN, unique_id)},
name=name, name=device_name,
) )
if battery: if battery:

View file

@ -55,7 +55,7 @@ def async_setup_legacy(
providers = hass.data[DATA_PROVIDERS] = {} providers = hass.data[DATA_PROVIDERS] = {}
async def async_setup_platform(p_type, p_config=None, discovery_info=None): async def async_setup_platform(p_type, p_config=None, discovery_info=None):
"""Set up a TTS platform.""" """Set up an STT platform."""
if p_config is None: if p_config is None:
p_config = {} p_config = {}

View file

@ -1,11 +1,12 @@
"""The tests for calendar recorder.""" """The tests for calendar recorder."""
from datetime import timedelta from datetime import timedelta
from unittest.mock import patch
import pytest import pytest
from homeassistant.components.recorder import Recorder from homeassistant.components.recorder import Recorder
from homeassistant.components.recorder.history import get_significant_states from homeassistant.components.recorder.history import get_significant_states
from homeassistant.const import ATTR_FRIENDLY_NAME from homeassistant.const import ATTR_FRIENDLY_NAME, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
@ -19,6 +20,16 @@ async def setup_homeassistant():
"""Override the fixture in calendar.conftest.""" """Override the fixture in calendar.conftest."""
@pytest.fixture(autouse=True)
async def calendar_only() -> None:
"""Enable only the calendar platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.CALENDAR],
):
yield
async def test_exclude_attributes(recorder_mock: Recorder, hass: HomeAssistant) -> None: async def test_exclude_attributes(recorder_mock: Recorder, hass: HomeAssistant) -> None:
"""Test sensor attributes to be excluded.""" """Test sensor attributes to be excluded."""
now = dt_util.utcnow() now = dt_util.utcnow()

View file

@ -5,6 +5,7 @@ import pytest
from homeassistant.components import camera from homeassistant.components import camera
from homeassistant.components.camera.const import StreamType from homeassistant.components.camera.const import StreamType
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
@ -17,6 +18,16 @@ async def setup_homeassistant(hass: HomeAssistant):
await async_setup_component(hass, "homeassistant", {}) await async_setup_component(hass, "homeassistant", {})
@pytest.fixture(autouse=True)
async def camera_only() -> None:
"""Enable only the camera platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.CAMERA],
):
yield
@pytest.fixture(name="mock_camera") @pytest.fixture(name="mock_camera")
async def mock_camera_fixture(hass): async def mock_camera_fixture(hass):
"""Initialize a demo camera platform.""" """Initialize a demo camera platform."""

View file

@ -2,6 +2,9 @@
from __future__ import annotations from __future__ import annotations
from datetime import timedelta from datetime import timedelta
from unittest.mock import patch
import pytest
from homeassistant.components import climate from homeassistant.components import climate
from homeassistant.components.climate import ( from homeassistant.components.climate import (
@ -17,7 +20,7 @@ from homeassistant.components.climate import (
) )
from homeassistant.components.recorder import Recorder from homeassistant.components.recorder import Recorder
from homeassistant.components.recorder.history import get_significant_states from homeassistant.components.recorder.history import get_significant_states
from homeassistant.const import ATTR_FRIENDLY_NAME from homeassistant.const import ATTR_FRIENDLY_NAME, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
@ -26,6 +29,16 @@ from tests.common import async_fire_time_changed
from tests.components.recorder.common import async_wait_recording_done from tests.components.recorder.common import async_wait_recording_done
@pytest.fixture(autouse=True)
async def climate_only() -> None:
"""Enable only the climate platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.CLIMATE],
):
yield
async def test_exclude_attributes(recorder_mock: Recorder, hass: HomeAssistant) -> None: async def test_exclude_attributes(recorder_mock: Recorder, hass: HomeAssistant) -> None:
"""Test climate registered attributes to be excluded.""" """Test climate registered attributes to be excluded."""
now = dt_util.utcnow() now = dt_util.utcnow()

View file

@ -976,7 +976,7 @@ async def test_get_single(
assert await async_setup_component(hass, "config", {}) assert await async_setup_component(hass, "config", {})
ws_client = await hass_ws_client(hass) ws_client = await hass_ws_client(hass)
entry = MockConfigEntry(domain="demo", state=core_ce.ConfigEntryState.LOADED) entry = MockConfigEntry(domain="test", state=core_ce.ConfigEntryState.LOADED)
entry.add_to_hass(hass) entry.add_to_hass(hass)
assert entry.pref_disable_new_entities is False assert entry.pref_disable_new_entities is False
@ -993,7 +993,7 @@ async def test_get_single(
assert response["success"] assert response["success"]
assert response["result"]["config_entry"] == { assert response["result"]["config_entry"] == {
"disabled_by": None, "disabled_by": None,
"domain": "demo", "domain": "test",
"entry_id": entry.entry_id, "entry_id": entry.entry_id,
"pref_disable_new_entities": False, "pref_disable_new_entities": False,
"pref_disable_polling": False, "pref_disable_polling": False,

View file

@ -1,4 +1,6 @@
"""demo conftest.""" """demo conftest."""
from unittest.mock import patch
import pytest import pytest
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
@ -16,3 +18,13 @@ def stub_blueprint_populate_autouse(stub_blueprint_populate: None) -> None:
async def setup_homeassistant(hass: HomeAssistant): async def setup_homeassistant(hass: HomeAssistant):
"""Set up the homeassistant integration.""" """Set up the homeassistant integration."""
await async_setup_component(hass, "homeassistant", {}) await async_setup_component(hass, "homeassistant", {})
@pytest.fixture
async def disable_platforms(hass: HomeAssistant) -> None:
"""Disable platforms to speed up tests."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[],
):
yield

View file

@ -5,7 +5,7 @@ from unittest.mock import patch
import pytest import pytest
from homeassistant.components.button import DOMAIN, SERVICE_PRESS from homeassistant.components.button import DOMAIN, SERVICE_PRESS
from homeassistant.const import ATTR_ENTITY_ID, STATE_UNKNOWN from homeassistant.const import ATTR_ENTITY_ID, STATE_UNKNOWN, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
@ -13,8 +13,18 @@ from homeassistant.util import dt as dt_util
ENTITY_PUSH = "button.push" ENTITY_PUSH = "button.push"
@pytest.fixture
async def button_only() -> None:
"""Enable only the button platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.BUTTON],
):
yield
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def setup_demo_button(hass: HomeAssistant) -> None: async def setup_demo_button(hass: HomeAssistant, button_only) -> None:
"""Initialize setup demo button entity.""" """Initialize setup demo button entity."""
assert await async_setup_component(hass, DOMAIN, {"button": {"platform": "demo"}}) assert await async_setup_component(hass, DOMAIN, {"button": {"platform": "demo"}})
await hass.async_block_till_done() await hass.async_block_till_done()

View file

@ -14,7 +14,7 @@ from homeassistant.components.camera import (
async_get_image, async_get_image,
) )
from homeassistant.components.demo import DOMAIN from homeassistant.components.demo import DOMAIN
from homeassistant.const import ATTR_ENTITY_ID from homeassistant.const import ATTR_ENTITY_ID, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
@ -22,8 +22,18 @@ from homeassistant.setup import async_setup_component
ENTITY_CAMERA = "camera.demo_camera" ENTITY_CAMERA = "camera.demo_camera"
@pytest.fixture
async def camera_only() -> None:
"""Enable only the button platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.CAMERA],
):
yield
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def demo_camera(hass): async def demo_camera(hass, camera_only):
"""Initialize a demo camera platform.""" """Initialize a demo camera platform."""
assert await async_setup_component( assert await async_setup_component(
hass, CAMERA_DOMAIN, {CAMERA_DOMAIN: {"platform": DOMAIN}} hass, CAMERA_DOMAIN, {CAMERA_DOMAIN: {"platform": DOMAIN}}

View file

@ -1,4 +1,5 @@
"""The tests for the demo climate component.""" """The tests for the demo climate component."""
from unittest.mock import patch
import pytest import pytest
import voluptuous as vol import voluptuous as vol
@ -40,6 +41,7 @@ from homeassistant.const import (
SERVICE_TURN_ON, SERVICE_TURN_ON,
STATE_OFF, STATE_OFF,
STATE_ON, STATE_ON,
Platform,
) )
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
@ -50,8 +52,18 @@ ENTITY_ECOBEE = "climate.ecobee"
ENTITY_HEATPUMP = "climate.heatpump" ENTITY_HEATPUMP = "climate.heatpump"
@pytest.fixture
async def climate_only() -> None:
"""Enable only the climate platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.CLIMATE],
):
yield
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def setup_demo_climate(hass): async def setup_demo_climate(hass, climate_only):
"""Initialize setup demo climate.""" """Initialize setup demo climate."""
hass.config.units = METRIC_SYSTEM hass.config.units = METRIC_SYSTEM
assert await async_setup_component(hass, DOMAIN, {"climate": {"platform": "demo"}}) assert await async_setup_component(hass, DOMAIN, {"climate": {"platform": "demo"}})

View file

@ -1,5 +1,6 @@
"""The tests for the Demo cover platform.""" """The tests for the Demo cover platform."""
from datetime import timedelta from datetime import timedelta
from unittest.mock import patch
import pytest import pytest
@ -27,6 +28,7 @@ from homeassistant.const import (
STATE_CLOSING, STATE_CLOSING,
STATE_OPEN, STATE_OPEN,
STATE_OPENING, STATE_OPENING,
Platform,
) )
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
@ -39,7 +41,17 @@ ENTITY_COVER = "cover.living_room_window"
@pytest.fixture @pytest.fixture
async def setup_comp(hass): async def cover_only() -> None:
"""Enable only the climate platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.COVER],
):
yield
@pytest.fixture
async def setup_comp(hass, cover_only):
"""Set up demo cover component.""" """Set up demo cover component."""
with assert_setup_component(1, DOMAIN): with assert_setup_component(1, DOMAIN):
await async_setup_component(hass, DOMAIN, CONFIG) await async_setup_component(hass, DOMAIN, CONFIG)

View file

@ -1,16 +1,28 @@
"""The tests for the demo date component.""" """The tests for the demo date component."""
from unittest.mock import patch
import pytest import pytest
from homeassistant.components.date import ATTR_DATE, DOMAIN, SERVICE_SET_VALUE from homeassistant.components.date import ATTR_DATE, DOMAIN, SERVICE_SET_VALUE
from homeassistant.const import ATTR_ENTITY_ID from homeassistant.const import ATTR_ENTITY_ID, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
ENTITY_DATE = "date.date" ENTITY_DATE = "date.date"
@pytest.fixture
async def date_only() -> None:
"""Enable only the date platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.DATE],
):
yield
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def setup_demo_date(hass: HomeAssistant) -> None: async def setup_demo_date(hass: HomeAssistant, date_only) -> None:
"""Initialize setup demo date.""" """Initialize setup demo date."""
assert await async_setup_component(hass, DOMAIN, {"date": {"platform": "demo"}}) assert await async_setup_component(hass, DOMAIN, {"date": {"platform": "demo"}})
await hass.async_block_till_done() await hass.async_block_till_done()

View file

@ -1,16 +1,28 @@
"""The tests for the demo datetime component.""" """The tests for the demo datetime component."""
from unittest.mock import patch
import pytest import pytest
from homeassistant.components.datetime import ATTR_DATETIME, DOMAIN, SERVICE_SET_VALUE from homeassistant.components.datetime import ATTR_DATETIME, DOMAIN, SERVICE_SET_VALUE
from homeassistant.const import ATTR_ENTITY_ID from homeassistant.const import ATTR_ENTITY_ID, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
ENTITY_DATETIME = "datetime.date_and_time" ENTITY_DATETIME = "datetime.date_and_time"
@pytest.fixture
async def datetime_only() -> None:
"""Enable only the datetime platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.DATETIME],
):
yield
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def setup_demo_datetime(hass: HomeAssistant) -> None: async def setup_demo_datetime(hass: HomeAssistant, datetime_only) -> None:
"""Initialize setup demo datetime.""" """Initialize setup demo datetime."""
assert await async_setup_component(hass, DOMAIN, {"datetime": {"platform": "demo"}}) assert await async_setup_component(hass, DOMAIN, {"datetime": {"platform": "demo"}})
await hass.async_block_till_done() await hass.async_block_till_done()

View file

@ -32,7 +32,7 @@ PERCENTAGE_MODEL_FANS = ["fan.percentage_full_fan", "fan.percentage_limited_fan"
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def setup_comp(hass): async def setup_comp(hass, disable_platforms):
"""Initialize components.""" """Initialize components."""
assert await async_setup_component(hass, fan.DOMAIN, {"fan": {"platform": "demo"}}) assert await async_setup_component(hass, fan.DOMAIN, {"fan": {"platform": "demo"}})
await hass.async_block_till_done() await hass.async_block_till_done()

View file

@ -21,7 +21,7 @@ from tests.common import assert_setup_component, async_fire_time_changed
CONFIG = {geo_location.DOMAIN: [{"platform": "demo"}]} CONFIG = {geo_location.DOMAIN: [{"platform": "demo"}]}
async def test_setup_platform(hass: HomeAssistant) -> None: async def test_setup_platform(hass: HomeAssistant, disable_platforms) -> None:
"""Test setup of demo platform via configuration.""" """Test setup of demo platform via configuration."""
utcnow = dt_util.utcnow() utcnow = dt_util.utcnow()
# Patching 'utcnow' to gain more control over the timed update. # Patching 'utcnow' to gain more control over the timed update.

View file

@ -30,7 +30,7 @@ ENTITY_HUMIDIFIER = "humidifier.humidifier"
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def setup_demo_humidifier(hass): async def setup_demo_humidifier(hass, disable_platforms):
"""Initialize setup demo humidifier.""" """Initialize setup demo humidifier."""
assert await async_setup_component( assert await async_setup_component(
hass, DOMAIN, {"humidifier": {"platform": "demo"}} hass, DOMAIN, {"humidifier": {"platform": "demo"}}

View file

@ -1,4 +1,6 @@
"""The tests for the demo light component.""" """The tests for the demo light component."""
from unittest.mock import patch
import pytest import pytest
from homeassistant.components.demo import DOMAIN from homeassistant.components.demo import DOMAIN
@ -16,15 +18,25 @@ from homeassistant.components.light import (
SERVICE_TURN_OFF, SERVICE_TURN_OFF,
SERVICE_TURN_ON, SERVICE_TURN_ON,
) )
from homeassistant.const import ATTR_ENTITY_ID, STATE_OFF, STATE_ON from homeassistant.const import ATTR_ENTITY_ID, STATE_OFF, STATE_ON, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
ENTITY_LIGHT = "light.bed_light" ENTITY_LIGHT = "light.bed_light"
@pytest.fixture
async def light_only() -> None:
"""Enable only the light platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.LIGHT],
):
yield
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def setup_comp(hass): async def setup_comp(hass, light_only):
"""Set up demo component.""" """Set up demo component."""
assert await async_setup_component( assert await async_setup_component(
hass, LIGHT_DOMAIN, {LIGHT_DOMAIN: {"platform": DOMAIN}} hass, LIGHT_DOMAIN, {LIGHT_DOMAIN: {"platform": DOMAIN}}

View file

@ -28,7 +28,7 @@ OPENABLE_LOCK = "lock.openable_lock"
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def setup_comp(hass): async def setup_comp(hass, disable_platforms):
"""Set up demo component.""" """Set up demo component."""
assert await async_setup_component( assert await async_setup_component(
hass, LOCK_DOMAIN, {LOCK_DOMAIN: {"platform": DOMAIN}} hass, LOCK_DOMAIN, {LOCK_DOMAIN: {"platform": DOMAIN}}

View file

@ -23,6 +23,11 @@ from tests.typing import ClientSessionGenerator
TEST_ENTITY_ID = "media_player.walkman" TEST_ENTITY_ID = "media_player.walkman"
@pytest.fixture(autouse=True)
def autouse_disable_platforms(disable_platforms):
"""Auto use the disable_platforms fixture."""
@pytest.fixture(name="mock_media_seek") @pytest.fixture(name="mock_media_seek")
def media_player_media_seek_fixture(): def media_player_media_seek_fixture():
"""Mock demo YouTube player media seek.""" """Mock demo YouTube player media seek."""

View file

@ -16,6 +16,11 @@ from tests.common import assert_setup_component, async_capture_events
CONFIG = {notify.DOMAIN: {"platform": "demo"}} CONFIG = {notify.DOMAIN: {"platform": "demo"}}
@pytest.fixture(autouse=True)
def autouse_disable_platforms(disable_platforms):
"""Auto use the disable_platforms fixture."""
@pytest.fixture @pytest.fixture
def events(hass): def events(hass):
"""Fixture that catches notify events.""" """Fixture that catches notify events."""

View file

@ -1,4 +1,5 @@
"""The tests for the demo number component.""" """The tests for the demo number component."""
from unittest.mock import patch
import pytest import pytest
import voluptuous as vol import voluptuous as vol
@ -12,7 +13,7 @@ from homeassistant.components.number import (
SERVICE_SET_VALUE, SERVICE_SET_VALUE,
NumberMode, NumberMode,
) )
from homeassistant.const import ATTR_ENTITY_ID, ATTR_MODE from homeassistant.const import ATTR_ENTITY_ID, ATTR_MODE, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
@ -22,8 +23,18 @@ ENTITY_LARGE_RANGE = "number.large_range"
ENTITY_SMALL_RANGE = "number.small_range" ENTITY_SMALL_RANGE = "number.small_range"
@pytest.fixture
async def number_only() -> None:
"""Enable only the number platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.NUMBER],
):
yield
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def setup_demo_number(hass): async def setup_demo_number(hass, number_only):
"""Initialize setup demo Number entity.""" """Initialize setup demo Number entity."""
assert await async_setup_component(hass, DOMAIN, {"number": {"platform": "demo"}}) assert await async_setup_component(hass, DOMAIN, {"number": {"platform": "demo"}})
await hass.async_block_till_done() await hass.async_block_till_done()

View file

@ -18,7 +18,7 @@ SERVICE_SEND_COMMAND = "send_command"
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def setup_component(hass): async def setup_component(hass, disable_platforms):
"""Initialize components.""" """Initialize components."""
assert await async_setup_component( assert await async_setup_component(
hass, remote.DOMAIN, {"remote": {"platform": "demo"}} hass, remote.DOMAIN, {"remote": {"platform": "demo"}}

View file

@ -1,4 +1,5 @@
"""The tests for the demo select component.""" """The tests for the demo select component."""
from unittest.mock import patch
import pytest import pytest
@ -8,15 +9,25 @@ from homeassistant.components.select import (
DOMAIN, DOMAIN,
SERVICE_SELECT_OPTION, SERVICE_SELECT_OPTION,
) )
from homeassistant.const import ATTR_ENTITY_ID from homeassistant.const import ATTR_ENTITY_ID, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
ENTITY_SPEED = "select.speed" ENTITY_SPEED = "select.speed"
@pytest.fixture
async def select_only() -> None:
"""Enable only the select platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.SELECT],
):
yield
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def setup_demo_select(hass: HomeAssistant) -> None: async def setup_demo_select(hass: HomeAssistant, select_only) -> None:
"""Initialize setup demo select entity.""" """Initialize setup demo select entity."""
assert await async_setup_component(hass, DOMAIN, {"select": {"platform": "demo"}}) assert await async_setup_component(hass, DOMAIN, {"select": {"platform": "demo"}})
await hass.async_block_till_done() await hass.async_block_till_done()

View file

@ -1,5 +1,6 @@
"""The tests for the demo sensor component.""" """The tests for the demo sensor component."""
from datetime import timedelta from datetime import timedelta
from unittest.mock import patch
from freezegun.api import FrozenDateTimeFactory from freezegun.api import FrozenDateTimeFactory
import pytest import pytest
@ -7,12 +8,23 @@ import pytest
from homeassistant import core as ha from homeassistant import core as ha
from homeassistant.components.demo import DOMAIN from homeassistant.components.demo import DOMAIN
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from tests.common import mock_restore_cache_with_extra_data from tests.common import mock_restore_cache_with_extra_data
@pytest.fixture(autouse=True)
async def sensor_only() -> None:
"""Enable only the sensor platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.SENSOR],
):
yield
@pytest.mark.parametrize(("entity_id", "delta"), (("sensor.total_energy_kwh", 0.5),)) @pytest.mark.parametrize(("entity_id", "delta"), (("sensor.total_energy_kwh", 0.5),))
async def test_energy_sensor( async def test_energy_sensor(
hass: HomeAssistant, entity_id, delta, freezer: FrozenDateTimeFactory hass: HomeAssistant, entity_id, delta, freezer: FrozenDateTimeFactory

View file

@ -25,7 +25,7 @@ ENTITY_SIREN_WITH_ALL_FEATURES = "siren.siren_with_all_features"
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def setup_demo_siren(hass): async def setup_demo_siren(hass, disable_platforms):
"""Initialize setup demo siren.""" """Initialize setup demo siren."""
assert await async_setup_component(hass, DOMAIN, {"siren": {"platform": "demo"}}) assert await async_setup_component(hass, DOMAIN, {"siren": {"platform": "demo"}})
await hass.async_block_till_done() await hass.async_block_till_done()

View file

@ -15,7 +15,7 @@ SWITCH_ENTITY_IDS = ["switch.decorative_lights", "switch.ac"]
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def setup_comp(hass): async def setup_comp(hass, disable_platforms):
"""Set up demo component.""" """Set up demo component."""
assert await async_setup_component( assert await async_setup_component(
hass, SWITCH_DOMAIN, {SWITCH_DOMAIN: {"platform": DOMAIN}} hass, SWITCH_DOMAIN, {SWITCH_DOMAIN: {"platform": DOMAIN}}

View file

@ -17,7 +17,7 @@ ENTITY_TEXT = "text.text"
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def setup_demo_text(hass): async def setup_demo_text(hass, disable_platforms):
"""Initialize setup demo text.""" """Initialize setup demo text."""
assert await async_setup_component(hass, DOMAIN, {"text": {"platform": "demo"}}) assert await async_setup_component(hass, DOMAIN, {"text": {"platform": "demo"}})
await hass.async_block_till_done() await hass.async_block_till_done()

View file

@ -10,7 +10,7 @@ ENTITY_TIME = "time.time"
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def setup_demo_datetime(hass: HomeAssistant) -> None: async def setup_demo_datetime(hass: HomeAssistant, disable_platforms) -> None:
"""Initialize setup demo time.""" """Initialize setup demo time."""
assert await async_setup_component(hass, DOMAIN, {"time": {"platform": "demo"}}) assert await async_setup_component(hass, DOMAIN, {"time": {"platform": "demo"}})
await hass.async_block_till_done() await hass.async_block_till_done()

View file

@ -27,7 +27,7 @@ from homeassistant.setup import async_setup_component
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def setup_demo_update(hass: HomeAssistant) -> None: async def setup_demo_update(hass: HomeAssistant, disable_platforms) -> None:
"""Initialize setup demo update entity.""" """Initialize setup demo update entity."""
assert await async_setup_component(hass, DOMAIN, {"update": {"platform": "demo"}}) assert await async_setup_component(hass, DOMAIN, {"update": {"platform": "demo"}})
await hass.async_block_till_done() await hass.async_block_till_done()

View file

@ -52,7 +52,7 @@ ENTITY_VACUUM_STATE = f"{DOMAIN}.{DEMO_VACUUM_STATE}".lower()
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def setup_demo_vacuum(hass): async def setup_demo_vacuum(hass, disable_platforms):
"""Initialize setup demo vacuum.""" """Initialize setup demo vacuum."""
assert await async_setup_component(hass, DOMAIN, {DOMAIN: {CONF_PLATFORM: "demo"}}) assert await async_setup_component(hass, DOMAIN, {DOMAIN: {CONF_PLATFORM: "demo"}})
await hass.async_block_till_done() await hass.async_block_till_done()

View file

@ -14,7 +14,7 @@ ENTITY_WATER_HEATER_CELSIUS = "water_heater.demo_water_heater_celsius"
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
async def setup_comp(hass): async def setup_comp(hass, disable_platforms):
"""Set up demo component.""" """Set up demo component."""
hass.config.units = US_CUSTOMARY_SYSTEM hass.config.units = US_CUSTOMARY_SYSTEM
assert await async_setup_component( assert await async_setup_component(

View file

@ -20,7 +20,7 @@ from homeassistant.setup import async_setup_component
from homeassistant.util.unit_system import METRIC_SYSTEM from homeassistant.util.unit_system import METRIC_SYSTEM
async def test_attributes(hass: HomeAssistant) -> None: async def test_attributes(hass: HomeAssistant, disable_platforms) -> None:
"""Test weather attributes.""" """Test weather attributes."""
assert await async_setup_component( assert await async_setup_component(
hass, weather.DOMAIN, {"weather": {"platform": "demo"}} hass, weather.DOMAIN, {"weather": {"platform": "demo"}}

View file

@ -135,8 +135,25 @@ async def base_setup(hass):
) )
@pytest.fixture(autouse=True)
async def wanted_platforms_only() -> None:
"""Enable only the wanted demo platforms."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[
const.Platform.CLIMATE,
const.Platform.COVER,
const.Platform.FAN,
const.Platform.HUMIDIFIER,
const.Platform.LIGHT,
const.Platform.MEDIA_PLAYER,
],
):
yield
@pytest.fixture @pytest.fixture
async def demo_setup(hass): async def demo_setup(hass, wanted_platforms_only):
"""Fixture to setup demo platforms.""" """Fixture to setup demo platforms."""
# We need to do this to get access to homeassistant/turn_(on,off) # We need to do this to get access to homeassistant/turn_(on,off)
setups = [ setups = [
@ -144,12 +161,7 @@ async def demo_setup(hass):
setup.async_setup_component( setup.async_setup_component(
hass, http.DOMAIN, {http.DOMAIN: {http.CONF_SERVER_PORT: HTTP_SERVER_PORT}} hass, http.DOMAIN, {http.DOMAIN: {http.CONF_SERVER_PORT: HTTP_SERVER_PORT}}
), ),
*[ setup.async_setup_component(hass, "demo", {}),
setup.async_setup_component(
hass, comp.DOMAIN, {comp.DOMAIN: [{"platform": "demo"}]}
)
for comp in (light, climate, humidifier, media_player, fan, cover)
],
setup.async_setup_component( setup.async_setup_component(
hass, hass,
script.DOMAIN, script.DOMAIN,

View file

@ -2,12 +2,15 @@
from __future__ import annotations from __future__ import annotations
from datetime import timedelta from datetime import timedelta
from unittest.mock import patch
import pytest
from homeassistant.components import fan from homeassistant.components import fan
from homeassistant.components.fan import ATTR_PRESET_MODES from homeassistant.components.fan import ATTR_PRESET_MODES
from homeassistant.components.recorder import Recorder from homeassistant.components.recorder import Recorder
from homeassistant.components.recorder.history import get_significant_states from homeassistant.components.recorder.history import get_significant_states
from homeassistant.const import ATTR_FRIENDLY_NAME from homeassistant.const import ATTR_FRIENDLY_NAME, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
@ -16,6 +19,16 @@ from tests.common import async_fire_time_changed
from tests.components.recorder.common import async_wait_recording_done from tests.components.recorder.common import async_wait_recording_done
@pytest.fixture(autouse=True)
async def fan_only() -> None:
"""Enable only the fan platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.FAN],
):
yield
async def test_exclude_attributes(recorder_mock: Recorder, hass: HomeAssistant) -> None: async def test_exclude_attributes(recorder_mock: Recorder, hass: HomeAssistant) -> None:
"""Test fan registered attributes to be excluded.""" """Test fan registered attributes to be excluded."""
now = dt_util.utcnow() now = dt_util.utcnow()

View file

@ -1,8 +1,11 @@
"""Test diagnostics.""" """Test diagnostics."""
from unittest.mock import ANY from unittest.mock import ANY, patch
import pytest
from homeassistant import setup from homeassistant import setup
from homeassistant.components import google_assistant as ga, switch from homeassistant.components import google_assistant as ga, switch
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
@ -12,6 +15,16 @@ from tests.components.diagnostics import get_diagnostics_for_config_entry
from tests.typing import ClientSessionGenerator from tests.typing import ClientSessionGenerator
@pytest.fixture(autouse=True)
async def switch_only() -> None:
"""Enable only the switch platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.SWITCH],
):
yield
async def test_diagnostics( async def test_diagnostics(
hass: HomeAssistant, hass_client: ClientSessionGenerator hass: HomeAssistant, hass_client: ClientSessionGenerator
) -> None: ) -> None:

View file

@ -1,26 +1,22 @@
"""The tests for the Google Assistant component.""" """The tests for the Google Assistant component."""
from http import HTTPStatus from http import HTTPStatus
import json import json
from unittest.mock import patch
from aiohttp.hdrs import AUTHORIZATION from aiohttp.hdrs import AUTHORIZATION
import pytest import pytest
from homeassistant import const, core, setup from homeassistant import const, core, setup
from homeassistant.components import ( from homeassistant.components import (
alarm_control_panel,
climate,
cover,
fan,
google_assistant as ga, google_assistant as ga,
humidifier, humidifier,
light, light,
lock,
media_player, media_player,
switch,
) )
from homeassistant.const import ( from homeassistant.const import (
CLOUD_NEVER_EXPOSED_ENTITIES, CLOUD_NEVER_EXPOSED_ENTITIES,
EntityCategory, EntityCategory,
Platform,
UnitOfTemperature, UnitOfTemperature,
) )
from homeassistant.helpers import entity_registry as er from homeassistant.helpers import entity_registry as er
@ -65,6 +61,26 @@ def assistant_client(event_loop, hass, hass_client_no_auth):
return loop.run_until_complete(hass_client_no_auth()) return loop.run_until_complete(hass_client_no_auth())
@pytest.fixture(autouse=True)
async def wanted_platforms_only() -> None:
"""Enable only the wanted demo platforms."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[
Platform.ALARM_CONTROL_PANEL,
Platform.CLIMATE,
Platform.COVER,
Platform.FAN,
Platform.HUMIDIFIER,
Platform.LIGHT,
Platform.LOCK,
Platform.MEDIA_PLAYER,
Platform.SWITCH,
],
):
yield
@pytest.fixture @pytest.fixture
def hass_fixture(event_loop, hass): def hass_fixture(event_loop, hass):
"""Set up a Home Assistant instance for these tests.""" """Set up a Home Assistant instance for these tests."""
@ -73,55 +89,7 @@ def hass_fixture(event_loop, hass):
# We need to do this to get access to homeassistant/turn_(on,off) # We need to do this to get access to homeassistant/turn_(on,off)
loop.run_until_complete(setup.async_setup_component(hass, core.DOMAIN, {})) loop.run_until_complete(setup.async_setup_component(hass, core.DOMAIN, {}))
loop.run_until_complete( loop.run_until_complete(setup.async_setup_component(hass, "demo", {}))
setup.async_setup_component(
hass, light.DOMAIN, {"light": [{"platform": "demo"}]}
)
)
loop.run_until_complete(
setup.async_setup_component(
hass, switch.DOMAIN, {"switch": [{"platform": "demo"}]}
)
)
loop.run_until_complete(
setup.async_setup_component(
hass, cover.DOMAIN, {"cover": [{"platform": "demo"}]}
)
)
loop.run_until_complete(
setup.async_setup_component(
hass, media_player.DOMAIN, {"media_player": [{"platform": "demo"}]}
)
)
loop.run_until_complete(
setup.async_setup_component(hass, fan.DOMAIN, {"fan": [{"platform": "demo"}]})
)
loop.run_until_complete(
setup.async_setup_component(
hass, climate.DOMAIN, {"climate": [{"platform": "demo"}]}
)
)
loop.run_until_complete(
setup.async_setup_component(
hass, humidifier.DOMAIN, {"humidifier": [{"platform": "demo"}]}
)
)
loop.run_until_complete(
setup.async_setup_component(hass, lock.DOMAIN, {"lock": [{"platform": "demo"}]})
)
loop.run_until_complete(
setup.async_setup_component(
hass,
alarm_control_panel.DOMAIN,
{"alarm_control_panel": [{"platform": "demo"}]},
)
)
return hass return hass

View file

@ -22,7 +22,12 @@ from homeassistant.components.google_assistant import (
trait, trait,
) )
from homeassistant.config import async_process_ha_core_config from homeassistant.config import async_process_ha_core_config
from homeassistant.const import ATTR_UNIT_OF_MEASUREMENT, UnitOfTemperature, __version__ from homeassistant.const import (
ATTR_UNIT_OF_MEASUREMENT,
Platform,
UnitOfTemperature,
__version__,
)
from homeassistant.core import EVENT_CALL_SERVICE, HomeAssistant, State from homeassistant.core import EVENT_CALL_SERVICE, HomeAssistant, State
from homeassistant.helpers import ( from homeassistant.helpers import (
area_registry as ar, area_registry as ar,
@ -39,6 +44,16 @@ from tests.common import async_capture_events
REQ_ID = "ff36a3cc-ec34-11e6-b1a0-64510650abcf" REQ_ID = "ff36a3cc-ec34-11e6-b1a0-64510650abcf"
@pytest.fixture
async def light_only() -> None:
"""Enable only the light platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.LIGHT],
):
yield
@pytest.fixture @pytest.fixture
def registries( def registries(
entity_registry: er.EntityRegistry, entity_registry: er.EntityRegistry,
@ -128,6 +143,8 @@ async def test_sync_message(hass: HomeAssistant, registries) -> None:
) )
light.hass = hass light.hass = hass
light.entity_id = "light.demo_light" light.entity_id = "light.demo_light"
light._attr_device_info = None
light._attr_name = "Demo Light"
light.async_write_ha_state() light.async_write_ha_state()
# This should not show up in the sync request # This should not show up in the sync request
@ -268,6 +285,8 @@ async def test_sync_in_area(area_on_device, hass: HomeAssistant, registries) ->
) )
light.hass = hass light.hass = hass
light.entity_id = entity.entity_id light.entity_id = entity.entity_id
light._attr_device_info = None
light._attr_name = "Demo Light"
light.async_write_ha_state() light.async_write_ha_state()
config = MockConfig(should_expose=lambda _: True, entity_config={}) config = MockConfig(should_expose=lambda _: True, entity_config={})
@ -360,6 +379,8 @@ async def test_query_message(hass: HomeAssistant) -> None:
) )
light.hass = hass light.hass = hass
light.entity_id = "light.demo_light" light.entity_id = "light.demo_light"
light._attr_device_info = None
light._attr_name = "Demo Light"
light.async_write_ha_state() light.async_write_ha_state()
light2 = DemoLight( light2 = DemoLight(
@ -367,11 +388,15 @@ async def test_query_message(hass: HomeAssistant) -> None:
) )
light2.hass = hass light2.hass = hass
light2.entity_id = "light.another_light" light2.entity_id = "light.another_light"
light2._attr_device_info = None
light2._attr_name = "Another Light"
light2.async_write_ha_state() light2.async_write_ha_state()
light3 = DemoLight(None, "Color temp Light", state=True, ct=400, brightness=200) light3 = DemoLight(None, "Color temp Light", state=True, ct=400, brightness=200)
light3.hass = hass light3.hass = hass
light3.entity_id = "light.color_temp_light" light3.entity_id = "light.color_temp_light"
light3._attr_device_info = None
light3._attr_name = "Color temp Light"
light3.async_write_ha_state() light3.async_write_ha_state()
events = async_capture_events(hass, EVENT_QUERY_RECEIVED) events = async_capture_events(hass, EVENT_QUERY_RECEIVED)
@ -448,7 +473,7 @@ async def test_query_message(hass: HomeAssistant) -> None:
[(False, True, 20, 0.2), (True, ANY, ANY, ANY)], [(False, True, 20, 0.2), (True, ANY, ANY, ANY)],
) )
async def test_execute( async def test_execute(
hass: HomeAssistant, report_state, on, brightness, value hass: HomeAssistant, light_only, report_state, on, brightness, value
) -> None: ) -> None:
"""Test an execute command.""" """Test an execute command."""
await async_setup_component(hass, "homeassistant", {}) await async_setup_component(hass, "homeassistant", {})
@ -630,7 +655,7 @@ async def test_execute(
("report_state", "on", "brightness", "value"), [(False, False, ANY, ANY)] ("report_state", "on", "brightness", "value"), [(False, False, ANY, ANY)]
) )
async def test_execute_times_out( async def test_execute_times_out(
hass: HomeAssistant, report_state, on, brightness, value hass: HomeAssistant, light_only, report_state, on, brightness, value
) -> None: ) -> None:
"""Test an execute command which times out.""" """Test an execute command which times out."""
orig_execute_limit = sh.EXECUTE_LIMIT orig_execute_limit = sh.EXECUTE_LIMIT
@ -933,6 +958,8 @@ async def test_unavailable_state_does_sync(hass: HomeAssistant) -> None:
light.hass = hass light.hass = hass
light.entity_id = "light.demo_light" light.entity_id = "light.demo_light"
light._available = False light._available = False
light._attr_device_info = None
light._attr_name = "Demo Light"
light.async_write_ha_state() light.async_write_ha_state()
events = async_capture_events(hass, EVENT_SYNC_RECEIVED) events = async_capture_events(hass, EVENT_SYNC_RECEIVED)
@ -1074,6 +1101,8 @@ async def test_device_class_binary_sensor(
) )
sensor.hass = hass sensor.hass = hass
sensor.entity_id = "binary_sensor.demo_sensor" sensor.entity_id = "binary_sensor.demo_sensor"
sensor._attr_device_info = None
sensor._attr_name = "Demo Sensor"
sensor.async_write_ha_state() sensor.async_write_ha_state()
result = await sh.async_handle_message( result = await sh.async_handle_message(
@ -1125,6 +1154,8 @@ async def test_device_class_cover(
sensor = DemoCover(None, hass, "Demo Sensor", device_class=device_class) sensor = DemoCover(None, hass, "Demo Sensor", device_class=device_class)
sensor.hass = hass sensor.hass = hass
sensor.entity_id = "cover.demo_sensor" sensor.entity_id = "cover.demo_sensor"
sensor._attr_device_info = None
sensor._attr_name = "Demo Sensor"
sensor.async_write_ha_state() sensor.async_write_ha_state()
result = await sh.async_handle_message( result = await sh.async_handle_message(
@ -1456,6 +1487,8 @@ async def test_sync_message_recovery(
) )
light.hass = hass light.hass = hass
light.entity_id = "light.demo_light" light.entity_id = "light.demo_light"
light._attr_device_info = None
light._attr_name = "Demo Light"
light.async_write_ha_state() light.async_write_ha_state()
hass.states.async_set( hass.states.async_set(

View file

@ -2,6 +2,9 @@
from __future__ import annotations from __future__ import annotations
from datetime import timedelta from datetime import timedelta
from unittest.mock import patch
import pytest
from homeassistant.components import light from homeassistant.components import light
from homeassistant.components.light import ( from homeassistant.components.light import (
@ -14,7 +17,7 @@ from homeassistant.components.light import (
) )
from homeassistant.components.recorder import Recorder from homeassistant.components.recorder import Recorder
from homeassistant.components.recorder.history import get_significant_states from homeassistant.components.recorder.history import get_significant_states
from homeassistant.const import ATTR_FRIENDLY_NAME from homeassistant.const import ATTR_FRIENDLY_NAME, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
@ -23,6 +26,16 @@ from tests.common import async_fire_time_changed
from tests.components.recorder.common import async_wait_recording_done from tests.components.recorder.common import async_wait_recording_done
@pytest.fixture(autouse=True)
async def light_only() -> None:
"""Enable only the light platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.LIGHT],
):
yield
async def test_exclude_attributes(recorder_mock: Recorder, hass: HomeAssistant) -> None: async def test_exclude_attributes(recorder_mock: Recorder, hass: HomeAssistant) -> None:
"""Test light registered attributes to be excluded.""" """Test light registered attributes to be excluded."""
now = dt_util.utcnow() now = dt_util.utcnow()

View file

@ -2,6 +2,9 @@
from __future__ import annotations from __future__ import annotations
from datetime import timedelta from datetime import timedelta
from unittest.mock import patch
import pytest
from homeassistant.components import media_player from homeassistant.components import media_player
from homeassistant.components.media_player import ( from homeassistant.components.media_player import (
@ -13,7 +16,7 @@ from homeassistant.components.media_player import (
) )
from homeassistant.components.recorder import Recorder from homeassistant.components.recorder import Recorder
from homeassistant.components.recorder.history import get_significant_states from homeassistant.components.recorder.history import get_significant_states
from homeassistant.const import ATTR_ENTITY_PICTURE, ATTR_FRIENDLY_NAME from homeassistant.const import ATTR_ENTITY_PICTURE, ATTR_FRIENDLY_NAME, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
@ -22,6 +25,16 @@ from tests.common import async_fire_time_changed
from tests.components.recorder.common import async_wait_recording_done from tests.components.recorder.common import async_wait_recording_done
@pytest.fixture(autouse=True)
async def media_player_only() -> None:
"""Enable only the media_player platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.MEDIA_PLAYER],
):
yield
async def test_exclude_attributes(recorder_mock: Recorder, hass: HomeAssistant) -> None: async def test_exclude_attributes(recorder_mock: Recorder, hass: HomeAssistant) -> None:
"""Test media_player registered attributes to be excluded.""" """Test media_player registered attributes to be excluded."""
now = dt_util.utcnow() now = dt_util.utcnow()

View file

@ -2,12 +2,15 @@
from __future__ import annotations from __future__ import annotations
from datetime import timedelta from datetime import timedelta
from unittest.mock import patch
import pytest
from homeassistant.components import number from homeassistant.components import number
from homeassistant.components.number import ATTR_MAX, ATTR_MIN, ATTR_MODE, ATTR_STEP from homeassistant.components.number import ATTR_MAX, ATTR_MIN, ATTR_MODE, ATTR_STEP
from homeassistant.components.recorder import Recorder from homeassistant.components.recorder import Recorder
from homeassistant.components.recorder.history import get_significant_states from homeassistant.components.recorder.history import get_significant_states
from homeassistant.const import ATTR_FRIENDLY_NAME from homeassistant.const import ATTR_FRIENDLY_NAME, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
@ -16,6 +19,16 @@ from tests.common import async_fire_time_changed
from tests.components.recorder.common import async_wait_recording_done from tests.components.recorder.common import async_wait_recording_done
@pytest.fixture(autouse=True)
async def number_only() -> None:
"""Enable only the number platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.NUMBER],
):
yield
async def test_exclude_attributes(recorder_mock: Recorder, hass: HomeAssistant) -> None: async def test_exclude_attributes(recorder_mock: Recorder, hass: HomeAssistant) -> None:
"""Test number registered attributes to be excluded.""" """Test number registered attributes to be excluded."""
assert await async_setup_component(hass, "homeassistant", {}) assert await async_setup_component(hass, "homeassistant", {})

View file

@ -2,12 +2,15 @@
from __future__ import annotations from __future__ import annotations
from datetime import timedelta from datetime import timedelta
from unittest.mock import patch
import pytest
from homeassistant.components import select from homeassistant.components import select
from homeassistant.components.recorder import Recorder from homeassistant.components.recorder import Recorder
from homeassistant.components.recorder.history import get_significant_states from homeassistant.components.recorder.history import get_significant_states
from homeassistant.components.select import ATTR_OPTIONS from homeassistant.components.select import ATTR_OPTIONS
from homeassistant.const import ATTR_FRIENDLY_NAME from homeassistant.const import ATTR_FRIENDLY_NAME, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
@ -16,6 +19,16 @@ from tests.common import async_fire_time_changed
from tests.components.recorder.common import async_wait_recording_done from tests.components.recorder.common import async_wait_recording_done
@pytest.fixture(autouse=True)
async def select_only() -> None:
"""Enable only the select platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.SELECT],
):
yield
async def test_exclude_attributes(recorder_mock: Recorder, hass: HomeAssistant) -> None: async def test_exclude_attributes(recorder_mock: Recorder, hass: HomeAssistant) -> None:
"""Test select registered attributes to be excluded.""" """Test select registered attributes to be excluded."""
now = dt_util.utcnow() now = dt_util.utcnow()

View file

@ -2,12 +2,15 @@
from __future__ import annotations from __future__ import annotations
from datetime import timedelta from datetime import timedelta
from unittest.mock import patch
import pytest
from homeassistant.components import text from homeassistant.components import text
from homeassistant.components.recorder import Recorder from homeassistant.components.recorder import Recorder
from homeassistant.components.recorder.history import get_significant_states from homeassistant.components.recorder.history import get_significant_states
from homeassistant.components.text import ATTR_MAX, ATTR_MIN, ATTR_MODE, ATTR_PATTERN from homeassistant.components.text import ATTR_MAX, ATTR_MIN, ATTR_MODE, ATTR_PATTERN
from homeassistant.const import ATTR_FRIENDLY_NAME from homeassistant.const import ATTR_FRIENDLY_NAME, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
@ -16,6 +19,16 @@ from tests.common import async_fire_time_changed
from tests.components.recorder.common import async_wait_recording_done from tests.components.recorder.common import async_wait_recording_done
@pytest.fixture(autouse=True)
async def text_only() -> None:
"""Enable only the text platform."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[Platform.TEXT],
):
yield
async def test_exclude_attributes(recorder_mock: Recorder, hass: HomeAssistant) -> None: async def test_exclude_attributes(recorder_mock: Recorder, hass: HomeAssistant) -> None:
"""Test siren registered attributes to be excluded.""" """Test siren registered attributes to be excluded."""
now = dt_util.utcnow() now = dt_util.utcnow()

View file

@ -1,7 +1,9 @@
"""The tests for the TTS component.""" """The tests for the TTS component."""
from unittest.mock import patch
import pytest import pytest
from homeassistant.components import media_player, notify, tts from homeassistant.components import notify, tts
from homeassistant.components.media_player import ( from homeassistant.components.media_player import (
DOMAIN as DOMAIN_MP, DOMAIN as DOMAIN_MP,
SERVICE_PLAY_MEDIA, SERVICE_PLAY_MEDIA,
@ -24,6 +26,16 @@ async def internal_url_mock(hass: HomeAssistant) -> None:
) )
@pytest.fixture(autouse=True)
async def disable_platforms() -> None:
"""Disable demo platforms."""
with patch(
"homeassistant.components.demo.COMPONENTS_WITH_CONFIG_ENTRY_DEMO_PLATFORM",
[],
):
yield
async def test_setup_legacy_platform(hass: HomeAssistant) -> None: async def test_setup_legacy_platform(hass: HomeAssistant) -> None:
"""Set up the tts notify platform .""" """Set up the tts notify platform ."""
config = { config = {
@ -62,7 +74,6 @@ async def test_setup_legacy_service(hass: HomeAssistant) -> None:
config = { config = {
tts.DOMAIN: {"platform": "demo"}, tts.DOMAIN: {"platform": "demo"},
media_player.DOMAIN: {"platform": "demo"},
notify.DOMAIN: { notify.DOMAIN: {
"platform": "tts", "platform": "tts",
"name": "tts_test", "name": "tts_test",