Add typing to tests with single hass argument (2) (#87675)

* Add typing to tests with single hass argument (2)

* a few more
This commit is contained in:
epenet 2023-02-08 08:51:43 +01:00 committed by GitHub
parent 1bbc03d0ba
commit c98b4e3204
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
50 changed files with 816 additions and 671 deletions

View file

@ -2,11 +2,12 @@
from homeassistant import auth, data_entry_flow from homeassistant import auth, data_entry_flow
from homeassistant.auth.mfa_modules import auth_mfa_module_from_config from homeassistant.auth.mfa_modules import auth_mfa_module_from_config
from homeassistant.auth.models import Credentials from homeassistant.auth.models import Credentials
from homeassistant.core import HomeAssistant
from tests.common import MockUser from tests.common import MockUser
async def test_validate(hass): async def test_validate(hass: HomeAssistant) -> None:
"""Test validating pin.""" """Test validating pin."""
auth_module = await auth_mfa_module_from_config( auth_module = await auth_mfa_module_from_config(
hass, hass,
@ -26,7 +27,7 @@ async def test_validate(hass):
assert result is False assert result is False
async def test_setup_user(hass): async def test_setup_user(hass: HomeAssistant) -> None:
"""Test setup user.""" """Test setup user."""
auth_module = await auth_mfa_module_from_config( auth_module = await auth_mfa_module_from_config(
hass, {"type": "insecure_example", "data": []} hass, {"type": "insecure_example", "data": []}
@ -39,7 +40,7 @@ async def test_setup_user(hass):
assert result is True assert result is True
async def test_depose_user(hass): async def test_depose_user(hass: HomeAssistant) -> None:
"""Test despose user.""" """Test despose user."""
auth_module = await auth_mfa_module_from_config( auth_module = await auth_mfa_module_from_config(
hass, hass,
@ -54,7 +55,7 @@ async def test_depose_user(hass):
assert len(auth_module._data) == 0 assert len(auth_module._data) == 0
async def test_is_user_setup(hass): async def test_is_user_setup(hass: HomeAssistant) -> None:
"""Test is user setup.""" """Test is user setup."""
auth_module = await auth_mfa_module_from_config( auth_module = await auth_mfa_module_from_config(
hass, hass,
@ -67,7 +68,7 @@ async def test_is_user_setup(hass):
assert await auth_module.async_is_user_setup("invalid-user") is False assert await auth_module.async_is_user_setup("invalid-user") is False
async def test_login(hass): async def test_login(hass: HomeAssistant) -> None:
"""Test login flow with auth module.""" """Test login flow with auth module."""
hass.auth = await auth.auth_manager_from_config( hass.auth = await auth.auth_manager_from_config(
hass, hass,
@ -134,7 +135,7 @@ async def test_login(hass):
assert result["data"].id == "mock-id" assert result["data"].id == "mock-id"
async def test_setup_flow(hass): async def test_setup_flow(hass: HomeAssistant) -> None:
"""Test validating pin.""" """Test validating pin."""
auth_module = await auth_mfa_module_from_config( auth_module = await auth_mfa_module_from_config(
hass, hass,

View file

@ -6,6 +6,7 @@ from homeassistant import data_entry_flow
from homeassistant.auth import auth_manager_from_config, models as auth_models from homeassistant.auth import auth_manager_from_config, models as auth_models
from homeassistant.auth.mfa_modules import auth_mfa_module_from_config from homeassistant.auth.mfa_modules import auth_mfa_module_from_config
from homeassistant.components.notify import NOTIFY_SERVICE_SCHEMA from homeassistant.components.notify import NOTIFY_SERVICE_SCHEMA
from homeassistant.core import HomeAssistant
from tests.common import MockUser, async_mock_service from tests.common import MockUser, async_mock_service
@ -13,7 +14,7 @@ MOCK_CODE = "123456"
MOCK_CODE_2 = "654321" MOCK_CODE_2 = "654321"
async def test_validating_mfa(hass): async def test_validating_mfa(hass: HomeAssistant) -> None:
"""Test validating mfa code.""" """Test validating mfa code."""
notify_auth_module = await auth_mfa_module_from_config(hass, {"type": "notify"}) notify_auth_module = await auth_mfa_module_from_config(hass, {"type": "notify"})
await notify_auth_module.async_setup_user("test-user", {"notify_service": "dummy"}) await notify_auth_module.async_setup_user("test-user", {"notify_service": "dummy"})
@ -22,7 +23,7 @@ async def test_validating_mfa(hass):
assert await notify_auth_module.async_validate("test-user", {"code": MOCK_CODE}) assert await notify_auth_module.async_validate("test-user", {"code": MOCK_CODE})
async def test_validating_mfa_invalid_code(hass): async def test_validating_mfa_invalid_code(hass: HomeAssistant) -> None:
"""Test validating an invalid mfa code.""" """Test validating an invalid mfa code."""
notify_auth_module = await auth_mfa_module_from_config(hass, {"type": "notify"}) notify_auth_module = await auth_mfa_module_from_config(hass, {"type": "notify"})
await notify_auth_module.async_setup_user("test-user", {"notify_service": "dummy"}) await notify_auth_module.async_setup_user("test-user", {"notify_service": "dummy"})
@ -34,7 +35,7 @@ async def test_validating_mfa_invalid_code(hass):
) )
async def test_validating_mfa_invalid_user(hass): async def test_validating_mfa_invalid_user(hass: HomeAssistant) -> None:
"""Test validating an mfa code with invalid user.""" """Test validating an mfa code with invalid user."""
notify_auth_module = await auth_mfa_module_from_config(hass, {"type": "notify"}) notify_auth_module = await auth_mfa_module_from_config(hass, {"type": "notify"})
await notify_auth_module.async_setup_user("test-user", {"notify_service": "dummy"}) await notify_auth_module.async_setup_user("test-user", {"notify_service": "dummy"})
@ -45,7 +46,7 @@ async def test_validating_mfa_invalid_user(hass):
) )
async def test_validating_mfa_counter(hass): async def test_validating_mfa_counter(hass: HomeAssistant) -> None:
"""Test counter will move only after generate code.""" """Test counter will move only after generate code."""
notify_auth_module = await auth_mfa_module_from_config(hass, {"type": "notify"}) notify_auth_module = await auth_mfa_module_from_config(hass, {"type": "notify"})
await notify_auth_module.async_setup_user( await notify_auth_module.async_setup_user(
@ -81,7 +82,7 @@ async def test_validating_mfa_counter(hass):
assert after_generate_count == notify_setting.counter assert after_generate_count == notify_setting.counter
async def test_setup_depose_user(hass): async def test_setup_depose_user(hass: HomeAssistant) -> None:
"""Test set up and despose user.""" """Test set up and despose user."""
notify_auth_module = await auth_mfa_module_from_config(hass, {"type": "notify"}) notify_auth_module = await auth_mfa_module_from_config(hass, {"type": "notify"})
await notify_auth_module.async_setup_user("test-user", {}) await notify_auth_module.async_setup_user("test-user", {})
@ -96,7 +97,7 @@ async def test_setup_depose_user(hass):
assert len(notify_auth_module._user_settings) == 1 assert len(notify_auth_module._user_settings) == 1
async def test_login_flow_validates_mfa(hass): async def test_login_flow_validates_mfa(hass: HomeAssistant) -> None:
"""Test login flow with mfa enabled.""" """Test login flow with mfa enabled."""
hass.auth = await auth_manager_from_config( hass.auth = await auth_manager_from_config(
hass, hass,
@ -232,7 +233,7 @@ async def test_login_flow_validates_mfa(hass):
assert result["data"].id == "mock-id" assert result["data"].id == "mock-id"
async def test_setup_user_notify_service(hass): async def test_setup_user_notify_service(hass: HomeAssistant) -> None:
"""Test allow select notify service during mfa setup.""" """Test allow select notify service during mfa setup."""
notify_calls = async_mock_service(hass, "notify", "test1", NOTIFY_SERVICE_SCHEMA) notify_calls = async_mock_service(hass, "notify", "test1", NOTIFY_SERVICE_SCHEMA)
async_mock_service(hass, "notify", "test2", NOTIFY_SERVICE_SCHEMA) async_mock_service(hass, "notify", "test2", NOTIFY_SERVICE_SCHEMA)
@ -286,7 +287,7 @@ async def test_setup_user_notify_service(hass):
assert step["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY assert step["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY
async def test_include_exclude_config(hass): async def test_include_exclude_config(hass: HomeAssistant) -> None:
"""Test allow include exclude config.""" """Test allow include exclude config."""
async_mock_service(hass, "notify", "include1", NOTIFY_SERVICE_SCHEMA) async_mock_service(hass, "notify", "include1", NOTIFY_SERVICE_SCHEMA)
async_mock_service(hass, "notify", "include2", NOTIFY_SERVICE_SCHEMA) async_mock_service(hass, "notify", "include2", NOTIFY_SERVICE_SCHEMA)
@ -320,7 +321,7 @@ async def test_include_exclude_config(hass):
assert services == ["include1"] assert services == ["include1"]
async def test_setup_user_no_notify_service(hass): async def test_setup_user_no_notify_service(hass: HomeAssistant) -> None:
"""Test setup flow abort if there is no available notify service.""" """Test setup flow abort if there is no available notify service."""
async_mock_service(hass, "notify", "test1", NOTIFY_SERVICE_SCHEMA) async_mock_service(hass, "notify", "test1", NOTIFY_SERVICE_SCHEMA)
notify_auth_module = await auth_mfa_module_from_config( notify_auth_module = await auth_mfa_module_from_config(
@ -336,7 +337,7 @@ async def test_setup_user_no_notify_service(hass):
assert step["reason"] == "no_available_service" assert step["reason"] == "no_available_service"
async def test_not_raise_exception_when_service_not_exist(hass): async def test_not_raise_exception_when_service_not_exist(hass: HomeAssistant) -> None:
"""Test login flow will not raise exception when notify service error.""" """Test login flow will not raise exception when notify service error."""
hass.auth = await auth_manager_from_config( hass.auth = await auth_manager_from_config(
hass, hass,
@ -382,7 +383,7 @@ async def test_not_raise_exception_when_service_not_exist(hass):
await hass.async_block_till_done() await hass.async_block_till_done()
async def test_race_condition_in_data_loading(hass): async def test_race_condition_in_data_loading(hass: HomeAssistant) -> None:
"""Test race condition in the data loading.""" """Test race condition in the data loading."""
counter = 0 counter = 0

View file

@ -5,13 +5,14 @@ from unittest.mock import patch
from homeassistant import data_entry_flow from homeassistant import data_entry_flow
from homeassistant.auth import auth_manager_from_config, models as auth_models from homeassistant.auth import auth_manager_from_config, models as auth_models
from homeassistant.auth.mfa_modules import auth_mfa_module_from_config from homeassistant.auth.mfa_modules import auth_mfa_module_from_config
from homeassistant.core import HomeAssistant
from tests.common import MockUser from tests.common import MockUser
MOCK_CODE = "123456" MOCK_CODE = "123456"
async def test_validating_mfa(hass): async def test_validating_mfa(hass: HomeAssistant) -> None:
"""Test validating mfa code.""" """Test validating mfa code."""
totp_auth_module = await auth_mfa_module_from_config(hass, {"type": "totp"}) totp_auth_module = await auth_mfa_module_from_config(hass, {"type": "totp"})
await totp_auth_module.async_setup_user("test-user", {}) await totp_auth_module.async_setup_user("test-user", {})
@ -20,7 +21,7 @@ async def test_validating_mfa(hass):
assert await totp_auth_module.async_validate("test-user", {"code": MOCK_CODE}) assert await totp_auth_module.async_validate("test-user", {"code": MOCK_CODE})
async def test_validating_mfa_invalid_code(hass): async def test_validating_mfa_invalid_code(hass: HomeAssistant) -> None:
"""Test validating an invalid mfa code.""" """Test validating an invalid mfa code."""
totp_auth_module = await auth_mfa_module_from_config(hass, {"type": "totp"}) totp_auth_module = await auth_mfa_module_from_config(hass, {"type": "totp"})
await totp_auth_module.async_setup_user("test-user", {}) await totp_auth_module.async_setup_user("test-user", {})
@ -32,7 +33,7 @@ async def test_validating_mfa_invalid_code(hass):
) )
async def test_validating_mfa_invalid_user(hass): async def test_validating_mfa_invalid_user(hass: HomeAssistant) -> None:
"""Test validating an mfa code with invalid user.""" """Test validating an mfa code with invalid user."""
totp_auth_module = await auth_mfa_module_from_config(hass, {"type": "totp"}) totp_auth_module = await auth_mfa_module_from_config(hass, {"type": "totp"})
await totp_auth_module.async_setup_user("test-user", {}) await totp_auth_module.async_setup_user("test-user", {})
@ -43,7 +44,7 @@ async def test_validating_mfa_invalid_user(hass):
) )
async def test_setup_depose_user(hass): async def test_setup_depose_user(hass: HomeAssistant) -> None:
"""Test despose user.""" """Test despose user."""
totp_auth_module = await auth_mfa_module_from_config(hass, {"type": "totp"}) totp_auth_module = await auth_mfa_module_from_config(hass, {"type": "totp"})
result = await totp_auth_module.async_setup_user("test-user", {}) result = await totp_auth_module.async_setup_user("test-user", {})
@ -62,7 +63,7 @@ async def test_setup_depose_user(hass):
assert len(totp_auth_module._users) == 1 assert len(totp_auth_module._users) == 1
async def test_login_flow_validates_mfa(hass): async def test_login_flow_validates_mfa(hass: HomeAssistant) -> None:
"""Test login flow with mfa enabled.""" """Test login flow with mfa enabled."""
hass.auth = await auth_manager_from_config( hass.auth = await auth_manager_from_config(
hass, hass,
@ -130,7 +131,7 @@ async def test_login_flow_validates_mfa(hass):
assert result["data"].id == "mock-id" assert result["data"].id == "mock-id"
async def test_race_condition_in_data_loading(hass): async def test_race_condition_in_data_loading(hass: HomeAssistant) -> None:
"""Test race condition in the data loading.""" """Test race condition in the data loading."""
counter = 0 counter = 0

View file

@ -11,6 +11,7 @@ from homeassistant.auth.providers import (
auth_provider_from_config, auth_provider_from_config,
homeassistant as hass_auth, homeassistant as hass_auth,
) )
from homeassistant.core import HomeAssistant
@pytest.fixture @pytest.fixture
@ -273,7 +274,7 @@ async def test_legacy_get_or_create_credentials(hass, legacy_data):
assert credentials1 is not credentials3 assert credentials1 is not credentials3
async def test_race_condition_in_data_loading(hass): async def test_race_condition_in_data_loading(hass: HomeAssistant) -> None:
"""Test race condition in the hass_auth.Data loading. """Test race condition in the hass_auth.Data loading.
Ref issue: https://github.com/home-assistant/core/issues/21569 Ref issue: https://github.com/home-assistant/core/issues/21569

View file

@ -3,6 +3,7 @@ import asyncio
from unittest.mock import patch from unittest.mock import patch
from homeassistant.auth import auth_store from homeassistant.auth import auth_store
from homeassistant.core import HomeAssistant
async def test_loading_no_group_data_format(hass, hass_storage): async def test_loading_no_group_data_format(hass, hass_storage):
@ -232,7 +233,7 @@ async def test_system_groups_store_id_and_name(hass, hass_storage):
] ]
async def test_loading_race_condition(hass): async def test_loading_race_condition(hass: HomeAssistant) -> None:
"""Test only one storage load called when concurrent loading occurred .""" """Test only one storage load called when concurrent loading occurred ."""
store = auth_store.AuthStore(hass) store = auth_store.AuthStore(hass)
with patch( with patch(

View file

@ -15,7 +15,7 @@ from homeassistant.auth import (
models as auth_models, models as auth_models,
) )
from homeassistant.auth.const import GROUP_ID_ADMIN, MFA_SESSION_EXPIRATION from homeassistant.auth.const import GROUP_ID_ADMIN, MFA_SESSION_EXPIRATION
from homeassistant.core import callback from homeassistant.core import HomeAssistant, callback
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
from tests.common import ( from tests.common import (
@ -140,7 +140,7 @@ async def test_auth_manager_from_config_auth_modules(mock_hass):
] ]
async def test_create_new_user(hass): async def test_create_new_user(hass: HomeAssistant) -> None:
"""Test creating new user.""" """Test creating new user."""
events = [] events = []
@ -355,7 +355,7 @@ async def test_saving_loading(hass, hass_storage):
pytest.fail(f"Unknown client_id: {r_token.client_id}") pytest.fail(f"Unknown client_id: {r_token.client_id}")
async def test_cannot_retrieve_expired_access_token(hass): async def test_cannot_retrieve_expired_access_token(hass: HomeAssistant) -> None:
"""Test that we cannot retrieve expired access tokens.""" """Test that we cannot retrieve expired access tokens."""
manager = await auth.auth_manager_from_config(hass, [], []) manager = await auth.auth_manager_from_config(hass, [], [])
user = MockUser().add_to_auth_manager(manager) user = MockUser().add_to_auth_manager(manager)
@ -377,7 +377,7 @@ async def test_cannot_retrieve_expired_access_token(hass):
assert await manager.async_validate_access_token(access_token) is None assert await manager.async_validate_access_token(access_token) is None
async def test_generating_system_user(hass): async def test_generating_system_user(hass: HomeAssistant) -> None:
"""Test that we can add a system user.""" """Test that we can add a system user."""
events = [] events = []
@ -416,7 +416,7 @@ async def test_generating_system_user(hass):
assert events[1].data["user_id"] == user.id assert events[1].data["user_id"] == user.id
async def test_refresh_token_requires_client_for_user(hass): async def test_refresh_token_requires_client_for_user(hass: HomeAssistant) -> None:
"""Test create refresh token for a user with client_id.""" """Test create refresh token for a user with client_id."""
manager = await auth.auth_manager_from_config(hass, [], []) manager = await auth.auth_manager_from_config(hass, [], [])
user = MockUser().add_to_auth_manager(manager) user = MockUser().add_to_auth_manager(manager)
@ -433,7 +433,9 @@ async def test_refresh_token_requires_client_for_user(hass):
assert token.access_token_expiration == auth_const.ACCESS_TOKEN_EXPIRATION assert token.access_token_expiration == auth_const.ACCESS_TOKEN_EXPIRATION
async def test_refresh_token_not_requires_client_for_system_user(hass): async def test_refresh_token_not_requires_client_for_system_user(
hass: HomeAssistant,
) -> None:
"""Test create refresh token for a system user w/o client_id.""" """Test create refresh token for a system user w/o client_id."""
manager = await auth.auth_manager_from_config(hass, [], []) manager = await auth.auth_manager_from_config(hass, [], [])
user = await manager.async_create_system_user("Hass.io") user = await manager.async_create_system_user("Hass.io")
@ -448,7 +450,9 @@ async def test_refresh_token_not_requires_client_for_system_user(hass):
assert token.token_type == auth_models.TOKEN_TYPE_SYSTEM assert token.token_type == auth_models.TOKEN_TYPE_SYSTEM
async def test_refresh_token_with_specific_access_token_expiration(hass): async def test_refresh_token_with_specific_access_token_expiration(
hass: HomeAssistant,
) -> None:
"""Test create a refresh token with specific access token expiration.""" """Test create a refresh token with specific access token expiration."""
manager = await auth.auth_manager_from_config(hass, [], []) manager = await auth.auth_manager_from_config(hass, [], [])
user = MockUser().add_to_auth_manager(manager) user = MockUser().add_to_auth_manager(manager)
@ -461,7 +465,7 @@ async def test_refresh_token_with_specific_access_token_expiration(hass):
assert token.access_token_expiration == timedelta(days=100) assert token.access_token_expiration == timedelta(days=100)
async def test_refresh_token_type(hass): async def test_refresh_token_type(hass: HomeAssistant) -> None:
"""Test create a refresh token with token type.""" """Test create a refresh token with token type."""
manager = await auth.auth_manager_from_config(hass, [], []) manager = await auth.auth_manager_from_config(hass, [], [])
user = MockUser().add_to_auth_manager(manager) user = MockUser().add_to_auth_manager(manager)
@ -479,7 +483,7 @@ async def test_refresh_token_type(hass):
assert token.token_type == auth_models.TOKEN_TYPE_NORMAL assert token.token_type == auth_models.TOKEN_TYPE_NORMAL
async def test_refresh_token_type_long_lived_access_token(hass): async def test_refresh_token_type_long_lived_access_token(hass: HomeAssistant) -> None:
"""Test create a refresh token has long-lived access token type.""" """Test create a refresh token has long-lived access token type."""
manager = await auth.auth_manager_from_config(hass, [], []) manager = await auth.auth_manager_from_config(hass, [], [])
user = MockUser().add_to_auth_manager(manager) user = MockUser().add_to_auth_manager(manager)
@ -963,7 +967,7 @@ async def test_enable_mfa_for_user(hass, hass_storage):
await manager.async_disable_user_mfa(user, "insecure_example") await manager.async_disable_user_mfa(user, "insecure_example")
async def test_async_remove_user(hass): async def test_async_remove_user(hass: HomeAssistant) -> None:
"""Test removing a user.""" """Test removing a user."""
events = async_capture_events(hass, "user_removed") events = async_capture_events(hass, "user_removed")
manager = await auth.auth_manager_from_config( manager = await auth.auth_manager_from_config(
@ -1100,7 +1104,7 @@ async def test_rename_does_not_change_refresh_token(mock_hass):
assert token_before == token_after assert token_before == token_after
async def test_event_user_updated_fires(hass): async def test_event_user_updated_fires(hass: HomeAssistant) -> None:
"""Test the user updated event fires.""" """Test the user updated event fires."""
manager = await auth.auth_manager_from_config(hass, [], []) manager = await auth.auth_manager_from_config(hass, [], [])
user = MockUser().add_to_auth_manager(manager) user = MockUser().add_to_auth_manager(manager)

View file

@ -17,7 +17,7 @@ from homeassistant.const import (
CONF_VERIFY_SSL, CONF_VERIFY_SSL,
HTTP_BASIC_AUTHENTICATION, HTTP_BASIC_AUTHENTICATION,
) )
from homeassistant.core import EVENT_HOMEASSISTANT_CLOSE from homeassistant.core import EVENT_HOMEASSISTANT_CLOSE, HomeAssistant
import homeassistant.helpers.aiohttp_client as client import homeassistant.helpers.aiohttp_client as client
from homeassistant.util.color import RGBColor from homeassistant.util.color import RGBColor
@ -48,7 +48,7 @@ def camera_client_fixture(hass, hass_client):
return hass.loop.run_until_complete(hass_client()) return hass.loop.run_until_complete(hass_client())
async def test_get_clientsession_with_ssl(hass): async def test_get_clientsession_with_ssl(hass: HomeAssistant) -> None:
"""Test init clientsession with ssl.""" """Test init clientsession with ssl."""
client.async_get_clientsession(hass) client.async_get_clientsession(hass)
@ -56,7 +56,7 @@ async def test_get_clientsession_with_ssl(hass):
assert isinstance(hass.data[client.DATA_CONNECTOR], aiohttp.TCPConnector) assert isinstance(hass.data[client.DATA_CONNECTOR], aiohttp.TCPConnector)
async def test_get_clientsession_without_ssl(hass): async def test_get_clientsession_without_ssl(hass: HomeAssistant) -> None:
"""Test init clientsession without ssl.""" """Test init clientsession without ssl."""
client.async_get_clientsession(hass, verify_ssl=False) client.async_get_clientsession(hass, verify_ssl=False)
@ -66,21 +66,23 @@ async def test_get_clientsession_without_ssl(hass):
assert isinstance(hass.data[client.DATA_CONNECTOR_NOTVERIFY], aiohttp.TCPConnector) assert isinstance(hass.data[client.DATA_CONNECTOR_NOTVERIFY], aiohttp.TCPConnector)
async def test_create_clientsession_with_ssl_and_cookies(hass): async def test_create_clientsession_with_ssl_and_cookies(hass: HomeAssistant) -> None:
"""Test create clientsession with ssl.""" """Test create clientsession with ssl."""
session = client.async_create_clientsession(hass, cookies={"bla": True}) session = client.async_create_clientsession(hass, cookies={"bla": True})
assert isinstance(session, aiohttp.ClientSession) assert isinstance(session, aiohttp.ClientSession)
assert isinstance(hass.data[client.DATA_CONNECTOR], aiohttp.TCPConnector) assert isinstance(hass.data[client.DATA_CONNECTOR], aiohttp.TCPConnector)
async def test_create_clientsession_without_ssl_and_cookies(hass): async def test_create_clientsession_without_ssl_and_cookies(
hass: HomeAssistant,
) -> None:
"""Test create clientsession without ssl.""" """Test create clientsession without ssl."""
session = client.async_create_clientsession(hass, False, cookies={"bla": True}) session = client.async_create_clientsession(hass, False, cookies={"bla": True})
assert isinstance(session, aiohttp.ClientSession) assert isinstance(session, aiohttp.ClientSession)
assert isinstance(hass.data[client.DATA_CONNECTOR_NOTVERIFY], aiohttp.TCPConnector) assert isinstance(hass.data[client.DATA_CONNECTOR_NOTVERIFY], aiohttp.TCPConnector)
async def test_get_clientsession_cleanup(hass): async def test_get_clientsession_cleanup(hass: HomeAssistant) -> None:
"""Test init clientsession with ssl.""" """Test init clientsession with ssl."""
client.async_get_clientsession(hass) client.async_get_clientsession(hass)
@ -94,7 +96,7 @@ async def test_get_clientsession_cleanup(hass):
assert hass.data[client.DATA_CONNECTOR].closed assert hass.data[client.DATA_CONNECTOR].closed
async def test_get_clientsession_cleanup_without_ssl(hass): async def test_get_clientsession_cleanup_without_ssl(hass: HomeAssistant) -> None:
"""Test init clientsession with ssl.""" """Test init clientsession with ssl."""
client.async_get_clientsession(hass, verify_ssl=False) client.async_get_clientsession(hass, verify_ssl=False)
@ -110,7 +112,7 @@ async def test_get_clientsession_cleanup_without_ssl(hass):
assert hass.data[client.DATA_CONNECTOR_NOTVERIFY].closed assert hass.data[client.DATA_CONNECTOR_NOTVERIFY].closed
async def test_get_clientsession_patched_close(hass): async def test_get_clientsession_patched_close(hass: HomeAssistant) -> None:
"""Test closing clientsession does not work.""" """Test closing clientsession does not work."""
with patch("aiohttp.ClientSession.close") as mock_close: with patch("aiohttp.ClientSession.close") as mock_close:
session = client.async_get_clientsession(hass) session = client.async_get_clientsession(hass)
@ -226,7 +228,7 @@ async def test_sending_named_tuple(hass, aioclient_mock):
aioclient_mock.mock_calls[0][2]["rgb"] == RGBColor(4, 3, 2) aioclient_mock.mock_calls[0][2]["rgb"] == RGBColor(4, 3, 2)
async def test_client_session_immutable_headers(hass): async def test_client_session_immutable_headers(hass: HomeAssistant) -> None:
"""Test we can't mutate headers.""" """Test we can't mutate headers."""
session = client.async_get_clientsession(hass) session = client.async_get_clientsession(hass)

View file

@ -3,6 +3,7 @@ import logging
from unittest.mock import Mock, patch from unittest.mock import Mock, patch
from homeassistant.config import YAML_CONFIG_FILE from homeassistant.config import YAML_CONFIG_FILE
from homeassistant.core import HomeAssistant
from homeassistant.helpers.check_config import ( from homeassistant.helpers.check_config import (
CheckConfigError, CheckConfigError,
async_check_ha_config_file, async_check_ha_config_file,
@ -38,7 +39,7 @@ def log_ha_config(conf):
_LOGGER.debug("error[%s] = %s", cnt, err) _LOGGER.debug("error[%s] = %s", cnt, err)
async def test_bad_core_config(hass): async def test_bad_core_config(hass: HomeAssistant) -> None:
"""Test a bad core config setup.""" """Test a bad core config setup."""
files = {YAML_CONFIG_FILE: BAD_CORE_CONFIG} files = {YAML_CONFIG_FILE: BAD_CORE_CONFIG}
with patch("os.path.isfile", return_value=True), patch_yaml_files(files): with patch("os.path.isfile", return_value=True), patch_yaml_files(files):
@ -54,7 +55,7 @@ async def test_bad_core_config(hass):
assert not res.errors assert not res.errors
async def test_config_platform_valid(hass): async def test_config_platform_valid(hass: HomeAssistant) -> None:
"""Test a valid platform setup.""" """Test a valid platform setup."""
files = {YAML_CONFIG_FILE: BASE_CONFIG + "light:\n platform: demo"} files = {YAML_CONFIG_FILE: BASE_CONFIG + "light:\n platform: demo"}
with patch("os.path.isfile", return_value=True), patch_yaml_files(files): with patch("os.path.isfile", return_value=True), patch_yaml_files(files):
@ -66,7 +67,7 @@ async def test_config_platform_valid(hass):
assert not res.errors assert not res.errors
async def test_component_platform_not_found(hass): async def test_component_platform_not_found(hass: HomeAssistant) -> None:
"""Test errors if component or platform not found.""" """Test errors if component or platform not found."""
# Make sure they don't exist # Make sure they don't exist
files = {YAML_CONFIG_FILE: BASE_CONFIG + "beer:"} files = {YAML_CONFIG_FILE: BASE_CONFIG + "beer:"}
@ -84,7 +85,7 @@ async def test_component_platform_not_found(hass):
assert not res.errors assert not res.errors
async def test_component_requirement_not_found(hass): async def test_component_requirement_not_found(hass: HomeAssistant) -> None:
"""Test errors if component with a requirement not found not found.""" """Test errors if component with a requirement not found not found."""
# Make sure they don't exist # Make sure they don't exist
files = {YAML_CONFIG_FILE: BASE_CONFIG + "test_custom_component:"} files = {YAML_CONFIG_FILE: BASE_CONFIG + "test_custom_component:"}
@ -110,7 +111,7 @@ async def test_component_requirement_not_found(hass):
assert not res.errors assert not res.errors
async def test_component_not_found_safe_mode(hass): async def test_component_not_found_safe_mode(hass: HomeAssistant) -> None:
"""Test no errors if component not found in safe mode.""" """Test no errors if component not found in safe mode."""
# Make sure they don't exist # Make sure they don't exist
files = {YAML_CONFIG_FILE: BASE_CONFIG + "beer:"} files = {YAML_CONFIG_FILE: BASE_CONFIG + "beer:"}
@ -123,7 +124,7 @@ async def test_component_not_found_safe_mode(hass):
assert not res.errors assert not res.errors
async def test_component_platform_not_found_2(hass): async def test_component_platform_not_found_2(hass: HomeAssistant) -> None:
"""Test errors if component or platform not found.""" """Test errors if component or platform not found."""
# Make sure they don't exist # Make sure they don't exist
files = {YAML_CONFIG_FILE: BASE_CONFIG + "light:\n platform: beer"} files = {YAML_CONFIG_FILE: BASE_CONFIG + "light:\n platform: beer"}
@ -143,7 +144,7 @@ async def test_component_platform_not_found_2(hass):
assert not res.errors assert not res.errors
async def test_platform_not_found_safe_mode(hass): async def test_platform_not_found_safe_mode(hass: HomeAssistant) -> None:
"""Test no errors if platform not found in safe_mode.""" """Test no errors if platform not found in safe_mode."""
# Make sure they don't exist # Make sure they don't exist
files = {YAML_CONFIG_FILE: BASE_CONFIG + "light:\n platform: beer"} files = {YAML_CONFIG_FILE: BASE_CONFIG + "light:\n platform: beer"}
@ -158,7 +159,7 @@ async def test_platform_not_found_safe_mode(hass):
assert not res.errors assert not res.errors
async def test_package_invalid(hass): async def test_package_invalid(hass: HomeAssistant) -> None:
"""Test a valid platform setup.""" """Test a valid platform setup."""
files = {YAML_CONFIG_FILE: BASE_CONFIG + ' packages:\n p1:\n group: ["a"]'} files = {YAML_CONFIG_FILE: BASE_CONFIG + ' packages:\n p1:\n group: ["a"]'}
with patch("os.path.isfile", return_value=True), patch_yaml_files(files): with patch("os.path.isfile", return_value=True), patch_yaml_files(files):
@ -174,7 +175,7 @@ async def test_package_invalid(hass):
assert res.keys() == {"homeassistant"} assert res.keys() == {"homeassistant"}
async def test_bootstrap_error(hass): async def test_bootstrap_error(hass: HomeAssistant) -> None:
"""Test a valid platform setup.""" """Test a valid platform setup."""
files = {YAML_CONFIG_FILE: BASE_CONFIG + "automation: !include no.yaml"} files = {YAML_CONFIG_FILE: BASE_CONFIG + "automation: !include no.yaml"}
with patch("os.path.isfile", return_value=True), patch_yaml_files(files): with patch("os.path.isfile", return_value=True), patch_yaml_files(files):
@ -188,7 +189,7 @@ async def test_bootstrap_error(hass):
assert not res.errors assert not res.errors
async def test_automation_config_platform(hass): async def test_automation_config_platform(hass: HomeAssistant) -> None:
"""Test automation async config.""" """Test automation async config."""
files = { files = {
YAML_CONFIG_FILE: BASE_CONFIG YAML_CONFIG_FILE: BASE_CONFIG
@ -224,7 +225,7 @@ action:
assert "input_datetime" in res assert "input_datetime" in res
async def test_config_platform_raise(hass): async def test_config_platform_raise(hass: HomeAssistant) -> None:
"""Test bad config validation platform.""" """Test bad config validation platform."""
mock_platform( mock_platform(
hass, hass,

View file

@ -6,6 +6,7 @@ import logging
import pytest import pytest
import voluptuous as vol import voluptuous as vol
from homeassistant.core import HomeAssistant
from homeassistant.helpers import ( from homeassistant.helpers import (
collection, collection,
entity_component, entity_component,
@ -188,7 +189,7 @@ async def test_yaml_collection_skipping_duplicate_ids() -> None:
) )
async def test_storage_collection(hass): async def test_storage_collection(hass: HomeAssistant) -> None:
"""Test storage collection.""" """Test storage collection."""
store = storage.Store(hass, 1, "test-data") store = storage.Store(hass, 1, "test-data")
await store.async_save( await store.async_save(
@ -251,7 +252,7 @@ async def test_storage_collection(hass):
} }
async def test_attach_entity_component_collection(hass): async def test_attach_entity_component_collection(hass: HomeAssistant) -> None:
"""Test attaching collection to entity component.""" """Test attaching collection to entity component."""
ent_comp = entity_component.EntityComponent(_LOGGER, "test", hass) ent_comp = entity_component.EntityComponent(_LOGGER, "test", hass)
coll = MockObservableCollection(_LOGGER) coll = MockObservableCollection(_LOGGER)
@ -290,7 +291,7 @@ async def test_attach_entity_component_collection(hass):
assert hass.states.get("test.mock_1") is None assert hass.states.get("test.mock_1") is None
async def test_entity_component_collection_abort(hass): async def test_entity_component_collection_abort(hass: HomeAssistant) -> None:
"""Test aborted entity adding is handled.""" """Test aborted entity adding is handled."""
ent_comp = entity_component.EntityComponent(_LOGGER, "test", hass) ent_comp = entity_component.EntityComponent(_LOGGER, "test", hass)
coll = MockObservableCollection(_LOGGER) coll = MockObservableCollection(_LOGGER)
@ -356,7 +357,7 @@ async def test_entity_component_collection_abort(hass):
assert len(async_remove_calls) == 0 assert len(async_remove_calls) == 0
async def test_entity_component_collection_entity_removed(hass): async def test_entity_component_collection_entity_removed(hass: HomeAssistant) -> None:
"""Test entity removal is handled.""" """Test entity removal is handled."""
ent_comp = entity_component.EntityComponent(_LOGGER, "test", hass) ent_comp = entity_component.EntityComponent(_LOGGER, "test", hass)
coll = MockObservableCollection(_LOGGER) coll = MockObservableCollection(_LOGGER)

View file

@ -86,7 +86,7 @@ def assert_condition_trace(expected):
assert_element(condition_trace[key][index], element, path) assert_element(condition_trace[key][index], element, path)
async def test_invalid_condition(hass): async def test_invalid_condition(hass: HomeAssistant) -> None:
"""Test if invalid condition raises.""" """Test if invalid condition raises."""
with pytest.raises(HomeAssistantError): with pytest.raises(HomeAssistantError):
await condition.async_from_config( await condition.async_from_config(
@ -104,7 +104,7 @@ async def test_invalid_condition(hass):
) )
async def test_and_condition(hass): async def test_and_condition(hass: HomeAssistant) -> None:
"""Test the 'and' condition.""" """Test the 'and' condition."""
config = { config = {
"alias": "And Condition", "alias": "And Condition",
@ -177,7 +177,7 @@ async def test_and_condition(hass):
) )
async def test_and_condition_raises(hass): async def test_and_condition_raises(hass: HomeAssistant) -> None:
"""Test the 'and' condition.""" """Test the 'and' condition."""
config = { config = {
"alias": "And Condition", "alias": "And Condition",
@ -250,7 +250,7 @@ async def test_and_condition_raises(hass):
) )
async def test_and_condition_with_template(hass): async def test_and_condition_with_template(hass: HomeAssistant) -> None:
"""Test the 'and' condition.""" """Test the 'and' condition."""
config = { config = {
"condition": "and", "condition": "and",
@ -289,7 +289,7 @@ async def test_and_condition_with_template(hass):
assert test(hass) assert test(hass)
async def test_and_condition_shorthand(hass): async def test_and_condition_shorthand(hass: HomeAssistant) -> None:
"""Test the 'and' condition shorthand.""" """Test the 'and' condition shorthand."""
config = { config = {
"alias": "And Condition Shorthand", "alias": "And Condition Shorthand",
@ -331,7 +331,7 @@ async def test_and_condition_shorthand(hass):
assert test(hass) assert test(hass)
async def test_and_condition_list_shorthand(hass): async def test_and_condition_list_shorthand(hass: HomeAssistant) -> None:
"""Test the 'and' condition list shorthand.""" """Test the 'and' condition list shorthand."""
config = { config = {
"alias": "And Condition List Shorthand", "alias": "And Condition List Shorthand",
@ -373,7 +373,7 @@ async def test_and_condition_list_shorthand(hass):
assert test(hass) assert test(hass)
async def test_malformed_and_condition_list_shorthand(hass): async def test_malformed_and_condition_list_shorthand(hass: HomeAssistant) -> None:
"""Test the 'and' condition list shorthand syntax check.""" """Test the 'and' condition list shorthand syntax check."""
config = { config = {
"alias": "Bad shorthand syntax", "alias": "Bad shorthand syntax",
@ -384,7 +384,7 @@ async def test_malformed_and_condition_list_shorthand(hass):
cv.CONDITION_SCHEMA(config) cv.CONDITION_SCHEMA(config)
async def test_or_condition(hass): async def test_or_condition(hass: HomeAssistant) -> None:
"""Test the 'or' condition.""" """Test the 'or' condition."""
config = { config = {
"alias": "Or Condition", "alias": "Or Condition",
@ -467,7 +467,7 @@ async def test_or_condition(hass):
) )
async def test_or_condition_raises(hass): async def test_or_condition_raises(hass: HomeAssistant) -> None:
"""Test the 'or' condition.""" """Test the 'or' condition."""
config = { config = {
"alias": "Or Condition", "alias": "Or Condition",
@ -540,7 +540,7 @@ async def test_or_condition_raises(hass):
) )
async def test_or_condition_with_template(hass): async def test_or_condition_with_template(hass: HomeAssistant) -> None:
"""Test the 'or' condition.""" """Test the 'or' condition."""
config = { config = {
"condition": "or", "condition": "or",
@ -567,7 +567,7 @@ async def test_or_condition_with_template(hass):
assert test(hass) assert test(hass)
async def test_or_condition_shorthand(hass): async def test_or_condition_shorthand(hass: HomeAssistant) -> None:
"""Test the 'or' condition shorthand.""" """Test the 'or' condition shorthand."""
config = { config = {
"alias": "Or Condition Shorthand", "alias": "Or Condition Shorthand",
@ -597,7 +597,7 @@ async def test_or_condition_shorthand(hass):
assert test(hass) assert test(hass)
async def test_not_condition(hass): async def test_not_condition(hass: HomeAssistant) -> None:
"""Test the 'not' condition.""" """Test the 'not' condition."""
config = { config = {
"alias": "Not Condition", "alias": "Not Condition",
@ -696,7 +696,7 @@ async def test_not_condition(hass):
) )
async def test_not_condition_raises(hass): async def test_not_condition_raises(hass: HomeAssistant) -> None:
"""Test the 'and' condition.""" """Test the 'and' condition."""
config = { config = {
"alias": "Not Condition", "alias": "Not Condition",
@ -763,7 +763,7 @@ async def test_not_condition_raises(hass):
) )
async def test_not_condition_with_template(hass): async def test_not_condition_with_template(hass: HomeAssistant) -> None:
"""Test the 'or' condition.""" """Test the 'or' condition."""
config = { config = {
"condition": "not", "condition": "not",
@ -796,7 +796,7 @@ async def test_not_condition_with_template(hass):
assert not test(hass) assert not test(hass)
async def test_not_condition_shorthand(hass): async def test_not_condition_shorthand(hass: HomeAssistant) -> None:
"""Test the 'or' condition shorthand.""" """Test the 'or' condition shorthand."""
config = { config = {
"alias": "Not Condition Shorthand", "alias": "Not Condition Shorthand",
@ -832,7 +832,7 @@ async def test_not_condition_shorthand(hass):
assert not test(hass) assert not test(hass)
async def test_time_window(hass): async def test_time_window(hass: HomeAssistant) -> None:
"""Test time condition windows.""" """Test time condition windows."""
sixam = "06:00:00" sixam = "06:00:00"
sixpm = "18:00:00" sixpm = "18:00:00"
@ -885,7 +885,7 @@ async def test_time_window(hass):
assert test2(hass) assert test2(hass)
async def test_time_using_input_datetime(hass): async def test_time_using_input_datetime(hass: HomeAssistant) -> None:
"""Test time conditions using input_datetime entities.""" """Test time conditions using input_datetime entities."""
await async_setup_component( await async_setup_component(
hass, hass,
@ -1005,7 +1005,7 @@ async def test_time_using_input_datetime(hass):
condition.time(hass, before="input_datetime.not_existing") condition.time(hass, before="input_datetime.not_existing")
async def test_time_using_sensor(hass): async def test_time_using_sensor(hass: HomeAssistant) -> None:
"""Test time conditions using sensor entities.""" """Test time conditions using sensor entities."""
hass.states.async_set( hass.states.async_set(
"sensor.am", "sensor.am",
@ -1089,7 +1089,7 @@ async def test_time_using_sensor(hass):
condition.time(hass, before="sensor.not_existing") condition.time(hass, before="sensor.not_existing")
async def test_state_raises(hass): async def test_state_raises(hass: HomeAssistant) -> None:
"""Test that state raises ConditionError on errors.""" """Test that state raises ConditionError on errors."""
# No entity # No entity
with pytest.raises(ConditionError, match="no entity"): with pytest.raises(ConditionError, match="no entity"):
@ -1124,7 +1124,7 @@ async def test_state_raises(hass):
test(hass) test(hass)
async def test_state_unknown_attribute(hass): async def test_state_unknown_attribute(hass: HomeAssistant) -> None:
"""Test that state returns False on unknown attribute.""" """Test that state returns False on unknown attribute."""
# Unknown attribute # Unknown attribute
config = { config = {
@ -1156,7 +1156,7 @@ async def test_state_unknown_attribute(hass):
) )
async def test_state_multiple_entities(hass): async def test_state_multiple_entities(hass: HomeAssistant) -> None:
"""Test with multiple entities in condition.""" """Test with multiple entities in condition."""
config = { config = {
"condition": "and", "condition": "and",
@ -1219,7 +1219,7 @@ async def test_state_multiple_entities_match_any(hass: HomeAssistant) -> None:
assert not test(hass) assert not test(hass)
async def test_multiple_states(hass): async def test_multiple_states(hass: HomeAssistant) -> None:
"""Test with multiple states in condition.""" """Test with multiple states in condition."""
config = { config = {
"condition": "and", "condition": "and",
@ -1246,7 +1246,7 @@ async def test_multiple_states(hass):
assert not test(hass) assert not test(hass)
async def test_state_attribute(hass): async def test_state_attribute(hass: HomeAssistant) -> None:
"""Test with state attribute in condition.""" """Test with state attribute in condition."""
config = { config = {
"condition": "and", "condition": "and",
@ -1279,7 +1279,7 @@ async def test_state_attribute(hass):
assert not test(hass) assert not test(hass)
async def test_state_attribute_boolean(hass): async def test_state_attribute_boolean(hass: HomeAssistant) -> None:
"""Test with boolean state attribute in condition.""" """Test with boolean state attribute in condition."""
config = { config = {
"condition": "state", "condition": "state",
@ -1304,7 +1304,7 @@ async def test_state_attribute_boolean(hass):
assert test(hass) assert test(hass)
async def test_state_entity_registry_id(hass): async def test_state_entity_registry_id(hass: HomeAssistant) -> None:
"""Test with entity specified by entity registry id.""" """Test with entity specified by entity registry id."""
registry = er.async_get(hass) registry = er.async_get(hass)
entry = registry.async_get_or_create( entry = registry.async_get_or_create(
@ -1327,7 +1327,7 @@ async def test_state_entity_registry_id(hass):
assert not test(hass) assert not test(hass)
async def test_state_using_input_entities(hass): async def test_state_using_input_entities(hass: HomeAssistant) -> None:
"""Test state conditions using input_* entities.""" """Test state conditions using input_* entities."""
await async_setup_component( await async_setup_component(
hass, hass,
@ -1408,7 +1408,7 @@ async def test_state_using_input_entities(hass):
assert test(hass) assert test(hass)
async def test_numeric_state_known_non_matching(hass): async def test_numeric_state_known_non_matching(hass: HomeAssistant) -> None:
"""Test that numeric_state doesn't match on known non-matching states.""" """Test that numeric_state doesn't match on known non-matching states."""
hass.states.async_set("sensor.temperature", "unavailable") hass.states.async_set("sensor.temperature", "unavailable")
config = { config = {
@ -1460,7 +1460,7 @@ async def test_numeric_state_known_non_matching(hass):
) )
async def test_numeric_state_raises(hass): async def test_numeric_state_raises(hass: HomeAssistant) -> None:
"""Test that numeric_state raises ConditionError on errors.""" """Test that numeric_state raises ConditionError on errors."""
# Unknown entities # Unknown entities
config = { config = {
@ -1550,7 +1550,7 @@ async def test_numeric_state_raises(hass):
test(hass) test(hass)
async def test_numeric_state_unknown_attribute(hass): async def test_numeric_state_unknown_attribute(hass: HomeAssistant) -> None:
"""Test that numeric_state returns False on unknown attribute.""" """Test that numeric_state returns False on unknown attribute."""
# Unknown attribute # Unknown attribute
config = { config = {
@ -1583,7 +1583,7 @@ async def test_numeric_state_unknown_attribute(hass):
) )
async def test_numeric_state_multiple_entities(hass): async def test_numeric_state_multiple_entities(hass: HomeAssistant) -> None:
"""Test with multiple entities in condition.""" """Test with multiple entities in condition."""
config = { config = {
"condition": "and", "condition": "and",
@ -1613,7 +1613,7 @@ async def test_numeric_state_multiple_entities(hass):
assert not test(hass) assert not test(hass)
async def test_numeric_state_attribute(hass): async def test_numeric_state_attribute(hass: HomeAssistant) -> None:
"""Test with numeric state attribute in condition.""" """Test with numeric state attribute in condition."""
config = { config = {
"condition": "and", "condition": "and",
@ -1646,7 +1646,7 @@ async def test_numeric_state_attribute(hass):
assert not test(hass) assert not test(hass)
async def test_numeric_state_entity_registry_id(hass): async def test_numeric_state_entity_registry_id(hass: HomeAssistant) -> None:
"""Test with entity specified by entity registry id.""" """Test with entity specified by entity registry id."""
registry = er.async_get(hass) registry = er.async_get(hass)
entry = registry.async_get_or_create( entry = registry.async_get_or_create(
@ -1669,7 +1669,7 @@ async def test_numeric_state_entity_registry_id(hass):
assert not test(hass) assert not test(hass)
async def test_numeric_state_using_input_number(hass): async def test_numeric_state_using_input_number(hass: HomeAssistant) -> None:
"""Test numeric_state conditions using input_number entities.""" """Test numeric_state conditions using input_number entities."""
hass.states.async_set("number.low", 10) hass.states.async_set("number.low", 10)
await async_setup_component( await async_setup_component(
@ -1739,7 +1739,7 @@ async def test_numeric_state_using_input_number(hass):
) )
async def test_zone_raises(hass): async def test_zone_raises(hass: HomeAssistant) -> None:
"""Test that zone raises ConditionError on errors.""" """Test that zone raises ConditionError on errors."""
config = { config = {
"condition": "zone", "condition": "zone",
@ -1825,7 +1825,7 @@ async def test_zone_raises(hass):
assert test(hass) assert test(hass)
async def test_zone_multiple_entities(hass): async def test_zone_multiple_entities(hass: HomeAssistant) -> None:
"""Test with multiple entities in condition.""" """Test with multiple entities in condition."""
config = { config = {
"condition": "and", "condition": "and",
@ -1885,7 +1885,7 @@ async def test_zone_multiple_entities(hass):
assert not test(hass) assert not test(hass)
async def test_multiple_zones(hass): async def test_multiple_zones(hass: HomeAssistant) -> None:
"""Test with multiple entities in condition.""" """Test with multiple entities in condition."""
config = { config = {
"condition": "and", "condition": "and",
@ -2056,7 +2056,7 @@ async def test_extract_devices() -> None:
) == {"abcd", "qwer", "abcd_not", "qwer_not", "abcd_or", "qwer_or"} ) == {"abcd", "qwer", "abcd_not", "qwer_not", "abcd_or", "qwer_or"}
async def test_condition_template_error(hass): async def test_condition_template_error(hass: HomeAssistant) -> None:
"""Test invalid template.""" """Test invalid template."""
config = {"condition": "template", "value_template": "{{ undefined.state }}"} config = {"condition": "template", "value_template": "{{ undefined.state }}"}
config = cv.CONDITION_SCHEMA(config) config = cv.CONDITION_SCHEMA(config)
@ -2067,7 +2067,7 @@ async def test_condition_template_error(hass):
test(hass) test(hass)
async def test_condition_template_invalid_results(hass): async def test_condition_template_invalid_results(hass: HomeAssistant) -> None:
"""Test template condition render false with invalid results.""" """Test template condition render false with invalid results."""
config = {"condition": "template", "value_template": "{{ 'string' }}"} config = {"condition": "template", "value_template": "{{ 'string' }}"}
config = cv.CONDITION_SCHEMA(config) config = cv.CONDITION_SCHEMA(config)
@ -3260,7 +3260,7 @@ async def test_if_action_after_sunset_no_offset_kotzebue(hass, hass_ws_client, c
) )
async def test_trigger(hass): async def test_trigger(hass: HomeAssistant) -> None:
"""Test trigger condition.""" """Test trigger condition."""
config = {"alias": "Trigger Cond", "condition": "trigger", "id": "123456"} config = {"alias": "Trigger Cond", "condition": "trigger", "id": "123456"}
config = cv.CONDITION_SCHEMA(config) config = cv.CONDITION_SCHEMA(config)
@ -3274,7 +3274,7 @@ async def test_trigger(hass):
assert test(hass, {"trigger": {"id": "123456"}}) assert test(hass, {"trigger": {"id": "123456"}})
async def test_platform_async_validate_condition_config(hass): async def test_platform_async_validate_condition_config(hass: HomeAssistant) -> None:
"""Test platform.async_validate_condition_config will be called if it exists.""" """Test platform.async_validate_condition_config will be called if it exists."""
config = {CONF_DEVICE_ID: "test", CONF_DOMAIN: "test", CONF_CONDITION: "device"} config = {CONF_DEVICE_ID: "test", CONF_DOMAIN: "test", CONF_CONDITION: "device"}
with patch( with patch(
@ -3305,7 +3305,7 @@ async def test_disabled_condition(hass: HomeAssistant) -> None:
assert test(hass) is None assert test(hass) is None
async def test_and_condition_with_disabled_condition(hass): async def test_and_condition_with_disabled_condition(hass: HomeAssistant) -> None:
"""Test the 'and' condition with one of the conditions disabled.""" """Test the 'and' condition with one of the conditions disabled."""
config = { config = {
"alias": "And Condition", "alias": "And Condition",
@ -3370,7 +3370,7 @@ async def test_and_condition_with_disabled_condition(hass):
) )
async def test_or_condition_with_disabled_condition(hass): async def test_or_condition_with_disabled_condition(hass: HomeAssistant) -> None:
"""Test the 'or' condition with one of the conditions disabled.""" """Test the 'or' condition with one of the conditions disabled."""
config = { config = {
"alias": "Or Condition", "alias": "Or Condition",

View file

@ -1,10 +1,11 @@
"""Tests for debounce.""" """Tests for debounce."""
from unittest.mock import AsyncMock from unittest.mock import AsyncMock
from homeassistant.core import HomeAssistant
from homeassistant.helpers import debounce from homeassistant.helpers import debounce
async def test_immediate_works(hass): async def test_immediate_works(hass: HomeAssistant) -> None:
"""Test immediate works.""" """Test immediate works."""
calls = [] calls = []
debouncer = debounce.Debouncer( debouncer = debounce.Debouncer(
@ -57,7 +58,7 @@ async def test_immediate_works(hass):
assert debouncer._job.target == debouncer.function assert debouncer._job.target == debouncer.function
async def test_not_immediate_works(hass): async def test_not_immediate_works(hass: HomeAssistant) -> None:
"""Test immediate works.""" """Test immediate works."""
calls = [] calls = []
debouncer = debounce.Debouncer( debouncer = debounce.Debouncer(
@ -107,7 +108,7 @@ async def test_not_immediate_works(hass):
assert debouncer._job.target == debouncer.function assert debouncer._job.target == debouncer.function
async def test_immediate_works_with_function_swapped(hass): async def test_immediate_works_with_function_swapped(hass: HomeAssistant) -> None:
"""Test immediate works and we can change out the function.""" """Test immediate works and we can change out the function."""
calls = [] calls = []

View file

@ -6,7 +6,7 @@ import pytest
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.const import EVENT_HOMEASSISTANT_STARTED from homeassistant.const import EVENT_HOMEASSISTANT_STARTED
from homeassistant.core import CoreState, callback from homeassistant.core import CoreState, HomeAssistant, callback
from homeassistant.exceptions import RequiredParameterMissing from homeassistant.exceptions import RequiredParameterMissing
from homeassistant.helpers import device_registry, entity_registry from homeassistant.helpers import device_registry, entity_registry
@ -1159,7 +1159,7 @@ async def test_cleanup_device_registry_removes_expired_orphaned_devices(hass, re
assert len(registry.deleted_devices) == 0 assert len(registry.deleted_devices) == 0
async def test_cleanup_startup(hass): async def test_cleanup_startup(hass: HomeAssistant) -> None:
"""Test we run a cleanup on startup.""" """Test we run a cleanup on startup."""
hass.state = CoreState.not_running hass.state = CoreState.not_running
@ -1173,7 +1173,7 @@ async def test_cleanup_startup(hass):
@pytest.mark.parametrize("load_registries", [False]) @pytest.mark.parametrize("load_registries", [False])
async def test_cleanup_entity_registry_change(hass): async def test_cleanup_entity_registry_change(hass: HomeAssistant) -> None:
"""Test we run a cleanup when entity registry changes. """Test we run a cleanup when entity registry changes.
Don't pre-load the registries as the debouncer will then not be waiting for Don't pre-load the registries as the debouncer will then not be waiting for

View file

@ -5,7 +5,7 @@ import pytest
from homeassistant import setup from homeassistant import setup
from homeassistant.const import Platform from homeassistant.const import Platform
from homeassistant.core import callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import discovery from homeassistant.helpers import discovery
from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.helpers.dispatcher import async_dispatcher_send
@ -104,7 +104,7 @@ async def test_platform(hass, mock_setup_component):
assert len(calls) == 1 assert len(calls) == 1
async def test_circular_import(hass): async def test_circular_import(hass: HomeAssistant) -> None:
"""Test we don't break doing circular import. """Test we don't break doing circular import.
This test will have test_component discover the switch.test_circular This test will have test_component discover the switch.test_circular
@ -155,7 +155,7 @@ async def test_circular_import(hass):
assert "switch" in hass.config.components assert "switch" in hass.config.components
async def test_1st_discovers_2nd_component(hass): async def test_1st_discovers_2nd_component(hass: HomeAssistant) -> None:
"""Test that we don't break if one component discovers the other. """Test that we don't break if one component discovers the other.
If the first component fires a discovery event to set up the If the first component fires a discovery event to set up the

View file

@ -3,14 +3,14 @@ from functools import partial
import pytest import pytest
from homeassistant.core import callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.dispatcher import ( from homeassistant.helpers.dispatcher import (
async_dispatcher_connect, async_dispatcher_connect,
async_dispatcher_send, async_dispatcher_send,
) )
async def test_simple_function(hass): async def test_simple_function(hass: HomeAssistant) -> None:
"""Test simple function (executor).""" """Test simple function (executor)."""
calls = [] calls = []
@ -30,7 +30,7 @@ async def test_simple_function(hass):
assert calls == [3, "bla"] assert calls == [3, "bla"]
async def test_simple_function_unsub(hass): async def test_simple_function_unsub(hass: HomeAssistant) -> None:
"""Test simple function (executor) and unsub.""" """Test simple function (executor) and unsub."""
calls1 = [] calls1 = []
calls2 = [] calls2 = []
@ -72,7 +72,7 @@ async def test_simple_function_unsub(hass):
assert calls2 == [4] assert calls2 == [4]
async def test_simple_callback(hass): async def test_simple_callback(hass: HomeAssistant) -> None:
"""Test simple callback (async).""" """Test simple callback (async)."""
calls = [] calls = []
@ -93,7 +93,7 @@ async def test_simple_callback(hass):
assert calls == [3, "bla"] assert calls == [3, "bla"]
async def test_simple_coro(hass): async def test_simple_coro(hass: HomeAssistant) -> None:
"""Test simple coro (async).""" """Test simple coro (async)."""
calls = [] calls = []
@ -113,7 +113,7 @@ async def test_simple_coro(hass):
assert calls == [3, "bla"] assert calls == [3, "bla"]
async def test_simple_function_multiargs(hass): async def test_simple_function_multiargs(hass: HomeAssistant) -> None:
"""Test simple function (executor).""" """Test simple function (executor)."""
calls = [] calls = []

View file

@ -16,7 +16,7 @@ from homeassistant.const import (
STATE_UNAVAILABLE, STATE_UNAVAILABLE,
STATE_UNKNOWN, STATE_UNKNOWN,
) )
from homeassistant.core import Context, HomeAssistantError from homeassistant.core import Context, HomeAssistant, HomeAssistantError
from homeassistant.helpers import device_registry as dr, entity, entity_registry as er from homeassistant.helpers import device_registry as dr, entity, entity_registry as er
from tests.common import ( from tests.common import (
@ -53,7 +53,7 @@ def test_generate_entity_id_given_keys() -> None:
) )
async def test_async_update_support(hass): async def test_async_update_support(hass: HomeAssistant) -> None:
"""Test async update getting called.""" """Test async update getting called."""
sync_update = [] sync_update = []
async_update = [] async_update = []
@ -196,7 +196,7 @@ async def test_warn_slow_device_update_disabled(hass, caplog):
assert update_call assert update_call
async def test_async_schedule_update_ha_state(hass): async def test_async_schedule_update_ha_state(hass: HomeAssistant) -> None:
"""Warn we log when entity update takes a long time and trow exception.""" """Warn we log when entity update takes a long time and trow exception."""
update_call = False update_call = False
@ -216,7 +216,7 @@ async def test_async_schedule_update_ha_state(hass):
assert update_call is True assert update_call is True
async def test_async_async_request_call_without_lock(hass): async def test_async_async_request_call_without_lock(hass: HomeAssistant) -> None:
"""Test for async_requests_call works without a lock.""" """Test for async_requests_call works without a lock."""
updates = [] updates = []
@ -251,7 +251,7 @@ async def test_async_async_request_call_without_lock(hass):
assert updates == [1, 2] assert updates == [1, 2]
async def test_async_async_request_call_with_lock(hass): async def test_async_async_request_call_with_lock(hass: HomeAssistant) -> None:
"""Test for async_requests_call works with a semaphore.""" """Test for async_requests_call works with a semaphore."""
updates = [] updates = []
@ -302,7 +302,7 @@ async def test_async_async_request_call_with_lock(hass):
assert updates == [1, 2] assert updates == [1, 2]
async def test_async_parallel_updates_with_zero(hass): async def test_async_parallel_updates_with_zero(hass: HomeAssistant) -> None:
"""Test parallel updates with 0 (disabled).""" """Test parallel updates with 0 (disabled)."""
updates = [] updates = []
test_lock = asyncio.Event() test_lock = asyncio.Event()
@ -339,7 +339,9 @@ async def test_async_parallel_updates_with_zero(hass):
test_lock.set() test_lock.set()
async def test_async_parallel_updates_with_zero_on_sync_update(hass): async def test_async_parallel_updates_with_zero_on_sync_update(
hass: HomeAssistant,
) -> None:
"""Test parallel updates with 0 (disabled).""" """Test parallel updates with 0 (disabled)."""
updates = [] updates = []
test_lock = threading.Event() test_lock = threading.Event()
@ -379,7 +381,7 @@ async def test_async_parallel_updates_with_zero_on_sync_update(hass):
await asyncio.sleep(0) await asyncio.sleep(0)
async def test_async_parallel_updates_with_one(hass): async def test_async_parallel_updates_with_one(hass: HomeAssistant) -> None:
"""Test parallel updates with 1 (sequential).""" """Test parallel updates with 1 (sequential)."""
updates = [] updates = []
test_lock = asyncio.Lock() test_lock = asyncio.Lock()
@ -455,7 +457,7 @@ async def test_async_parallel_updates_with_one(hass):
test_lock.release() test_lock.release()
async def test_async_parallel_updates_with_two(hass): async def test_async_parallel_updates_with_two(hass: HomeAssistant) -> None:
"""Test parallel updates with 2 (parallel).""" """Test parallel updates with 2 (parallel)."""
updates = [] updates = []
test_lock = asyncio.Lock() test_lock = asyncio.Lock()
@ -524,7 +526,7 @@ async def test_async_parallel_updates_with_two(hass):
test_lock.release() test_lock.release()
async def test_async_remove_no_platform(hass): async def test_async_remove_no_platform(hass: HomeAssistant) -> None:
"""Test async_remove method when no platform set.""" """Test async_remove method when no platform set."""
ent = entity.Entity() ent = entity.Entity()
ent.hass = hass ent.hass = hass
@ -535,7 +537,7 @@ async def test_async_remove_no_platform(hass):
assert len(hass.states.async_entity_ids()) == 0 assert len(hass.states.async_entity_ids()) == 0
async def test_async_remove_runs_callbacks(hass): async def test_async_remove_runs_callbacks(hass: HomeAssistant) -> None:
"""Test async_remove method when no platform set.""" """Test async_remove method when no platform set."""
result = [] result = []
@ -547,7 +549,7 @@ async def test_async_remove_runs_callbacks(hass):
assert len(result) == 1 assert len(result) == 1
async def test_async_remove_ignores_in_flight_polling(hass): async def test_async_remove_ignores_in_flight_polling(hass: HomeAssistant) -> None:
"""Test in flight polling is ignored after removing.""" """Test in flight polling is ignored after removing."""
result = [] result = []
@ -563,7 +565,7 @@ async def test_async_remove_ignores_in_flight_polling(hass):
ent.async_write_ha_state() ent.async_write_ha_state()
async def test_set_context(hass): async def test_set_context(hass: HomeAssistant) -> None:
"""Test setting context.""" """Test setting context."""
context = Context() context = Context()
ent = entity.Entity() ent = entity.Entity()
@ -574,7 +576,7 @@ async def test_set_context(hass):
assert hass.states.get("hello.world").context == context assert hass.states.get("hello.world").context == context
async def test_set_context_expired(hass): async def test_set_context_expired(hass: HomeAssistant) -> None:
"""Test setting context.""" """Test setting context."""
context = Context() context = Context()
@ -620,7 +622,7 @@ async def test_warn_disabled(hass, caplog):
assert caplog.text == "" assert caplog.text == ""
async def test_disabled_in_entity_registry(hass): async def test_disabled_in_entity_registry(hass: HomeAssistant) -> None:
"""Test entity is removed if we disable entity registry entry.""" """Test entity is removed if we disable entity registry entry."""
entry = er.RegistryEntry( entry = er.RegistryEntry(
entity_id="hello.world", entity_id="hello.world",
@ -656,7 +658,7 @@ async def test_disabled_in_entity_registry(hass):
assert ent.registry_entry == entry2 assert ent.registry_entry == entry2
async def test_capability_attrs(hass): async def test_capability_attrs(hass: HomeAssistant) -> None:
"""Test we still include capabilities even when unavailable.""" """Test we still include capabilities even when unavailable."""
with patch.object( with patch.object(
entity.Entity, "available", PropertyMock(return_value=False) entity.Entity, "available", PropertyMock(return_value=False)
@ -718,7 +720,7 @@ async def test_warn_slow_write_state_custom_component(hass, caplog):
) in caplog.text ) in caplog.text
async def test_setup_source(hass): async def test_setup_source(hass: HomeAssistant) -> None:
"""Check that we register sources correctly.""" """Check that we register sources correctly."""
platform = MockEntityPlatform(hass) platform = MockEntityPlatform(hass)
@ -748,7 +750,7 @@ async def test_setup_source(hass):
assert entity.entity_sources(hass) == {} assert entity.entity_sources(hass) == {}
async def test_removing_entity_unavailable(hass): async def test_removing_entity_unavailable(hass: HomeAssistant) -> None:
"""Test removing an entity that is still registered creates an unavailable state.""" """Test removing an entity that is still registered creates an unavailable state."""
entry = er.RegistryEntry( entry = er.RegistryEntry(
entity_id="hello.world", entity_id="hello.world",
@ -774,7 +776,7 @@ async def test_removing_entity_unavailable(hass):
assert state.state == STATE_UNAVAILABLE assert state.state == STATE_UNAVAILABLE
async def test_get_supported_features_entity_registry(hass): async def test_get_supported_features_entity_registry(hass: HomeAssistant) -> None:
"""Test get_supported_features falls back to entity registry.""" """Test get_supported_features falls back to entity registry."""
entity_reg = mock_registry(hass) entity_reg = mock_registry(hass)
entity_id = entity_reg.async_get_or_create( entity_id = entity_reg.async_get_or_create(
@ -783,7 +785,7 @@ async def test_get_supported_features_entity_registry(hass):
assert entity.get_supported_features(hass, entity_id) == 456 assert entity.get_supported_features(hass, entity_id) == 456
async def test_get_supported_features_prioritize_state(hass): async def test_get_supported_features_prioritize_state(hass: HomeAssistant) -> None:
"""Test get_supported_features gives priority to state.""" """Test get_supported_features gives priority to state."""
entity_reg = mock_registry(hass) entity_reg = mock_registry(hass)
entity_id = entity_reg.async_get_or_create( entity_id = entity_reg.async_get_or_create(
@ -796,13 +798,13 @@ async def test_get_supported_features_prioritize_state(hass):
assert entity.get_supported_features(hass, entity_id) == 123 assert entity.get_supported_features(hass, entity_id) == 123
async def test_get_supported_features_raises_on_unknown(hass): async def test_get_supported_features_raises_on_unknown(hass: HomeAssistant) -> None:
"""Test get_supported_features raises on unknown entity_id.""" """Test get_supported_features raises on unknown entity_id."""
with pytest.raises(HomeAssistantError): with pytest.raises(HomeAssistantError):
entity.get_supported_features(hass, "hello.world") entity.get_supported_features(hass, "hello.world")
async def test_float_conversion(hass): async def test_float_conversion(hass: HomeAssistant) -> None:
"""Test conversion of float state to string rounds.""" """Test conversion of float state to string rounds."""
assert 2.4 + 1.2 != 3.6 assert 2.4 + 1.2 != 3.6
with patch.object(entity.Entity, "state", PropertyMock(return_value=2.4 + 1.2)): with patch.object(entity.Entity, "state", PropertyMock(return_value=2.4 + 1.2)):
@ -816,7 +818,7 @@ async def test_float_conversion(hass):
assert state.state == "3.6" assert state.state == "3.6"
async def test_attribution_attribute(hass): async def test_attribution_attribute(hass: HomeAssistant) -> None:
"""Test attribution attribute.""" """Test attribution attribute."""
mock_entity = entity.Entity() mock_entity = entity.Entity()
mock_entity.hass = hass mock_entity.hass = hass
@ -830,7 +832,7 @@ async def test_attribution_attribute(hass):
assert state.attributes.get(ATTR_ATTRIBUTION) == "Home Assistant" assert state.attributes.get(ATTR_ATTRIBUTION) == "Home Assistant"
async def test_entity_category_property(hass): async def test_entity_category_property(hass: HomeAssistant) -> None:
"""Test entity category property.""" """Test entity category property."""
mock_entity1 = entity.Entity() mock_entity1 = entity.Entity()
mock_entity1.hass = hass mock_entity1.hass = hass
@ -935,7 +937,7 @@ async def test_friendly_name(
assert state.attributes.get(ATTR_FRIENDLY_NAME) == expected_friendly_name assert state.attributes.get(ATTR_FRIENDLY_NAME) == expected_friendly_name
async def test_translation_key(hass): async def test_translation_key(hass: HomeAssistant) -> None:
"""Test translation key property.""" """Test translation key property."""
mock_entity1 = entity.Entity() mock_entity1 = entity.Entity()
mock_entity1.hass = hass mock_entity1.hass = hass

View file

@ -14,7 +14,7 @@ from homeassistant.const import (
ENTITY_MATCH_NONE, ENTITY_MATCH_NONE,
EVENT_HOMEASSISTANT_STOP, EVENT_HOMEASSISTANT_STOP,
) )
import homeassistant.core as ha from homeassistant.core import HomeAssistant, ServiceCall, callback
from homeassistant.exceptions import PlatformNotReady from homeassistant.exceptions import PlatformNotReady
from homeassistant.helpers import discovery from homeassistant.helpers import discovery
from homeassistant.helpers.entity_component import EntityComponent, async_update_entity from homeassistant.helpers.entity_component import EntityComponent, async_update_entity
@ -35,7 +35,7 @@ _LOGGER = logging.getLogger(__name__)
DOMAIN = "test_domain" DOMAIN = "test_domain"
async def test_setup_loads_platforms(hass): async def test_setup_loads_platforms(hass: HomeAssistant) -> None:
"""Test the loading of the platforms.""" """Test the loading of the platforms."""
component_setup = Mock(return_value=True) component_setup = Mock(return_value=True)
platform_setup = Mock(return_value=None) platform_setup = Mock(return_value=None)
@ -57,7 +57,7 @@ async def test_setup_loads_platforms(hass):
assert platform_setup.called assert platform_setup.called
async def test_setup_recovers_when_setup_raises(hass): async def test_setup_recovers_when_setup_raises(hass: HomeAssistant) -> None:
"""Test the setup if exceptions are happening.""" """Test the setup if exceptions are happening."""
platform1_setup = Mock(side_effect=Exception("Broken")) platform1_setup = Mock(side_effect=Exception("Broken"))
platform2_setup = Mock(return_value=None) platform2_setup = Mock(return_value=None)
@ -126,7 +126,7 @@ async def test_set_scan_interval_via_config(mock_track, hass):
assert timedelta(seconds=30) == mock_track.call_args[0][2] assert timedelta(seconds=30) == mock_track.call_args[0][2]
async def test_set_entity_namespace_via_config(hass): async def test_set_entity_namespace_via_config(hass: HomeAssistant) -> None:
"""Test setting an entity namespace.""" """Test setting an entity namespace."""
def platform_setup(hass, config, add_entities, discovery_info=None): def platform_setup(hass, config, add_entities, discovery_info=None):
@ -149,7 +149,7 @@ async def test_set_entity_namespace_via_config(hass):
] ]
async def test_extract_from_service_available_device(hass): async def test_extract_from_service_available_device(hass: HomeAssistant) -> None:
"""Test the extraction of entity from service and device is available.""" """Test the extraction of entity from service and device is available."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
await component.async_add_entities( await component.async_add_entities(
@ -161,13 +161,13 @@ async def test_extract_from_service_available_device(hass):
] ]
) )
call_1 = ha.ServiceCall("test", "service", data={"entity_id": ENTITY_MATCH_ALL}) call_1 = ServiceCall("test", "service", data={"entity_id": ENTITY_MATCH_ALL})
assert ["test_domain.test_1", "test_domain.test_3"] == sorted( assert ["test_domain.test_1", "test_domain.test_3"] == sorted(
ent.entity_id for ent in (await component.async_extract_from_service(call_1)) ent.entity_id for ent in (await component.async_extract_from_service(call_1))
) )
call_2 = ha.ServiceCall( call_2 = ServiceCall(
"test", "test",
"service", "service",
data={"entity_id": ["test_domain.test_3", "test_domain.test_4"]}, data={"entity_id": ["test_domain.test_3", "test_domain.test_4"]},
@ -178,7 +178,7 @@ async def test_extract_from_service_available_device(hass):
) )
async def test_platform_not_ready(hass): async def test_platform_not_ready(hass: HomeAssistant) -> None:
"""Test that we retry when platform not ready.""" """Test that we retry when platform not ready."""
platform1_setup = Mock(side_effect=[PlatformNotReady, PlatformNotReady, None]) platform1_setup = Mock(side_effect=[PlatformNotReady, PlatformNotReady, None])
mock_integration(hass, MockModule("mod1")) mock_integration(hass, MockModule("mod1"))
@ -217,7 +217,7 @@ async def test_platform_not_ready(hass):
assert "test_domain.mod1" in hass.config.components assert "test_domain.mod1" in hass.config.components
async def test_extract_from_service_fails_if_no_entity_id(hass): async def test_extract_from_service_fails_if_no_entity_id(hass: HomeAssistant) -> None:
"""Test the extraction of everything from service.""" """Test the extraction of everything from service."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
await component.async_add_entities( await component.async_add_entities(
@ -225,31 +225,32 @@ async def test_extract_from_service_fails_if_no_entity_id(hass):
) )
assert ( assert (
await component.async_extract_from_service(ha.ServiceCall("test", "service")) await component.async_extract_from_service(ServiceCall("test", "service")) == []
== []
) )
assert ( assert (
await component.async_extract_from_service( await component.async_extract_from_service(
ha.ServiceCall("test", "service", {"entity_id": ENTITY_MATCH_NONE}) ServiceCall("test", "service", {"entity_id": ENTITY_MATCH_NONE})
) )
== [] == []
) )
assert ( assert (
await component.async_extract_from_service( await component.async_extract_from_service(
ha.ServiceCall("test", "service", {"area_id": ENTITY_MATCH_NONE}) ServiceCall("test", "service", {"area_id": ENTITY_MATCH_NONE})
) )
== [] == []
) )
async def test_extract_from_service_filter_out_non_existing_entities(hass): async def test_extract_from_service_filter_out_non_existing_entities(
hass: HomeAssistant,
) -> None:
"""Test the extraction of non existing entities from service.""" """Test the extraction of non existing entities from service."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
await component.async_add_entities( await component.async_add_entities(
[MockEntity(name="test_1"), MockEntity(name="test_2")] [MockEntity(name="test_1"), MockEntity(name="test_2")]
) )
call = ha.ServiceCall( call = ServiceCall(
"test", "test",
"service", "service",
{"entity_id": ["test_domain.test_2", "test_domain.non_exist"]}, {"entity_id": ["test_domain.test_2", "test_domain.non_exist"]},
@ -260,19 +261,19 @@ async def test_extract_from_service_filter_out_non_existing_entities(hass):
] ]
async def test_extract_from_service_no_group_expand(hass): async def test_extract_from_service_no_group_expand(hass: HomeAssistant) -> None:
"""Test not expanding a group.""" """Test not expanding a group."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
await component.async_add_entities([MockEntity(entity_id="group.test_group")]) await component.async_add_entities([MockEntity(entity_id="group.test_group")])
call = ha.ServiceCall("test", "service", {"entity_id": ["group.test_group"]}) call = ServiceCall("test", "service", {"entity_id": ["group.test_group"]})
extracted = await component.async_extract_from_service(call, expand_group=False) extracted = await component.async_extract_from_service(call, expand_group=False)
assert len(extracted) == 1 assert len(extracted) == 1
assert extracted[0].entity_id == "group.test_group" assert extracted[0].entity_id == "group.test_group"
async def test_setup_dependencies_platform(hass): async def test_setup_dependencies_platform(hass: HomeAssistant) -> None:
"""Test we setup the dependencies of a platform. """Test we setup the dependencies of a platform.
We're explicitly testing that we process dependencies even if a component We're explicitly testing that we process dependencies even if a component
@ -293,7 +294,7 @@ async def test_setup_dependencies_platform(hass):
assert "test_domain.test_component" in hass.config.components assert "test_domain.test_component" in hass.config.components
async def test_setup_entry(hass): async def test_setup_entry(hass: HomeAssistant) -> None:
"""Test setup entry calls async_setup_entry on platform.""" """Test setup entry calls async_setup_entry on platform."""
mock_setup_entry = AsyncMock(return_value=True) mock_setup_entry = AsyncMock(return_value=True)
mock_entity_platform( mock_entity_platform(
@ -316,7 +317,7 @@ async def test_setup_entry(hass):
assert component._platforms[entry.entry_id].scan_interval == timedelta(seconds=5) assert component._platforms[entry.entry_id].scan_interval == timedelta(seconds=5)
async def test_setup_entry_platform_not_exist(hass): async def test_setup_entry_platform_not_exist(hass: HomeAssistant) -> None:
"""Test setup entry fails if platform does not exist.""" """Test setup entry fails if platform does not exist."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
entry = MockConfigEntry(domain="non_existing") entry = MockConfigEntry(domain="non_existing")
@ -324,7 +325,7 @@ async def test_setup_entry_platform_not_exist(hass):
assert (await component.async_setup_entry(entry)) is False assert (await component.async_setup_entry(entry)) is False
async def test_setup_entry_fails_duplicate(hass): async def test_setup_entry_fails_duplicate(hass: HomeAssistant) -> None:
"""Test we don't allow setting up a config entry twice.""" """Test we don't allow setting up a config entry twice."""
mock_setup_entry = AsyncMock(return_value=True) mock_setup_entry = AsyncMock(return_value=True)
mock_entity_platform( mock_entity_platform(
@ -342,7 +343,7 @@ async def test_setup_entry_fails_duplicate(hass):
await component.async_setup_entry(entry) await component.async_setup_entry(entry)
async def test_unload_entry_resets_platform(hass): async def test_unload_entry_resets_platform(hass: HomeAssistant) -> None:
"""Test unloading an entry removes all entities.""" """Test unloading an entry removes all entities."""
mock_setup_entry = AsyncMock(return_value=True) mock_setup_entry = AsyncMock(return_value=True)
mock_entity_platform( mock_entity_platform(
@ -366,7 +367,7 @@ async def test_unload_entry_resets_platform(hass):
assert len(hass.states.async_entity_ids()) == 0 assert len(hass.states.async_entity_ids()) == 0
async def test_unload_entry_fails_if_never_loaded(hass): async def test_unload_entry_fails_if_never_loaded(hass: HomeAssistant) -> None:
""".""" """."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
entry = MockConfigEntry(domain="entry_domain") entry = MockConfigEntry(domain="entry_domain")
@ -375,7 +376,7 @@ async def test_unload_entry_fails_if_never_loaded(hass):
await component.async_unload_entry(entry) await component.async_unload_entry(entry)
async def test_update_entity(hass): async def test_update_entity(hass: HomeAssistant) -> None:
"""Test that we can update an entity with the helper.""" """Test that we can update an entity with the helper."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
entity = MockEntity() entity = MockEntity()
@ -392,7 +393,7 @@ async def test_update_entity(hass):
assert entity.async_update_ha_state.mock_calls[-1][1][0] is True assert entity.async_update_ha_state.mock_calls[-1][1][0] is True
async def test_set_service_race(hass): async def test_set_service_race(hass: HomeAssistant) -> None:
"""Test race condition on setting service.""" """Test race condition on setting service."""
exception = False exception = False
@ -420,7 +421,7 @@ async def test_extract_all_omit_entity_id(hass, caplog):
[MockEntity(name="test_1"), MockEntity(name="test_2")] [MockEntity(name="test_1"), MockEntity(name="test_2")]
) )
call = ha.ServiceCall("test", "service") call = ServiceCall("test", "service")
assert [] == sorted( assert [] == sorted(
ent.entity_id for ent in await component.async_extract_from_service(call) ent.entity_id for ent in await component.async_extract_from_service(call)
@ -434,7 +435,7 @@ async def test_extract_all_use_match_all(hass, caplog):
[MockEntity(name="test_1"), MockEntity(name="test_2")] [MockEntity(name="test_1"), MockEntity(name="test_2")]
) )
call = ha.ServiceCall("test", "service", {"entity_id": "all"}) call = ServiceCall("test", "service", {"entity_id": "all"})
assert ["test_domain.test_1", "test_domain.test_2"] == sorted( assert ["test_domain.test_1", "test_domain.test_2"] == sorted(
ent.entity_id for ent in await component.async_extract_from_service(call) ent.entity_id for ent in await component.async_extract_from_service(call)
@ -444,12 +445,12 @@ async def test_extract_all_use_match_all(hass, caplog):
) not in caplog.text ) not in caplog.text
async def test_register_entity_service(hass): async def test_register_entity_service(hass: HomeAssistant) -> None:
"""Test not expanding a group.""" """Test not expanding a group."""
entity = MockEntity(entity_id=f"{DOMAIN}.entity") entity = MockEntity(entity_id=f"{DOMAIN}.entity")
calls = [] calls = []
@ha.callback @callback
def appender(**kwargs): def appender(**kwargs):
calls.append(kwargs) calls.append(kwargs)
@ -494,7 +495,7 @@ async def test_register_entity_service(hass):
assert len(calls) == 2 assert len(calls) == 2
async def test_platforms_shutdown_on_stop(hass): async def test_platforms_shutdown_on_stop(hass: HomeAssistant) -> None:
"""Test that we shutdown platforms on stop.""" """Test that we shutdown platforms on stop."""
platform1_setup = Mock(side_effect=[PlatformNotReady, PlatformNotReady, None]) platform1_setup = Mock(side_effect=[PlatformNotReady, PlatformNotReady, None])
mock_integration(hass, MockModule("mod1")) mock_integration(hass, MockModule("mod1"))

View file

@ -40,7 +40,9 @@ DOMAIN = "test_domain"
PLATFORM = "test_platform" PLATFORM = "test_platform"
async def test_polling_only_updates_entities_it_should_poll(hass): async def test_polling_only_updates_entities_it_should_poll(
hass: HomeAssistant,
) -> None:
"""Test the polling of only updated entities.""" """Test the polling of only updated entities."""
component = EntityComponent(_LOGGER, DOMAIN, hass, timedelta(seconds=20)) component = EntityComponent(_LOGGER, DOMAIN, hass, timedelta(seconds=20))
@ -61,7 +63,7 @@ async def test_polling_only_updates_entities_it_should_poll(hass):
assert poll_ent.async_update.called assert poll_ent.async_update.called
async def test_polling_disabled_by_config_entry(hass): async def test_polling_disabled_by_config_entry(hass: HomeAssistant) -> None:
"""Test the polling of only updated entities.""" """Test the polling of only updated entities."""
entity_platform = MockEntityPlatform(hass) entity_platform = MockEntityPlatform(hass)
entity_platform.config_entry = MockConfigEntry(pref_disable_polling=True) entity_platform.config_entry = MockConfigEntry(pref_disable_polling=True)
@ -72,7 +74,7 @@ async def test_polling_disabled_by_config_entry(hass):
assert entity_platform._async_unsub_polling is None assert entity_platform._async_unsub_polling is None
async def test_polling_updates_entities_with_exception(hass): async def test_polling_updates_entities_with_exception(hass: HomeAssistant) -> None:
"""Test the updated entities that not break with an exception.""" """Test the updated entities that not break with an exception."""
component = EntityComponent(_LOGGER, DOMAIN, hass, timedelta(seconds=20)) component = EntityComponent(_LOGGER, DOMAIN, hass, timedelta(seconds=20))
@ -109,7 +111,7 @@ async def test_polling_updates_entities_with_exception(hass):
assert len(update_err) == 1 assert len(update_err) == 1
async def test_update_state_adds_entities(hass): async def test_update_state_adds_entities(hass: HomeAssistant) -> None:
"""Test if updating poll entities cause an entity to be added works.""" """Test if updating poll entities cause an entity to be added works."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
@ -126,7 +128,9 @@ async def test_update_state_adds_entities(hass):
assert len(hass.states.async_entity_ids()) == 2 assert len(hass.states.async_entity_ids()) == 2
async def test_update_state_adds_entities_with_update_before_add_true(hass): async def test_update_state_adds_entities_with_update_before_add_true(
hass: HomeAssistant,
) -> None:
"""Test if call update before add to state machine.""" """Test if call update before add to state machine."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
@ -140,7 +144,9 @@ async def test_update_state_adds_entities_with_update_before_add_true(hass):
assert ent.update.called assert ent.update.called
async def test_update_state_adds_entities_with_update_before_add_false(hass): async def test_update_state_adds_entities_with_update_before_add_false(
hass: HomeAssistant,
) -> None:
"""Test if not call update before add to state machine.""" """Test if not call update before add to state machine."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
@ -176,7 +182,9 @@ async def test_set_scan_interval_via_platform(mock_track, hass):
assert timedelta(seconds=30) == mock_track.call_args[0][2] assert timedelta(seconds=30) == mock_track.call_args[0][2]
async def test_adding_entities_with_generator_and_thread_callback(hass): async def test_adding_entities_with_generator_and_thread_callback(
hass: HomeAssistant,
) -> None:
"""Test generator in add_entities that calls thread method. """Test generator in add_entities that calls thread method.
We should make sure we resolve the generator to a list before passing We should make sure we resolve the generator to a list before passing
@ -193,7 +201,7 @@ async def test_adding_entities_with_generator_and_thread_callback(hass):
await component.async_add_entities(create_entity(i) for i in range(2)) await component.async_add_entities(create_entity(i) for i in range(2))
async def test_platform_warn_slow_setup(hass): async def test_platform_warn_slow_setup(hass: HomeAssistant) -> None:
"""Warn we log when platform setup takes a long time.""" """Warn we log when platform setup takes a long time."""
platform = MockPlatform() platform = MockPlatform()
@ -235,7 +243,7 @@ async def test_platform_error_slow_setup(hass, caplog):
assert "test_platform is taking longer than 0 seconds" in caplog.text assert "test_platform is taking longer than 0 seconds" in caplog.text
async def test_updated_state_used_for_entity_id(hass): async def test_updated_state_used_for_entity_id(hass: HomeAssistant) -> None:
"""Test that first update results used for entity ID generation.""" """Test that first update results used for entity ID generation."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
@ -253,7 +261,7 @@ async def test_updated_state_used_for_entity_id(hass):
assert entity_ids[0] == "test_domain.living_room" assert entity_ids[0] == "test_domain.living_room"
async def test_parallel_updates_async_platform(hass): async def test_parallel_updates_async_platform(hass: HomeAssistant) -> None:
"""Test async platform does not have parallel_updates limit by default.""" """Test async platform does not have parallel_updates limit by default."""
platform = MockPlatform() platform = MockPlatform()
@ -279,7 +287,9 @@ async def test_parallel_updates_async_platform(hass):
assert entity.parallel_updates is None assert entity.parallel_updates is None
async def test_parallel_updates_async_platform_with_constant(hass): async def test_parallel_updates_async_platform_with_constant(
hass: HomeAssistant,
) -> None:
"""Test async platform can set parallel_updates limit.""" """Test async platform can set parallel_updates limit."""
platform = MockPlatform() platform = MockPlatform()
platform.PARALLEL_UPDATES = 2 platform.PARALLEL_UPDATES = 2
@ -306,7 +316,7 @@ async def test_parallel_updates_async_platform_with_constant(hass):
assert entity.parallel_updates._value == 2 assert entity.parallel_updates._value == 2
async def test_parallel_updates_sync_platform(hass): async def test_parallel_updates_sync_platform(hass: HomeAssistant) -> None:
"""Test sync platform parallel_updates default set to 1.""" """Test sync platform parallel_updates default set to 1."""
platform = MockPlatform() platform = MockPlatform()
@ -332,7 +342,7 @@ async def test_parallel_updates_sync_platform(hass):
assert entity.parallel_updates._value == 1 assert entity.parallel_updates._value == 1
async def test_parallel_updates_no_update_method(hass): async def test_parallel_updates_no_update_method(hass: HomeAssistant) -> None:
"""Test platform parallel_updates default set to 0.""" """Test platform parallel_updates default set to 0."""
platform = MockPlatform() platform = MockPlatform()
@ -351,7 +361,9 @@ async def test_parallel_updates_no_update_method(hass):
assert entity.parallel_updates is None assert entity.parallel_updates is None
async def test_parallel_updates_sync_platform_with_constant(hass): async def test_parallel_updates_sync_platform_with_constant(
hass: HomeAssistant,
) -> None:
"""Test sync platform can set parallel_updates limit.""" """Test sync platform can set parallel_updates limit."""
platform = MockPlatform() platform = MockPlatform()
platform.PARALLEL_UPDATES = 2 platform.PARALLEL_UPDATES = 2
@ -378,7 +390,7 @@ async def test_parallel_updates_sync_platform_with_constant(hass):
assert entity.parallel_updates._value == 2 assert entity.parallel_updates._value == 2
async def test_raise_error_on_update(hass): async def test_raise_error_on_update(hass: HomeAssistant) -> None:
"""Test the add entity if they raise an error on update.""" """Test the add entity if they raise an error on update."""
updates = [] updates = []
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
@ -403,7 +415,7 @@ async def test_raise_error_on_update(hass):
assert entity2.platform is not None assert entity2.platform is not None
async def test_async_remove_with_platform(hass): async def test_async_remove_with_platform(hass: HomeAssistant) -> None:
"""Remove an entity from a platform.""" """Remove an entity from a platform."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
entity1 = MockEntity(name="test_1") entity1 = MockEntity(name="test_1")
@ -413,7 +425,7 @@ async def test_async_remove_with_platform(hass):
assert len(hass.states.async_entity_ids()) == 0 assert len(hass.states.async_entity_ids()) == 0
async def test_async_remove_with_platform_update_finishes(hass): async def test_async_remove_with_platform_update_finishes(hass: HomeAssistant) -> None:
"""Remove an entity when an update finishes after its been removed.""" """Remove an entity when an update finishes after its been removed."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
entity1 = MockEntity(name="test_1") entity1 = MockEntity(name="test_1")
@ -474,7 +486,7 @@ async def test_not_adding_duplicate_entities_with_unique_id(hass, caplog):
assert entry.original_name == "test1" assert entry.original_name == "test1"
async def test_using_prescribed_entity_id(hass): async def test_using_prescribed_entity_id(hass: HomeAssistant) -> None:
"""Test for using predefined entity ID.""" """Test for using predefined entity ID."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
await component.async_add_entities( await component.async_add_entities(
@ -483,7 +495,7 @@ async def test_using_prescribed_entity_id(hass):
assert "hello.world" in hass.states.async_entity_ids() assert "hello.world" in hass.states.async_entity_ids()
async def test_using_prescribed_entity_id_with_unique_id(hass): async def test_using_prescribed_entity_id_with_unique_id(hass: HomeAssistant) -> None:
"""Test for amending predefined entity ID because currently exists.""" """Test for amending predefined entity ID because currently exists."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
@ -495,7 +507,9 @@ async def test_using_prescribed_entity_id_with_unique_id(hass):
assert "test_domain.world_2" in hass.states.async_entity_ids() assert "test_domain.world_2" in hass.states.async_entity_ids()
async def test_using_prescribed_entity_id_which_is_registered(hass): async def test_using_prescribed_entity_id_which_is_registered(
hass: HomeAssistant,
) -> None:
"""Test not allowing predefined entity ID that already registered.""" """Test not allowing predefined entity ID that already registered."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
registry = mock_registry(hass) registry = mock_registry(hass)
@ -508,7 +522,7 @@ async def test_using_prescribed_entity_id_which_is_registered(hass):
assert "test_domain.world_2" in hass.states.async_entity_ids() assert "test_domain.world_2" in hass.states.async_entity_ids()
async def test_name_which_conflict_with_registered(hass): async def test_name_which_conflict_with_registered(hass: HomeAssistant) -> None:
"""Test not generating conflicting entity ID based on name.""" """Test not generating conflicting entity ID based on name."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
registry = mock_registry(hass) registry = mock_registry(hass)
@ -521,7 +535,9 @@ async def test_name_which_conflict_with_registered(hass):
assert "test_domain.world_2" in hass.states.async_entity_ids() assert "test_domain.world_2" in hass.states.async_entity_ids()
async def test_entity_with_name_and_entity_id_getting_registered(hass): async def test_entity_with_name_and_entity_id_getting_registered(
hass: HomeAssistant,
) -> None:
"""Ensure that entity ID is used for registration.""" """Ensure that entity ID is used for registration."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
await component.async_add_entities( await component.async_add_entities(
@ -530,7 +546,7 @@ async def test_entity_with_name_and_entity_id_getting_registered(hass):
assert "test_domain.world" in hass.states.async_entity_ids() assert "test_domain.world" in hass.states.async_entity_ids()
async def test_overriding_name_from_registry(hass): async def test_overriding_name_from_registry(hass: HomeAssistant) -> None:
"""Test that we can override a name via the Entity Registry.""" """Test that we can override a name via the Entity Registry."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
mock_registry( mock_registry(
@ -554,7 +570,7 @@ async def test_overriding_name_from_registry(hass):
assert state.name == "Overridden" assert state.name == "Overridden"
async def test_registry_respect_entity_namespace(hass): async def test_registry_respect_entity_namespace(hass: HomeAssistant) -> None:
"""Test that the registry respects entity namespace.""" """Test that the registry respects entity namespace."""
mock_registry(hass) mock_registry(hass)
platform = MockEntityPlatform(hass, entity_namespace="ns") platform = MockEntityPlatform(hass, entity_namespace="ns")
@ -563,7 +579,7 @@ async def test_registry_respect_entity_namespace(hass):
assert entity.entity_id == "test_domain.ns_device_name" assert entity.entity_id == "test_domain.ns_device_name"
async def test_registry_respect_entity_disabled(hass): async def test_registry_respect_entity_disabled(hass: HomeAssistant) -> None:
"""Test that the registry respects entity disabled.""" """Test that the registry respects entity disabled."""
mock_registry( mock_registry(
hass, hass,
@ -606,7 +622,7 @@ async def test_unique_id_conflict_has_priority_over_disabled_entity(hass, caplog
assert entry.original_name == "test1" assert entry.original_name == "test1"
async def test_entity_registry_updates_name(hass): async def test_entity_registry_updates_name(hass: HomeAssistant) -> None:
"""Test that updates on the entity registry update platform entities.""" """Test that updates on the entity registry update platform entities."""
registry = mock_registry( registry = mock_registry(
hass, hass,
@ -636,7 +652,7 @@ async def test_entity_registry_updates_name(hass):
assert state.name == "after update" assert state.name == "after update"
async def test_setup_entry(hass): async def test_setup_entry(hass: HomeAssistant) -> None:
"""Test we can setup an entry.""" """Test we can setup an entry."""
registry = mock_registry(hass) registry = mock_registry(hass)
@ -725,7 +741,7 @@ async def test_setup_entry_platform_not_ready_from_exception(hass, caplog):
assert len(mock_call_later.mock_calls) == 1 assert len(mock_call_later.mock_calls) == 1
async def test_reset_cancels_retry_setup(hass): async def test_reset_cancels_retry_setup(hass: HomeAssistant) -> None:
"""Test that resetting a platform will cancel scheduled a setup retry.""" """Test that resetting a platform will cancel scheduled a setup retry."""
async_setup_entry = Mock(side_effect=PlatformNotReady) async_setup_entry = Mock(side_effect=PlatformNotReady)
platform = MockPlatform(async_setup_entry=async_setup_entry) platform = MockPlatform(async_setup_entry=async_setup_entry)
@ -747,7 +763,7 @@ async def test_reset_cancels_retry_setup(hass):
assert ent_platform._async_cancel_retry_setup is None assert ent_platform._async_cancel_retry_setup is None
async def test_reset_cancels_retry_setup_when_not_started(hass): async def test_reset_cancels_retry_setup_when_not_started(hass: HomeAssistant) -> None:
"""Test that resetting a platform will cancel scheduled a setup retry when not yet started.""" """Test that resetting a platform will cancel scheduled a setup retry when not yet started."""
hass.state = CoreState.starting hass.state = CoreState.starting
async_setup_entry = Mock(side_effect=PlatformNotReady) async_setup_entry = Mock(side_effect=PlatformNotReady)
@ -772,7 +788,9 @@ async def test_reset_cancels_retry_setup_when_not_started(hass):
assert ent_platform._async_cancel_retry_setup is None assert ent_platform._async_cancel_retry_setup is None
async def test_stop_shutdown_cancels_retry_setup_and_interval_listener(hass): async def test_stop_shutdown_cancels_retry_setup_and_interval_listener(
hass: HomeAssistant,
) -> None:
"""Test that shutdown will cancel scheduled a setup retry and interval listener.""" """Test that shutdown will cancel scheduled a setup retry and interval listener."""
async_setup_entry = Mock(side_effect=PlatformNotReady) async_setup_entry = Mock(side_effect=PlatformNotReady)
platform = MockPlatform(async_setup_entry=async_setup_entry) platform = MockPlatform(async_setup_entry=async_setup_entry)
@ -795,7 +813,7 @@ async def test_stop_shutdown_cancels_retry_setup_and_interval_listener(hass):
assert ent_platform._async_cancel_retry_setup is None assert ent_platform._async_cancel_retry_setup is None
async def test_not_fails_with_adding_empty_entities_(hass): async def test_not_fails_with_adding_empty_entities_(hass: HomeAssistant) -> None:
"""Test for not fails on empty entities list.""" """Test for not fails on empty entities list."""
component = EntityComponent(_LOGGER, DOMAIN, hass) component = EntityComponent(_LOGGER, DOMAIN, hass)
@ -804,7 +822,7 @@ async def test_not_fails_with_adding_empty_entities_(hass):
assert len(hass.states.async_entity_ids()) == 0 assert len(hass.states.async_entity_ids()) == 0
async def test_entity_registry_updates_entity_id(hass): async def test_entity_registry_updates_entity_id(hass: HomeAssistant) -> None:
"""Test that updates on the entity registry update platform entities.""" """Test that updates on the entity registry update platform entities."""
registry = mock_registry( registry = mock_registry(
hass, hass,
@ -836,7 +854,7 @@ async def test_entity_registry_updates_entity_id(hass):
assert hass.states.get("test_domain.planet") is not None assert hass.states.get("test_domain.planet") is not None
async def test_entity_registry_updates_invalid_entity_id(hass): async def test_entity_registry_updates_invalid_entity_id(hass: HomeAssistant) -> None:
"""Test that we can't update to an invalid entity id.""" """Test that we can't update to an invalid entity id."""
registry = mock_registry( registry = mock_registry(
hass, hass,
@ -886,7 +904,7 @@ async def test_entity_registry_updates_invalid_entity_id(hass):
assert hass.states.get("diff_domain.world") is None assert hass.states.get("diff_domain.world") is None
async def test_device_info_called(hass): async def test_device_info_called(hass: HomeAssistant) -> None:
"""Test device info is forwarded correctly.""" """Test device info is forwarded correctly."""
registry = dr.async_get(hass) registry = dr.async_get(hass)
via = registry.async_get_or_create( via = registry.async_get_or_create(
@ -950,7 +968,7 @@ async def test_device_info_called(hass):
assert device.via_device_id == via.id assert device.via_device_id == via.id
async def test_device_info_not_overrides(hass): async def test_device_info_not_overrides(hass: HomeAssistant) -> None:
"""Test device info is forwarded correctly.""" """Test device info is forwarded correctly."""
registry = dr.async_get(hass) registry = dr.async_get(hass)
device = registry.async_get_or_create( device = registry.async_get_or_create(
@ -1134,7 +1152,7 @@ async def test_device_info_change_to_no_url(hass, caplog):
assert device.configuration_url is None assert device.configuration_url is None
async def test_entity_disabled_by_integration(hass): async def test_entity_disabled_by_integration(hass: HomeAssistant) -> None:
"""Test entity disabled by integration.""" """Test entity disabled by integration."""
component = EntityComponent(_LOGGER, DOMAIN, hass, timedelta(seconds=20)) component = EntityComponent(_LOGGER, DOMAIN, hass, timedelta(seconds=20))
@ -1196,7 +1214,7 @@ async def test_entity_disabled_by_device(hass: HomeAssistant):
assert entry_disabled.disabled_by is er.RegistryEntryDisabler.DEVICE assert entry_disabled.disabled_by is er.RegistryEntryDisabler.DEVICE
async def test_entity_hidden_by_integration(hass): async def test_entity_hidden_by_integration(hass: HomeAssistant) -> None:
"""Test entity hidden by integration.""" """Test entity hidden by integration."""
component = EntityComponent(_LOGGER, DOMAIN, hass, timedelta(seconds=20)) component = EntityComponent(_LOGGER, DOMAIN, hass, timedelta(seconds=20))
@ -1215,7 +1233,7 @@ async def test_entity_hidden_by_integration(hass):
assert entry_hidden.hidden_by is er.RegistryEntryHider.INTEGRATION assert entry_hidden.hidden_by is er.RegistryEntryHider.INTEGRATION
async def test_entity_info_added_to_entity_registry(hass): async def test_entity_info_added_to_entity_registry(hass: HomeAssistant) -> None:
"""Test entity info is written to entity registry.""" """Test entity info is written to entity registry."""
component = EntityComponent(_LOGGER, DOMAIN, hass, timedelta(seconds=20)) component = EntityComponent(_LOGGER, DOMAIN, hass, timedelta(seconds=20))
@ -1257,7 +1275,7 @@ async def test_entity_info_added_to_entity_registry(hass):
) )
async def test_override_restored_entities(hass): async def test_override_restored_entities(hass: HomeAssistant) -> None:
"""Test that we allow overriding restored entities.""" """Test that we allow overriding restored entities."""
registry = mock_registry(hass) registry = mock_registry(hass)
registry.async_get_or_create( registry.async_get_or_create(
@ -1290,7 +1308,7 @@ async def test_platform_with_no_setup(hass, caplog):
) )
async def test_platforms_sharing_services(hass): async def test_platforms_sharing_services(hass: HomeAssistant) -> None:
"""Test platforms share services.""" """Test platforms share services."""
entity_platform1 = MockEntityPlatform( entity_platform1 = MockEntityPlatform(
hass, domain="mock_integration", platform_name="mock_platform", platform=None hass, domain="mock_integration", platform_name="mock_platform", platform=None
@ -1333,7 +1351,7 @@ async def test_platforms_sharing_services(hass):
assert entity2 in entities assert entity2 in entities
async def test_invalid_entity_id(hass): async def test_invalid_entity_id(hass: HomeAssistant) -> None:
"""Test specifying an invalid entity id.""" """Test specifying an invalid entity id."""
platform = MockEntityPlatform(hass) platform = MockEntityPlatform(hass)
entity = MockEntity(entity_id="invalid_entity_id") entity = MockEntity(entity_id="invalid_entity_id")
@ -1381,7 +1399,7 @@ async def test_setup_entry_with_entities_that_block_forever(hass, caplog):
assert "test" in caplog.text assert "test" in caplog.text
async def test_two_platforms_add_same_entity(hass): async def test_two_platforms_add_same_entity(hass: HomeAssistant) -> None:
"""Test two platforms in the same domain adding an entity with the same name.""" """Test two platforms in the same domain adding an entity with the same name."""
entity_platform1 = MockEntityPlatform( entity_platform1 = MockEntityPlatform(
hass, domain="mock_integration", platform_name="mock_platform", platform=None hass, domain="mock_integration", platform_name="mock_platform", platform=None

View file

@ -748,7 +748,7 @@ async def test_disabled_by_config_entry_pref(registry):
assert entry2.disabled_by is er.RegistryEntryDisabler.USER assert entry2.disabled_by is er.RegistryEntryDisabler.USER
async def test_restore_states(hass): async def test_restore_states(hass: HomeAssistant) -> None:
"""Test restoring states.""" """Test restoring states."""
hass.state = CoreState.not_running hass.state = CoreState.not_running
@ -814,7 +814,7 @@ async def test_restore_states(hass):
assert hass.states.get("light.all_info_set") is None assert hass.states.get("light.all_info_set") is None
async def test_async_get_device_class_lookup(hass): async def test_async_get_device_class_lookup(hass: HomeAssistant) -> None:
"""Test registry device class lookup.""" """Test registry device class lookup."""
hass.state = CoreState.not_running hass.state = CoreState.not_running
@ -1318,7 +1318,7 @@ def test_entity_registry_items() -> None:
assert entities.get_entry(entry2.id) is None assert entities.get_entry(entry2.id) is None
async def test_disabled_by_str_not_allowed(hass): async def test_disabled_by_str_not_allowed(hass: HomeAssistant) -> None:
"""Test we need to pass disabled by type.""" """Test we need to pass disabled by type."""
reg = er.async_get(hass) reg = er.async_get(hass)
@ -1334,7 +1334,7 @@ async def test_disabled_by_str_not_allowed(hass):
) )
async def test_entity_category_str_not_allowed(hass): async def test_entity_category_str_not_allowed(hass: HomeAssistant) -> None:
"""Test we need to pass entity category type.""" """Test we need to pass entity category type."""
reg = er.async_get(hass) reg = er.async_get(hass)
@ -1350,7 +1350,7 @@ async def test_entity_category_str_not_allowed(hass):
) )
async def test_hidden_by_str_not_allowed(hass): async def test_hidden_by_str_not_allowed(hass: HomeAssistant) -> None:
"""Test we need to pass hidden by type.""" """Test we need to pass hidden by type."""
reg = er.async_get(hass) reg = er.async_get(hass)

View file

@ -16,7 +16,7 @@ import pytest
from homeassistant.components import sun from homeassistant.components import sun
from homeassistant.const import MATCH_ALL from homeassistant.const import MATCH_ALL
import homeassistant.core as ha import homeassistant.core as ha
from homeassistant.core import callback from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import TemplateError from homeassistant.exceptions import TemplateError
from homeassistant.helpers.entity_registry import EVENT_ENTITY_REGISTRY_UPDATED from homeassistant.helpers.entity_registry import EVENT_ENTITY_REGISTRY_UPDATED
from homeassistant.helpers.event import ( from homeassistant.helpers.event import (
@ -51,7 +51,7 @@ from tests.common import async_fire_time_changed, async_fire_time_changed_exact
DEFAULT_TIME_ZONE = dt_util.DEFAULT_TIME_ZONE DEFAULT_TIME_ZONE = dt_util.DEFAULT_TIME_ZONE
async def test_track_point_in_time(hass): async def test_track_point_in_time(hass: HomeAssistant) -> None:
"""Test track point in time.""" """Test track point in time."""
before_birthday = datetime(1985, 7, 9, 12, 0, 0, tzinfo=dt_util.UTC) before_birthday = datetime(1985, 7, 9, 12, 0, 0, tzinfo=dt_util.UTC)
birthday_paulus = datetime(1986, 7, 9, 12, 0, 0, tzinfo=dt_util.UTC) birthday_paulus = datetime(1986, 7, 9, 12, 0, 0, tzinfo=dt_util.UTC)
@ -94,7 +94,7 @@ async def test_track_point_in_time(hass):
assert len(runs) == 2 assert len(runs) == 2
async def test_track_point_in_time_drift_rearm(hass): async def test_track_point_in_time_drift_rearm(hass: HomeAssistant) -> None:
"""Test tasks with the time rolling backwards.""" """Test tasks with the time rolling backwards."""
specific_runs = [] specific_runs = []
@ -126,7 +126,7 @@ async def test_track_point_in_time_drift_rearm(hass):
assert len(specific_runs) == 1 assert len(specific_runs) == 1
async def test_track_state_change_from_to_state_match(hass): async def test_track_state_change_from_to_state_match(hass: HomeAssistant) -> None:
"""Test track_state_change with from and to state matchers.""" """Test track_state_change with from and to state matchers."""
from_and_to_state_runs = [] from_and_to_state_runs = []
only_from_runs = [] only_from_runs = []
@ -210,7 +210,7 @@ async def test_track_state_change_from_to_state_match(hass):
assert len(no_to_from_specified_runs) == 4 assert len(no_to_from_specified_runs) == 4
async def test_track_state_change(hass): async def test_track_state_change(hass: HomeAssistant) -> None:
"""Test track_state_change.""" """Test track_state_change."""
# 2 lists to track how often our callbacks get called # 2 lists to track how often our callbacks get called
specific_runs = [] specific_runs = []
@ -290,7 +290,7 @@ async def test_track_state_change(hass):
assert len(wildercard_runs) == 6 assert len(wildercard_runs) == 6
async def test_async_track_state_change_filtered(hass): async def test_async_track_state_change_filtered(hass: HomeAssistant) -> None:
"""Test async_track_state_change_filtered.""" """Test async_track_state_change_filtered."""
single_entity_id_tracker = [] single_entity_id_tracker = []
multiple_entity_id_tracker = [] multiple_entity_id_tracker = []
@ -426,7 +426,7 @@ async def test_async_track_state_change_filtered(hass):
track_throws.async_remove() track_throws.async_remove()
async def test_async_track_state_change_event(hass): async def test_async_track_state_change_event(hass: HomeAssistant) -> None:
"""Test async_track_state_change_event.""" """Test async_track_state_change_event."""
single_entity_id_tracker = [] single_entity_id_tracker = []
multiple_entity_id_tracker = [] multiple_entity_id_tracker = []
@ -519,7 +519,9 @@ async def test_async_track_state_change_event(hass):
unsub_throws() unsub_throws()
async def test_async_track_state_change_event_with_empty_list(hass): async def test_async_track_state_change_event_with_empty_list(
hass: HomeAssistant,
) -> None:
"""Test async_track_state_change_event passing an empty list of entities.""" """Test async_track_state_change_event passing an empty list of entities."""
unsub_single = async_track_state_change_event( unsub_single = async_track_state_change_event(
hass, [], ha.callback(lambda event: None) hass, [], ha.callback(lambda event: None)
@ -532,7 +534,7 @@ async def test_async_track_state_change_event_with_empty_list(hass):
unsub_single() unsub_single()
async def test_async_track_state_added_domain(hass): async def test_async_track_state_added_domain(hass: HomeAssistant) -> None:
"""Test async_track_state_added_domain.""" """Test async_track_state_added_domain."""
single_entity_id_tracker = [] single_entity_id_tracker = []
multiple_entity_id_tracker = [] multiple_entity_id_tracker = []
@ -614,7 +616,9 @@ async def test_async_track_state_added_domain(hass):
unsub_throws() unsub_throws()
async def test_async_track_state_added_domain_with_empty_list(hass): async def test_async_track_state_added_domain_with_empty_list(
hass: HomeAssistant,
) -> None:
"""Test async_track_state_added_domain passing an empty list of domains.""" """Test async_track_state_added_domain passing an empty list of domains."""
unsub_single = async_track_state_added_domain( unsub_single = async_track_state_added_domain(
hass, [], ha.callback(lambda event: None) hass, [], ha.callback(lambda event: None)
@ -627,7 +631,9 @@ async def test_async_track_state_added_domain_with_empty_list(hass):
unsub_single() unsub_single()
async def test_async_track_state_removed_domain_with_empty_list(hass): async def test_async_track_state_removed_domain_with_empty_list(
hass: HomeAssistant,
) -> None:
"""Test async_track_state_removed_domain passing an empty list of domains.""" """Test async_track_state_removed_domain passing an empty list of domains."""
unsub_single = async_track_state_removed_domain( unsub_single = async_track_state_removed_domain(
hass, [], ha.callback(lambda event: None) hass, [], ha.callback(lambda event: None)
@ -640,7 +646,7 @@ async def test_async_track_state_removed_domain_with_empty_list(hass):
unsub_single() unsub_single()
async def test_async_track_state_removed_domain(hass): async def test_async_track_state_removed_domain(hass: HomeAssistant) -> None:
"""Test async_track_state_removed_domain.""" """Test async_track_state_removed_domain."""
single_entity_id_tracker = [] single_entity_id_tracker = []
multiple_entity_id_tracker = [] multiple_entity_id_tracker = []
@ -722,7 +728,7 @@ async def test_async_track_state_removed_domain(hass):
unsub_throws() unsub_throws()
async def test_async_track_state_removed_domain_match_all(hass): async def test_async_track_state_removed_domain_match_all(hass: HomeAssistant) -> None:
"""Test async_track_state_removed_domain with a match_all.""" """Test async_track_state_removed_domain with a match_all."""
single_entity_id_tracker = [] single_entity_id_tracker = []
match_all_entity_id_tracker = [] match_all_entity_id_tracker = []
@ -766,7 +772,7 @@ async def test_async_track_state_removed_domain_match_all(hass):
assert len(match_all_entity_id_tracker) == 2 assert len(match_all_entity_id_tracker) == 2
async def test_track_template(hass): async def test_track_template(hass: HomeAssistant) -> None:
"""Test tracking template.""" """Test tracking template."""
specific_runs = [] specific_runs = []
wildcard_runs = [] wildcard_runs = []
@ -936,7 +942,7 @@ async def test_track_template_time_change(hass, caplog):
assert calls[0] == (None, None, None) assert calls[0] == (None, None, None)
async def test_track_template_result(hass): async def test_track_template_result(hass: HomeAssistant) -> None:
"""Test tracking template.""" """Test tracking template."""
specific_runs = [] specific_runs = []
wildcard_runs = [] wildcard_runs = []
@ -1022,7 +1028,7 @@ async def test_track_template_result(hass):
assert len(wildercard_runs) == 4 assert len(wildercard_runs) == 4
async def test_track_template_result_none(hass): async def test_track_template_result_none(hass: HomeAssistant) -> None:
"""Test tracking template.""" """Test tracking template."""
specific_runs = [] specific_runs = []
wildcard_runs = [] wildcard_runs = []
@ -1089,7 +1095,7 @@ async def test_track_template_result_none(hass):
assert wildercard_runs == [(None, 5), (5, 10)] assert wildercard_runs == [(None, 5), (5, 10)]
async def test_track_template_result_super_template(hass): async def test_track_template_result_super_template(hass: HomeAssistant) -> None:
"""Test tracking template with super template listening to same entity.""" """Test tracking template with super template listening to same entity."""
specific_runs = [] specific_runs = []
specific_runs_availability = [] specific_runs_availability = []
@ -1233,7 +1239,9 @@ async def test_track_template_result_super_template(hass):
assert len(wildercard_runs_availability) == 6 assert len(wildercard_runs_availability) == 6
async def test_track_template_result_super_template_initially_false(hass): async def test_track_template_result_super_template_initially_false(
hass: HomeAssistant,
) -> None:
"""Test tracking template with super template listening to same entity.""" """Test tracking template with super template listening to same entity."""
specific_runs = [] specific_runs = []
specific_runs_availability = [] specific_runs_availability = []
@ -1654,7 +1662,7 @@ async def test_track_template_result_super_template_2_initially_false(
assert wildercard_runs == [(0, 10), (10, 35)] assert wildercard_runs == [(0, 10), (10, 35)]
async def test_track_template_result_complex(hass): async def test_track_template_result_complex(hass: HomeAssistant) -> None:
"""Test tracking template.""" """Test tracking template."""
specific_runs = [] specific_runs = []
template_complex_str = """ template_complex_str = """
@ -1810,7 +1818,7 @@ async def test_track_template_result_complex(hass):
} }
async def test_track_template_result_with_wildcard(hass): async def test_track_template_result_with_wildcard(hass: HomeAssistant) -> None:
"""Test tracking template with a wildcard.""" """Test tracking template with a wildcard."""
specific_runs = [] specific_runs = []
template_complex_str = r""" template_complex_str = r"""
@ -1851,7 +1859,7 @@ async def test_track_template_result_with_wildcard(hass):
assert "cover.office_skylight=open" in specific_runs[0] assert "cover.office_skylight=open" in specific_runs[0]
async def test_track_template_result_with_group(hass): async def test_track_template_result_with_group(hass: HomeAssistant) -> None:
"""Test tracking template with a group.""" """Test tracking template with a group."""
hass.states.async_set("sensor.power_1", 0) hass.states.async_set("sensor.power_1", 0)
hass.states.async_set("sensor.power_2", 200.2) hass.states.async_set("sensor.power_2", 200.2)
@ -1924,7 +1932,7 @@ async def test_track_template_result_with_group(hass):
assert specific_runs[-1] == 100.1 + 200.2 + 0 + 800.8 assert specific_runs[-1] == 100.1 + 200.2 + 0 + 800.8
async def test_track_template_result_and_conditional(hass): async def test_track_template_result_and_conditional(hass: HomeAssistant) -> None:
"""Test tracking template with an and conditional.""" """Test tracking template with an and conditional."""
specific_runs = [] specific_runs = []
hass.states.async_set("light.a", "off") hass.states.async_set("light.a", "off")
@ -1987,7 +1995,9 @@ async def test_track_template_result_and_conditional(hass):
assert specific_runs[2] == "on" assert specific_runs[2] == "on"
async def test_track_template_result_and_conditional_upper_case(hass): async def test_track_template_result_and_conditional_upper_case(
hass: HomeAssistant,
) -> None:
"""Test tracking template with an and conditional with an upper case template.""" """Test tracking template with an and conditional with an upper case template."""
specific_runs = [] specific_runs = []
hass.states.async_set("light.a", "off") hass.states.async_set("light.a", "off")
@ -2050,7 +2060,7 @@ async def test_track_template_result_and_conditional_upper_case(hass):
assert specific_runs[2] == "on" assert specific_runs[2] == "on"
async def test_track_template_result_iterator(hass): async def test_track_template_result_iterator(hass: HomeAssistant) -> None:
"""Test tracking template.""" """Test tracking template."""
iterator_runs = [] iterator_runs = []
@ -2209,7 +2219,7 @@ async def test_track_template_result_errors(hass, caplog):
assert isinstance(not_exist_runs[2][3], TemplateError) assert isinstance(not_exist_runs[2][3], TemplateError)
async def test_static_string(hass): async def test_static_string(hass: HomeAssistant) -> None:
"""Test a static string.""" """Test a static string."""
template_refresh = Template("{{ 'static' }}", hass) template_refresh = Template("{{ 'static' }}", hass)
@ -2229,7 +2239,7 @@ async def test_static_string(hass):
assert refresh_runs == ["static"] assert refresh_runs == ["static"]
async def test_track_template_rate_limit(hass): async def test_track_template_rate_limit(hass: HomeAssistant) -> None:
"""Test template rate limit.""" """Test template rate limit."""
template_refresh = Template("{{ states | count }}", hass) template_refresh = Template("{{ states | count }}", hass)
@ -2282,7 +2292,7 @@ async def test_track_template_rate_limit(hass):
assert refresh_runs == [0, 1, 2, 4] assert refresh_runs == [0, 1, 2, 4]
async def test_track_template_rate_limit_super(hass): async def test_track_template_rate_limit_super(hass: HomeAssistant) -> None:
"""Test template rate limit with super template.""" """Test template rate limit with super template."""
template_availability = Template( template_availability = Template(
"{{ states('sensor.one') != 'unavailable' }}", hass "{{ states('sensor.one') != 'unavailable' }}", hass
@ -2354,7 +2364,7 @@ async def test_track_template_rate_limit_super(hass):
assert refresh_runs == [0, 1, 4] assert refresh_runs == [0, 1, 4]
async def test_track_template_rate_limit_super_2(hass): async def test_track_template_rate_limit_super_2(hass: HomeAssistant) -> None:
"""Test template rate limit with rate limited super template.""" """Test template rate limit with rate limited super template."""
# Somewhat forced example of a rate limited template # Somewhat forced example of a rate limited template
template_availability = Template("{{ states | count % 2 == 1 }}", hass) template_availability = Template("{{ states | count % 2 == 1 }}", hass)
@ -2421,7 +2431,7 @@ async def test_track_template_rate_limit_super_2(hass):
assert refresh_runs == [1, 5] assert refresh_runs == [1, 5]
async def test_track_template_rate_limit_super_3(hass): async def test_track_template_rate_limit_super_3(hass: HomeAssistant) -> None:
"""Test template with rate limited super template.""" """Test template with rate limited super template."""
# Somewhat forced example of a rate limited template # Somewhat forced example of a rate limited template
template_availability = Template("{{ states | count % 2 == 1 }}", hass) template_availability = Template("{{ states | count % 2 == 1 }}", hass)
@ -2493,7 +2503,7 @@ async def test_track_template_rate_limit_super_3(hass):
assert refresh_runs == [1, 2, 5, 6, 7] assert refresh_runs == [1, 2, 5, 6, 7]
async def test_track_template_rate_limit_suppress_listener(hass): async def test_track_template_rate_limit_suppress_listener(hass: HomeAssistant) -> None:
"""Test template rate limit will suppress the listener during the rate limit.""" """Test template rate limit will suppress the listener during the rate limit."""
template_refresh = Template("{{ states | count }}", hass) template_refresh = Template("{{ states | count }}", hass)
@ -2588,7 +2598,7 @@ async def test_track_template_rate_limit_suppress_listener(hass):
assert refresh_runs == [0, 1, 2, 4] assert refresh_runs == [0, 1, 2, 4]
async def test_track_template_rate_limit_five(hass): async def test_track_template_rate_limit_five(hass: HomeAssistant) -> None:
"""Test template rate limit of 5 seconds.""" """Test template rate limit of 5 seconds."""
template_refresh = Template("{{ states | count }}", hass) template_refresh = Template("{{ states | count }}", hass)
@ -2621,7 +2631,7 @@ async def test_track_template_rate_limit_five(hass):
assert refresh_runs == [0, 1] assert refresh_runs == [0, 1]
async def test_track_template_has_default_rate_limit(hass): async def test_track_template_has_default_rate_limit(hass: HomeAssistant) -> None:
"""Test template has a rate limit by default.""" """Test template has a rate limit by default."""
hass.states.async_set("sensor.zero", "any") hass.states.async_set("sensor.zero", "any")
template_refresh = Template("{{ states | list | count }}", hass) template_refresh = Template("{{ states | list | count }}", hass)
@ -2655,7 +2665,9 @@ async def test_track_template_has_default_rate_limit(hass):
assert refresh_runs == [1, 2] assert refresh_runs == [1, 2]
async def test_track_template_unavailable_states_has_default_rate_limit(hass): async def test_track_template_unavailable_states_has_default_rate_limit(
hass: HomeAssistant,
) -> None:
"""Test template watching for unavailable states has a rate limit by default.""" """Test template watching for unavailable states has a rate limit by default."""
hass.states.async_set("sensor.zero", "unknown") hass.states.async_set("sensor.zero", "unknown")
template_refresh = Template( template_refresh = Template(
@ -2696,7 +2708,9 @@ async def test_track_template_unavailable_states_has_default_rate_limit(hass):
info.async_remove() info.async_remove()
async def test_specifically_referenced_entity_is_not_rate_limited(hass): async def test_specifically_referenced_entity_is_not_rate_limited(
hass: HomeAssistant,
) -> None:
"""Test template rate limit of 5 seconds.""" """Test template rate limit of 5 seconds."""
hass.states.async_set("sensor.one", "none") hass.states.async_set("sensor.one", "none")
@ -2735,7 +2749,9 @@ async def test_specifically_referenced_entity_is_not_rate_limited(hass):
info.async_remove() info.async_remove()
async def test_track_two_templates_with_different_rate_limits(hass): async def test_track_two_templates_with_different_rate_limits(
hass: HomeAssistant,
) -> None:
"""Test two templates with different rate limits.""" """Test two templates with different rate limits."""
template_one = Template("{{ (states | count) + 0 }}", hass) template_one = Template("{{ (states | count) + 0 }}", hass)
template_five = Template("{{ states | count }}", hass) template_five = Template("{{ states | count }}", hass)
@ -2800,7 +2816,7 @@ async def test_track_two_templates_with_different_rate_limits(hass):
info.async_remove() info.async_remove()
async def test_string(hass): async def test_string(hass: HomeAssistant) -> None:
"""Test a string.""" """Test a string."""
template_refresh = Template("no_template", hass) template_refresh = Template("no_template", hass)
@ -2820,7 +2836,7 @@ async def test_string(hass):
assert refresh_runs == ["no_template"] assert refresh_runs == ["no_template"]
async def test_track_template_result_refresh_cancel(hass): async def test_track_template_result_refresh_cancel(hass: HomeAssistant) -> None:
"""Test cancelling and refreshing result.""" """Test cancelling and refreshing result."""
template_refresh = Template("{{states.switch.test.state == 'on' and now() }}", hass) template_refresh = Template("{{states.switch.test.state == 'on' and now() }}", hass)
@ -2874,7 +2890,9 @@ async def test_track_template_result_refresh_cancel(hass):
assert refresh_runs == ["duck"] assert refresh_runs == ["duck"]
async def test_async_track_template_result_multiple_templates(hass): async def test_async_track_template_result_multiple_templates(
hass: HomeAssistant,
) -> None:
"""Test tracking multiple templates.""" """Test tracking multiple templates."""
template_1 = Template("{{ states.switch.test.state == 'on' }}") template_1 = Template("{{ states.switch.test.state == 'on' }}")
@ -2933,7 +2951,9 @@ async def test_async_track_template_result_multiple_templates(hass):
] ]
async def test_async_track_template_result_multiple_templates_mixing_domain(hass): async def test_async_track_template_result_multiple_templates_mixing_domain(
hass: HomeAssistant,
) -> None:
"""Test tracking multiple templates when tracking entities and an entire domain.""" """Test tracking multiple templates when tracking entities and an entire domain."""
template_1 = Template("{{ states.switch.test.state == 'on' }}") template_1 = Template("{{ states.switch.test.state == 'on' }}")
@ -3001,7 +3021,9 @@ async def test_async_track_template_result_multiple_templates_mixing_domain(hass
] ]
async def test_async_track_template_result_raise_on_template_error(hass): async def test_async_track_template_result_raise_on_template_error(
hass: HomeAssistant,
) -> None:
"""Test that we raise as soon as we encounter a failed template.""" """Test that we raise as soon as we encounter a failed template."""
with pytest.raises(TemplateError): with pytest.raises(TemplateError):
@ -3020,7 +3042,7 @@ async def test_async_track_template_result_raise_on_template_error(hass):
) )
async def test_track_template_with_time(hass): async def test_track_template_with_time(hass: HomeAssistant) -> None:
"""Test tracking template with time.""" """Test tracking template with time."""
hass.states.async_set("switch.test", "on") hass.states.async_set("switch.test", "on")
@ -3051,7 +3073,7 @@ async def test_track_template_with_time(hass):
info.async_remove() info.async_remove()
async def test_track_template_with_time_default(hass): async def test_track_template_with_time_default(hass: HomeAssistant) -> None:
"""Test tracking template with time.""" """Test tracking template with time."""
specific_runs = [] specific_runs = []
@ -3087,7 +3109,7 @@ async def test_track_template_with_time_default(hass):
info.async_remove() info.async_remove()
async def test_track_template_with_time_that_leaves_scope(hass): async def test_track_template_with_time_that_leaves_scope(hass: HomeAssistant) -> None:
"""Test tracking template with time.""" """Test tracking template with time."""
now = dt_util.utcnow() now = dt_util.utcnow()
test_time = datetime(now.year + 1, 5, 24, 11, 59, 1, 500000, tzinfo=dt_util.UTC) test_time = datetime(now.year + 1, 5, 24, 11, 59, 1, 500000, tzinfo=dt_util.UTC)
@ -3160,7 +3182,9 @@ async def test_track_template_with_time_that_leaves_scope(hass):
info.async_remove() info.async_remove()
async def test_async_track_template_result_multiple_templates_mixing_listeners(hass): async def test_async_track_template_result_multiple_templates_mixing_listeners(
hass: HomeAssistant,
) -> None:
"""Test tracking multiple templates with mixing listener types.""" """Test tracking multiple templates with mixing listener types."""
template_1 = Template("{{ states.switch.test.state == 'on' }}") template_1 = Template("{{ states.switch.test.state == 'on' }}")
@ -3228,7 +3252,7 @@ async def test_async_track_template_result_multiple_templates_mixing_listeners(h
] ]
async def test_track_same_state_simple_no_trigger(hass): async def test_track_same_state_simple_no_trigger(hass: HomeAssistant) -> None:
"""Test track_same_change with no trigger.""" """Test track_same_change with no trigger."""
callback_runs = [] callback_runs = []
period = timedelta(minutes=1) period = timedelta(minutes=1)
@ -3262,7 +3286,7 @@ async def test_track_same_state_simple_no_trigger(hass):
assert len(callback_runs) == 0 assert len(callback_runs) == 0
async def test_track_same_state_simple_trigger_check_funct(hass): async def test_track_same_state_simple_trigger_check_funct(hass: HomeAssistant) -> None:
"""Test track_same_change with trigger and check funct.""" """Test track_same_change with trigger and check funct."""
callback_runs = [] callback_runs = []
check_func = [] check_func = []
@ -3300,7 +3324,7 @@ async def test_track_same_state_simple_trigger_check_funct(hass):
assert len(callback_runs) == 1 assert len(callback_runs) == 1
async def test_track_time_interval(hass): async def test_track_time_interval(hass: HomeAssistant) -> None:
"""Test tracking time interval.""" """Test tracking time interval."""
specific_runs = [] specific_runs = []
@ -3328,7 +3352,7 @@ async def test_track_time_interval(hass):
assert len(specific_runs) == 2 assert len(specific_runs) == 2
async def test_track_sunrise(hass): async def test_track_sunrise(hass: HomeAssistant) -> None:
"""Test track the sunrise.""" """Test track the sunrise."""
latitude = 32.87336 latitude = 32.87336
longitude = 117.22743 longitude = 117.22743
@ -3396,7 +3420,7 @@ async def test_track_sunrise(hass):
assert len(offset_runs) == 1 assert len(offset_runs) == 1
async def test_track_sunrise_update_location(hass): async def test_track_sunrise_update_location(hass: HomeAssistant) -> None:
"""Test track the sunrise.""" """Test track the sunrise."""
# Setup sun component # Setup sun component
hass.config.latitude = 32.87336 hass.config.latitude = 32.87336
@ -3465,7 +3489,7 @@ async def test_track_sunrise_update_location(hass):
assert len(runs) == 2 assert len(runs) == 2
async def test_track_sunset(hass): async def test_track_sunset(hass: HomeAssistant) -> None:
"""Test track the sunset.""" """Test track the sunset."""
latitude = 32.87336 latitude = 32.87336
longitude = 117.22743 longitude = 117.22743
@ -3531,7 +3555,7 @@ async def test_track_sunset(hass):
assert len(offset_runs) == 1 assert len(offset_runs) == 1
async def test_async_track_time_change(hass): async def test_async_track_time_change(hass: HomeAssistant) -> None:
"""Test tracking time change.""" """Test tracking time change."""
wildcard_runs = [] wildcard_runs = []
specific_runs = [] specific_runs = []
@ -3584,7 +3608,7 @@ async def test_async_track_time_change(hass):
assert len(wildcard_runs) == 3 assert len(wildcard_runs) == 3
async def test_periodic_task_minute(hass): async def test_periodic_task_minute(hass: HomeAssistant) -> None:
"""Test periodic tasks per minute.""" """Test periodic tasks per minute."""
specific_runs = [] specific_runs = []
@ -3628,7 +3652,7 @@ async def test_periodic_task_minute(hass):
assert len(specific_runs) == 2 assert len(specific_runs) == 2
async def test_periodic_task_hour(hass): async def test_periodic_task_hour(hass: HomeAssistant) -> None:
"""Test periodic tasks per hour.""" """Test periodic tasks per hour."""
specific_runs = [] specific_runs = []
@ -3688,7 +3712,7 @@ async def test_periodic_task_hour(hass):
assert len(specific_runs) == 3 assert len(specific_runs) == 3
async def test_periodic_task_wrong_input(hass): async def test_periodic_task_wrong_input(hass: HomeAssistant) -> None:
"""Test periodic tasks with wrong input.""" """Test periodic tasks with wrong input."""
specific_runs = [] specific_runs = []
@ -3706,7 +3730,7 @@ async def test_periodic_task_wrong_input(hass):
assert len(specific_runs) == 0 assert len(specific_runs) == 0
async def test_periodic_task_clock_rollback(hass): async def test_periodic_task_clock_rollback(hass: HomeAssistant) -> None:
"""Test periodic tasks with the time rolling backwards.""" """Test periodic tasks with the time rolling backwards."""
specific_runs = [] specific_runs = []
@ -3770,7 +3794,7 @@ async def test_periodic_task_clock_rollback(hass):
assert len(specific_runs) == 2 assert len(specific_runs) == 2
async def test_periodic_task_duplicate_time(hass): async def test_periodic_task_duplicate_time(hass: HomeAssistant) -> None:
"""Test periodic tasks not triggering on duplicate time.""" """Test periodic tasks not triggering on duplicate time."""
specific_runs = [] specific_runs = []
@ -4048,7 +4072,7 @@ async def test_periodic_task_leaving_dst_2(hass, freezer):
unsub() unsub()
async def test_call_later(hass): async def test_call_later(hass: HomeAssistant) -> None:
"""Test calling an action later.""" """Test calling an action later."""
future = asyncio.get_running_loop().create_future() future = asyncio.get_running_loop().create_future()
delay = 5 delay = 5
@ -4068,7 +4092,7 @@ async def test_call_later(hass):
assert await future, "callback was called but the delay was wrong" assert await future, "callback was called but the delay was wrong"
async def test_async_call_later(hass): async def test_async_call_later(hass: HomeAssistant) -> None:
"""Test calling an action later.""" """Test calling an action later."""
future = asyncio.get_running_loop().create_future() future = asyncio.get_running_loop().create_future()
delay = 5 delay = 5
@ -4090,7 +4114,7 @@ async def test_async_call_later(hass):
remove() remove()
async def test_async_call_later_timedelta(hass): async def test_async_call_later_timedelta(hass: HomeAssistant) -> None:
"""Test calling an action later with a timedelta.""" """Test calling an action later with a timedelta."""
future = asyncio.get_running_loop().create_future() future = asyncio.get_running_loop().create_future()
delay = 5 delay = 5
@ -4112,7 +4136,7 @@ async def test_async_call_later_timedelta(hass):
remove() remove()
async def test_async_call_later_cancel(hass): async def test_async_call_later_cancel(hass: HomeAssistant) -> None:
"""Test canceling a call_later action.""" """Test canceling a call_later action."""
future = asyncio.get_running_loop().create_future() future = asyncio.get_running_loop().create_future()
delay = 0.25 delay = 0.25
@ -4137,7 +4161,9 @@ async def test_async_call_later_cancel(hass):
assert await future, "callback not canceled" assert await future, "callback not canceled"
async def test_track_state_change_event_chain_multple_entity(hass): async def test_track_state_change_event_chain_multple_entity(
hass: HomeAssistant,
) -> None:
"""Test that adding a new state tracker inside a tracker does not fire right away.""" """Test that adding a new state tracker inside a tracker does not fire right away."""
tracker_called = [] tracker_called = []
chained_tracker_called = [] chained_tracker_called = []
@ -4189,7 +4215,9 @@ async def test_track_state_change_event_chain_multple_entity(hass):
assert len(chained_tracker_unsub) == 3 assert len(chained_tracker_unsub) == 3
async def test_track_state_change_event_chain_single_entity(hass): async def test_track_state_change_event_chain_single_entity(
hass: HomeAssistant,
) -> None:
"""Test that adding a new state tracker inside a tracker does not fire right away.""" """Test that adding a new state tracker inside a tracker does not fire right away."""
tracker_called = [] tracker_called = []
chained_tracker_called = [] chained_tracker_called = []
@ -4238,7 +4266,7 @@ async def test_track_state_change_event_chain_single_entity(hass):
assert len(chained_tracker_unsub) == 2 assert len(chained_tracker_unsub) == 2
async def test_track_point_in_utc_time_cancel(hass): async def test_track_point_in_utc_time_cancel(hass: HomeAssistant) -> None:
"""Test cancel of async track point in time.""" """Test cancel of async track point in time."""
times = [] times = []
@ -4270,7 +4298,7 @@ async def test_track_point_in_utc_time_cancel(hass):
assert times[0].tzinfo == dt_util.UTC assert times[0].tzinfo == dt_util.UTC
async def test_async_track_point_in_time_cancel(hass): async def test_async_track_point_in_time_cancel(hass: HomeAssistant) -> None:
"""Test cancel of async track point in time.""" """Test cancel of async track point in time."""
times = [] times = []
@ -4298,7 +4326,7 @@ async def test_async_track_point_in_time_cancel(hass):
assert "US/Hawaii" in str(times[0].tzinfo) assert "US/Hawaii" in str(times[0].tzinfo)
async def test_async_track_entity_registry_updated_event(hass): async def test_async_track_entity_registry_updated_event(hass: HomeAssistant) -> None:
"""Test tracking entity registry updates for an entity_id.""" """Test tracking entity registry updates for an entity_id."""
entity_id = "switch.puppy_feeder" entity_id = "switch.puppy_feeder"
@ -4395,7 +4423,9 @@ async def test_async_track_entity_registry_updated_event_with_a_callback_that_th
assert event_data[0] == {"action": "create", "entity_id": "switch.puppy_feeder"} assert event_data[0] == {"action": "create", "entity_id": "switch.puppy_feeder"}
async def test_async_track_entity_registry_updated_event_with_empty_list(hass): async def test_async_track_entity_registry_updated_event_with_empty_list(
hass: HomeAssistant,
) -> None:
"""Test async_track_entity_registry_updated_event passing an empty list of entities.""" """Test async_track_entity_registry_updated_event passing an empty list of entities."""
unsub_single = async_track_entity_registry_updated_event( unsub_single = async_track_entity_registry_updated_event(
hass, [], ha.callback(lambda event: None) hass, [], ha.callback(lambda event: None)

View file

@ -5,25 +5,27 @@ from unittest.mock import Mock, patch
import httpx import httpx
import pytest import pytest
from homeassistant.core import EVENT_HOMEASSISTANT_CLOSE from homeassistant.core import EVENT_HOMEASSISTANT_CLOSE, HomeAssistant
import homeassistant.helpers.httpx_client as client import homeassistant.helpers.httpx_client as client
async def test_get_async_client_with_ssl(hass): async def test_get_async_client_with_ssl(hass: HomeAssistant) -> None:
"""Test init async client with ssl.""" """Test init async client with ssl."""
client.get_async_client(hass) client.get_async_client(hass)
assert isinstance(hass.data[client.DATA_ASYNC_CLIENT], httpx.AsyncClient) assert isinstance(hass.data[client.DATA_ASYNC_CLIENT], httpx.AsyncClient)
async def test_get_async_client_without_ssl(hass): async def test_get_async_client_without_ssl(hass: HomeAssistant) -> None:
"""Test init async client without ssl.""" """Test init async client without ssl."""
client.get_async_client(hass, verify_ssl=False) client.get_async_client(hass, verify_ssl=False)
assert isinstance(hass.data[client.DATA_ASYNC_CLIENT_NOVERIFY], httpx.AsyncClient) assert isinstance(hass.data[client.DATA_ASYNC_CLIENT_NOVERIFY], httpx.AsyncClient)
async def test_create_async_httpx_client_with_ssl_and_cookies(hass): async def test_create_async_httpx_client_with_ssl_and_cookies(
hass: HomeAssistant,
) -> None:
"""Test init async client with ssl and cookies.""" """Test init async client with ssl and cookies."""
client.get_async_client(hass) client.get_async_client(hass)
@ -32,7 +34,9 @@ async def test_create_async_httpx_client_with_ssl_and_cookies(hass):
assert hass.data[client.DATA_ASYNC_CLIENT] != httpx_client assert hass.data[client.DATA_ASYNC_CLIENT] != httpx_client
async def test_create_async_httpx_client_without_ssl_and_cookies(hass): async def test_create_async_httpx_client_without_ssl_and_cookies(
hass: HomeAssistant,
) -> None:
"""Test init async client without ssl and cookies.""" """Test init async client without ssl and cookies."""
client.get_async_client(hass, verify_ssl=False) client.get_async_client(hass, verify_ssl=False)
@ -43,7 +47,7 @@ async def test_create_async_httpx_client_without_ssl_and_cookies(hass):
assert hass.data[client.DATA_ASYNC_CLIENT_NOVERIFY] != httpx_client assert hass.data[client.DATA_ASYNC_CLIENT_NOVERIFY] != httpx_client
async def test_get_async_client_cleanup(hass): async def test_get_async_client_cleanup(hass: HomeAssistant) -> None:
"""Test init async client with ssl.""" """Test init async client with ssl."""
client.get_async_client(hass) client.get_async_client(hass)
@ -55,7 +59,7 @@ async def test_get_async_client_cleanup(hass):
assert hass.data[client.DATA_ASYNC_CLIENT].is_closed assert hass.data[client.DATA_ASYNC_CLIENT].is_closed
async def test_get_async_client_cleanup_without_ssl(hass): async def test_get_async_client_cleanup_without_ssl(hass: HomeAssistant) -> None:
"""Test init async client without ssl.""" """Test init async client without ssl."""
client.get_async_client(hass, verify_ssl=False) client.get_async_client(hass, verify_ssl=False)
@ -67,7 +71,7 @@ async def test_get_async_client_cleanup_without_ssl(hass):
assert hass.data[client.DATA_ASYNC_CLIENT_NOVERIFY].is_closed assert hass.data[client.DATA_ASYNC_CLIENT_NOVERIFY].is_closed
async def test_get_async_client_patched_close(hass): async def test_get_async_client_patched_close(hass: HomeAssistant) -> None:
"""Test closing the async client does not work.""" """Test closing the async client does not work."""
with patch("httpx.AsyncClient.aclose") as mock_aclose: with patch("httpx.AsyncClient.aclose") as mock_aclose:
@ -80,7 +84,7 @@ async def test_get_async_client_patched_close(hass):
assert mock_aclose.call_count == 0 assert mock_aclose.call_count == 0
async def test_get_async_client_context_manager(hass): async def test_get_async_client_context_manager(hass: HomeAssistant) -> None:
"""Test using the async client with a context manager does not close the session.""" """Test using the async client with a context manager does not close the session."""
with patch("httpx.AsyncClient.aclose") as mock_aclose: with patch("httpx.AsyncClient.aclose") as mock_aclose:

View file

@ -1,6 +1,7 @@
"""Test integration platform helpers.""" """Test integration platform helpers."""
from unittest.mock import Mock from unittest.mock import Mock
from homeassistant.core import HomeAssistant
from homeassistant.helpers.integration_platform import ( from homeassistant.helpers.integration_platform import (
async_process_integration_platform_for_component, async_process_integration_platform_for_component,
async_process_integration_platforms, async_process_integration_platforms,
@ -10,7 +11,7 @@ from homeassistant.setup import ATTR_COMPONENT, EVENT_COMPONENT_LOADED
from tests.common import mock_platform from tests.common import mock_platform
async def test_process_integration_platforms(hass): async def test_process_integration_platforms(hass: HomeAssistant) -> None:
"""Test processing integrations.""" """Test processing integrations."""
loaded_platform = Mock() loaded_platform = Mock()
mock_platform(hass, "loaded.platform_to_check", loaded_platform) mock_platform(hass, "loaded.platform_to_check", loaded_platform)
@ -45,7 +46,7 @@ async def test_process_integration_platforms(hass):
assert len(processed) == 2 assert len(processed) == 2
async def test_process_integration_platforms_none_loaded(hass): async def test_process_integration_platforms_none_loaded(hass: HomeAssistant) -> None:
"""Test processing integrations with none loaded.""" """Test processing integrations with none loaded."""
# Verify we can call async_process_integration_platform_for_component # Verify we can call async_process_integration_platform_for_component
# when there are none loaded and it does not throw # when there are none loaded and it does not throw

View file

@ -5,7 +5,7 @@ import voluptuous as vol
from homeassistant.components.switch import SwitchDeviceClass from homeassistant.components.switch import SwitchDeviceClass
from homeassistant.const import ATTR_FRIENDLY_NAME from homeassistant.const import ATTR_FRIENDLY_NAME
from homeassistant.core import State from homeassistant.core import HomeAssistant, State
from homeassistant.helpers import ( from homeassistant.helpers import (
area_registry, area_registry,
config_validation as cv, config_validation as cv,
@ -23,7 +23,7 @@ class MockIntentHandler(intent.IntentHandler):
self.slot_schema = slot_schema self.slot_schema = slot_schema
async def test_async_match_states(hass): async def test_async_match_states(hass: HomeAssistant) -> None:
"""Test async_match_state helper.""" """Test async_match_state helper."""
areas = area_registry.async_get(hass) areas = area_registry.async_get(hass)
area_kitchen = areas.async_get_or_create("kitchen") area_kitchen = areas.async_get_or_create("kitchen")
@ -101,7 +101,7 @@ async def test_async_match_states(hass):
) == [state2] ) == [state2]
async def test_match_device_area(hass): async def test_match_device_area(hass: HomeAssistant) -> None:
"""Test async_match_state with a device in an area.""" """Test async_match_state with a device in an area."""
areas = area_registry.async_get(hass) areas = area_registry.async_get(hass)
area_kitchen = areas.async_get_or_create("kitchen") area_kitchen = areas.async_get_or_create("kitchen")

View file

@ -45,7 +45,7 @@ def test_closest_returns_closest() -> None:
assert state == location.closest(123.45, 123.45, [state, state2]) assert state == location.closest(123.45, 123.45, [state, state2])
async def test_coordinates_function_as_attributes(hass): async def test_coordinates_function_as_attributes(hass: HomeAssistant) -> None:
"""Test coordinates function.""" """Test coordinates function."""
hass.states.async_set( hass.states.async_set(
"test.object", "happy", {"latitude": 32.87336, "longitude": -117.22943} "test.object", "happy", {"latitude": 32.87336, "longitude": -117.22943}
@ -53,13 +53,13 @@ async def test_coordinates_function_as_attributes(hass):
assert location.find_coordinates(hass, "test.object") == "32.87336,-117.22943" assert location.find_coordinates(hass, "test.object") == "32.87336,-117.22943"
async def test_coordinates_function_as_state(hass): async def test_coordinates_function_as_state(hass: HomeAssistant) -> None:
"""Test coordinates function.""" """Test coordinates function."""
hass.states.async_set("test.object", "32.87336,-117.22943") hass.states.async_set("test.object", "32.87336,-117.22943")
assert location.find_coordinates(hass, "test.object") == "32.87336,-117.22943" assert location.find_coordinates(hass, "test.object") == "32.87336,-117.22943"
async def test_coordinates_function_device_tracker_in_zone(hass): async def test_coordinates_function_device_tracker_in_zone(hass: HomeAssistant) -> None:
"""Test coordinates function.""" """Test coordinates function."""
hass.states.async_set( hass.states.async_set(
"zone.home", "zone.home",
@ -73,7 +73,7 @@ async def test_coordinates_function_device_tracker_in_zone(hass):
) )
async def test_coordinates_function_zone_friendly_name(hass): async def test_coordinates_function_zone_friendly_name(hass: HomeAssistant) -> None:
"""Test coordinates function.""" """Test coordinates function."""
hass.states.async_set( hass.states.async_set(
"zone.home", "zone.home",
@ -88,7 +88,9 @@ async def test_coordinates_function_zone_friendly_name(hass):
assert location.find_coordinates(hass, "my_home") == "32.87336,-117.22943" assert location.find_coordinates(hass, "my_home") == "32.87336,-117.22943"
async def test_coordinates_function_device_tracker_from_input_select(hass): async def test_coordinates_function_device_tracker_from_input_select(
hass: HomeAssistant,
) -> None:
"""Test coordinates function.""" """Test coordinates function."""
hass.states.async_set( hass.states.async_set(
"input_select.select", "input_select.select",
@ -111,7 +113,9 @@ def test_coordinates_function_returns_none_on_recursion(hass: HomeAssistant) ->
assert location.find_coordinates(hass, "test.first") is None assert location.find_coordinates(hass, "test.first") is None
async def test_coordinates_function_returns_state_if_no_coords(hass): async def test_coordinates_function_returns_state_if_no_coords(
hass: HomeAssistant,
) -> None:
"""Test test_coordinates function.""" """Test test_coordinates function."""
hass.states.async_set( hass.states.async_set(
"test.object", "test.object",

View file

@ -674,7 +674,7 @@ async def test_is_internal_request(hass: HomeAssistant, mock_current_request):
assert is_internal_request(hass), mock_current_request.return_value.url assert is_internal_request(hass), mock_current_request.return_value.url
async def test_is_hass_url(hass): async def test_is_hass_url(hass: HomeAssistant) -> None:
"""Test is_hass_url.""" """Test is_hass_url."""
assert hass.config.api is None assert hass.config.api is None
assert hass.config.internal_url is None assert hass.config.internal_url is None
@ -721,7 +721,7 @@ async def test_is_hass_url(hass):
assert is_hass_url(hass, "http://example.nabu.casa") is False assert is_hass_url(hass, "http://example.nabu.casa") is False
async def test_is_hass_url_addon_url(hass): async def test_is_hass_url_addon_url(hass: HomeAssistant) -> None:
"""Test is_hass_url with a supervisor network URL.""" """Test is_hass_url with a supervisor network URL."""
assert is_hass_url(hass, "http://homeassistant:8123") is False assert is_hass_url(hass, "http://homeassistant:8123") is False
@ -741,7 +741,7 @@ async def test_is_hass_url_addon_url(hass):
assert is_hass_url(hass, "https://homeassistant:8123") assert is_hass_url(hass, "https://homeassistant:8123")
async def test_get_supervisor_network_url(hass): async def test_get_supervisor_network_url(hass: HomeAssistant) -> None:
"""Test get_supervisor_network_url.""" """Test get_supervisor_network_url."""
assert get_supervisor_network_url(hass) is None assert get_supervisor_network_url(hass) is None

View file

@ -2,12 +2,12 @@
import asyncio import asyncio
from datetime import timedelta from datetime import timedelta
from homeassistant.core import callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import ratelimit from homeassistant.helpers import ratelimit
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
async def test_hit(hass): async def test_hit(hass: HomeAssistant) -> None:
"""Test hitting the rate limit.""" """Test hitting the rate limit."""
refresh_called = False refresh_called = False
@ -44,7 +44,7 @@ async def test_hit(hass):
rate_limiter.async_remove() rate_limiter.async_remove()
async def test_miss(hass): async def test_miss(hass: HomeAssistant) -> None:
"""Test missing the rate limit.""" """Test missing the rate limit."""
refresh_called = False refresh_called = False
@ -76,7 +76,7 @@ async def test_miss(hass):
rate_limiter.async_remove() rate_limiter.async_remove()
async def test_no_limit(hass): async def test_no_limit(hass: HomeAssistant) -> None:
"""Test async_schedule_action always return None when there is no rate limit.""" """Test async_schedule_action always return None when there is no rate limit."""
refresh_called = False refresh_called = False

View file

@ -6,6 +6,7 @@ import pytest
from homeassistant import config from homeassistant import config
from homeassistant.const import SERVICE_RELOAD from homeassistant.const import SERVICE_RELOAD
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_component import EntityComponent from homeassistant.helpers.entity_component import EntityComponent
from homeassistant.helpers.entity_platform import async_get_platforms from homeassistant.helpers.entity_platform import async_get_platforms
from homeassistant.helpers.reload import ( from homeassistant.helpers.reload import (
@ -29,7 +30,7 @@ DOMAIN = "test_domain"
PLATFORM = "test_platform" PLATFORM = "test_platform"
async def test_reload_platform(hass): async def test_reload_platform(hass: HomeAssistant) -> None:
"""Test the polling of only updated entities.""" """Test the polling of only updated entities."""
component_setup = Mock(return_value=True) component_setup = Mock(return_value=True)
@ -69,7 +70,7 @@ async def test_reload_platform(hass):
assert not async_get_platform_without_config_entry(hass, PLATFORM, DOMAIN) assert not async_get_platform_without_config_entry(hass, PLATFORM, DOMAIN)
async def test_setup_reload_service(hass): async def test_setup_reload_service(hass: HomeAssistant) -> None:
"""Test setting up a reload service.""" """Test setting up a reload service."""
component_setup = Mock(return_value=True) component_setup = Mock(return_value=True)
@ -108,7 +109,9 @@ async def test_setup_reload_service(hass):
assert len(setup_called) == 2 assert len(setup_called) == 2
async def test_setup_reload_service_when_async_process_component_config_fails(hass): async def test_setup_reload_service_when_async_process_component_config_fails(
hass: HomeAssistant,
) -> None:
"""Test setting up a reload service with the config processing failing.""" """Test setting up a reload service with the config processing failing."""
component_setup = Mock(return_value=True) component_setup = Mock(return_value=True)
@ -198,7 +201,7 @@ async def test_setup_reload_service_with_platform_that_provides_async_reset_plat
assert len(async_reset_platform_called) == 1 assert len(async_reset_platform_called) == 1
async def test_async_integration_yaml_config(hass): async def test_async_integration_yaml_config(hass: HomeAssistant) -> None:
"""Test loading yaml config for an integration.""" """Test loading yaml config for an integration."""
mock_integration(hass, MockModule(DOMAIN)) mock_integration(hass, MockModule(DOMAIN))
@ -209,7 +212,7 @@ async def test_async_integration_yaml_config(hass):
assert processed_config == {DOMAIN: [{"name": "one"}, {"name": "two"}]} assert processed_config == {DOMAIN: [{"name": "one"}, {"name": "two"}]}
async def test_async_integration_missing_yaml_config(hass): async def test_async_integration_missing_yaml_config(hass: HomeAssistant) -> None:
"""Test loading missing yaml config for an integration.""" """Test loading missing yaml config for an integration."""
mock_integration(hass, MockModule(DOMAIN)) mock_integration(hass, MockModule(DOMAIN))

View file

@ -3,7 +3,7 @@ from datetime import datetime, timedelta
from unittest.mock import patch from unittest.mock import patch
from homeassistant.const import EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP from homeassistant.const import EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP
from homeassistant.core import CoreState, State from homeassistant.core import CoreState, HomeAssistant, State
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity import Entity
from homeassistant.helpers.restore_state import ( from homeassistant.helpers.restore_state import (
@ -18,7 +18,7 @@ from homeassistant.util import dt as dt_util
from tests.common import async_fire_time_changed from tests.common import async_fire_time_changed
async def test_caching_data(hass): async def test_caching_data(hass: HomeAssistant) -> None:
"""Test that we cache data.""" """Test that we cache data."""
now = dt_util.utcnow() now = dt_util.utcnow()
stored_states = [ stored_states = [
@ -52,7 +52,7 @@ async def test_caching_data(hass):
assert mock_write_data.called assert mock_write_data.called
async def test_periodic_write(hass): async def test_periodic_write(hass: HomeAssistant) -> None:
"""Test that we write periodiclly but not after stop.""" """Test that we write periodiclly but not after stop."""
data = await RestoreStateData.async_get_instance(hass) data = await RestoreStateData.async_get_instance(hass)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -98,7 +98,7 @@ async def test_periodic_write(hass):
assert not mock_write_data.called assert not mock_write_data.called
async def test_save_persistent_states(hass): async def test_save_persistent_states(hass: HomeAssistant) -> None:
"""Test that we cancel the currently running job, save the data, and verify the perdiodic job continues.""" """Test that we cancel the currently running job, save the data, and verify the perdiodic job continues."""
data = await RestoreStateData.async_get_instance(hass) data = await RestoreStateData.async_get_instance(hass)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -154,7 +154,7 @@ async def test_save_persistent_states(hass):
assert mock_write_data.called assert mock_write_data.called
async def test_hass_starting(hass): async def test_hass_starting(hass: HomeAssistant) -> None:
"""Test that we cache data.""" """Test that we cache data."""
hass.state = CoreState.starting hass.state = CoreState.starting
@ -203,7 +203,7 @@ async def test_hass_starting(hass):
assert mock_write_data.called assert mock_write_data.called
async def test_dump_data(hass): async def test_dump_data(hass: HomeAssistant) -> None:
"""Test that we cache data.""" """Test that we cache data."""
states = [ states = [
State("input_boolean.b0", "on"), State("input_boolean.b0", "on"),
@ -278,7 +278,7 @@ async def test_dump_data(hass):
assert written_states[1]["state"]["state"] == "off" assert written_states[1]["state"]["state"] == "off"
async def test_dump_error(hass): async def test_dump_error(hass: HomeAssistant) -> None:
"""Test that we cache data.""" """Test that we cache data."""
states = [ states = [
State("input_boolean.b0", "on"), State("input_boolean.b0", "on"),
@ -307,7 +307,7 @@ async def test_dump_error(hass):
assert mock_write_data.called assert mock_write_data.called
async def test_load_error(hass): async def test_load_error(hass: HomeAssistant) -> None:
"""Test that we cache data.""" """Test that we cache data."""
entity = RestoreEntity() entity = RestoreEntity()
entity.hass = hass entity.hass = hass
@ -322,7 +322,7 @@ async def test_load_error(hass):
assert state is None assert state is None
async def test_state_saved_on_remove(hass): async def test_state_saved_on_remove(hass: HomeAssistant) -> None:
"""Test that we save entity state on removal.""" """Test that we save entity state on removal."""
entity = RestoreEntity() entity = RestoreEntity()
entity.hass = hass entity.hass = hass

View file

@ -177,7 +177,7 @@ async def test_firing_event_basic(hass, caplog):
) )
async def test_firing_event_template(hass): async def test_firing_event_template(hass: HomeAssistant) -> None:
"""Test the firing of events.""" """Test the firing of events."""
event = "test_event" event = "test_event"
context = Context() context = Context()
@ -276,7 +276,7 @@ async def test_calling_service_basic(hass, caplog):
) )
async def test_calling_service_template(hass): async def test_calling_service_template(hass: HomeAssistant) -> None:
"""Test the calling of a service.""" """Test the calling of a service."""
context = Context() context = Context()
calls = async_mock_service(hass, "test", "script") calls = async_mock_service(hass, "test", "script")
@ -329,7 +329,7 @@ async def test_calling_service_template(hass):
) )
async def test_data_template_with_templated_key(hass): async def test_data_template_with_templated_key(hass: HomeAssistant) -> None:
"""Test the calling of a service with a data_template with a templated key.""" """Test the calling of a service with a data_template with a templated key."""
context = Context() context = Context()
calls = async_mock_service(hass, "test", "script") calls = async_mock_service(hass, "test", "script")
@ -368,7 +368,7 @@ async def test_data_template_with_templated_key(hass):
) )
async def test_multiple_runs_no_wait(hass): async def test_multiple_runs_no_wait(hass: HomeAssistant) -> None:
"""Test multiple runs with no wait in script.""" """Test multiple runs with no wait in script."""
logger = logging.getLogger("TEST") logger = logging.getLogger("TEST")
calls = [] calls = []
@ -516,7 +516,7 @@ async def test_stop_no_wait(hass, count):
assert len(events) == 0 assert len(events) == 0
async def test_delay_basic(hass): async def test_delay_basic(hass: HomeAssistant) -> None:
"""Test the delay.""" """Test the delay."""
delay_alias = "delay step" delay_alias = "delay step"
sequence = cv.SCRIPT_SCHEMA({"delay": {"seconds": 5}, "alias": delay_alias}) sequence = cv.SCRIPT_SCHEMA({"delay": {"seconds": 5}, "alias": delay_alias})
@ -546,7 +546,7 @@ async def test_delay_basic(hass):
) )
async def test_multiple_runs_delay(hass): async def test_multiple_runs_delay(hass: HomeAssistant) -> None:
"""Test multiple runs with delay in script.""" """Test multiple runs with delay in script."""
event = "test_event" event = "test_event"
events = async_capture_events(hass, event) events = async_capture_events(hass, event)
@ -589,7 +589,7 @@ async def test_multiple_runs_delay(hass):
assert events[-1].data["value"] == 2 assert events[-1].data["value"] == 2
async def test_delay_template_ok(hass): async def test_delay_template_ok(hass: HomeAssistant) -> None:
"""Test the delay as a template.""" """Test the delay as a template."""
sequence = cv.SCRIPT_SCHEMA({"delay": "00:00:{{ 5 }}"}) sequence = cv.SCRIPT_SCHEMA({"delay": "00:00:{{ 5 }}"})
script_obj = script.Script(hass, sequence, "Test Name", "test_domain") script_obj = script.Script(hass, sequence, "Test Name", "test_domain")
@ -651,7 +651,7 @@ async def test_delay_template_invalid(hass, caplog):
) )
async def test_delay_template_complex_ok(hass): async def test_delay_template_complex_ok(hass: HomeAssistant) -> None:
"""Test the delay with a working complex template.""" """Test the delay with a working complex template."""
sequence = cv.SCRIPT_SCHEMA({"delay": {"seconds": "{{ 5 }}"}}) sequence = cv.SCRIPT_SCHEMA({"delay": {"seconds": "{{ 5 }}"}})
script_obj = script.Script(hass, sequence, "Test Name", "test_domain") script_obj = script.Script(hass, sequence, "Test Name", "test_domain")
@ -712,7 +712,7 @@ async def test_delay_template_complex_invalid(hass, caplog):
) )
async def test_cancel_delay(hass): async def test_cancel_delay(hass: HomeAssistant) -> None:
"""Test the cancelling while the delay is present.""" """Test the cancelling while the delay is present."""
event = "test_event" event = "test_event"
events = async_capture_events(hass, event) events = async_capture_events(hass, event)
@ -808,7 +808,7 @@ async def test_wait_basic(hass, action_type):
) )
async def test_wait_for_trigger_variables(hass): async def test_wait_for_trigger_variables(hass: HomeAssistant) -> None:
"""Test variables are passed to wait_for_trigger action.""" """Test variables are passed to wait_for_trigger action."""
context = Context() context = Context()
wait_alias = "wait step" wait_alias = "wait step"
@ -1014,7 +1014,7 @@ async def test_cancel_wait(hass, action_type):
) )
async def test_wait_template_not_schedule(hass): async def test_wait_template_not_schedule(hass: HomeAssistant) -> None:
"""Test the wait template with correct condition.""" """Test the wait template with correct condition."""
event = "test_event" event = "test_event"
events = async_capture_events(hass, event) events = async_capture_events(hass, event)
@ -1180,7 +1180,7 @@ async def test_wait_continue_on_timeout(
assert_action_trace(expected_trace, expected_script_execution) assert_action_trace(expected_trace, expected_script_execution)
async def test_wait_template_variables_in(hass): async def test_wait_template_variables_in(hass: HomeAssistant) -> None:
"""Test the wait template with input variables.""" """Test the wait template with input variables."""
sequence = cv.SCRIPT_SCHEMA({"wait_template": "{{ is_state(data, 'off') }}"}) sequence = cv.SCRIPT_SCHEMA({"wait_template": "{{ is_state(data, 'off') }}"})
script_obj = script.Script(hass, sequence, "Test Name", "test_domain") script_obj = script.Script(hass, sequence, "Test Name", "test_domain")
@ -1210,7 +1210,7 @@ async def test_wait_template_variables_in(hass):
) )
async def test_wait_template_with_utcnow(hass): async def test_wait_template_with_utcnow(hass: HomeAssistant) -> None:
"""Test the wait template with utcnow.""" """Test the wait template with utcnow."""
sequence = cv.SCRIPT_SCHEMA({"wait_template": "{{ utcnow().hour == 12 }}"}) sequence = cv.SCRIPT_SCHEMA({"wait_template": "{{ utcnow().hour == 12 }}"})
script_obj = script.Script(hass, sequence, "Test Name", "test_domain") script_obj = script.Script(hass, sequence, "Test Name", "test_domain")
@ -1241,7 +1241,7 @@ async def test_wait_template_with_utcnow(hass):
) )
async def test_wait_template_with_utcnow_no_match(hass): async def test_wait_template_with_utcnow_no_match(hass: HomeAssistant) -> None:
"""Test the wait template with utcnow that does not match.""" """Test the wait template with utcnow that does not match."""
sequence = cv.SCRIPT_SCHEMA({"wait_template": "{{ utcnow().hour == 12 }}"}) sequence = cv.SCRIPT_SCHEMA({"wait_template": "{{ utcnow().hour == 12 }}"})
script_obj = script.Script(hass, sequence, "Test Name", "test_domain") script_obj = script.Script(hass, sequence, "Test Name", "test_domain")
@ -1745,7 +1745,7 @@ async def test_condition_created_once(async_from_config, hass):
assert len(script_obj._config_cache) == 1 assert len(script_obj._config_cache) == 1
async def test_condition_all_cached(hass): async def test_condition_all_cached(hass: HomeAssistant) -> None:
"""Test that multiple conditions get cached.""" """Test that multiple conditions get cached."""
sequence = cv.SCRIPT_SCHEMA( sequence = cv.SCRIPT_SCHEMA(
[ [
@ -3317,7 +3317,7 @@ async def test_parallel_error(
assert_action_trace(expected_trace, expected_script_execution="error") assert_action_trace(expected_trace, expected_script_execution="error")
async def test_last_triggered(hass): async def test_last_triggered(hass: HomeAssistant) -> None:
"""Test the last_triggered.""" """Test the last_triggered."""
event = "test_event" event = "test_event"
sequence = cv.SCRIPT_SCHEMA({"event": event}) sequence = cv.SCRIPT_SCHEMA({"event": event})
@ -3333,7 +3333,7 @@ async def test_last_triggered(hass):
assert script_obj.last_triggered == time assert script_obj.last_triggered == time
async def test_propagate_error_service_not_found(hass): async def test_propagate_error_service_not_found(hass: HomeAssistant) -> None:
"""Test that a script aborts when a service is not found.""" """Test that a script aborts when a service is not found."""
event = "test_event" event = "test_event"
events = async_capture_events(hass, event) events = async_capture_events(hass, event)
@ -3366,7 +3366,7 @@ async def test_propagate_error_service_not_found(hass):
assert_action_trace(expected_trace, expected_script_execution="error") assert_action_trace(expected_trace, expected_script_execution="error")
async def test_propagate_error_invalid_service_data(hass): async def test_propagate_error_invalid_service_data(hass: HomeAssistant) -> None:
"""Test that a script aborts when we send invalid service data.""" """Test that a script aborts when we send invalid service data."""
event = "test_event" event = "test_event"
events = async_capture_events(hass, event) events = async_capture_events(hass, event)
@ -3403,7 +3403,7 @@ async def test_propagate_error_invalid_service_data(hass):
assert_action_trace(expected_trace, expected_script_execution="error") assert_action_trace(expected_trace, expected_script_execution="error")
async def test_propagate_error_service_exception(hass): async def test_propagate_error_service_exception(hass: HomeAssistant) -> None:
"""Test that a script aborts when a service throws an exception.""" """Test that a script aborts when a service throws an exception."""
event = "test_event" event = "test_event"
events = async_capture_events(hass, event) events = async_capture_events(hass, event)
@ -3444,7 +3444,7 @@ async def test_propagate_error_service_exception(hass):
assert_action_trace(expected_trace, expected_script_execution="error") assert_action_trace(expected_trace, expected_script_execution="error")
async def test_referenced_areas(hass): async def test_referenced_areas(hass: HomeAssistant) -> None:
"""Test referenced areas.""" """Test referenced areas."""
script_obj = script.Script( script_obj = script.Script(
hass, hass,
@ -3546,7 +3546,7 @@ async def test_referenced_areas(hass):
assert script_obj.referenced_areas is script_obj.referenced_areas assert script_obj.referenced_areas is script_obj.referenced_areas
async def test_referenced_entities(hass): async def test_referenced_entities(hass: HomeAssistant) -> None:
"""Test referenced entities.""" """Test referenced entities."""
script_obj = script.Script( script_obj = script.Script(
hass, hass,
@ -3667,7 +3667,7 @@ async def test_referenced_entities(hass):
assert script_obj.referenced_entities is script_obj.referenced_entities assert script_obj.referenced_entities is script_obj.referenced_entities
async def test_referenced_devices(hass): async def test_referenced_devices(hass: HomeAssistant) -> None:
"""Test referenced entities.""" """Test referenced entities."""
script_obj = script.Script( script_obj = script.Script(
hass, hass,
@ -3952,7 +3952,7 @@ async def test_script_mode_2(hass, caplog, script_mode, messages, last_events):
assert events[idx].data["value"] == value assert events[idx].data["value"] == value
async def test_script_mode_queued(hass): async def test_script_mode_queued(hass: HomeAssistant) -> None:
"""Test overlapping runs with script_mode = 'queued' & max_runs > 1.""" """Test overlapping runs with script_mode = 'queued' & max_runs > 1."""
event = "test_event" event = "test_event"
events = async_capture_events(hass, event) events = async_capture_events(hass, event)
@ -4049,7 +4049,7 @@ async def test_script_mode_queued(hass):
assert events[3].data["value"] == 2 assert events[3].data["value"] == 2
async def test_script_mode_queued_cancel(hass): async def test_script_mode_queued_cancel(hass: HomeAssistant) -> None:
"""Test canceling with a queued run.""" """Test canceling with a queued run."""
script_obj = script.Script( script_obj = script.Script(
hass, hass,
@ -4091,7 +4091,7 @@ async def test_script_mode_queued_cancel(hass):
raise raise
async def test_script_mode_queued_stop(hass): async def test_script_mode_queued_stop(hass: HomeAssistant) -> None:
"""Test stopping with a queued run.""" """Test stopping with a queued run."""
script_obj = script.Script( script_obj = script.Script(
hass, hass,
@ -4350,7 +4350,7 @@ async def test_set_redefines_variable(hass, caplog):
assert_action_trace(expected_trace) assert_action_trace(expected_trace)
async def test_validate_action_config(hass): async def test_validate_action_config(hass: HomeAssistant) -> None:
"""Validate action config.""" """Validate action config."""
def templated_device_action(message): def templated_device_action(message):
@ -4456,7 +4456,7 @@ async def test_validate_action_config(hass):
assert isinstance(device_action["message"], template.Template) assert isinstance(device_action["message"], template.Template)
async def test_embedded_wait_for_trigger_in_automation(hass): async def test_embedded_wait_for_trigger_in_automation(hass: HomeAssistant) -> None:
"""Test an embedded wait for trigger.""" """Test an embedded wait for trigger."""
assert await async_setup_component( assert await async_setup_component(
hass, hass,
@ -4515,7 +4515,7 @@ async def test_embedded_wait_for_trigger_in_automation(hass):
assert len(mock_calls) == 1 assert len(mock_calls) == 1
async def test_breakpoints_1(hass): async def test_breakpoints_1(hass: HomeAssistant) -> None:
"""Test setting a breakpoint halts execution, and execution can be resumed.""" """Test setting a breakpoint halts execution, and execution can be resumed."""
event = "test_event" event = "test_event"
events = async_capture_events(hass, event) events = async_capture_events(hass, event)
@ -4610,7 +4610,7 @@ async def test_breakpoints_1(hass):
assert events[-1].data["value"] == 7 assert events[-1].data["value"] == 7
async def test_breakpoints_2(hass): async def test_breakpoints_2(hass: HomeAssistant) -> None:
"""Test setting a breakpoint halts execution, and execution can be aborted.""" """Test setting a breakpoint halts execution, and execution can be aborted."""
event = "test_event" event = "test_event"
events = async_capture_events(hass, event) events = async_capture_events(hass, event)
@ -4677,7 +4677,7 @@ async def test_breakpoints_2(hass):
assert len(events) == 1 assert len(events) == 1
async def test_platform_async_validate_action_config(hass): async def test_platform_async_validate_action_config(hass: HomeAssistant) -> None:
"""Test platform.async_validate_action_config will be called if it exists.""" """Test platform.async_validate_action_config will be called if it exists."""
config = {CONF_DEVICE_ID: "test", CONF_DOMAIN: "test"} config = {CONF_DEVICE_ID: "test", CONF_DOMAIN: "test"}
with patch( with patch(

View file

@ -1,6 +1,7 @@
"""Test script variables.""" """Test script variables."""
import pytest import pytest
from homeassistant.core import HomeAssistant
from homeassistant.helpers import config_validation as cv, template from homeassistant.helpers import config_validation as cv, template
@ -46,14 +47,14 @@ async def test_static_vars_run_args_no_default() -> None:
assert orig == orig_copy assert orig == orig_copy
async def test_template_vars(hass): async def test_template_vars(hass: HomeAssistant) -> None:
"""Test template vars.""" """Test template vars."""
var = cv.SCRIPT_VARIABLES_SCHEMA({"hello": "{{ 1 + 1 }}"}) var = cv.SCRIPT_VARIABLES_SCHEMA({"hello": "{{ 1 + 1 }}"})
rendered = var.async_render(hass, None) rendered = var.async_render(hass, None)
assert rendered == {"hello": 2} assert rendered == {"hello": 2}
async def test_template_vars_run_args(hass): async def test_template_vars_run_args(hass: HomeAssistant) -> None:
"""Test template vars.""" """Test template vars."""
var = cv.SCRIPT_VARIABLES_SCHEMA( var = cv.SCRIPT_VARIABLES_SCHEMA(
{ {
@ -75,14 +76,14 @@ async def test_template_vars_run_args(hass):
} }
async def test_template_vars_no_default(hass): async def test_template_vars_no_default(hass: HomeAssistant) -> None:
"""Test template vars.""" """Test template vars."""
var = cv.SCRIPT_VARIABLES_SCHEMA({"hello": "{{ 1 + 1 }}"}) var = cv.SCRIPT_VARIABLES_SCHEMA({"hello": "{{ 1 + 1 }}"})
rendered = var.async_render(hass, None, render_as_defaults=False) rendered = var.async_render(hass, None, render_as_defaults=False)
assert rendered == {"hello": 2} assert rendered == {"hello": 2}
async def test_template_vars_run_args_no_default(hass): async def test_template_vars_run_args_no_default(hass: HomeAssistant) -> None:
"""Test template vars.""" """Test template vars."""
var = cv.SCRIPT_VARIABLES_SCHEMA( var = cv.SCRIPT_VARIABLES_SCHEMA(
{ {
@ -105,7 +106,7 @@ async def test_template_vars_run_args_no_default(hass):
} }
async def test_template_vars_error(hass): async def test_template_vars_error(hass: HomeAssistant) -> None:
"""Test template vars.""" """Test template vars."""
var = cv.SCRIPT_VARIABLES_SCHEMA({"hello": "{{ canont.work }}"}) var = cv.SCRIPT_VARIABLES_SCHEMA({"hello": "{{ canont.work }}"})
with pytest.raises(template.TemplateError): with pytest.raises(template.TemplateError):

View file

@ -8,7 +8,7 @@ import pytest
import voluptuous as vol import voluptuous as vol
# To prevent circular import when running just this file # To prevent circular import when running just this file
from homeassistant import core as ha, exceptions from homeassistant import exceptions
from homeassistant.auth.permissions import PolicyPermissions from homeassistant.auth.permissions import PolicyPermissions
import homeassistant.components # noqa: F401, pylint: disable=unused-import import homeassistant.components # noqa: F401, pylint: disable=unused-import
from homeassistant.const import ( from homeassistant.const import (
@ -18,6 +18,7 @@ from homeassistant.const import (
STATE_OFF, STATE_OFF,
STATE_ON, STATE_ON,
) )
from homeassistant.core import Context, HomeAssistant, ServiceCall
from homeassistant.helpers import ( from homeassistant.helpers import (
device_registry as dev_reg, device_registry as dev_reg,
entity_registry as ent_reg, entity_registry as ent_reg,
@ -401,7 +402,7 @@ class TestServiceHelpers(unittest.TestCase):
assert mock_log.call_count == 3 assert mock_log.call_count == 3
async def test_service_call_entry_id(hass): async def test_service_call_entry_id(hass: HomeAssistant) -> None:
"""Test service call with entity specified by entity registry ID.""" """Test service call with entity specified by entity registry ID."""
registry = ent_reg.async_get(hass) registry = ent_reg.async_get(hass)
calls = async_mock_service(hass, "test_domain", "test_service") calls = async_mock_service(hass, "test_domain", "test_service")
@ -438,7 +439,7 @@ async def test_service_call_all_none(hass, target):
assert dict(calls[0].data) == {"entity_id": target} assert dict(calls[0].data) == {"entity_id": target}
async def test_extract_entity_ids(hass): async def test_extract_entity_ids(hass: HomeAssistant) -> None:
"""Test extract_entity_ids method.""" """Test extract_entity_ids method."""
hass.states.async_set("light.Bowl", STATE_ON) hass.states.async_set("light.Bowl", STATE_ON)
hass.states.async_set("light.Ceiling", STATE_OFF) hass.states.async_set("light.Ceiling", STATE_OFF)
@ -450,11 +451,11 @@ async def test_extract_entity_ids(hass):
hass, "test", ["light.Ceiling", "light.Kitchen"] hass, "test", ["light.Ceiling", "light.Kitchen"]
) )
call = ha.ServiceCall("light", "turn_on", {ATTR_ENTITY_ID: "light.Bowl"}) call = ServiceCall("light", "turn_on", {ATTR_ENTITY_ID: "light.Bowl"})
assert {"light.bowl"} == await service.async_extract_entity_ids(hass, call) assert {"light.bowl"} == await service.async_extract_entity_ids(hass, call)
call = ha.ServiceCall("light", "turn_on", {ATTR_ENTITY_ID: "group.test"}) call = ServiceCall("light", "turn_on", {ATTR_ENTITY_ID: "group.test"})
assert {"light.ceiling", "light.kitchen"} == await service.async_extract_entity_ids( assert {"light.ceiling", "light.kitchen"} == await service.async_extract_entity_ids(
hass, call hass, call
@ -467,7 +468,7 @@ async def test_extract_entity_ids(hass):
assert ( assert (
await service.async_extract_entity_ids( await service.async_extract_entity_ids(
hass, hass,
ha.ServiceCall("light", "turn_on", {ATTR_ENTITY_ID: ENTITY_MATCH_NONE}), ServiceCall("light", "turn_on", {ATTR_ENTITY_ID: ENTITY_MATCH_NONE}),
) )
== set() == set()
) )
@ -475,20 +476,20 @@ async def test_extract_entity_ids(hass):
async def test_extract_entity_ids_from_area(hass, area_mock): async def test_extract_entity_ids_from_area(hass, area_mock):
"""Test extract_entity_ids method with areas.""" """Test extract_entity_ids method with areas."""
call = ha.ServiceCall("light", "turn_on", {"area_id": "own-area"}) call = ServiceCall("light", "turn_on", {"area_id": "own-area"})
assert { assert {
"light.in_own_area", "light.in_own_area",
} == await service.async_extract_entity_ids(hass, call) } == await service.async_extract_entity_ids(hass, call)
call = ha.ServiceCall("light", "turn_on", {"area_id": "test-area"}) call = ServiceCall("light", "turn_on", {"area_id": "test-area"})
assert { assert {
"light.in_area", "light.in_area",
"light.assigned_to_area", "light.assigned_to_area",
} == await service.async_extract_entity_ids(hass, call) } == await service.async_extract_entity_ids(hass, call)
call = ha.ServiceCall("light", "turn_on", {"area_id": ["test-area", "diff-area"]}) call = ServiceCall("light", "turn_on", {"area_id": ["test-area", "diff-area"]})
assert { assert {
"light.in_area", "light.in_area",
@ -498,7 +499,7 @@ async def test_extract_entity_ids_from_area(hass, area_mock):
assert ( assert (
await service.async_extract_entity_ids( await service.async_extract_entity_ids(
hass, ha.ServiceCall("light", "turn_on", {"area_id": ENTITY_MATCH_NONE}) hass, ServiceCall("light", "turn_on", {"area_id": ENTITY_MATCH_NONE})
) )
== set() == set()
) )
@ -507,13 +508,13 @@ async def test_extract_entity_ids_from_area(hass, area_mock):
async def test_extract_entity_ids_from_devices(hass, area_mock): async def test_extract_entity_ids_from_devices(hass, area_mock):
"""Test extract_entity_ids method with devices.""" """Test extract_entity_ids method with devices."""
assert await service.async_extract_entity_ids( assert await service.async_extract_entity_ids(
hass, ha.ServiceCall("light", "turn_on", {"device_id": "device-no-area-id"}) hass, ServiceCall("light", "turn_on", {"device_id": "device-no-area-id"})
) == { ) == {
"light.no_area", "light.no_area",
} }
assert await service.async_extract_entity_ids( assert await service.async_extract_entity_ids(
hass, ha.ServiceCall("light", "turn_on", {"device_id": "device-area-a-id"}) hass, ServiceCall("light", "turn_on", {"device_id": "device-area-a-id"})
) == { ) == {
"light.in_area_a", "light.in_area_a",
"light.in_area_b", "light.in_area_b",
@ -521,13 +522,13 @@ async def test_extract_entity_ids_from_devices(hass, area_mock):
assert ( assert (
await service.async_extract_entity_ids( await service.async_extract_entity_ids(
hass, ha.ServiceCall("light", "turn_on", {"device_id": "non-existing-id"}) hass, ServiceCall("light", "turn_on", {"device_id": "non-existing-id"})
) )
== set() == set()
) )
async def test_async_get_all_descriptions(hass): async def test_async_get_all_descriptions(hass: HomeAssistant) -> None:
"""Test async_get_all_descriptions.""" """Test async_get_all_descriptions."""
group = hass.components.group group = hass.components.group
group_config = {group.DOMAIN: {}} group_config = {group.DOMAIN: {}}
@ -557,7 +558,7 @@ async def test_call_with_required_features(hass, mock_entities):
hass, hass,
[Mock(entities=mock_entities)], [Mock(entities=mock_entities)],
test_service_mock, test_service_mock,
ha.ServiceCall("test_domain", "test_service", {"entity_id": "all"}), ServiceCall("test_domain", "test_service", {"entity_id": "all"}),
required_features=[SUPPORT_A], required_features=[SUPPORT_A],
) )
@ -576,7 +577,7 @@ async def test_call_with_required_features(hass, mock_entities):
hass, hass,
[Mock(entities=mock_entities)], [Mock(entities=mock_entities)],
test_service_mock, test_service_mock,
ha.ServiceCall( ServiceCall(
"test_domain", "test_service", {"entity_id": "light.living_room"} "test_domain", "test_service", {"entity_id": "light.living_room"}
), ),
required_features=[SUPPORT_A], required_features=[SUPPORT_A],
@ -591,7 +592,7 @@ async def test_call_with_both_required_features(hass, mock_entities):
hass, hass,
[Mock(entities=mock_entities)], [Mock(entities=mock_entities)],
test_service_mock, test_service_mock,
ha.ServiceCall("test_domain", "test_service", {"entity_id": "all"}), ServiceCall("test_domain", "test_service", {"entity_id": "all"}),
required_features=[SUPPORT_A | SUPPORT_B], required_features=[SUPPORT_A | SUPPORT_B],
) )
@ -608,7 +609,7 @@ async def test_call_with_one_of_required_features(hass, mock_entities):
hass, hass,
[Mock(entities=mock_entities)], [Mock(entities=mock_entities)],
test_service_mock, test_service_mock,
ha.ServiceCall("test_domain", "test_service", {"entity_id": "all"}), ServiceCall("test_domain", "test_service", {"entity_id": "all"}),
required_features=[SUPPORT_A, SUPPORT_C], required_features=[SUPPORT_A, SUPPORT_C],
) )
@ -629,7 +630,7 @@ async def test_call_with_sync_func(hass, mock_entities):
hass, hass,
[Mock(entities=mock_entities)], [Mock(entities=mock_entities)],
test_service_mock, test_service_mock,
ha.ServiceCall("test_domain", "test_service", {"entity_id": "light.kitchen"}), ServiceCall("test_domain", "test_service", {"entity_id": "light.kitchen"}),
) )
assert test_service_mock.call_count == 1 assert test_service_mock.call_count == 1
@ -641,7 +642,7 @@ async def test_call_with_sync_attr(hass, mock_entities):
hass, hass,
[Mock(entities=mock_entities)], [Mock(entities=mock_entities)],
"sync_method", "sync_method",
ha.ServiceCall( ServiceCall(
"test_domain", "test_domain",
"test_service", "test_service",
{"entity_id": "light.kitchen", "area_id": "abcd"}, {"entity_id": "light.kitchen", "area_id": "abcd"},
@ -652,17 +653,17 @@ async def test_call_with_sync_attr(hass, mock_entities):
assert mock_method.mock_calls[0][2] == {} assert mock_method.mock_calls[0][2] == {}
async def test_call_context_user_not_exist(hass): async def test_call_context_user_not_exist(hass: HomeAssistant) -> None:
"""Check we don't allow deleted users to do things.""" """Check we don't allow deleted users to do things."""
with pytest.raises(exceptions.UnknownUser) as err: with pytest.raises(exceptions.UnknownUser) as err:
await service.entity_service_call( await service.entity_service_call(
hass, hass,
[], [],
Mock(), Mock(),
ha.ServiceCall( ServiceCall(
"test_domain", "test_domain",
"test_service", "test_service",
context=ha.Context(user_id="non-existing"), context=Context(user_id="non-existing"),
), ),
) )
@ -683,11 +684,11 @@ async def test_call_context_target_all(hass, mock_handle_entity_call, mock_entit
hass, hass,
[Mock(entities=mock_entities)], [Mock(entities=mock_entities)],
Mock(), Mock(),
ha.ServiceCall( ServiceCall(
"test_domain", "test_domain",
"test_service", "test_service",
data={"entity_id": ENTITY_MATCH_ALL}, data={"entity_id": ENTITY_MATCH_ALL},
context=ha.Context(user_id="mock-id"), context=Context(user_id="mock-id"),
), ),
) )
@ -711,11 +712,11 @@ async def test_call_context_target_specific(
hass, hass,
[Mock(entities=mock_entities)], [Mock(entities=mock_entities)],
Mock(), Mock(),
ha.ServiceCall( ServiceCall(
"test_domain", "test_domain",
"test_service", "test_service",
{"entity_id": "light.kitchen"}, {"entity_id": "light.kitchen"},
context=ha.Context(user_id="mock-id"), context=Context(user_id="mock-id"),
), ),
) )
@ -735,11 +736,11 @@ async def test_call_context_target_specific_no_auth(
hass, hass,
[Mock(entities=mock_entities)], [Mock(entities=mock_entities)],
Mock(), Mock(),
ha.ServiceCall( ServiceCall(
"test_domain", "test_domain",
"test_service", "test_service",
{"entity_id": "light.kitchen"}, {"entity_id": "light.kitchen"},
context=ha.Context(user_id="mock-id"), context=Context(user_id="mock-id"),
), ),
) )
@ -753,7 +754,7 @@ async def test_call_no_context_target_all(hass, mock_handle_entity_call, mock_en
hass, hass,
[Mock(entities=mock_entities)], [Mock(entities=mock_entities)],
Mock(), Mock(),
ha.ServiceCall( ServiceCall(
"test_domain", "test_service", data={"entity_id": ENTITY_MATCH_ALL} "test_domain", "test_service", data={"entity_id": ENTITY_MATCH_ALL}
), ),
) )
@ -772,7 +773,7 @@ async def test_call_no_context_target_specific(
hass, hass,
[Mock(entities=mock_entities)], [Mock(entities=mock_entities)],
Mock(), Mock(),
ha.ServiceCall( ServiceCall(
"test_domain", "test_domain",
"test_service", "test_service",
{"entity_id": ["light.kitchen", "light.non-existing"]}, {"entity_id": ["light.kitchen", "light.non-existing"]},
@ -791,7 +792,7 @@ async def test_call_with_match_all(
hass, hass,
[Mock(entities=mock_entities)], [Mock(entities=mock_entities)],
Mock(), Mock(),
ha.ServiceCall("test_domain", "test_service", {"entity_id": "all"}), ServiceCall("test_domain", "test_service", {"entity_id": "all"}),
) )
assert len(mock_handle_entity_call.mock_calls) == 4 assert len(mock_handle_entity_call.mock_calls) == 4
@ -806,7 +807,7 @@ async def test_call_with_omit_entity_id(hass, mock_handle_entity_call, mock_enti
hass, hass,
[Mock(entities=mock_entities)], [Mock(entities=mock_entities)],
Mock(), Mock(),
ha.ServiceCall("test_domain", "test_service"), ServiceCall("test_domain", "test_service"),
) )
assert len(mock_handle_entity_call.mock_calls) == 0 assert len(mock_handle_entity_call.mock_calls) == 0
@ -834,7 +835,7 @@ async def test_register_admin_service(hass, hass_read_only_user, hass_admin_user
"test", "test",
{}, {},
blocking=True, blocking=True,
context=ha.Context(user_id="non-existing"), context=Context(user_id="non-existing"),
) )
assert len(calls) == 0 assert len(calls) == 0
@ -844,7 +845,7 @@ async def test_register_admin_service(hass, hass_read_only_user, hass_admin_user
"test", "test",
{}, {},
blocking=True, blocking=True,
context=ha.Context(user_id=hass_read_only_user.id), context=Context(user_id=hass_read_only_user.id),
) )
assert len(calls) == 0 assert len(calls) == 0
@ -854,7 +855,7 @@ async def test_register_admin_service(hass, hass_read_only_user, hass_admin_user
"test", "test",
{"invalid": True}, {"invalid": True},
blocking=True, blocking=True,
context=ha.Context(user_id=hass_admin_user.id), context=Context(user_id=hass_admin_user.id),
) )
assert len(calls) == 0 assert len(calls) == 0
@ -864,7 +865,7 @@ async def test_register_admin_service(hass, hass_read_only_user, hass_admin_user
"test2", "test2",
{}, {},
blocking=True, blocking=True,
context=ha.Context(user_id=hass_admin_user.id), context=Context(user_id=hass_admin_user.id),
) )
assert len(calls) == 0 assert len(calls) == 0
@ -873,7 +874,7 @@ async def test_register_admin_service(hass, hass_read_only_user, hass_admin_user
"test2", "test2",
{"required": True}, {"required": True},
blocking=True, blocking=True,
context=ha.Context(user_id=hass_admin_user.id), context=Context(user_id=hass_admin_user.id),
) )
assert len(calls) == 1 assert len(calls) == 1
assert calls[0].context.user_id == hass_admin_user.id assert calls[0].context.user_id == hass_admin_user.id
@ -917,7 +918,7 @@ async def test_domain_control_unknown(hass, mock_entities):
"test_service", "test_service",
{}, {},
blocking=True, blocking=True,
context=ha.Context(user_id="fake_user_id"), context=Context(user_id="fake_user_id"),
) )
assert len(calls) == 0 assert len(calls) == 0
@ -955,7 +956,7 @@ async def test_domain_control_unauthorized(hass, hass_read_only_user):
"test_service", "test_service",
{}, {},
blocking=True, blocking=True,
context=ha.Context(user_id=hass_read_only_user.id), context=Context(user_id=hass_read_only_user.id),
) )
assert len(calls) == 0 assert len(calls) == 0
@ -993,13 +994,13 @@ async def test_domain_control_admin(hass, hass_admin_user):
"test_service", "test_service",
{}, {},
blocking=True, blocking=True,
context=ha.Context(user_id=hass_admin_user.id), context=Context(user_id=hass_admin_user.id),
) )
assert len(calls) == 1 assert len(calls) == 1
async def test_domain_control_no_user(hass): async def test_domain_control_no_user(hass: HomeAssistant) -> None:
"""Test domain verification in a service call with no user.""" """Test domain verification in a service call with no user."""
mock_registry( mock_registry(
hass, hass,
@ -1031,13 +1032,13 @@ async def test_domain_control_no_user(hass):
"test_service", "test_service",
{}, {},
blocking=True, blocking=True,
context=ha.Context(user_id=None), context=Context(user_id=None),
) )
assert len(calls) == 1 assert len(calls) == 1
async def test_extract_from_service_available_device(hass): async def test_extract_from_service_available_device(hass: HomeAssistant) -> None:
"""Test the extraction of entity from service and device is available.""" """Test the extraction of entity from service and device is available."""
entities = [ entities = [
MockEntity(name="test_1", entity_id="test_domain.test_1"), MockEntity(name="test_1", entity_id="test_domain.test_1"),
@ -1046,14 +1047,14 @@ async def test_extract_from_service_available_device(hass):
MockEntity(name="test_4", entity_id="test_domain.test_4", available=False), MockEntity(name="test_4", entity_id="test_domain.test_4", available=False),
] ]
call_1 = ha.ServiceCall("test", "service", data={"entity_id": ENTITY_MATCH_ALL}) call_1 = ServiceCall("test", "service", data={"entity_id": ENTITY_MATCH_ALL})
assert ["test_domain.test_1", "test_domain.test_3"] == [ assert ["test_domain.test_1", "test_domain.test_3"] == [
ent.entity_id ent.entity_id
for ent in (await service.async_extract_entities(hass, entities, call_1)) for ent in (await service.async_extract_entities(hass, entities, call_1))
] ]
call_2 = ha.ServiceCall( call_2 = ServiceCall(
"test", "test",
"service", "service",
data={"entity_id": ["test_domain.test_3", "test_domain.test_4"]}, data={"entity_id": ["test_domain.test_3", "test_domain.test_4"]},
@ -1068,7 +1069,7 @@ async def test_extract_from_service_available_device(hass):
await service.async_extract_entities( await service.async_extract_entities(
hass, hass,
entities, entities,
ha.ServiceCall( ServiceCall(
"test", "test",
"service", "service",
data={"entity_id": ENTITY_MATCH_NONE}, data={"entity_id": ENTITY_MATCH_NONE},
@ -1078,13 +1079,13 @@ async def test_extract_from_service_available_device(hass):
) )
async def test_extract_from_service_empty_if_no_entity_id(hass): async def test_extract_from_service_empty_if_no_entity_id(hass: HomeAssistant) -> None:
"""Test the extraction from service without specifying entity.""" """Test the extraction from service without specifying entity."""
entities = [ entities = [
MockEntity(name="test_1", entity_id="test_domain.test_1"), MockEntity(name="test_1", entity_id="test_domain.test_1"),
MockEntity(name="test_2", entity_id="test_domain.test_2"), MockEntity(name="test_2", entity_id="test_domain.test_2"),
] ]
call = ha.ServiceCall("test", "service") call = ServiceCall("test", "service")
assert [] == [ assert [] == [
ent.entity_id ent.entity_id
@ -1092,14 +1093,16 @@ async def test_extract_from_service_empty_if_no_entity_id(hass):
] ]
async def test_extract_from_service_filter_out_non_existing_entities(hass): async def test_extract_from_service_filter_out_non_existing_entities(
hass: HomeAssistant,
) -> None:
"""Test the extraction of non existing entities from service.""" """Test the extraction of non existing entities from service."""
entities = [ entities = [
MockEntity(name="test_1", entity_id="test_domain.test_1"), MockEntity(name="test_1", entity_id="test_domain.test_1"),
MockEntity(name="test_2", entity_id="test_domain.test_2"), MockEntity(name="test_2", entity_id="test_domain.test_2"),
] ]
call = ha.ServiceCall( call = ServiceCall(
"test", "test",
"service", "service",
{"entity_id": ["test_domain.test_2", "test_domain.non_exist"]}, {"entity_id": ["test_domain.test_2", "test_domain.non_exist"]},
@ -1119,12 +1122,12 @@ async def test_extract_from_service_area_id(hass, area_mock):
MockEntity(name="diff_area", entity_id="light.diff_area"), MockEntity(name="diff_area", entity_id="light.diff_area"),
] ]
call = ha.ServiceCall("light", "turn_on", {"area_id": "test-area"}) call = ServiceCall("light", "turn_on", {"area_id": "test-area"})
extracted = await service.async_extract_entities(hass, entities, call) extracted = await service.async_extract_entities(hass, entities, call)
assert len(extracted) == 1 assert len(extracted) == 1
assert extracted[0].entity_id == "light.in_area" assert extracted[0].entity_id == "light.in_area"
call = ha.ServiceCall("light", "turn_on", {"area_id": ["test-area", "diff-area"]}) call = ServiceCall("light", "turn_on", {"area_id": ["test-area", "diff-area"]})
extracted = await service.async_extract_entities(hass, entities, call) extracted = await service.async_extract_entities(hass, entities, call)
assert len(extracted) == 2 assert len(extracted) == 2
assert sorted(ent.entity_id for ent in extracted) == [ assert sorted(ent.entity_id for ent in extracted) == [
@ -1132,7 +1135,7 @@ async def test_extract_from_service_area_id(hass, area_mock):
"light.in_area", "light.in_area",
] ]
call = ha.ServiceCall( call = ServiceCall(
"light", "light",
"turn_on", "turn_on",
{"area_id": ["test-area", "diff-area"], "device_id": "device-no-area-id"}, {"area_id": ["test-area", "diff-area"], "device_id": "device-no-area-id"},
@ -1148,7 +1151,7 @@ async def test_extract_from_service_area_id(hass, area_mock):
async def test_entity_service_call_warn_referenced(hass, caplog): async def test_entity_service_call_warn_referenced(hass, caplog):
"""Test we only warn for referenced entities in entity_service_call.""" """Test we only warn for referenced entities in entity_service_call."""
call = ha.ServiceCall( call = ServiceCall(
"light", "light",
"turn_on", "turn_on",
{ {
@ -1166,7 +1169,7 @@ async def test_entity_service_call_warn_referenced(hass, caplog):
async def test_async_extract_entities_warn_referenced(hass, caplog): async def test_async_extract_entities_warn_referenced(hass, caplog):
"""Test we only warn for referenced entities in async_extract_entities.""" """Test we only warn for referenced entities in async_extract_entities."""
call = ha.ServiceCall( call = ServiceCall(
"light", "light",
"turn_on", "turn_on",
{ {
@ -1183,14 +1186,14 @@ async def test_async_extract_entities_warn_referenced(hass, caplog):
) )
async def test_async_extract_config_entry_ids(hass): async def test_async_extract_config_entry_ids(hass: HomeAssistant) -> None:
"""Test we can find devices that have no entities.""" """Test we can find devices that have no entities."""
device_no_entities = dev_reg.DeviceEntry( device_no_entities = dev_reg.DeviceEntry(
id="device-no-entities", config_entries={"abc"} id="device-no-entities", config_entries={"abc"}
) )
call = ha.ServiceCall( call = ServiceCall(
"homeassistant", "homeassistant",
"reload_config_entry", "reload_config_entry",
{ {

View file

@ -1,12 +1,12 @@
"""Test starting HA helpers.""" """Test starting HA helpers."""
from homeassistant import core
from homeassistant.const import EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STARTED from homeassistant.const import EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STARTED
from homeassistant.core import CoreState, HomeAssistant, callback
from homeassistant.helpers import start from homeassistant.helpers import start
async def test_at_start_when_running_awaitable(hass): async def test_at_start_when_running_awaitable(hass: HomeAssistant) -> None:
"""Test at start when already running.""" """Test at start when already running."""
assert hass.state == core.CoreState.running assert hass.state == CoreState.running
assert hass.is_running assert hass.is_running
calls = [] calls = []
@ -19,7 +19,7 @@ async def test_at_start_when_running_awaitable(hass):
await hass.async_block_till_done() await hass.async_block_till_done()
assert len(calls) == 1 assert len(calls) == 1
hass.state = core.CoreState.starting hass.state = CoreState.starting
assert hass.is_running assert hass.is_running
start.async_at_start(hass, cb_at_start) start.async_at_start(hass, cb_at_start)
@ -29,12 +29,12 @@ async def test_at_start_when_running_awaitable(hass):
async def test_at_start_when_running_callback(hass, caplog): async def test_at_start_when_running_callback(hass, caplog):
"""Test at start when already running.""" """Test at start when already running."""
assert hass.state == core.CoreState.running assert hass.state == CoreState.running
assert hass.is_running assert hass.is_running
calls = [] calls = []
@core.callback @callback
def cb_at_start(hass): def cb_at_start(hass):
"""Home Assistant is started.""" """Home Assistant is started."""
calls.append(1) calls.append(1)
@ -42,7 +42,7 @@ async def test_at_start_when_running_callback(hass, caplog):
start.async_at_start(hass, cb_at_start)() start.async_at_start(hass, cb_at_start)()
assert len(calls) == 1 assert len(calls) == 1
hass.state = core.CoreState.starting hass.state = CoreState.starting
assert hass.is_running assert hass.is_running
start.async_at_start(hass, cb_at_start)() start.async_at_start(hass, cb_at_start)()
@ -53,9 +53,9 @@ async def test_at_start_when_running_callback(hass, caplog):
assert record.levelname in ("DEBUG", "INFO") assert record.levelname in ("DEBUG", "INFO")
async def test_at_start_when_starting_awaitable(hass): async def test_at_start_when_starting_awaitable(hass: HomeAssistant) -> None:
"""Test at start when yet to start.""" """Test at start when yet to start."""
hass.state = core.CoreState.not_running hass.state = CoreState.not_running
assert not hass.is_running assert not hass.is_running
calls = [] calls = []
@ -75,12 +75,12 @@ async def test_at_start_when_starting_awaitable(hass):
async def test_at_start_when_starting_callback(hass, caplog): async def test_at_start_when_starting_callback(hass, caplog):
"""Test at start when yet to start.""" """Test at start when yet to start."""
hass.state = core.CoreState.not_running hass.state = CoreState.not_running
assert not hass.is_running assert not hass.is_running
calls = [] calls = []
@core.callback @callback
def cb_at_start(hass): def cb_at_start(hass):
"""Home Assistant is started.""" """Home Assistant is started."""
calls.append(1) calls.append(1)
@ -102,7 +102,7 @@ async def test_at_start_when_starting_callback(hass, caplog):
async def test_cancelling_at_start_when_running(hass, caplog): async def test_cancelling_at_start_when_running(hass, caplog):
"""Test cancelling at start when already running.""" """Test cancelling at start when already running."""
assert hass.state == core.CoreState.running assert hass.state == CoreState.running
assert hass.is_running assert hass.is_running
calls = [] calls = []
@ -120,14 +120,14 @@ async def test_cancelling_at_start_when_running(hass, caplog):
assert record.levelname in ("DEBUG", "INFO") assert record.levelname in ("DEBUG", "INFO")
async def test_cancelling_at_start_when_starting(hass): async def test_cancelling_at_start_when_starting(hass: HomeAssistant) -> None:
"""Test cancelling at start when yet to start.""" """Test cancelling at start when yet to start."""
hass.state = core.CoreState.not_running hass.state = CoreState.not_running
assert not hass.is_running assert not hass.is_running
calls = [] calls = []
@core.callback @callback
def cb_at_start(hass): def cb_at_start(hass):
"""Home Assistant is started.""" """Home Assistant is started."""
calls.append(1) calls.append(1)
@ -141,9 +141,9 @@ async def test_cancelling_at_start_when_starting(hass):
assert len(calls) == 0 assert len(calls) == 0
async def test_at_started_when_running_awaitable(hass): async def test_at_started_when_running_awaitable(hass: HomeAssistant) -> None:
"""Test at started when already started.""" """Test at started when already started."""
assert hass.state == core.CoreState.running assert hass.state == CoreState.running
calls = [] calls = []
@ -156,7 +156,7 @@ async def test_at_started_when_running_awaitable(hass):
assert len(calls) == 1 assert len(calls) == 1
# Test the job is not run if state is CoreState.starting # Test the job is not run if state is CoreState.starting
hass.state = core.CoreState.starting hass.state = CoreState.starting
start.async_at_started(hass, cb_at_start) start.async_at_started(hass, cb_at_start)
await hass.async_block_till_done() await hass.async_block_till_done()
@ -165,11 +165,11 @@ async def test_at_started_when_running_awaitable(hass):
async def test_at_started_when_running_callback(hass, caplog): async def test_at_started_when_running_callback(hass, caplog):
"""Test at started when already running.""" """Test at started when already running."""
assert hass.state == core.CoreState.running assert hass.state == CoreState.running
calls = [] calls = []
@core.callback @callback
def cb_at_start(hass): def cb_at_start(hass):
"""Home Assistant is started.""" """Home Assistant is started."""
calls.append(1) calls.append(1)
@ -178,7 +178,7 @@ async def test_at_started_when_running_callback(hass, caplog):
assert len(calls) == 1 assert len(calls) == 1
# Test the job is not run if state is CoreState.starting # Test the job is not run if state is CoreState.starting
hass.state = core.CoreState.starting hass.state = CoreState.starting
start.async_at_started(hass, cb_at_start)() start.async_at_started(hass, cb_at_start)()
assert len(calls) == 1 assert len(calls) == 1
@ -188,9 +188,9 @@ async def test_at_started_when_running_callback(hass, caplog):
assert record.levelname in ("DEBUG", "INFO") assert record.levelname in ("DEBUG", "INFO")
async def test_at_started_when_starting_awaitable(hass): async def test_at_started_when_starting_awaitable(hass: HomeAssistant) -> None:
"""Test at started when yet to start.""" """Test at started when yet to start."""
hass.state = core.CoreState.not_running hass.state = CoreState.not_running
calls = [] calls = []
@ -213,11 +213,11 @@ async def test_at_started_when_starting_awaitable(hass):
async def test_at_started_when_starting_callback(hass, caplog): async def test_at_started_when_starting_callback(hass, caplog):
"""Test at started when yet to start.""" """Test at started when yet to start."""
hass.state = core.CoreState.not_running hass.state = CoreState.not_running
calls = [] calls = []
@core.callback @callback
def cb_at_start(hass): def cb_at_start(hass):
"""Home Assistant is started.""" """Home Assistant is started."""
calls.append(1) calls.append(1)
@ -243,7 +243,7 @@ async def test_at_started_when_starting_callback(hass, caplog):
async def test_cancelling_at_started_when_running(hass, caplog): async def test_cancelling_at_started_when_running(hass, caplog):
"""Test cancelling at start when already running.""" """Test cancelling at start when already running."""
assert hass.state == core.CoreState.running assert hass.state == CoreState.running
assert hass.is_running assert hass.is_running
calls = [] calls = []
@ -261,14 +261,14 @@ async def test_cancelling_at_started_when_running(hass, caplog):
assert record.levelname in ("DEBUG", "INFO") assert record.levelname in ("DEBUG", "INFO")
async def test_cancelling_at_started_when_starting(hass): async def test_cancelling_at_started_when_starting(hass: HomeAssistant) -> None:
"""Test cancelling at start when yet to start.""" """Test cancelling at start when yet to start."""
hass.state = core.CoreState.not_running hass.state = CoreState.not_running
assert not hass.is_running assert not hass.is_running
calls = [] calls = []
@core.callback @callback
def cb_at_start(hass): def cb_at_start(hass):
"""Home Assistant is started.""" """Home Assistant is started."""
calls.append(1) calls.append(1)

View file

@ -18,7 +18,7 @@ from homeassistant.const import (
STATE_OPEN, STATE_OPEN,
STATE_UNLOCKED, STATE_UNLOCKED,
) )
import homeassistant.core as ha from homeassistant.core import HomeAssistant, State
from homeassistant.helpers import state from homeassistant.helpers import state
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
@ -49,7 +49,7 @@ async def test_async_track_states(hass, mock_integration_frame):
assert [state2, state3] == sorted(states, key=lambda state: state.entity_id) assert [state2, state3] == sorted(states, key=lambda state: state.entity_id)
async def test_call_to_component(hass): async def test_call_to_component(hass: HomeAssistant) -> None:
"""Test calls to components state reproduction functions.""" """Test calls to components state reproduction functions."""
with patch( with patch(
"homeassistant.components.media_player.reproduce_state.async_reproduce_states" "homeassistant.components.media_player.reproduce_state.async_reproduce_states"
@ -63,8 +63,8 @@ async def test_call_to_component(hass):
climate_fun.return_value = asyncio.Future() climate_fun.return_value = asyncio.Future()
climate_fun.return_value.set_result(None) climate_fun.return_value.set_result(None)
state_media_player = ha.State("media_player.test", "bad") state_media_player = State("media_player.test", "bad")
state_climate = ha.State("climate.test", "bad") state_climate = State("climate.test", "bad")
context = "dummy_context" context = "dummy_context"
await state.async_reproduce_state( await state.async_reproduce_state(
@ -103,11 +103,11 @@ async def test_get_changed_since(hass, mock_integration_frame):
assert [state2, state3] == state.get_changed_since([state1, state2, state3], point2) assert [state2, state3] == state.get_changed_since([state1, state2, state3], point2)
async def test_reproduce_with_no_entity(hass): async def test_reproduce_with_no_entity(hass: HomeAssistant) -> None:
"""Test reproduce_state with no entity.""" """Test reproduce_state with no entity."""
calls = async_mock_service(hass, "light", SERVICE_TURN_ON) calls = async_mock_service(hass, "light", SERVICE_TURN_ON)
await state.async_reproduce_state(hass, ha.State("light.test", "on")) await state.async_reproduce_state(hass, State("light.test", "on"))
await hass.async_block_till_done() await hass.async_block_till_done()
@ -115,13 +115,13 @@ async def test_reproduce_with_no_entity(hass):
assert hass.states.get("light.test") is None assert hass.states.get("light.test") is None
async def test_reproduce_turn_on(hass): async def test_reproduce_turn_on(hass: HomeAssistant) -> None:
"""Test reproduce_state with SERVICE_TURN_ON.""" """Test reproduce_state with SERVICE_TURN_ON."""
calls = async_mock_service(hass, "light", SERVICE_TURN_ON) calls = async_mock_service(hass, "light", SERVICE_TURN_ON)
hass.states.async_set("light.test", "off") hass.states.async_set("light.test", "off")
await state.async_reproduce_state(hass, ha.State("light.test", "on")) await state.async_reproduce_state(hass, State("light.test", "on"))
await hass.async_block_till_done() await hass.async_block_till_done()
@ -132,13 +132,13 @@ async def test_reproduce_turn_on(hass):
assert last_call.data.get("entity_id") == "light.test" assert last_call.data.get("entity_id") == "light.test"
async def test_reproduce_turn_off(hass): async def test_reproduce_turn_off(hass: HomeAssistant) -> None:
"""Test reproduce_state with SERVICE_TURN_OFF.""" """Test reproduce_state with SERVICE_TURN_OFF."""
calls = async_mock_service(hass, "light", SERVICE_TURN_OFF) calls = async_mock_service(hass, "light", SERVICE_TURN_OFF)
hass.states.async_set("light.test", "on") hass.states.async_set("light.test", "on")
await state.async_reproduce_state(hass, ha.State("light.test", "off")) await state.async_reproduce_state(hass, State("light.test", "off"))
await hass.async_block_till_done() await hass.async_block_till_done()
@ -149,7 +149,7 @@ async def test_reproduce_turn_off(hass):
assert last_call.data.get("entity_id") == "light.test" assert last_call.data.get("entity_id") == "light.test"
async def test_reproduce_complex_data(hass): async def test_reproduce_complex_data(hass: HomeAssistant) -> None:
"""Test reproduce_state with complex service data.""" """Test reproduce_state with complex service data."""
calls = async_mock_service(hass, "light", SERVICE_TURN_ON) calls = async_mock_service(hass, "light", SERVICE_TURN_ON)
@ -158,7 +158,7 @@ async def test_reproduce_complex_data(hass):
complex_data = [255, 100, 100] complex_data = [255, 100, 100]
await state.async_reproduce_state( await state.async_reproduce_state(
hass, ha.State("light.test", "on", {"rgb_color": complex_data}) hass, State("light.test", "on", {"rgb_color": complex_data})
) )
await hass.async_block_till_done() await hass.async_block_till_done()
@ -170,13 +170,13 @@ async def test_reproduce_complex_data(hass):
assert last_call.data.get("rgb_color") == complex_data assert last_call.data.get("rgb_color") == complex_data
async def test_reproduce_bad_state(hass): async def test_reproduce_bad_state(hass: HomeAssistant) -> None:
"""Test reproduce_state with bad state.""" """Test reproduce_state with bad state."""
calls = async_mock_service(hass, "light", SERVICE_TURN_ON) calls = async_mock_service(hass, "light", SERVICE_TURN_ON)
hass.states.async_set("light.test", "off") hass.states.async_set("light.test", "off")
await state.async_reproduce_state(hass, ha.State("light.test", "bad")) await state.async_reproduce_state(hass, State("light.test", "bad"))
await hass.async_block_till_done() await hass.async_block_till_done()
@ -184,7 +184,7 @@ async def test_reproduce_bad_state(hass):
assert hass.states.get("light.test").state == "off" assert hass.states.get("light.test").state == "off"
async def test_as_number_states(hass): async def test_as_number_states(hass: HomeAssistant) -> None:
"""Test state_as_number with states.""" """Test state_as_number with states."""
zero_states = ( zero_states = (
STATE_OFF, STATE_OFF,
@ -195,21 +195,21 @@ async def test_as_number_states(hass):
) )
one_states = (STATE_ON, STATE_OPEN, STATE_LOCKED, STATE_ABOVE_HORIZON, STATE_HOME) one_states = (STATE_ON, STATE_OPEN, STATE_LOCKED, STATE_ABOVE_HORIZON, STATE_HOME)
for _state in zero_states: for _state in zero_states:
assert state.state_as_number(ha.State("domain.test", _state, {})) == 0 assert state.state_as_number(State("domain.test", _state, {})) == 0
for _state in one_states: for _state in one_states:
assert state.state_as_number(ha.State("domain.test", _state, {})) == 1 assert state.state_as_number(State("domain.test", _state, {})) == 1
async def test_as_number_coercion(hass): async def test_as_number_coercion(hass: HomeAssistant) -> None:
"""Test state_as_number with number.""" """Test state_as_number with number."""
for _state in ("0", "0.0", 0, 0.0): for _state in ("0", "0.0", 0, 0.0):
assert state.state_as_number(ha.State("domain.test", _state, {})) == 0.0 assert state.state_as_number(State("domain.test", _state, {})) == 0.0
for _state in ("1", "1.0", 1, 1.0): for _state in ("1", "1.0", 1, 1.0):
assert state.state_as_number(ha.State("domain.test", _state, {})) == 1.0 assert state.state_as_number(State("domain.test", _state, {})) == 1.0
async def test_as_number_invalid_cases(hass): async def test_as_number_invalid_cases(hass: HomeAssistant) -> None:
"""Test state_as_number with invalid cases.""" """Test state_as_number with invalid cases."""
for _state in ("", "foo", "foo.bar", None, False, True, object, object()): for _state in ("", "foo", "foo.bar", None, False, True, object, object()):
with pytest.raises(ValueError): with pytest.raises(ValueError):
state.state_as_number(ha.State("domain.test", _state, {})) state.state_as_number(State("domain.test", _state, {}))

View file

@ -11,7 +11,7 @@ from homeassistant.const import (
EVENT_HOMEASSISTANT_FINAL_WRITE, EVENT_HOMEASSISTANT_FINAL_WRITE,
EVENT_HOMEASSISTANT_STOP, EVENT_HOMEASSISTANT_STOP,
) )
from homeassistant.core import CoreState from homeassistant.core import CoreState, HomeAssistant
from homeassistant.helpers import storage from homeassistant.helpers import storage
from homeassistant.util import dt from homeassistant.util import dt
from homeassistant.util.color import RGBColor from homeassistant.util.color import RGBColor
@ -64,7 +64,7 @@ async def test_loading(hass, store):
assert data == MOCK_DATA assert data == MOCK_DATA
async def test_custom_encoder(hass): async def test_custom_encoder(hass: HomeAssistant) -> None:
"""Test we can save and load data.""" """Test we can save and load data."""
class JSONEncoder(json.JSONEncoder): class JSONEncoder(json.JSONEncoder):

View file

@ -3,10 +3,11 @@ import json
from unittest.mock import patch from unittest.mock import patch
from homeassistant.const import __version__ as current_version from homeassistant.const import __version__ as current_version
from homeassistant.core import HomeAssistant
from homeassistant.helpers.system_info import async_get_system_info from homeassistant.helpers.system_info import async_get_system_info
async def test_get_system_info(hass): async def test_get_system_info(hass: HomeAssistant) -> None:
"""Test the get system info.""" """Test the get system info."""
info = await async_get_system_info(hass) info = await async_get_system_info(hass)
assert isinstance(info, dict) assert isinstance(info, dict)
@ -15,7 +16,7 @@ async def test_get_system_info(hass):
assert json.dumps(info) is not None assert json.dumps(info) is not None
async def test_container_installationtype(hass): async def test_container_installationtype(hass: HomeAssistant) -> None:
"""Test container installation type.""" """Test container installation type."""
with patch("platform.system", return_value="Linux"), patch( with patch("platform.system", return_value="Linux"), patch(
"os.path.isfile", return_value=True "os.path.isfile", return_value=True
@ -30,7 +31,7 @@ async def test_container_installationtype(hass):
assert info["installation_type"] == "Unsupported Third Party Container" assert info["installation_type"] == "Unsupported Third Party Container"
async def test_getuser_keyerror(hass): async def test_getuser_keyerror(hass: HomeAssistant) -> None:
"""Test getuser keyerror.""" """Test getuser keyerror."""
with patch("homeassistant.helpers.system_info.getuser", side_effect=KeyError): with patch("homeassistant.helpers.system_info.getuser", side_effect=KeyError):
info = await async_get_system_info(hass) info = await async_get_system_info(hass)

View file

@ -195,7 +195,7 @@ async def test_get_translations_loads_config_flows(hass, mock_config_flows):
assert "component2" not in hass.config.components assert "component2" not in hass.config.components
async def test_get_translations_while_loading_components(hass): async def test_get_translations_while_loading_components(hass: HomeAssistant) -> None:
"""Test the get translations helper loads config flow translations.""" """Test the get translations helper loads config flow translations."""
integration = Mock(file_path=pathlib.Path(__file__)) integration = Mock(file_path=pathlib.Path(__file__))
integration.name = "Component 1" integration.name = "Component 1"
@ -231,7 +231,7 @@ async def test_get_translations_while_loading_components(hass):
assert load_count == 1 assert load_count == 1
async def test_get_translation_categories(hass): async def test_get_translation_categories(hass: HomeAssistant) -> None:
"""Test the get translations helper loads config flow translations.""" """Test the get translations helper loads config flow translations."""
with patch.object(translation, "async_get_config_flows", return_value={"light"}): with patch.object(translation, "async_get_config_flows", return_value={"light"}):
translations = await translation.async_get_translations( translations = await translation.async_get_translations(
@ -351,7 +351,7 @@ async def test_translation_merging_loaded_together(hass, caplog):
assert translations == hue_translations | homekit_translations assert translations == hue_translations | homekit_translations
async def test_caching(hass): async def test_caching(hass: HomeAssistant) -> None:
"""Test we cache data.""" """Test we cache data."""
hass.config.components.add("sensor") hass.config.components.add("sensor")
hass.config.components.add("light") hass.config.components.add("light")

View file

@ -23,14 +23,14 @@ def calls(hass):
return async_mock_service(hass, "test", "automation") return async_mock_service(hass, "test", "automation")
async def test_bad_trigger_platform(hass): async def test_bad_trigger_platform(hass: HomeAssistant) -> None:
"""Test bad trigger platform.""" """Test bad trigger platform."""
with pytest.raises(vol.Invalid) as ex: with pytest.raises(vol.Invalid) as ex:
await async_validate_trigger_config(hass, [{"platform": "not_a_platform"}]) await async_validate_trigger_config(hass, [{"platform": "not_a_platform"}])
assert "Invalid platform 'not_a_platform' specified" in str(ex) assert "Invalid platform 'not_a_platform' specified" in str(ex)
async def test_trigger_subtype(hass): async def test_trigger_subtype(hass: HomeAssistant) -> None:
"""Test trigger subtypes.""" """Test trigger subtypes."""
with patch( with patch(
"homeassistant.helpers.trigger.async_get_integration", return_value=MagicMock() "homeassistant.helpers.trigger.async_get_integration", return_value=MagicMock()
@ -39,7 +39,7 @@ async def test_trigger_subtype(hass):
assert integration_mock.call_args == call(hass, "test") assert integration_mock.call_args == call(hass, "test")
async def test_trigger_variables(hass): async def test_trigger_variables(hass: HomeAssistant) -> None:
"""Test trigger variables.""" """Test trigger variables."""

View file

@ -11,7 +11,7 @@ import requests
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.const import EVENT_HOMEASSISTANT_STOP from homeassistant.const import EVENT_HOMEASSISTANT_STOP
from homeassistant.core import CoreState from homeassistant.core import CoreState, HomeAssistant
from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.helpers import update_coordinator from homeassistant.helpers import update_coordinator
from homeassistant.util.dt import utcnow from homeassistant.util.dt import utcnow
@ -395,7 +395,9 @@ async def test_async_config_entry_first_refresh_success(crd, caplog):
assert crd.last_update_success is True assert crd.last_update_success is True
async def test_not_schedule_refresh_if_system_option_disable_polling(hass): async def test_not_schedule_refresh_if_system_option_disable_polling(
hass: HomeAssistant,
) -> None:
"""Test we do not schedule a refresh if disable polling in config entry.""" """Test we do not schedule a refresh if disable polling in config entry."""
entry = MockConfigEntry(pref_disable_polling=True) entry = MockConfigEntry(pref_disable_polling=True)
config_entries.current_entry.set(entry) config_entries.current_entry.set(entry)

View file

@ -7,9 +7,10 @@ from unittest.mock import Mock, patch
import pytest import pytest
from homeassistant import bootstrap, core, runner from homeassistant import bootstrap, runner
import homeassistant.config as config_util import homeassistant.config as config_util
from homeassistant.const import SIGNAL_BOOTSTRAP_INTEGRATIONS from homeassistant.const import SIGNAL_BOOTSTRAP_INTEGRATIONS
from homeassistant.core import HomeAssistant, async_get_hass, callback
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.dispatcher import async_dispatcher_connect
@ -45,7 +46,7 @@ def mock_http_start_stop():
@patch("homeassistant.bootstrap.async_enable_logging", Mock()) @patch("homeassistant.bootstrap.async_enable_logging", Mock())
async def test_home_assistant_core_config_validation(hass): async def test_home_assistant_core_config_validation(hass: HomeAssistant) -> None:
"""Test if we pass in wrong information for HA conf.""" """Test if we pass in wrong information for HA conf."""
# Extensive HA conf validation testing is done # Extensive HA conf validation testing is done
result = await bootstrap.async_from_config_dict( result = await bootstrap.async_from_config_dict(
@ -79,7 +80,7 @@ async def test_async_enable_logging(hass, caplog):
assert "Error rolling over log file" in caplog.text assert "Error rolling over log file" in caplog.text
async def test_load_hassio(hass): async def test_load_hassio(hass: HomeAssistant) -> None:
"""Test that we load Hass.io component.""" """Test that we load Hass.io component."""
with patch.dict(os.environ, {}, clear=True): with patch.dict(os.environ, {}, clear=True):
assert bootstrap._get_domains(hass, {}) == set() assert bootstrap._get_domains(hass, {}) == set()
@ -89,7 +90,7 @@ async def test_load_hassio(hass):
@pytest.mark.parametrize("load_registries", [False]) @pytest.mark.parametrize("load_registries", [False])
async def test_empty_setup(hass): async def test_empty_setup(hass: HomeAssistant) -> None:
"""Test an empty set up loads the core.""" """Test an empty set up loads the core."""
await bootstrap.async_from_config_dict({}, hass) await bootstrap.async_from_config_dict({}, hass)
for domain in bootstrap.CORE_INTEGRATIONS: for domain in bootstrap.CORE_INTEGRATIONS:
@ -110,7 +111,7 @@ async def test_core_failure_loads_safe_mode(hass, caplog):
@pytest.mark.parametrize("load_registries", [False]) @pytest.mark.parametrize("load_registries", [False])
async def test_setting_up_config(hass): async def test_setting_up_config(hass: HomeAssistant) -> None:
"""Test we set up domains in config.""" """Test we set up domains in config."""
await bootstrap._async_set_up_integrations( await bootstrap._async_set_up_integrations(
hass, {"group hello": {}, "homeassistant": {}} hass, {"group hello": {}, "homeassistant": {}}
@ -120,7 +121,7 @@ async def test_setting_up_config(hass):
@pytest.mark.parametrize("load_registries", [False]) @pytest.mark.parametrize("load_registries", [False])
async def test_setup_after_deps_all_present(hass): async def test_setup_after_deps_all_present(hass: HomeAssistant) -> None:
"""Test after_dependencies when all present.""" """Test after_dependencies when all present."""
order = [] order = []
@ -165,7 +166,7 @@ async def test_setup_after_deps_all_present(hass):
@pytest.mark.parametrize("load_registries", [False]) @pytest.mark.parametrize("load_registries", [False])
async def test_setup_after_deps_in_stage_1_ignored(hass): async def test_setup_after_deps_in_stage_1_ignored(hass: HomeAssistant) -> None:
"""Test after_dependencies are ignored in stage 1.""" """Test after_dependencies are ignored in stage 1."""
# This test relies on this # This test relies on this
assert "cloud" in bootstrap.STAGE_1_INTEGRATIONS assert "cloud" in bootstrap.STAGE_1_INTEGRATIONS
@ -212,7 +213,7 @@ async def test_setup_after_deps_in_stage_1_ignored(hass):
@pytest.mark.parametrize("load_registries", [False]) @pytest.mark.parametrize("load_registries", [False])
async def test_setup_frontend_before_recorder(hass): async def test_setup_frontend_before_recorder(hass: HomeAssistant) -> None:
"""Test frontend is setup before recorder.""" """Test frontend is setup before recorder."""
order = [] order = []
@ -288,7 +289,7 @@ async def test_setup_frontend_before_recorder(hass):
@pytest.mark.parametrize("load_registries", [False]) @pytest.mark.parametrize("load_registries", [False])
async def test_setup_after_deps_via_platform(hass): async def test_setup_after_deps_via_platform(hass: HomeAssistant) -> None:
"""Test after_dependencies set up via platform.""" """Test after_dependencies set up via platform."""
order = [] order = []
after_dep_event = asyncio.Event() after_dep_event = asyncio.Event()
@ -320,7 +321,7 @@ async def test_setup_after_deps_via_platform(hass):
) )
mock_entity_platform(hass, "light.platform_int", MockPlatform()) mock_entity_platform(hass, "light.platform_int", MockPlatform())
@core.callback @callback
def continue_loading(_): def continue_loading(_):
"""When light component loaded, continue other loading.""" """When light component loaded, continue other loading."""
after_dep_event.set() after_dep_event.set()
@ -338,7 +339,7 @@ async def test_setup_after_deps_via_platform(hass):
@pytest.mark.parametrize("load_registries", [False]) @pytest.mark.parametrize("load_registries", [False])
async def test_setup_after_deps_not_trigger_load(hass): async def test_setup_after_deps_not_trigger_load(hass: HomeAssistant) -> None:
"""Test after_dependencies does not trigger loading it.""" """Test after_dependencies does not trigger loading it."""
order = [] order = []
@ -377,7 +378,7 @@ async def test_setup_after_deps_not_trigger_load(hass):
@pytest.mark.parametrize("load_registries", [False]) @pytest.mark.parametrize("load_registries", [False])
async def test_setup_after_deps_not_present(hass): async def test_setup_after_deps_not_present(hass: HomeAssistant) -> None:
"""Test after_dependencies when referenced integration doesn't exist.""" """Test after_dependencies when referenced integration doesn't exist."""
order = [] order = []
@ -501,7 +502,7 @@ async def test_setup_hass(
assert len(mock_ensure_config_exists.mock_calls) == 1 assert len(mock_ensure_config_exists.mock_calls) == 1
assert len(mock_process_ha_config_upgrade.mock_calls) == 1 assert len(mock_process_ha_config_upgrade.mock_calls) == 1
assert hass == core.async_get_hass() assert hass == async_get_hass()
async def test_setup_hass_takes_longer_than_log_slow_startup( async def test_setup_hass_takes_longer_than_log_slow_startup(
@ -708,7 +709,9 @@ async def test_setup_safe_mode_if_no_frontend(
@pytest.mark.parametrize("load_registries", [False]) @pytest.mark.parametrize("load_registries", [False])
async def test_empty_integrations_list_is_only_sent_at_the_end_of_bootstrap(hass): async def test_empty_integrations_list_is_only_sent_at_the_end_of_bootstrap(
hass: HomeAssistant,
) -> None:
"""Test empty integrations list is only sent at the end of bootstrap.""" """Test empty integrations list is only sent at the end of bootstrap."""
order = [] order = []
@ -743,7 +746,7 @@ async def test_empty_integrations_list_is_only_sent_at_the_end_of_bootstrap(hass
integrations = [] integrations = []
@core.callback @callback
def _bootstrap_integrations(data): def _bootstrap_integrations(data):
integrations.append(data) integrations.append(data)

View file

@ -81,7 +81,7 @@ def teardown():
os.remove(SCENES_PATH) os.remove(SCENES_PATH)
async def test_create_default_config(hass): async def test_create_default_config(hass: HomeAssistant) -> None:
"""Test creation of default config.""" """Test creation of default config."""
assert not os.path.isfile(YAML_PATH) assert not os.path.isfile(YAML_PATH)
assert not os.path.isfile(SECRET_PATH) assert not os.path.isfile(SECRET_PATH)
@ -96,7 +96,7 @@ async def test_create_default_config(hass):
assert os.path.isfile(AUTOMATIONS_PATH) assert os.path.isfile(AUTOMATIONS_PATH)
async def test_ensure_config_exists_creates_config(hass): async def test_ensure_config_exists_creates_config(hass: HomeAssistant) -> None:
"""Test that calling ensure_config_exists. """Test that calling ensure_config_exists.
If not creates a new config file. If not creates a new config file.
@ -109,7 +109,7 @@ async def test_ensure_config_exists_creates_config(hass):
assert mock_print.called assert mock_print.called
async def test_ensure_config_exists_uses_existing_config(hass): async def test_ensure_config_exists_uses_existing_config(hass: HomeAssistant) -> None:
"""Test that calling ensure_config_exists uses existing config.""" """Test that calling ensure_config_exists uses existing config."""
create_file(YAML_PATH) create_file(YAML_PATH)
await config_util.async_ensure_config_exists(hass) await config_util.async_ensure_config_exists(hass)
@ -121,7 +121,7 @@ async def test_ensure_config_exists_uses_existing_config(hass):
assert content == "" assert content == ""
async def test_ensure_existing_files_is_not_overwritten(hass): async def test_ensure_existing_files_is_not_overwritten(hass: HomeAssistant) -> None:
"""Test that calling async_create_default_config does not overwrite existing files.""" """Test that calling async_create_default_config does not overwrite existing files."""
create_file(SECRET_PATH) create_file(SECRET_PATH)
@ -190,7 +190,9 @@ def test_load_yaml_config_preserves_key_order() -> None:
) )
async def test_create_default_config_returns_none_if_write_error(hass): async def test_create_default_config_returns_none_if_write_error(
hass: HomeAssistant,
) -> None:
"""Test the writing of a default configuration. """Test the writing of a default configuration.
Non existing folder returns None. Non existing folder returns None.
@ -281,7 +283,7 @@ async def _compute_state(hass, config):
return hass.states.get("test.test") return hass.states.get("test.test")
async def test_entity_customization(hass): async def test_entity_customization(hass: HomeAssistant) -> None:
"""Test entity customization through configuration.""" """Test entity customization through configuration."""
config = { config = {
CONF_LATITUDE: 50, CONF_LATITUDE: 50,
@ -524,7 +526,7 @@ async def test_override_stored_configuration(hass, hass_storage):
assert hass.config.config_source is ConfigSource.YAML assert hass.config.config_source is ConfigSource.YAML
async def test_loading_configuration(hass): async def test_loading_configuration(hass: HomeAssistant) -> None:
"""Test loading core config onto hass object.""" """Test loading core config onto hass object."""
await config_util.async_process_ha_core_config( await config_util.async_process_ha_core_config(
hass, hass,
@ -631,7 +633,9 @@ async def test_language_default(
assert hass.config.language == default_language assert hass.config.language == default_language
async def test_loading_configuration_default_media_dirs_docker(hass): async def test_loading_configuration_default_media_dirs_docker(
hass: HomeAssistant,
) -> None:
"""Test loading core config onto hass object.""" """Test loading core config onto hass object."""
with patch("homeassistant.config.is_docker_env", return_value=True): with patch("homeassistant.config.is_docker_env", return_value=True):
await config_util.async_process_ha_core_config( await config_util.async_process_ha_core_config(
@ -647,7 +651,7 @@ async def test_loading_configuration_default_media_dirs_docker(hass):
assert hass.config.media_dirs == {"local": "/media"} assert hass.config.media_dirs == {"local": "/media"}
async def test_loading_configuration_from_packages(hass): async def test_loading_configuration_from_packages(hass: HomeAssistant) -> None:
"""Test loading packages config onto hass object config.""" """Test loading packages config onto hass object config."""
await config_util.async_process_ha_core_config( await config_util.async_process_ha_core_config(
hass, hass,
@ -882,7 +886,7 @@ async def test_merge_once_only_keys(merge_log_err, hass):
assert merge_log_err.call_count == 1 assert merge_log_err.call_count == 1
async def test_merge_once_only_lists(hass): async def test_merge_once_only_lists(hass: HomeAssistant) -> None:
"""Test if we have a merge for a comp that may occur only once. Lists.""" """Test if we have a merge for a comp that may occur only once. Lists."""
packages = { packages = {
"pack_2": { "pack_2": {
@ -901,7 +905,7 @@ async def test_merge_once_only_lists(hass):
} }
async def test_merge_once_only_dictionaries(hass): async def test_merge_once_only_dictionaries(hass: HomeAssistant) -> None:
"""Test if we have a merge for a comp that may occur only once. Dicts.""" """Test if we have a merge for a comp that may occur only once. Dicts."""
packages = { packages = {
"pack_2": { "pack_2": {
@ -927,7 +931,7 @@ async def test_merge_once_only_dictionaries(hass):
} }
async def test_merge_id_schema(hass): async def test_merge_id_schema(hass: HomeAssistant) -> None:
"""Test if we identify the config schemas correctly.""" """Test if we identify the config schemas correctly."""
types = { types = {
"panel_custom": "list", "panel_custom": "list",
@ -957,7 +961,7 @@ async def test_merge_duplicate_keys(merge_log_err, hass):
assert len(config["input_select"]) == 1 assert len(config["input_select"]) == 1
async def test_merge_customize(hass): async def test_merge_customize(hass: HomeAssistant) -> None:
"""Test loading core config onto hass object.""" """Test loading core config onto hass object."""
core_config = { core_config = {
"latitude": 60, "latitude": 60,
@ -976,7 +980,7 @@ async def test_merge_customize(hass):
assert hass.data[config_util.DATA_CUSTOMIZE].get("b.b") == {"friendly_name": "BB"} assert hass.data[config_util.DATA_CUSTOMIZE].get("b.b") == {"friendly_name": "BB"}
async def test_auth_provider_config(hass): async def test_auth_provider_config(hass: HomeAssistant) -> None:
"""Test loading auth provider config onto hass object.""" """Test loading auth provider config onto hass object."""
core_config = { core_config = {
"latitude": 60, "latitude": 60,
@ -1003,7 +1007,7 @@ async def test_auth_provider_config(hass):
assert hass.auth.auth_mfa_modules[1].id == "second" assert hass.auth.auth_mfa_modules[1].id == "second"
async def test_auth_provider_config_default(hass): async def test_auth_provider_config_default(hass: HomeAssistant) -> None:
"""Test loading default auth provider config.""" """Test loading default auth provider config."""
core_config = { core_config = {
"latitude": 60, "latitude": 60,
@ -1023,7 +1027,7 @@ async def test_auth_provider_config_default(hass):
assert hass.auth.auth_mfa_modules[0].id == "totp" assert hass.auth.auth_mfa_modules[0].id == "totp"
async def test_disallowed_auth_provider_config(hass): async def test_disallowed_auth_provider_config(hass: HomeAssistant) -> None:
"""Test loading insecure example auth provider is disallowed.""" """Test loading insecure example auth provider is disallowed."""
core_config = { core_config = {
"latitude": 60, "latitude": 60,
@ -1049,7 +1053,7 @@ async def test_disallowed_auth_provider_config(hass):
await config_util.async_process_ha_core_config(hass, core_config) await config_util.async_process_ha_core_config(hass, core_config)
async def test_disallowed_duplicated_auth_provider_config(hass): async def test_disallowed_duplicated_auth_provider_config(hass: HomeAssistant) -> None:
"""Test loading insecure example auth provider is disallowed.""" """Test loading insecure example auth provider is disallowed."""
core_config = { core_config = {
"latitude": 60, "latitude": 60,
@ -1064,7 +1068,7 @@ async def test_disallowed_duplicated_auth_provider_config(hass):
await config_util.async_process_ha_core_config(hass, core_config) await config_util.async_process_ha_core_config(hass, core_config)
async def test_disallowed_auth_mfa_module_config(hass): async def test_disallowed_auth_mfa_module_config(hass: HomeAssistant) -> None:
"""Test loading insecure example auth mfa module is disallowed.""" """Test loading insecure example auth mfa module is disallowed."""
core_config = { core_config = {
"latitude": 60, "latitude": 60,
@ -1084,7 +1088,9 @@ async def test_disallowed_auth_mfa_module_config(hass):
await config_util.async_process_ha_core_config(hass, core_config) await config_util.async_process_ha_core_config(hass, core_config)
async def test_disallowed_duplicated_auth_mfa_module_config(hass): async def test_disallowed_duplicated_auth_mfa_module_config(
hass: HomeAssistant,
) -> None:
"""Test loading insecure example auth mfa module is disallowed.""" """Test loading insecure example auth mfa module is disallowed."""
core_config = { core_config = {
"latitude": 60, "latitude": 60,
@ -1099,7 +1105,7 @@ async def test_disallowed_duplicated_auth_mfa_module_config(hass):
await config_util.async_process_ha_core_config(hass, core_config) await config_util.async_process_ha_core_config(hass, core_config)
async def test_merge_split_component_definition(hass): async def test_merge_split_component_definition(hass: HomeAssistant) -> None:
"""Test components with trailing description in packages are merged.""" """Test components with trailing description in packages are merged."""
packages = { packages = {
"pack_1": {"light one": {"l1": None}}, "pack_1": {"light one": {"l1": None}},
@ -1293,7 +1299,7 @@ def test_identify_config_schema(domain, schema, expected):
) )
async def test_core_config_schema_historic_currency(hass): async def test_core_config_schema_historic_currency(hass: HomeAssistant) -> None:
"""Test core config schema.""" """Test core config schema."""
await config_util.async_process_ha_core_config(hass, {"currency": "LTT"}) await config_util.async_process_ha_core_config(hass, {"currency": "LTT"})
@ -1327,7 +1333,7 @@ async def test_core_store_historic_currency(hass, hass_storage):
assert not issue assert not issue
async def test_core_config_schema_no_country(hass): async def test_core_config_schema_no_country(hass: HomeAssistant) -> None:
"""Test core config schema.""" """Test core config schema."""
await config_util.async_process_ha_core_config(hass, {}) await config_util.async_process_ha_core_config(hass, {})

View file

@ -69,7 +69,7 @@ def manager(hass):
return manager return manager
async def test_call_setup_entry(hass): async def test_call_setup_entry(hass: HomeAssistant) -> None:
"""Test we call <component>.setup_entry.""" """Test we call <component>.setup_entry."""
entry = MockConfigEntry(domain="comp") entry = MockConfigEntry(domain="comp")
entry.add_to_hass(hass) entry.add_to_hass(hass)
@ -98,7 +98,7 @@ async def test_call_setup_entry(hass):
assert entry.supports_unload assert entry.supports_unload
async def test_call_setup_entry_without_reload_support(hass): async def test_call_setup_entry_without_reload_support(hass: HomeAssistant) -> None:
"""Test we call <component>.setup_entry and the <component> does not support unloading.""" """Test we call <component>.setup_entry and the <component> does not support unloading."""
entry = MockConfigEntry(domain="comp") entry = MockConfigEntry(domain="comp")
entry.add_to_hass(hass) entry.add_to_hass(hass)
@ -127,7 +127,7 @@ async def test_call_setup_entry_without_reload_support(hass):
assert not entry.supports_unload assert not entry.supports_unload
async def test_call_async_migrate_entry(hass): async def test_call_async_migrate_entry(hass: HomeAssistant) -> None:
"""Test we call <component>.async_migrate_entry when version mismatch.""" """Test we call <component>.async_migrate_entry when version mismatch."""
entry = MockConfigEntry(domain="comp") entry = MockConfigEntry(domain="comp")
assert not entry.supports_unload assert not entry.supports_unload
@ -157,7 +157,7 @@ async def test_call_async_migrate_entry(hass):
assert entry.supports_unload assert entry.supports_unload
async def test_call_async_migrate_entry_failure_false(hass): async def test_call_async_migrate_entry_failure_false(hass: HomeAssistant) -> None:
"""Test migration fails if returns false.""" """Test migration fails if returns false."""
entry = MockConfigEntry(domain="comp") entry = MockConfigEntry(domain="comp")
entry.version = 2 entry.version = 2
@ -185,7 +185,7 @@ async def test_call_async_migrate_entry_failure_false(hass):
assert not entry.supports_unload assert not entry.supports_unload
async def test_call_async_migrate_entry_failure_exception(hass): async def test_call_async_migrate_entry_failure_exception(hass: HomeAssistant) -> None:
"""Test migration fails if exception raised.""" """Test migration fails if exception raised."""
entry = MockConfigEntry(domain="comp") entry = MockConfigEntry(domain="comp")
entry.version = 2 entry.version = 2
@ -213,7 +213,7 @@ async def test_call_async_migrate_entry_failure_exception(hass):
assert not entry.supports_unload assert not entry.supports_unload
async def test_call_async_migrate_entry_failure_not_bool(hass): async def test_call_async_migrate_entry_failure_not_bool(hass: HomeAssistant) -> None:
"""Test migration fails if boolean not returned.""" """Test migration fails if boolean not returned."""
entry = MockConfigEntry(domain="comp") entry = MockConfigEntry(domain="comp")
entry.version = 2 entry.version = 2
@ -241,7 +241,9 @@ async def test_call_async_migrate_entry_failure_not_bool(hass):
assert not entry.supports_unload assert not entry.supports_unload
async def test_call_async_migrate_entry_failure_not_supported(hass): async def test_call_async_migrate_entry_failure_not_supported(
hass: HomeAssistant,
) -> None:
"""Test migration fails if async_migrate_entry not implemented.""" """Test migration fails if async_migrate_entry not implemented."""
entry = MockConfigEntry(domain="comp") entry = MockConfigEntry(domain="comp")
entry.version = 2 entry.version = 2
@ -567,7 +569,7 @@ async def test_domains_gets_domains_excludes_ignore_and_disabled(manager):
] ]
async def test_saving_and_loading(hass): async def test_saving_and_loading(hass: HomeAssistant) -> None:
"""Test that we're saving and loading correctly.""" """Test that we're saving and loading correctly."""
mock_integration( mock_integration(
hass, MockModule("test", async_setup_entry=lambda *args: mock_coro(True)) hass, MockModule("test", async_setup_entry=lambda *args: mock_coro(True))
@ -639,7 +641,7 @@ async def test_saving_and_loading(hass):
assert orig.pref_disable_polling == loaded.pref_disable_polling assert orig.pref_disable_polling == loaded.pref_disable_polling
async def test_forward_entry_sets_up_component(hass): async def test_forward_entry_sets_up_component(hass: HomeAssistant) -> None:
"""Test we setup the component entry is forwarded to.""" """Test we setup the component entry is forwarded to."""
entry = MockConfigEntry(domain="original") entry = MockConfigEntry(domain="original")
@ -658,7 +660,9 @@ async def test_forward_entry_sets_up_component(hass):
assert len(mock_forwarded_setup_entry.mock_calls) == 1 assert len(mock_forwarded_setup_entry.mock_calls) == 1
async def test_forward_entry_does_not_setup_entry_if_setup_fails(hass): async def test_forward_entry_does_not_setup_entry_if_setup_fails(
hass: HomeAssistant,
) -> None:
"""Test we do not set up entry if component setup fails.""" """Test we do not set up entry if component setup fails."""
entry = MockConfigEntry(domain="original") entry = MockConfigEntry(domain="original")
@ -676,7 +680,7 @@ async def test_forward_entry_does_not_setup_entry_if_setup_fails(hass):
assert len(mock_setup_entry.mock_calls) == 0 assert len(mock_setup_entry.mock_calls) == 0
async def test_discovery_notification(hass): async def test_discovery_notification(hass: HomeAssistant) -> None:
"""Test that we create/dismiss a notification when source is discovery.""" """Test that we create/dismiss a notification when source is discovery."""
mock_integration(hass, MockModule("test")) mock_integration(hass, MockModule("test"))
mock_entity_platform(hass, "config_flow.test", None) mock_entity_platform(hass, "config_flow.test", None)
@ -728,7 +732,7 @@ async def test_discovery_notification(hass):
assert state is None assert state is None
async def test_reauth_notification(hass): async def test_reauth_notification(hass: HomeAssistant) -> None:
"""Test that we create/dismiss a notification when source is reauth.""" """Test that we create/dismiss a notification when source is reauth."""
mock_integration(hass, MockModule("test")) mock_integration(hass, MockModule("test"))
mock_entity_platform(hass, "config_flow.test", None) mock_entity_platform(hass, "config_flow.test", None)
@ -795,7 +799,7 @@ async def test_reauth_notification(hass):
assert state is None assert state is None
async def test_discovery_notification_not_created(hass): async def test_discovery_notification_not_created(hass: HomeAssistant) -> None:
"""Test that we not create a notification when discovery is aborted.""" """Test that we not create a notification when discovery is aborted."""
mock_integration(hass, MockModule("test")) mock_integration(hass, MockModule("test"))
mock_entity_platform(hass, "config_flow.test", None) mock_entity_platform(hass, "config_flow.test", None)
@ -819,7 +823,7 @@ async def test_discovery_notification_not_created(hass):
assert state is None assert state is None
async def test_loading_default_config(hass): async def test_loading_default_config(hass: HomeAssistant) -> None:
"""Test loading the default config.""" """Test loading the default config."""
manager = config_entries.ConfigEntries(hass, {}) manager = config_entries.ConfigEntries(hass, {})
@ -938,7 +942,7 @@ async def test_setup_raise_not_ready_from_exception(hass, caplog):
) )
async def test_setup_retrying_during_unload(hass): async def test_setup_retrying_during_unload(hass: HomeAssistant) -> None:
"""Test if we unload an entry that is in retry mode.""" """Test if we unload an entry that is in retry mode."""
entry = MockConfigEntry(domain="test") entry = MockConfigEntry(domain="test")
@ -958,7 +962,7 @@ async def test_setup_retrying_during_unload(hass):
assert len(mock_call.return_value.mock_calls) == 1 assert len(mock_call.return_value.mock_calls) == 1
async def test_setup_retrying_during_unload_before_started(hass): async def test_setup_retrying_during_unload_before_started(hass: HomeAssistant) -> None:
"""Test if we unload an entry that is in retry mode before started.""" """Test if we unload an entry that is in retry mode before started."""
entry = MockConfigEntry(domain="test") entry = MockConfigEntry(domain="test")
hass.state = CoreState.starting hass.state = CoreState.starting
@ -985,7 +989,7 @@ async def test_setup_retrying_during_unload_before_started(hass):
) )
async def test_create_entry_options(hass): async def test_create_entry_options(hass: HomeAssistant) -> None:
"""Test a config entry being created with options.""" """Test a config entry being created with options."""
async def mock_async_setup(hass, config): async def mock_async_setup(hass, config):
@ -1417,7 +1421,7 @@ async def test_entry_enable_without_reload_support(hass, manager):
assert entry.state is config_entries.ConfigEntryState.FAILED_UNLOAD assert entry.state is config_entries.ConfigEntryState.FAILED_UNLOAD
async def test_init_custom_integration(hass): async def test_init_custom_integration(hass: HomeAssistant) -> None:
"""Test initializing flow for custom integration.""" """Test initializing flow for custom integration."""
integration = loader.Integration( integration = loader.Integration(
hass, hass,
@ -1432,13 +1436,15 @@ async def test_init_custom_integration(hass):
await hass.config_entries.flow.async_init("bla", context={"source": "user"}) await hass.config_entries.flow.async_init("bla", context={"source": "user"})
async def test_support_entry_unload(hass): async def test_support_entry_unload(hass: HomeAssistant) -> None:
"""Test unloading entry.""" """Test unloading entry."""
assert await config_entries.support_entry_unload(hass, "light") assert await config_entries.support_entry_unload(hass, "light")
assert not await config_entries.support_entry_unload(hass, "auth") assert not await config_entries.support_entry_unload(hass, "auth")
async def test_reload_entry_entity_registry_ignores_no_entry(hass): async def test_reload_entry_entity_registry_ignores_no_entry(
hass: HomeAssistant,
) -> None:
"""Test reloading entry in entity registry skips if no config entry linked.""" """Test reloading entry in entity registry skips if no config entry linked."""
handler = config_entries.EntityRegistryDisabledHandler(hass) handler = config_entries.EntityRegistryDisabledHandler(hass)
registry = mock_registry(hass) registry = mock_registry(hass)
@ -1453,7 +1459,7 @@ async def test_reload_entry_entity_registry_ignores_no_entry(hass):
assert handler._remove_call_later is None assert handler._remove_call_later is None
async def test_reload_entry_entity_registry_works(hass): async def test_reload_entry_entity_registry_works(hass: HomeAssistant) -> None:
"""Test we schedule an entry to be reloaded if disabled_by is updated.""" """Test we schedule an entry to be reloaded if disabled_by is updated."""
handler = config_entries.EntityRegistryDisabledHandler(hass) handler = config_entries.EntityRegistryDisabledHandler(hass)
handler.async_setup() handler.async_setup()
@ -2334,7 +2340,7 @@ async def test_partial_flows_hidden(hass, manager):
assert state is not None assert state is not None
async def test_async_setup_init_entry(hass): async def test_async_setup_init_entry(hass: HomeAssistant) -> None:
"""Test a config entry being initialized during integration setup.""" """Test a config entry being initialized during integration setup."""
async def mock_async_setup(hass, config): async def mock_async_setup(hass, config):
@ -2378,7 +2384,9 @@ async def test_async_setup_init_entry(hass):
assert entries[0].state is config_entries.ConfigEntryState.LOADED assert entries[0].state is config_entries.ConfigEntryState.LOADED
async def test_async_setup_init_entry_completes_before_loaded_event_fires(hass): async def test_async_setup_init_entry_completes_before_loaded_event_fires(
hass: HomeAssistant,
) -> None:
"""Test a config entry being initialized during integration setup before the loaded event fires.""" """Test a config entry being initialized during integration setup before the loaded event fires."""
load_events: list[Event] = [] load_events: list[Event] = []
@ -2444,7 +2452,7 @@ async def test_async_setup_init_entry_completes_before_loaded_event_fires(hass):
listener() listener()
async def test_async_setup_update_entry(hass): async def test_async_setup_update_entry(hass: HomeAssistant) -> None:
"""Test a config entry being updated during integration setup.""" """Test a config entry being updated during integration setup."""
entry = MockConfigEntry(domain="comp", data={"value": "initial"}) entry = MockConfigEntry(domain="comp", data={"value": "initial"})
entry.add_to_hass(hass) entry.add_to_hass(hass)
@ -3090,7 +3098,7 @@ async def test_setup_raise_auth_failed_from_future_coordinator_update(hass, capl
assert len(flows) == 1 assert len(flows) == 1
async def test_initialize_and_shutdown(hass): async def test_initialize_and_shutdown(hass: HomeAssistant) -> None:
"""Test we call the shutdown function at stop.""" """Test we call the shutdown function at stop."""
manager = config_entries.ConfigEntries(hass, {}) manager = config_entries.ConfigEntries(hass, {})
@ -3102,7 +3110,7 @@ async def test_initialize_and_shutdown(hass):
assert mock_async_shutdown.called assert mock_async_shutdown.called
async def test_setup_retrying_during_shutdown(hass): async def test_setup_retrying_during_shutdown(hass: HomeAssistant) -> None:
"""Test if we shutdown an entry that is in retry mode.""" """Test if we shutdown an entry that is in retry mode."""
entry = MockConfigEntry(domain="test") entry = MockConfigEntry(domain="test")
@ -3376,7 +3384,7 @@ async def test_disallow_entry_reload_with_setup_in_progresss(hass, manager):
assert entry.state is config_entries.ConfigEntryState.SETUP_IN_PROGRESS assert entry.state is config_entries.ConfigEntryState.SETUP_IN_PROGRESS
async def test_reauth(hass): async def test_reauth(hass: HomeAssistant) -> None:
"""Test the async_reauth_helper.""" """Test the async_reauth_helper."""
entry = MockConfigEntry(title="test_title", domain="test") entry = MockConfigEntry(title="test_title", domain="test")
entry2 = MockConfigEntry(title="test_title", domain="test") entry2 = MockConfigEntry(title="test_title", domain="test")
@ -3424,7 +3432,7 @@ async def test_reauth(hass):
assert len(hass.config_entries.flow.async_progress()) == 2 assert len(hass.config_entries.flow.async_progress()) == 2
async def test_get_active_flows(hass): async def test_get_active_flows(hass: HomeAssistant) -> None:
"""Test the async_get_active_flows helper.""" """Test the async_get_active_flows helper."""
entry = MockConfigEntry(title="test_title", domain="test") entry = MockConfigEntry(title="test_title", domain="test")
mock_setup_entry = AsyncMock(return_value=True) mock_setup_entry = AsyncMock(return_value=True)

View file

@ -32,7 +32,7 @@ from homeassistant.const import (
__version__, __version__,
) )
import homeassistant.core as ha import homeassistant.core as ha
from homeassistant.core import State from homeassistant.core import HomeAssistant, State
from homeassistant.exceptions import ( from homeassistant.exceptions import (
InvalidEntityFormatError, InvalidEntityFormatError,
InvalidStateError, InvalidStateError,
@ -166,7 +166,7 @@ def test_async_run_hass_job_delegates_non_async() -> None:
assert len(hass.async_add_hass_job.mock_calls) == 1 assert len(hass.async_add_hass_job.mock_calls) == 1
async def test_stage_shutdown(hass): async def test_stage_shutdown(hass: HomeAssistant) -> None:
"""Simulate a shutdown, test calling stuff.""" """Simulate a shutdown, test calling stuff."""
test_stop = async_capture_events(hass, EVENT_HOMEASSISTANT_STOP) test_stop = async_capture_events(hass, EVENT_HOMEASSISTANT_STOP)
test_final_write = async_capture_events(hass, EVENT_HOMEASSISTANT_FINAL_WRITE) test_final_write = async_capture_events(hass, EVENT_HOMEASSISTANT_FINAL_WRITE)
@ -205,7 +205,7 @@ async def test_shutdown_calls_block_till_done_after_shutdown_run_callback_thread
assert stop_calls[-1] == "async_block_till_done" assert stop_calls[-1] == "async_block_till_done"
async def test_pending_sheduler(hass): async def test_pending_sheduler(hass: HomeAssistant) -> None:
"""Add a coro to pending tasks.""" """Add a coro to pending tasks."""
call_count = [] call_count = []
@ -222,7 +222,7 @@ async def test_pending_sheduler(hass):
assert len(call_count) == 3 assert len(call_count) == 3
async def test_async_add_job_pending_tasks_coro(hass): async def test_async_add_job_pending_tasks_coro(hass: HomeAssistant) -> None:
"""Add a coro to pending tasks.""" """Add a coro to pending tasks."""
call_count = [] call_count = []
@ -245,7 +245,7 @@ async def test_async_add_job_pending_tasks_coro(hass):
assert len(call_count) == 2 assert len(call_count) == 2
async def test_async_create_task_pending_tasks_coro(hass): async def test_async_create_task_pending_tasks_coro(hass: HomeAssistant) -> None:
"""Add a coro to pending tasks.""" """Add a coro to pending tasks."""
call_count = [] call_count = []
@ -268,7 +268,7 @@ async def test_async_create_task_pending_tasks_coro(hass):
assert len(call_count) == 2 assert len(call_count) == 2
async def test_async_add_job_pending_tasks_executor(hass): async def test_async_add_job_pending_tasks_executor(hass: HomeAssistant) -> None:
"""Run an executor in pending tasks.""" """Run an executor in pending tasks."""
call_count = [] call_count = []
@ -291,7 +291,7 @@ async def test_async_add_job_pending_tasks_executor(hass):
assert len(call_count) == 2 assert len(call_count) == 2
async def test_async_add_job_pending_tasks_callback(hass): async def test_async_add_job_pending_tasks_callback(hass: HomeAssistant) -> None:
"""Run a callback in pending tasks.""" """Run a callback in pending tasks."""
call_count = [] call_count = []
@ -316,7 +316,7 @@ async def test_async_add_job_pending_tasks_callback(hass):
assert len(call_count) == 2 assert len(call_count) == 2
async def test_add_job_with_none(hass): async def test_add_job_with_none(hass: HomeAssistant) -> None:
"""Try to add a job with None as function.""" """Try to add a job with None as function."""
with pytest.raises(ValueError): with pytest.raises(ValueError):
hass.async_add_job(None, "test_arg") hass.async_add_job(None, "test_arg")
@ -451,7 +451,7 @@ def test_state_as_compressed_state_unique_last_updated() -> None:
assert state.as_compressed_state() is as_compressed_state assert state.as_compressed_state() is as_compressed_state
async def test_eventbus_add_remove_listener(hass): async def test_eventbus_add_remove_listener(hass: HomeAssistant) -> None:
"""Test remove_listener method.""" """Test remove_listener method."""
old_count = len(hass.bus.async_listeners()) old_count = len(hass.bus.async_listeners())
@ -470,7 +470,7 @@ async def test_eventbus_add_remove_listener(hass):
unsub() unsub()
async def test_eventbus_filtered_listener(hass): async def test_eventbus_filtered_listener(hass: HomeAssistant) -> None:
"""Test we can prefilter events.""" """Test we can prefilter events."""
calls = [] calls = []
@ -499,7 +499,7 @@ async def test_eventbus_filtered_listener(hass):
unsub() unsub()
async def test_eventbus_run_immediately(hass): async def test_eventbus_run_immediately(hass: HomeAssistant) -> None:
"""Test we can call events immediately.""" """Test we can call events immediately."""
calls = [] calls = []
@ -517,7 +517,7 @@ async def test_eventbus_run_immediately(hass):
unsub() unsub()
async def test_eventbus_unsubscribe_listener(hass): async def test_eventbus_unsubscribe_listener(hass: HomeAssistant) -> None:
"""Test unsubscribe listener from returned function.""" """Test unsubscribe listener from returned function."""
calls = [] calls = []
@ -541,7 +541,7 @@ async def test_eventbus_unsubscribe_listener(hass):
assert len(calls) == 1 assert len(calls) == 1
async def test_eventbus_listen_once_event_with_callback(hass): async def test_eventbus_listen_once_event_with_callback(hass: HomeAssistant) -> None:
"""Test listen_once_event method.""" """Test listen_once_event method."""
runs = [] runs = []
@ -559,7 +559,7 @@ async def test_eventbus_listen_once_event_with_callback(hass):
assert len(runs) == 1 assert len(runs) == 1
async def test_eventbus_listen_once_event_with_coroutine(hass): async def test_eventbus_listen_once_event_with_coroutine(hass: HomeAssistant) -> None:
"""Test listen_once_event method.""" """Test listen_once_event method."""
runs = [] runs = []
@ -576,7 +576,7 @@ async def test_eventbus_listen_once_event_with_coroutine(hass):
assert len(runs) == 1 assert len(runs) == 1
async def test_eventbus_listen_once_event_with_thread(hass): async def test_eventbus_listen_once_event_with_thread(hass: HomeAssistant) -> None:
"""Test listen_once_event method.""" """Test listen_once_event method."""
runs = [] runs = []
@ -593,7 +593,7 @@ async def test_eventbus_listen_once_event_with_thread(hass):
assert len(runs) == 1 assert len(runs) == 1
async def test_eventbus_thread_event_listener(hass): async def test_eventbus_thread_event_listener(hass: HomeAssistant) -> None:
"""Test thread event listener.""" """Test thread event listener."""
thread_calls = [] thread_calls = []
@ -606,7 +606,7 @@ async def test_eventbus_thread_event_listener(hass):
assert len(thread_calls) == 1 assert len(thread_calls) == 1
async def test_eventbus_callback_event_listener(hass): async def test_eventbus_callback_event_listener(hass: HomeAssistant) -> None:
"""Test callback event listener.""" """Test callback event listener."""
callback_calls = [] callback_calls = []
@ -620,7 +620,7 @@ async def test_eventbus_callback_event_listener(hass):
assert len(callback_calls) == 1 assert len(callback_calls) == 1
async def test_eventbus_coroutine_event_listener(hass): async def test_eventbus_coroutine_event_listener(hass: HomeAssistant) -> None:
"""Test coroutine event listener.""" """Test coroutine event listener."""
coroutine_calls = [] coroutine_calls = []
@ -633,7 +633,7 @@ async def test_eventbus_coroutine_event_listener(hass):
assert len(coroutine_calls) == 1 assert len(coroutine_calls) == 1
async def test_eventbus_max_length_exceeded(hass): async def test_eventbus_max_length_exceeded(hass: HomeAssistant) -> None:
"""Test that an exception is raised when the max character length is exceeded.""" """Test that an exception is raised when the max character length is exceeded."""
long_evt_name = ( long_evt_name = (
@ -725,7 +725,7 @@ def test_state_repr() -> None:
) )
async def test_statemachine_is_state(hass): async def test_statemachine_is_state(hass: HomeAssistant) -> None:
"""Test is_state method.""" """Test is_state method."""
hass.states.async_set("light.bowl", "on", {}) hass.states.async_set("light.bowl", "on", {})
assert hass.states.is_state("light.Bowl", "on") assert hass.states.is_state("light.Bowl", "on")
@ -733,7 +733,7 @@ async def test_statemachine_is_state(hass):
assert not hass.states.is_state("light.Non_existing", "on") assert not hass.states.is_state("light.Non_existing", "on")
async def test_statemachine_entity_ids(hass): async def test_statemachine_entity_ids(hass: HomeAssistant) -> None:
"""Test get_entity_ids method.""" """Test get_entity_ids method."""
hass.states.async_set("light.bowl", "on", {}) hass.states.async_set("light.bowl", "on", {})
hass.states.async_set("SWITCH.AC", "off", {}) hass.states.async_set("SWITCH.AC", "off", {})
@ -750,7 +750,7 @@ async def test_statemachine_entity_ids(hass):
assert states == ["light.bowl", "switch.ac"] assert states == ["light.bowl", "switch.ac"]
async def test_statemachine_remove(hass): async def test_statemachine_remove(hass: HomeAssistant) -> None:
"""Test remove method.""" """Test remove method."""
hass.states.async_set("light.bowl", "on", {}) hass.states.async_set("light.bowl", "on", {})
events = async_capture_events(hass, EVENT_STATE_CHANGED) events = async_capture_events(hass, EVENT_STATE_CHANGED)
@ -772,7 +772,7 @@ async def test_statemachine_remove(hass):
assert len(events) == 1 assert len(events) == 1
async def test_statemachine_case_insensitivty(hass): async def test_statemachine_case_insensitivty(hass: HomeAssistant) -> None:
"""Test insensitivty.""" """Test insensitivty."""
events = async_capture_events(hass, EVENT_STATE_CHANGED) events = async_capture_events(hass, EVENT_STATE_CHANGED)
@ -783,7 +783,9 @@ async def test_statemachine_case_insensitivty(hass):
assert len(events) == 1 assert len(events) == 1
async def test_statemachine_last_changed_not_updated_on_same_state(hass): async def test_statemachine_last_changed_not_updated_on_same_state(
hass: HomeAssistant,
) -> None:
"""Test to not update the existing, same state.""" """Test to not update the existing, same state."""
hass.states.async_set("light.bowl", "on", {}) hass.states.async_set("light.bowl", "on", {})
state = hass.states.get("light.Bowl") state = hass.states.get("light.Bowl")
@ -799,7 +801,7 @@ async def test_statemachine_last_changed_not_updated_on_same_state(hass):
assert state.last_changed == state2.last_changed assert state.last_changed == state2.last_changed
async def test_statemachine_force_update(hass): async def test_statemachine_force_update(hass: HomeAssistant) -> None:
"""Test force update option.""" """Test force update option."""
hass.states.async_set("light.bowl", "on", {}) hass.states.async_set("light.bowl", "on", {})
events = async_capture_events(hass, EVENT_STATE_CHANGED) events = async_capture_events(hass, EVENT_STATE_CHANGED)
@ -825,7 +827,7 @@ def test_service_call_repr() -> None:
) )
async def test_serviceregistry_has_service(hass): async def test_serviceregistry_has_service(hass: HomeAssistant) -> None:
"""Test has_service method.""" """Test has_service method."""
hass.services.async_register("test_domain", "test_service", lambda call: None) hass.services.async_register("test_domain", "test_service", lambda call: None)
assert len(hass.services.async_services()) == 1 assert len(hass.services.async_services()) == 1
@ -834,7 +836,9 @@ async def test_serviceregistry_has_service(hass):
assert not hass.services.has_service("non_existing", "test_service") assert not hass.services.has_service("non_existing", "test_service")
async def test_serviceregistry_call_with_blocking_done_in_time(hass): async def test_serviceregistry_call_with_blocking_done_in_time(
hass: HomeAssistant,
) -> None:
"""Test call with blocking.""" """Test call with blocking."""
registered_events = async_capture_events(hass, EVENT_SERVICE_REGISTERED) registered_events = async_capture_events(hass, EVENT_SERVICE_REGISTERED)
calls = async_mock_service(hass, "test_domain", "register_calls") calls = async_mock_service(hass, "test_domain", "register_calls")
@ -850,13 +854,15 @@ async def test_serviceregistry_call_with_blocking_done_in_time(hass):
assert len(calls) == 1 assert len(calls) == 1
async def test_serviceregistry_call_non_existing_with_blocking(hass): async def test_serviceregistry_call_non_existing_with_blocking(
hass: HomeAssistant,
) -> None:
"""Test non-existing with blocking.""" """Test non-existing with blocking."""
with pytest.raises(ha.ServiceNotFound): with pytest.raises(ha.ServiceNotFound):
await hass.services.async_call("test_domain", "i_do_not_exist", blocking=True) await hass.services.async_call("test_domain", "i_do_not_exist", blocking=True)
async def test_serviceregistry_async_service(hass): async def test_serviceregistry_async_service(hass: HomeAssistant) -> None:
"""Test registering and calling an async service.""" """Test registering and calling an async service."""
calls = [] calls = []
@ -872,7 +878,7 @@ async def test_serviceregistry_async_service(hass):
assert len(calls) == 1 assert len(calls) == 1
async def test_serviceregistry_async_service_partial(hass): async def test_serviceregistry_async_service_partial(hass: HomeAssistant) -> None:
"""Test registering and calling an wrapped async service.""" """Test registering and calling an wrapped async service."""
calls = [] calls = []
@ -891,7 +897,7 @@ async def test_serviceregistry_async_service_partial(hass):
assert len(calls) == 1 assert len(calls) == 1
async def test_serviceregistry_callback_service(hass): async def test_serviceregistry_callback_service(hass: HomeAssistant) -> None:
"""Test registering and calling an async service.""" """Test registering and calling an async service."""
calls = [] calls = []
@ -908,7 +914,7 @@ async def test_serviceregistry_callback_service(hass):
assert len(calls) == 1 assert len(calls) == 1
async def test_serviceregistry_remove_service(hass): async def test_serviceregistry_remove_service(hass: HomeAssistant) -> None:
"""Test remove service.""" """Test remove service."""
calls_remove = async_capture_events(hass, EVENT_SERVICE_REMOVED) calls_remove = async_capture_events(hass, EVENT_SERVICE_REMOVED)
@ -924,7 +930,7 @@ async def test_serviceregistry_remove_service(hass):
assert calls_remove[-1].data["service"] == "test_service" assert calls_remove[-1].data["service"] == "test_service"
async def test_serviceregistry_service_that_not_exists(hass): async def test_serviceregistry_service_that_not_exists(hass: HomeAssistant) -> None:
"""Test remove service that not exists.""" """Test remove service that not exists."""
calls_remove = async_capture_events(hass, EVENT_SERVICE_REMOVED) calls_remove = async_capture_events(hass, EVENT_SERVICE_REMOVED)
assert not hass.services.has_service("test_xxx", "test_yyy") assert not hass.services.has_service("test_xxx", "test_yyy")
@ -936,7 +942,9 @@ async def test_serviceregistry_service_that_not_exists(hass):
await hass.services.async_call("test_do_not", "exist", {}) await hass.services.async_call("test_do_not", "exist", {})
async def test_serviceregistry_async_service_raise_exception(hass): async def test_serviceregistry_async_service_raise_exception(
hass: HomeAssistant,
) -> None:
"""Test registering and calling an async service raise exception.""" """Test registering and calling an async service raise exception."""
async def service_handler(_): async def service_handler(_):
@ -955,7 +963,9 @@ async def test_serviceregistry_async_service_raise_exception(hass):
await hass.async_block_till_done() await hass.async_block_till_done()
async def test_serviceregistry_callback_service_raise_exception(hass): async def test_serviceregistry_callback_service_raise_exception(
hass: HomeAssistant,
) -> None:
"""Test registering and calling an callback service raise exception.""" """Test registering and calling an callback service raise exception."""
@ha.callback @ha.callback
@ -1110,7 +1120,7 @@ async def test_config_is_allowed_external_url() -> None:
assert not config.is_allowed_external_url(url) assert not config.is_allowed_external_url(url)
async def test_event_on_update(hass): async def test_event_on_update(hass: HomeAssistant) -> None:
"""Test that event is fired on update.""" """Test that event is fired on update."""
events = async_capture_events(hass, EVENT_CORE_CONFIG_UPDATE) events = async_capture_events(hass, EVENT_CORE_CONFIG_UPDATE)
@ -1124,7 +1134,7 @@ async def test_event_on_update(hass):
assert events[0].data == {"latitude": 12} assert events[0].data == {"latitude": 12}
async def test_bad_timezone_raises_value_error(hass): async def test_bad_timezone_raises_value_error(hass: HomeAssistant) -> None:
"""Test bad timezone raises ValueError.""" """Test bad timezone raises ValueError."""
with pytest.raises(ValueError): with pytest.raises(ValueError):
await hass.config.async_update(time_zone="not_a_timezone") await hass.config.async_update(time_zone="not_a_timezone")
@ -1164,7 +1174,7 @@ async def test_track_task_functions(event_loop):
await hass.async_stop() await hass.async_stop()
async def test_service_executed_with_subservices(hass): async def test_service_executed_with_subservices(hass: HomeAssistant) -> None:
"""Test we block correctly till all services done.""" """Test we block correctly till all services done."""
calls = async_mock_service(hass, "test", "inner") calls = async_mock_service(hass, "test", "inner")
context = ha.Context() context = ha.Context()
@ -1195,7 +1205,7 @@ async def test_service_executed_with_subservices(hass):
assert all(call.context is context for call in calls) assert all(call.context is context for call in calls)
async def test_service_call_event_contains_original_data(hass): async def test_service_call_event_contains_original_data(hass: HomeAssistant) -> None:
"""Test that service call event contains original data.""" """Test that service call event contains original data."""
events = async_capture_events(hass, EVENT_CALL_SERVICE) events = async_capture_events(hass, EVENT_CALL_SERVICE)
@ -1229,7 +1239,7 @@ def test_context() -> None:
assert c.id is not None assert c.id is not None
async def test_async_functions_with_callback(hass): async def test_async_functions_with_callback(hass: HomeAssistant) -> None:
"""Test we deal with async functions accidentally marked as callback.""" """Test we deal with async functions accidentally marked as callback."""
runs = [] runs = []
@ -1361,7 +1371,7 @@ async def test_incorrect_internal_external_url(hass, hass_storage, caplog):
assert "Invalid internal_url set" in caplog.text assert "Invalid internal_url set" in caplog.text
async def test_start_events(hass): async def test_start_events(hass: HomeAssistant) -> None:
"""Test events fired when starting Home Assistant.""" """Test events fired when starting Home Assistant."""
hass.state = ha.CoreState.not_running hass.state = ha.CoreState.not_running
@ -1467,7 +1477,7 @@ async def test_chained_logging_misses_log_timeout(hass, caplog):
assert "_task_chain_" not in caplog.text assert "_task_chain_" not in caplog.text
async def test_async_all(hass): async def test_async_all(hass: HomeAssistant) -> None:
"""Test async_all.""" """Test async_all."""
hass.states.async_set("switch.link", "on") hass.states.async_set("switch.link", "on")
@ -1490,7 +1500,7 @@ async def test_async_all(hass):
} == {"light.bowl", "light.frog", "switch.link"} } == {"light.bowl", "light.frog", "switch.link"}
async def test_async_entity_ids_count(hass): async def test_async_entity_ids_count(hass: HomeAssistant) -> None:
"""Test async_entity_ids_count.""" """Test async_entity_ids_count."""
hass.states.async_set("switch.link", "on") hass.states.async_set("switch.link", "on")
@ -1522,7 +1532,7 @@ async def test_hassjob_forbid_coroutine() -> None:
await coro await coro
async def test_reserving_states(hass): async def test_reserving_states(hass: HomeAssistant) -> None:
"""Test we can reserve a state in the state machine.""" """Test we can reserve a state in the state machine."""
hass.states.async_reserve("light.bedroom") hass.states.async_reserve("light.bedroom")
@ -1837,7 +1847,9 @@ def _ulid_timestamp(ulid: str) -> int:
) )
async def test_state_change_events_context_id_match_state_time(hass): async def test_state_change_events_context_id_match_state_time(
hass: HomeAssistant,
) -> None:
"""Test last_updated, timed_fired, and the ulid all have the same time.""" """Test last_updated, timed_fired, and the ulid all have the same time."""
events = async_capture_events(hass, ha.EVENT_STATE_CHANGED) events = async_capture_events(hass, ha.EVENT_STATE_CHANGED)
hass.states.async_set("light.bedroom", "on") hass.states.async_set("light.bedroom", "on")
@ -1851,7 +1863,9 @@ async def test_state_change_events_context_id_match_state_time(hass):
) )
async def test_state_firing_event_matches_context_id_ulid_time(hass): async def test_state_firing_event_matches_context_id_ulid_time(
hass: HomeAssistant,
) -> None:
"""Test timed_fired and the ulid have the same time.""" """Test timed_fired and the ulid have the same time."""
events = async_capture_events(hass, EVENT_HOMEASSISTANT_STARTED) events = async_capture_events(hass, EVENT_HOMEASSISTANT_STARTED)
hass.bus.async_fire(EVENT_HOMEASSISTANT_STARTED) hass.bus.async_fire(EVENT_HOMEASSISTANT_STARTED)
@ -1865,7 +1879,7 @@ async def test_state_firing_event_matches_context_id_ulid_time(hass):
) )
async def test_event_context(hass): async def test_event_context(hass: HomeAssistant) -> None:
"""Test we can lookup the origin of a context from an event.""" """Test we can lookup the origin of a context from an event."""
events = [] events = []
@ -1916,7 +1930,7 @@ def _get_by_type(full_name: str) -> list[Any]:
reason="Takes too long on the CI", reason="Takes too long on the CI",
) )
@patch.object(ha._LOGGER, "debug", lambda *args: None) @patch.object(ha._LOGGER, "debug", lambda *args: None)
async def test_state_changed_events_to_not_leak_contexts(hass): async def test_state_changed_events_to_not_leak_contexts(hass: HomeAssistant) -> None:
"""Test state changed events do not leak contexts.""" """Test state changed events do not leak contexts."""
gc.collect() gc.collect()
# Other tests can log Contexts which keep them in memory # Other tests can log Contexts which keep them in memory

View file

@ -236,7 +236,7 @@ async def test_discovery_init_flow(manager):
assert entry["source"] == config_entries.SOURCE_DISCOVERY assert entry["source"] == config_entries.SOURCE_DISCOVERY
async def test_finish_callback_change_result_type(hass): async def test_finish_callback_change_result_type(hass: HomeAssistant) -> None:
"""Test finish callback can change result type.""" """Test finish callback can change result type."""
class TestFlow(data_entry_flow.FlowHandler): class TestFlow(data_entry_flow.FlowHandler):

View file

@ -11,7 +11,7 @@ from homeassistant.core import HomeAssistant, callback
from .common import MockModule, mock_integration from .common import MockModule, mock_integration
async def test_component_dependencies(hass): async def test_component_dependencies(hass: HomeAssistant) -> None:
"""Test if we can get the proper load order of components.""" """Test if we can get the proper load order of components."""
mock_integration(hass, MockModule("mod1")) mock_integration(hass, MockModule("mod1"))
mock_integration(hass, MockModule("mod2", ["mod1"])) mock_integration(hass, MockModule("mod2", ["mod1"]))
@ -56,7 +56,7 @@ def test_component_loader_non_existing(hass: HomeAssistant) -> None:
components.non_existing components.non_existing
async def test_component_wrapper(hass): async def test_component_wrapper(hass: HomeAssistant) -> None:
"""Test component wrapper.""" """Test component wrapper."""
components = loader.Components(hass) components = loader.Components(hass)
components.persistent_notification.async_create("message") components.persistent_notification.async_create("message")
@ -64,7 +64,7 @@ async def test_component_wrapper(hass):
assert len(hass.states.async_entity_ids("persistent_notification")) == 1 assert len(hass.states.async_entity_ids("persistent_notification")) == 1
async def test_helpers_wrapper(hass): async def test_helpers_wrapper(hass: HomeAssistant) -> None:
"""Test helpers wrapper.""" """Test helpers wrapper."""
helpers = loader.Helpers(hass) helpers = loader.Helpers(hass)
@ -139,14 +139,14 @@ async def test_custom_integration_version_not_valid(
) in caplog.text ) in caplog.text
async def test_get_integration(hass): async def test_get_integration(hass: HomeAssistant) -> None:
"""Test resolving integration.""" """Test resolving integration."""
integration = await loader.async_get_integration(hass, "hue") integration = await loader.async_get_integration(hass, "hue")
assert hue == integration.get_component() assert hue == integration.get_component()
assert hue_light == integration.get_platform("light") assert hue_light == integration.get_platform("light")
async def test_get_integration_exceptions(hass): async def test_get_integration_exceptions(hass: HomeAssistant) -> None:
"""Test resolving integration.""" """Test resolving integration."""
integration = await loader.async_get_integration(hass, "hue") integration = await loader.async_get_integration(hass, "hue")
@ -294,7 +294,7 @@ def test_integration_properties(hass: HomeAssistant) -> None:
assert integration.ssdp is None assert integration.ssdp is None
async def test_integrations_only_once(hass): async def test_integrations_only_once(hass: HomeAssistant) -> None:
"""Test that we load integrations only once.""" """Test that we load integrations only once."""
int_1 = hass.async_create_task(loader.async_get_integration(hass, "hue")) int_1 = hass.async_create_task(loader.async_get_integration(hass, "hue"))
int_2 = hass.async_create_task(loader.async_get_integration(hass, "hue")) int_2 = hass.async_create_task(loader.async_get_integration(hass, "hue"))
@ -479,7 +479,7 @@ async def test_get_custom_components(hass, enable_custom_integrations):
mock_get.assert_called_once_with(hass) mock_get.assert_called_once_with(hass)
async def test_get_config_flows(hass): async def test_get_config_flows(hass: HomeAssistant) -> None:
"""Verify that custom components with config_flow are available.""" """Verify that custom components with config_flow are available."""
test_1_integration = _get_test_integration(hass, "test_1", False) test_1_integration = _get_test_integration(hass, "test_1", False)
test_2_integration = _get_test_integration(hass, "test_2", True) test_2_integration = _get_test_integration(hass, "test_2", True)
@ -494,7 +494,7 @@ async def test_get_config_flows(hass):
assert "test_1" not in flows assert "test_1" not in flows
async def test_get_zeroconf(hass): async def test_get_zeroconf(hass: HomeAssistant) -> None:
"""Verify that custom components with zeroconf are found.""" """Verify that custom components with zeroconf are found."""
test_1_integration = _get_test_integration(hass, "test_1", True) test_1_integration = _get_test_integration(hass, "test_1", True)
test_2_integration = _get_test_integration_with_zeroconf_matcher( test_2_integration = _get_test_integration_with_zeroconf_matcher(
@ -513,7 +513,7 @@ async def test_get_zeroconf(hass):
] ]
async def test_get_application_credentials(hass): async def test_get_application_credentials(hass: HomeAssistant) -> None:
"""Verify that custom components with application_credentials are found.""" """Verify that custom components with application_credentials are found."""
test_1_integration = _get_test_integration(hass, "test_1", True) test_1_integration = _get_test_integration(hass, "test_1", True)
test_2_integration = _get_test_integration_with_application_credentials( test_2_integration = _get_test_integration_with_application_credentials(
@ -530,7 +530,7 @@ async def test_get_application_credentials(hass):
assert "test_1" not in application_credentials assert "test_1" not in application_credentials
async def test_get_zeroconf_back_compat(hass): async def test_get_zeroconf_back_compat(hass: HomeAssistant) -> None:
"""Verify that custom components with zeroconf are found and legacy matchers are converted.""" """Verify that custom components with zeroconf are found and legacy matchers are converted."""
test_1_integration = _get_test_integration(hass, "test_1", True) test_1_integration = _get_test_integration(hass, "test_1", True)
test_2_integration = _get_test_integration_with_legacy_zeroconf_matcher( test_2_integration = _get_test_integration_with_legacy_zeroconf_matcher(
@ -557,7 +557,7 @@ async def test_get_zeroconf_back_compat(hass):
] ]
async def test_get_bluetooth(hass): async def test_get_bluetooth(hass: HomeAssistant) -> None:
"""Verify that custom components with bluetooth are found.""" """Verify that custom components with bluetooth are found."""
test_1_integration = _get_test_integration_with_bluetooth_matcher( test_1_integration = _get_test_integration_with_bluetooth_matcher(
hass, "test_1", True hass, "test_1", True
@ -577,7 +577,7 @@ async def test_get_bluetooth(hass):
] ]
async def test_get_dhcp(hass): async def test_get_dhcp(hass: HomeAssistant) -> None:
"""Verify that custom components with dhcp are found.""" """Verify that custom components with dhcp are found."""
test_1_integration = _get_test_integration_with_dhcp_matcher(hass, "test_1", True) test_1_integration = _get_test_integration_with_dhcp_matcher(hass, "test_1", True)
@ -594,7 +594,7 @@ async def test_get_dhcp(hass):
] ]
async def test_get_usb(hass): async def test_get_usb(hass: HomeAssistant) -> None:
"""Verify that custom components with usb matchers are found.""" """Verify that custom components with usb matchers are found."""
test_1_integration = _get_test_integration_with_usb_matcher(hass, "test_1", True) test_1_integration = _get_test_integration_with_usb_matcher(hass, "test_1", True)
@ -612,7 +612,7 @@ async def test_get_usb(hass):
] ]
async def test_get_homekit(hass): async def test_get_homekit(hass: HomeAssistant) -> None:
"""Verify that custom components with homekit are found.""" """Verify that custom components with homekit are found."""
test_1_integration = _get_test_integration(hass, "test_1", True) test_1_integration = _get_test_integration(hass, "test_1", True)
test_2_integration = _get_test_integration(hass, "test_2", True) test_2_integration = _get_test_integration(hass, "test_2", True)
@ -627,7 +627,7 @@ async def test_get_homekit(hass):
assert homekit["test_2"] == "test_2" assert homekit["test_2"] == "test_2"
async def test_get_ssdp(hass): async def test_get_ssdp(hass: HomeAssistant) -> None:
"""Verify that custom components with ssdp are found.""" """Verify that custom components with ssdp are found."""
test_1_integration = _get_test_integration(hass, "test_1", True) test_1_integration = _get_test_integration(hass, "test_1", True)
test_2_integration = _get_test_integration(hass, "test_2", True) test_2_integration = _get_test_integration(hass, "test_2", True)
@ -642,7 +642,7 @@ async def test_get_ssdp(hass):
assert ssdp["test_2"] == [{"manufacturer": "test_2", "modelName": "test_2"}] assert ssdp["test_2"] == [{"manufacturer": "test_2", "modelName": "test_2"}]
async def test_get_mqtt(hass): async def test_get_mqtt(hass: HomeAssistant) -> None:
"""Verify that custom components with MQTT are found.""" """Verify that custom components with MQTT are found."""
test_1_integration = _get_test_integration(hass, "test_1", True) test_1_integration = _get_test_integration(hass, "test_1", True)
test_2_integration = _get_test_integration(hass, "test_2", True) test_2_integration = _get_test_integration(hass, "test_2", True)
@ -657,7 +657,7 @@ async def test_get_mqtt(hass):
assert mqtt["test_2"] == ["test_2/discovery"] assert mqtt["test_2"] == ["test_2/discovery"]
async def test_get_custom_components_safe_mode(hass): async def test_get_custom_components_safe_mode(hass: HomeAssistant) -> None:
"""Test that we get empty custom components in safe mode.""" """Test that we get empty custom components in safe mode."""
hass.config.safe_mode = True hass.config.safe_mode = True
assert await loader.async_get_custom_components(hass) == {} assert await loader.async_get_custom_components(hass) == {}
@ -684,13 +684,13 @@ async def test_custom_integration_missing(hass, caplog):
await loader.async_get_integration(hass, "test1") await loader.async_get_integration(hass, "test1")
async def test_validation(hass): async def test_validation(hass: HomeAssistant) -> None:
"""Test we raise if invalid domain passed in.""" """Test we raise if invalid domain passed in."""
with pytest.raises(ValueError): with pytest.raises(ValueError):
await loader.async_get_integration(hass, "some.thing") await loader.async_get_integration(hass, "some.thing")
async def test_loggers(hass): async def test_loggers(hass: HomeAssistant) -> None:
"""Test we can fetch the loggers from the integration.""" """Test we can fetch the loggers from the integration."""
name = "dummy" name = "dummy"
integration = loader.Integration( integration = loader.Integration(

View file

@ -6,6 +6,7 @@ from unittest.mock import call, patch
import pytest import pytest
from homeassistant import loader, setup from homeassistant import loader, setup
from homeassistant.core import HomeAssistant
from homeassistant.requirements import ( from homeassistant.requirements import (
CONSTRAINT_FILE, CONSTRAINT_FILE,
RequirementsNotFound, RequirementsNotFound,
@ -24,7 +25,7 @@ def env_without_wheel_links():
return env return env
async def test_requirement_installed_in_venv(hass): async def test_requirement_installed_in_venv(hass: HomeAssistant) -> None:
"""Test requirement installed in virtual environment.""" """Test requirement installed in virtual environment."""
with patch("os.path.dirname", return_value="ha_package_path"), patch( with patch("os.path.dirname", return_value="ha_package_path"), patch(
"homeassistant.util.package.is_virtual_env", return_value=True "homeassistant.util.package.is_virtual_env", return_value=True
@ -45,7 +46,7 @@ async def test_requirement_installed_in_venv(hass):
) )
async def test_requirement_installed_in_deps(hass): async def test_requirement_installed_in_deps(hass: HomeAssistant) -> None:
"""Test requirement installed in deps directory.""" """Test requirement installed in deps directory."""
with patch("os.path.dirname", return_value="ha_package_path"), patch( with patch("os.path.dirname", return_value="ha_package_path"), patch(
"homeassistant.util.package.is_virtual_env", return_value=False "homeassistant.util.package.is_virtual_env", return_value=False
@ -67,7 +68,7 @@ async def test_requirement_installed_in_deps(hass):
) )
async def test_install_existing_package(hass): async def test_install_existing_package(hass: HomeAssistant) -> None:
"""Test an install attempt on an existing package.""" """Test an install attempt on an existing package."""
with patch( with patch(
"homeassistant.util.package.install_package", return_value=True "homeassistant.util.package.install_package", return_value=True
@ -84,7 +85,7 @@ async def test_install_existing_package(hass):
assert len(mock_inst.mock_calls) == 0 assert len(mock_inst.mock_calls) == 0
async def test_install_missing_package(hass): async def test_install_missing_package(hass: HomeAssistant) -> None:
"""Test an install attempt on an existing package.""" """Test an install attempt on an existing package."""
with patch( with patch(
"homeassistant.util.package.install_package", return_value=False "homeassistant.util.package.install_package", return_value=False
@ -111,7 +112,7 @@ async def test_install_skipped_package(hass, caplog):
assert mock_inst.mock_calls[0].args[0] == "not_skipped==1.2.3" assert mock_inst.mock_calls[0].args[0] == "not_skipped==1.2.3"
async def test_get_integration_with_requirements(hass): async def test_get_integration_with_requirements(hass: HomeAssistant) -> None:
"""Check getting an integration with loaded requirements.""" """Check getting an integration with loaded requirements."""
hass.config.skip_pip = False hass.config.skip_pip = False
mock_integration( mock_integration(
@ -159,7 +160,9 @@ async def test_get_integration_with_requirements(hass):
] ]
async def test_get_integration_with_requirements_pip_install_fails_two_passes(hass): async def test_get_integration_with_requirements_pip_install_fails_two_passes(
hass: HomeAssistant,
) -> None:
"""Check getting an integration with loaded requirements and the pip install fails two passes.""" """Check getting an integration with loaded requirements and the pip install fails two passes."""
hass.config.skip_pip = False hass.config.skip_pip = False
mock_integration( mock_integration(
@ -289,7 +292,7 @@ async def test_get_integration_with_requirements_pip_install_fails_two_passes(ha
] ]
async def test_get_integration_with_missing_dependencies(hass): async def test_get_integration_with_missing_dependencies(hass: HomeAssistant) -> None:
"""Check getting an integration with missing dependencies.""" """Check getting an integration with missing dependencies."""
hass.config.skip_pip = False hass.config.skip_pip = False
mock_integration( mock_integration(
@ -319,7 +322,9 @@ async def test_get_integration_with_missing_dependencies(hass):
await async_get_integration_with_requirements(hass, "test_custom_component") await async_get_integration_with_requirements(hass, "test_custom_component")
async def test_get_built_in_integration_with_missing_after_dependencies(hass): async def test_get_built_in_integration_with_missing_after_dependencies(
hass: HomeAssistant,
) -> None:
"""Check getting a built_in integration with missing after_dependencies results in exception.""" """Check getting a built_in integration with missing after_dependencies results in exception."""
hass.config.skip_pip = False hass.config.skip_pip = False
mock_integration( mock_integration(
@ -334,7 +339,9 @@ async def test_get_built_in_integration_with_missing_after_dependencies(hass):
await async_get_integration_with_requirements(hass, "test_component") await async_get_integration_with_requirements(hass, "test_component")
async def test_get_custom_integration_with_missing_after_dependencies(hass): async def test_get_custom_integration_with_missing_after_dependencies(
hass: HomeAssistant,
) -> None:
"""Check getting a custom integration with missing after_dependencies.""" """Check getting a custom integration with missing after_dependencies."""
hass.config.skip_pip = False hass.config.skip_pip = False
mock_integration( mock_integration(
@ -352,7 +359,7 @@ async def test_get_custom_integration_with_missing_after_dependencies(hass):
assert integration.domain == "test_custom_component" assert integration.domain == "test_custom_component"
async def test_install_with_wheels_index(hass): async def test_install_with_wheels_index(hass: HomeAssistant) -> None:
"""Test an install attempt with wheels index URL.""" """Test an install attempt with wheels index URL."""
hass.config.skip_pip = False hass.config.skip_pip = False
mock_integration(hass, MockModule("comp", requirements=["hello==1.0.0"])) mock_integration(hass, MockModule("comp", requirements=["hello==1.0.0"]))
@ -377,7 +384,7 @@ async def test_install_with_wheels_index(hass):
) )
async def test_install_on_docker(hass): async def test_install_on_docker(hass: HomeAssistant) -> None:
"""Test an install attempt on an docker system env.""" """Test an install attempt on an docker system env."""
hass.config.skip_pip = False hass.config.skip_pip = False
mock_integration(hass, MockModule("comp", requirements=["hello==1.0.0"])) mock_integration(hass, MockModule("comp", requirements=["hello==1.0.0"]))
@ -401,7 +408,7 @@ async def test_install_on_docker(hass):
) )
async def test_discovery_requirements_mqtt(hass): async def test_discovery_requirements_mqtt(hass: HomeAssistant) -> None:
"""Test that we load discovery requirements.""" """Test that we load discovery requirements."""
hass.config.skip_pip = False hass.config.skip_pip = False
mqtt = await loader.async_get_integration(hass, "mqtt") mqtt = await loader.async_get_integration(hass, "mqtt")
@ -418,7 +425,7 @@ async def test_discovery_requirements_mqtt(hass):
assert mock_process.mock_calls[0][1][1] == mqtt.requirements assert mock_process.mock_calls[0][1][1] == mqtt.requirements
async def test_discovery_requirements_ssdp(hass): async def test_discovery_requirements_ssdp(hass: HomeAssistant) -> None:
"""Test that we load discovery requirements.""" """Test that we load discovery requirements."""
hass.config.skip_pip = False hass.config.skip_pip = False
ssdp = await loader.async_get_integration(hass, "ssdp") ssdp = await loader.async_get_integration(hass, "ssdp")
@ -465,7 +472,7 @@ async def test_discovery_requirements_zeroconf(hass, partial_manifest):
assert mock_process.mock_calls[0][1][1] == zeroconf.requirements assert mock_process.mock_calls[0][1][1] == zeroconf.requirements
async def test_discovery_requirements_dhcp(hass): async def test_discovery_requirements_dhcp(hass: HomeAssistant) -> None:
"""Test that we load dhcp discovery requirements.""" """Test that we load dhcp discovery requirements."""
hass.config.skip_pip = False hass.config.skip_pip = False
dhcp = await loader.async_get_integration(hass, "dhcp") dhcp = await loader.async_get_integration(hass, "dhcp")

View file

@ -10,7 +10,7 @@ import voluptuous as vol
from homeassistant import config_entries, setup from homeassistant import config_entries, setup
from homeassistant.const import EVENT_COMPONENT_LOADED, EVENT_HOMEASSISTANT_START from homeassistant.const import EVENT_COMPONENT_LOADED, EVENT_HOMEASSISTANT_START
from homeassistant.core import callback from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import discovery from homeassistant.helpers import discovery
from homeassistant.helpers.config_validation import ( from homeassistant.helpers.config_validation import (
@ -41,7 +41,7 @@ def mock_handlers():
yield yield
async def test_validate_component_config(hass): async def test_validate_component_config(hass: HomeAssistant) -> None:
"""Test validating component configuration.""" """Test validating component configuration."""
config_schema = vol.Schema({"comp_conf": {"hello": str}}, required=True) config_schema = vol.Schema({"comp_conf": {"hello": str}}, required=True)
mock_integration(hass, MockModule("comp_conf", config_schema=config_schema)) mock_integration(hass, MockModule("comp_conf", config_schema=config_schema))
@ -198,7 +198,7 @@ async def test_validate_platform_config_3(hass, caplog):
) )
async def test_validate_platform_config_4(hass): async def test_validate_platform_config_4(hass: HomeAssistant) -> None:
"""Test entity_namespace in PLATFORM_SCHEMA.""" """Test entity_namespace in PLATFORM_SCHEMA."""
component_schema = PLATFORM_SCHEMA_BASE component_schema = PLATFORM_SCHEMA_BASE
platform_schema = PLATFORM_SCHEMA platform_schema = PLATFORM_SCHEMA
@ -230,12 +230,12 @@ async def test_validate_platform_config_4(hass):
hass.config.components.remove("platform_conf") hass.config.components.remove("platform_conf")
async def test_component_not_found(hass): async def test_component_not_found(hass: HomeAssistant) -> None:
"""setup_component should not crash if component doesn't exist.""" """setup_component should not crash if component doesn't exist."""
assert await setup.async_setup_component(hass, "non_existing", {}) is False assert await setup.async_setup_component(hass, "non_existing", {}) is False
async def test_component_not_double_initialized(hass): async def test_component_not_double_initialized(hass: HomeAssistant) -> None:
"""Test we do not set up a component twice.""" """Test we do not set up a component twice."""
mock_setup = Mock(return_value=True) mock_setup = Mock(return_value=True)
@ -250,7 +250,9 @@ async def test_component_not_double_initialized(hass):
assert not mock_setup.called assert not mock_setup.called
async def test_component_not_installed_if_requirement_fails(hass): async def test_component_not_installed_if_requirement_fails(
hass: HomeAssistant,
) -> None:
"""Component setup should fail if requirement can't install.""" """Component setup should fail if requirement can't install."""
hass.config.skip_pip = False hass.config.skip_pip = False
mock_integration(hass, MockModule("comp", requirements=["package==0.0.1"])) mock_integration(hass, MockModule("comp", requirements=["package==0.0.1"]))
@ -261,7 +263,9 @@ async def test_component_not_installed_if_requirement_fails(hass):
assert "comp" not in hass.config.components assert "comp" not in hass.config.components
async def test_component_not_setup_twice_if_loaded_during_other_setup(hass): async def test_component_not_setup_twice_if_loaded_during_other_setup(
hass: HomeAssistant,
) -> None:
"""Test component setup while waiting for lock is not set up twice.""" """Test component setup while waiting for lock is not set up twice."""
result = [] result = []
@ -284,7 +288,7 @@ async def test_component_not_setup_twice_if_loaded_during_other_setup(hass):
assert len(result) == 1 assert len(result) == 1
async def test_component_not_setup_missing_dependencies(hass): async def test_component_not_setup_missing_dependencies(hass: HomeAssistant) -> None:
"""Test we do not set up a component if not all dependencies loaded.""" """Test we do not set up a component if not all dependencies loaded."""
deps = ["maybe_existing"] deps = ["maybe_existing"]
mock_integration(hass, MockModule("comp", dependencies=deps)) mock_integration(hass, MockModule("comp", dependencies=deps))
@ -300,7 +304,7 @@ async def test_component_not_setup_missing_dependencies(hass):
assert await setup.async_setup_component(hass, "comp2", {}) assert await setup.async_setup_component(hass, "comp2", {})
async def test_component_failing_setup(hass): async def test_component_failing_setup(hass: HomeAssistant) -> None:
"""Test component that fails setup.""" """Test component that fails setup."""
mock_integration(hass, MockModule("comp", setup=lambda hass, config: False)) mock_integration(hass, MockModule("comp", setup=lambda hass, config: False))
@ -308,7 +312,7 @@ async def test_component_failing_setup(hass):
assert "comp" not in hass.config.components assert "comp" not in hass.config.components
async def test_component_exception_setup(hass): async def test_component_exception_setup(hass: HomeAssistant) -> None:
"""Test component that raises exception during setup.""" """Test component that raises exception during setup."""
def exception_setup(hass, config): def exception_setup(hass, config):
@ -321,7 +325,9 @@ async def test_component_exception_setup(hass):
assert "comp" not in hass.config.components assert "comp" not in hass.config.components
async def test_component_setup_with_validation_and_dependency(hass): async def test_component_setup_with_validation_and_dependency(
hass: HomeAssistant,
) -> None:
"""Test all config is passed to dependencies.""" """Test all config is passed to dependencies."""
def config_check_setup(hass, config): def config_check_setup(hass, config):
@ -349,7 +355,7 @@ async def test_component_setup_with_validation_and_dependency(hass):
assert "comp_a" in hass.config.components assert "comp_a" in hass.config.components
async def test_platform_specific_config_validation(hass): async def test_platform_specific_config_validation(hass: HomeAssistant) -> None:
"""Test platform that specifies config.""" """Test platform that specifies config."""
platform_schema = PLATFORM_SCHEMA.extend({"valid": True}, extra=vol.PREVENT_EXTRA) platform_schema = PLATFORM_SCHEMA.extend({"valid": True}, extra=vol.PREVENT_EXTRA)
@ -401,7 +407,7 @@ async def test_platform_specific_config_validation(hass):
assert mock_setup.call_count == 1 assert mock_setup.call_count == 1
async def test_disable_component_if_invalid_return(hass): async def test_disable_component_if_invalid_return(hass: HomeAssistant) -> None:
"""Test disabling component if invalid return.""" """Test disabling component if invalid return."""
mock_integration( mock_integration(
hass, MockModule("disabled_component", setup=lambda hass, config: None) hass, MockModule("disabled_component", setup=lambda hass, config: None)
@ -428,7 +434,7 @@ async def test_disable_component_if_invalid_return(hass):
assert "disabled_component" in hass.config.components assert "disabled_component" in hass.config.components
async def test_all_work_done_before_start(hass): async def test_all_work_done_before_start(hass: HomeAssistant) -> None:
"""Test all init work done till start.""" """Test all init work done till start."""
call_order = [] call_order = []
@ -466,7 +472,7 @@ async def test_all_work_done_before_start(hass):
assert call_order == [1, 1, 2] assert call_order == [1, 1, 2]
async def test_component_warn_slow_setup(hass): async def test_component_warn_slow_setup(hass: HomeAssistant) -> None:
"""Warn we log when a component setup takes a long time.""" """Warn we log when a component setup takes a long time."""
mock_integration(hass, MockModule("test_component1")) mock_integration(hass, MockModule("test_component1"))
with patch.object(hass.loop, "call_later") as mock_call: with patch.object(hass.loop, "call_later") as mock_call:
@ -483,7 +489,7 @@ async def test_component_warn_slow_setup(hass):
assert mock_call().cancel.called assert mock_call().cancel.called
async def test_platform_no_warn_slow(hass): async def test_platform_no_warn_slow(hass: HomeAssistant) -> None:
"""Do not warn for long entity setup time.""" """Do not warn for long entity setup time."""
mock_integration( mock_integration(
hass, MockModule("test_component1", platform_schema=PLATFORM_SCHEMA) hass, MockModule("test_component1", platform_schema=PLATFORM_SCHEMA)
@ -512,7 +518,7 @@ async def test_platform_error_slow_setup(hass, caplog):
assert "test_component1 is taking longer than 0.1 seconds" in caplog.text assert "test_component1 is taking longer than 0.1 seconds" in caplog.text
async def test_when_setup_already_loaded(hass): async def test_when_setup_already_loaded(hass: HomeAssistant) -> None:
"""Test when setup.""" """Test when setup."""
calls = [] calls = []
@ -540,7 +546,7 @@ async def test_when_setup_already_loaded(hass):
assert calls == ["test", "test"] assert calls == ["test", "test"]
async def test_async_when_setup_or_start_already_loaded(hass): async def test_async_when_setup_or_start_already_loaded(hass: HomeAssistant) -> None:
"""Test when setup or start.""" """Test when setup or start."""
calls = [] calls = []
@ -575,7 +581,7 @@ async def test_async_when_setup_or_start_already_loaded(hass):
assert calls == ["test", "test", "not_loaded"] assert calls == ["test", "test", "not_loaded"]
async def test_setup_import_blows_up(hass): async def test_setup_import_blows_up(hass: HomeAssistant) -> None:
"""Test that we handle it correctly when importing integration blows up.""" """Test that we handle it correctly when importing integration blows up."""
with patch( with patch(
"homeassistant.loader.Integration.get_component", side_effect=ImportError "homeassistant.loader.Integration.get_component", side_effect=ImportError
@ -638,7 +644,7 @@ async def test_integration_logs_is_custom(hass, caplog):
assert "Setup failed for custom integration test_component1: Boom" in caplog.text assert "Setup failed for custom integration test_component1: Boom" in caplog.text
async def test_async_get_loaded_integrations(hass): async def test_async_get_loaded_integrations(hass: HomeAssistant) -> None:
"""Test we can enumerate loaded integrations.""" """Test we can enumerate loaded integrations."""
hass.config.components.add("notbase") hass.config.components.add("notbase")
hass.config.components.add("switch") hass.config.components.add("switch")
@ -669,7 +675,7 @@ async def test_integration_no_setup(hass, caplog):
assert "No setup or config entry setup function defined" in caplog.text assert "No setup or config entry setup function defined" in caplog.text
async def test_integration_only_setup_entry(hass): async def test_integration_only_setup_entry(hass: HomeAssistant) -> None:
"""Test we have an integration with only a setup entry method.""" """Test we have an integration with only a setup entry method."""
mock_integration( mock_integration(
hass, hass,
@ -682,7 +688,7 @@ async def test_integration_only_setup_entry(hass):
assert await setup.async_setup_component(hass, "test_integration_only_entry", {}) assert await setup.async_setup_component(hass, "test_integration_only_entry", {})
async def test_async_start_setup(hass): async def test_async_start_setup(hass: HomeAssistant) -> None:
"""Test setup started context manager keeps track of setup times.""" """Test setup started context manager keeps track of setup times."""
with setup.async_start_setup(hass, ["august"]): with setup.async_start_setup(hass, ["august"]):
assert isinstance( assert isinstance(
@ -698,7 +704,7 @@ async def test_async_start_setup(hass):
assert "august_2" not in hass.data[setup.DATA_SETUP_TIME] assert "august_2" not in hass.data[setup.DATA_SETUP_TIME]
async def test_async_start_setup_platforms(hass): async def test_async_start_setup_platforms(hass: HomeAssistant) -> None:
"""Test setup started context manager keeps track of setup times for platforms.""" """Test setup started context manager keeps track of setup times for platforms."""
with setup.async_start_setup(hass, ["sensor.august"]): with setup.async_start_setup(hass, ["sensor.august"]):
assert isinstance( assert isinstance(

View file

@ -4,7 +4,7 @@ import socket
import pytest import pytest
import pytest_socket import pytest_socket
from homeassistant.core import async_get_hass from homeassistant.core import HomeAssistant, async_get_hass
def test_sockets_disabled() -> None: def test_sockets_disabled() -> None:
@ -20,7 +20,7 @@ def test_sockets_enabled(socket_enabled):
mysocket.connect(("127.0.0.2", 1234)) mysocket.connect(("127.0.0.2", 1234))
async def test_hass_cv(hass): async def test_hass_cv(hass: HomeAssistant) -> None:
"""Test hass context variable. """Test hass context variable.
When tests are using the `hass`, this tests that the hass context variable was set When tests are using the `hass`, this tests that the hass context variable was set

View file

@ -6,6 +6,7 @@ from unittest.mock import MagicMock, Mock, patch
import pytest import pytest
from homeassistant import block_async_io from homeassistant import block_async_io
from homeassistant.core import HomeAssistant
from homeassistant.util import async_ as hasync from homeassistant.util import async_ as hasync
@ -239,7 +240,7 @@ async def test_gather_with_concurrency() -> None:
assert results == [2, 2, -1, -1] assert results == [2, 2, -1, -1]
async def test_shutdown_run_callback_threadsafe(hass): async def test_shutdown_run_callback_threadsafe(hass: HomeAssistant) -> None:
"""Test we can shutdown run_callback_threadsafe.""" """Test we can shutdown run_callback_threadsafe."""
hasync.shutdown_run_callback_threadsafe(hass.loop) hasync.shutdown_run_callback_threadsafe(hass.loop)
callback = MagicMock() callback = MagicMock()
@ -248,7 +249,7 @@ async def test_shutdown_run_callback_threadsafe(hass):
hasync.run_callback_threadsafe(hass.loop, callback) hasync.run_callback_threadsafe(hass.loop, callback)
async def test_run_callback_threadsafe(hass): async def test_run_callback_threadsafe(hass: HomeAssistant) -> None:
"""Test run_callback_threadsafe runs code in the event loop.""" """Test run_callback_threadsafe runs code in the event loop."""
it_ran = False it_ran = False
@ -265,7 +266,7 @@ async def test_run_callback_threadsafe(hass):
assert it_ran is True assert it_ran is True
async def test_callback_is_always_scheduled(hass): async def test_callback_is_always_scheduled(hass: HomeAssistant) -> None:
"""Test run_callback_threadsafe always calls call_soon_threadsafe before checking for shutdown.""" """Test run_callback_threadsafe always calls call_soon_threadsafe before checking for shutdown."""
# We have to check the shutdown state AFTER the callback is scheduled otherwise # We have to check the shutdown state AFTER the callback is scheduled otherwise
# the function could continue on and the caller call `future.result()` after # the function could continue on and the caller call `future.result()` after

View file

@ -7,7 +7,7 @@ from unittest.mock import patch
import pytest import pytest
from homeassistant.core import callback, is_callback from homeassistant.core import HomeAssistant, callback, is_callback
import homeassistant.util.logging as logging_util import homeassistant.util.logging as logging_util
@ -62,7 +62,7 @@ async def test_logging_with_queue_handler() -> None:
assert simple_queue.empty() assert simple_queue.empty()
async def test_migrate_log_handler(hass): async def test_migrate_log_handler(hass: HomeAssistant) -> None:
"""Test migrating log handlers.""" """Test migrating log handlers."""
logging_util.async_activate_log_queue_handler(hass) logging_util.async_activate_log_queue_handler(hass)

View file

@ -5,12 +5,13 @@ from unittest.mock import Mock, patch
import pytest import pytest
from homeassistant.core import HomeAssistant
from homeassistant.util import thread from homeassistant.util import thread
from homeassistant.util.async_ import run_callback_threadsafe from homeassistant.util.async_ import run_callback_threadsafe
from homeassistant.util.thread import ThreadWithException from homeassistant.util.thread import ThreadWithException
async def test_thread_with_exception_invalid(hass): async def test_thread_with_exception_invalid(hass: HomeAssistant) -> None:
"""Test throwing an invalid thread exception.""" """Test throwing an invalid thread exception."""
finish_event = asyncio.Event() finish_event = asyncio.Event()
@ -27,7 +28,7 @@ async def test_thread_with_exception_invalid(hass):
test_thread.join() test_thread.join()
async def test_thread_not_started(hass): async def test_thread_not_started(hass: HomeAssistant) -> None:
"""Test throwing when the thread is not started.""" """Test throwing when the thread is not started."""
test_thread = ThreadWithException(target=lambda *_: None) test_thread = ThreadWithException(target=lambda *_: None)
@ -36,7 +37,7 @@ async def test_thread_not_started(hass):
test_thread.raise_exc(TimeoutError) test_thread.raise_exc(TimeoutError)
async def test_thread_fails_raise(hass): async def test_thread_fails_raise(hass: HomeAssistant) -> None:
"""Test throwing after already ended.""" """Test throwing after already ended."""
finish_event = asyncio.Event() finish_event = asyncio.Event()

View file

@ -5,6 +5,7 @@ import time
import pytest import pytest
from homeassistant.core import HomeAssistant
from homeassistant.util.timeout import TimeoutManager from homeassistant.util.timeout import TimeoutManager
@ -17,7 +18,7 @@ async def test_simple_global_timeout() -> None:
await asyncio.sleep(0.3) await asyncio.sleep(0.3)
async def test_simple_global_timeout_with_executor_job(hass): async def test_simple_global_timeout_with_executor_job(hass: HomeAssistant) -> None:
"""Test a simple global timeout with executor job.""" """Test a simple global timeout with executor job."""
timeout = TimeoutManager() timeout = TimeoutManager()
@ -35,7 +36,9 @@ async def test_simple_global_timeout_freeze() -> None:
await asyncio.sleep(0.3) await asyncio.sleep(0.3)
async def test_simple_zone_timeout_freeze_inside_executor_job(hass): async def test_simple_zone_timeout_freeze_inside_executor_job(
hass: HomeAssistant,
) -> None:
"""Test a simple zone timeout freeze inside an executor job.""" """Test a simple zone timeout freeze inside an executor job."""
timeout = TimeoutManager() timeout = TimeoutManager()
@ -48,7 +51,9 @@ async def test_simple_zone_timeout_freeze_inside_executor_job(hass):
await hass.async_add_executor_job(_some_sync_work) await hass.async_add_executor_job(_some_sync_work)
async def test_simple_global_timeout_freeze_inside_executor_job(hass): async def test_simple_global_timeout_freeze_inside_executor_job(
hass: HomeAssistant,
) -> None:
"""Test a simple global timeout freeze inside an executor job.""" """Test a simple global timeout freeze inside an executor job."""
timeout = TimeoutManager() timeout = TimeoutManager()
@ -60,7 +65,9 @@ async def test_simple_global_timeout_freeze_inside_executor_job(hass):
await hass.async_add_executor_job(_some_sync_work) await hass.async_add_executor_job(_some_sync_work)
async def test_mix_global_timeout_freeze_and_zone_freeze_inside_executor_job(hass): async def test_mix_global_timeout_freeze_and_zone_freeze_inside_executor_job(
hass: HomeAssistant,
) -> None:
"""Test a simple global timeout freeze inside an executor job.""" """Test a simple global timeout freeze inside an executor job."""
timeout = TimeoutManager() timeout = TimeoutManager()
@ -73,7 +80,9 @@ async def test_mix_global_timeout_freeze_and_zone_freeze_inside_executor_job(has
await hass.async_add_executor_job(_some_sync_work) await hass.async_add_executor_job(_some_sync_work)
async def test_mix_global_timeout_freeze_and_zone_freeze_different_order(hass): async def test_mix_global_timeout_freeze_and_zone_freeze_different_order(
hass: HomeAssistant,
) -> None:
"""Test a simple global timeout freeze inside an executor job before timeout was set.""" """Test a simple global timeout freeze inside an executor job before timeout was set."""
timeout = TimeoutManager() timeout = TimeoutManager()
@ -121,7 +130,9 @@ async def test_mix_global_timeout_freeze_and_zone_freeze_inside_executor_job_sec
await hass.async_add_executor_job(lambda: time.sleep(0.2)) await hass.async_add_executor_job(lambda: time.sleep(0.2))
async def test_simple_global_timeout_freeze_with_executor_job(hass): async def test_simple_global_timeout_freeze_with_executor_job(
hass: HomeAssistant,
) -> None:
"""Test a simple global timeout freeze with executor job.""" """Test a simple global timeout freeze with executor job."""
timeout = TimeoutManager() timeout = TimeoutManager()
@ -263,7 +274,9 @@ async def test_mix_zone_timeout_trigger_global_cool_down() -> None:
await asyncio.sleep(0.2) await asyncio.sleep(0.2)
async def test_simple_zone_timeout_freeze_without_timeout_cleanup(hass): async def test_simple_zone_timeout_freeze_without_timeout_cleanup(
hass: HomeAssistant,
) -> None:
"""Test a simple zone timeout freeze on a zone that does not have a timeout set.""" """Test a simple zone timeout freeze on a zone that does not have a timeout set."""
timeout = TimeoutManager() timeout = TimeoutManager()
@ -276,7 +289,9 @@ async def test_simple_zone_timeout_freeze_without_timeout_cleanup(hass):
await asyncio.sleep(0.2) await asyncio.sleep(0.2)
async def test_simple_zone_timeout_freeze_without_timeout_cleanup2(hass): async def test_simple_zone_timeout_freeze_without_timeout_cleanup2(
hass: HomeAssistant,
) -> None:
"""Test a simple zone timeout freeze on a zone that does not have a timeout set.""" """Test a simple zone timeout freeze on a zone that does not have a timeout set."""
timeout = TimeoutManager() timeout = TimeoutManager()