Add more type hints to conftest (#87737)
This commit is contained in:
parent
17aee5e3a3
commit
aff0174afa
1 changed files with 60 additions and 27 deletions
|
@ -34,6 +34,7 @@ from homeassistant import core as ha, loader, runner, util
|
||||||
from homeassistant.auth.const import GROUP_ID_ADMIN, GROUP_ID_READ_ONLY
|
from homeassistant.auth.const import GROUP_ID_ADMIN, GROUP_ID_READ_ONLY
|
||||||
from homeassistant.auth.models import Credentials
|
from homeassistant.auth.models import Credentials
|
||||||
from homeassistant.auth.providers import homeassistant, legacy_api_password
|
from homeassistant.auth.providers import homeassistant, legacy_api_password
|
||||||
|
from homeassistant.components.device_tracker.legacy import Device
|
||||||
from homeassistant.components.network.models import Adapter, IPv4ConfiguredAddress
|
from homeassistant.components.network.models import Adapter, IPv4ConfiguredAddress
|
||||||
from homeassistant.components.websocket_api.auth import (
|
from homeassistant.components.websocket_api.auth import (
|
||||||
TYPE_AUTH,
|
TYPE_AUTH,
|
||||||
|
@ -103,12 +104,12 @@ dt_util.utcnow = _utcnow
|
||||||
event.time_tracker_utcnow = _utcnow
|
event.time_tracker_utcnow = _utcnow
|
||||||
|
|
||||||
|
|
||||||
def pytest_addoption(parser):
|
def pytest_addoption(parser: pytest.Parser) -> None:
|
||||||
"""Register custom pytest options."""
|
"""Register custom pytest options."""
|
||||||
parser.addoption("--dburl", action="store", default="sqlite://")
|
parser.addoption("--dburl", action="store", default="sqlite://")
|
||||||
|
|
||||||
|
|
||||||
def pytest_configure(config):
|
def pytest_configure(config: pytest.Config) -> None:
|
||||||
"""Register marker for tests that log exceptions."""
|
"""Register marker for tests that log exceptions."""
|
||||||
config.addinivalue_line(
|
config.addinivalue_line(
|
||||||
"markers", "no_fail_on_log_exception: mark test to not fail on logged exception"
|
"markers", "no_fail_on_log_exception: mark test to not fail on logged exception"
|
||||||
|
@ -120,7 +121,7 @@ def pytest_configure(config):
|
||||||
logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO)
|
logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO)
|
||||||
|
|
||||||
|
|
||||||
def pytest_runtest_setup():
|
def pytest_runtest_setup() -> None:
|
||||||
"""Prepare pytest_socket and freezegun.
|
"""Prepare pytest_socket and freezegun.
|
||||||
|
|
||||||
pytest_socket:
|
pytest_socket:
|
||||||
|
@ -216,14 +217,14 @@ util.get_local_ip = lambda: "127.0.0.1"
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(name="caplog")
|
@pytest.fixture(name="caplog")
|
||||||
def caplog_fixture(caplog):
|
def caplog_fixture(caplog: pytest.LogCaptureFixture) -> pytest.LogCaptureFixture:
|
||||||
"""Set log level to debug for tests using the caplog fixture."""
|
"""Set log level to debug for tests using the caplog fixture."""
|
||||||
caplog.set_level(logging.DEBUG)
|
caplog.set_level(logging.DEBUG)
|
||||||
return caplog
|
return caplog
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True, scope="module")
|
@pytest.fixture(autouse=True, scope="module")
|
||||||
def garbage_collection():
|
def garbage_collection() -> None:
|
||||||
"""Run garbage collection at known locations.
|
"""Run garbage collection at known locations.
|
||||||
|
|
||||||
This is to mimic the behavior of pytest-aiohttp, and is
|
This is to mimic the behavior of pytest-aiohttp, and is
|
||||||
|
@ -236,7 +237,9 @@ def garbage_collection():
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def verify_cleanup(event_loop: asyncio.AbstractEventLoop):
|
def verify_cleanup(
|
||||||
|
event_loop: asyncio.AbstractEventLoop,
|
||||||
|
) -> Generator[None, None, None]:
|
||||||
"""Verify that the test has cleaned up resources correctly."""
|
"""Verify that the test has cleaned up resources correctly."""
|
||||||
threads_before = frozenset(threading.enumerate())
|
threads_before = frozenset(threading.enumerate())
|
||||||
tasks_before = asyncio.all_tasks(event_loop)
|
tasks_before = asyncio.all_tasks(event_loop)
|
||||||
|
@ -273,7 +276,7 @@ def verify_cleanup(event_loop: asyncio.AbstractEventLoop):
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def bcrypt_cost():
|
def bcrypt_cost() -> Generator[None, None, None]:
|
||||||
"""Run with reduced rounds during tests, to speed up uses."""
|
"""Run with reduced rounds during tests, to speed up uses."""
|
||||||
import bcrypt
|
import bcrypt
|
||||||
|
|
||||||
|
@ -295,7 +298,7 @@ def hass_storage():
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def load_registries():
|
def load_registries() -> bool:
|
||||||
"""Fixture to control the loading of registries when setting up the hass fixture.
|
"""Fixture to control the loading of registries when setting up the hass fixture.
|
||||||
|
|
||||||
To avoid loading the registries, tests can be marked with:
|
To avoid loading the registries, tests can be marked with:
|
||||||
|
@ -338,7 +341,7 @@ class CoalescingClient(TestClient):
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def aiohttp_client_cls():
|
def aiohttp_client_cls() -> type[CoalescingClient]:
|
||||||
"""Override the test class for aiohttp."""
|
"""Override the test class for aiohttp."""
|
||||||
return CoalescingClient
|
return CoalescingClient
|
||||||
|
|
||||||
|
@ -396,13 +399,19 @@ def aiohttp_client(
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def hass_fixture_setup():
|
def hass_fixture_setup() -> list[bool]:
|
||||||
"""Fixture whichis truthy if the hass fixture has been setup."""
|
"""Fixture which is truthy if the hass fixture has been setup."""
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def hass(hass_fixture_setup, event_loop, load_registries, hass_storage, request):
|
def hass(
|
||||||
|
hass_fixture_setup: list[bool],
|
||||||
|
event_loop: asyncio.AbstractEventLoop,
|
||||||
|
load_registries: bool,
|
||||||
|
hass_storage: dict[str, Any],
|
||||||
|
request,
|
||||||
|
) -> Generator[HomeAssistant, None, None]:
|
||||||
"""Fixture to provide a test instance of Home Assistant."""
|
"""Fixture to provide a test instance of Home Assistant."""
|
||||||
|
|
||||||
loop = event_loop
|
loop = event_loop
|
||||||
|
@ -450,7 +459,9 @@ def hass(hass_fixture_setup, event_loop, load_registries, hass_storage, request)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
async def stop_hass(event_loop):
|
async def stop_hass(
|
||||||
|
event_loop: asyncio.AbstractEventLoop,
|
||||||
|
) -> AsyncGenerator[None, None]:
|
||||||
"""Make sure all hass are stopped."""
|
"""Make sure all hass are stopped."""
|
||||||
orig_hass = ha.HomeAssistant
|
orig_hass = ha.HomeAssistant
|
||||||
|
|
||||||
|
@ -489,11 +500,11 @@ def aioclient_mock() -> Generator[AiohttpClientMocker, None, None]:
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def mock_device_tracker_conf():
|
def mock_device_tracker_conf() -> Generator[list[Device], None, None]:
|
||||||
"""Prevent device tracker from reading/writing data."""
|
"""Prevent device tracker from reading/writing data."""
|
||||||
devices = []
|
devices: list[Device] = []
|
||||||
|
|
||||||
async def mock_update_config(path, id, entity):
|
async def mock_update_config(path: str, dev_id: str, entity: Device) -> None:
|
||||||
devices.append(entity)
|
devices.append(entity)
|
||||||
|
|
||||||
with patch(
|
with patch(
|
||||||
|
@ -510,7 +521,9 @@ def mock_device_tracker_conf():
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
async def hass_admin_credential(hass, local_auth):
|
async def hass_admin_credential(
|
||||||
|
hass: HomeAssistant, local_auth: homeassistant.HassAuthProvider
|
||||||
|
) -> Credentials:
|
||||||
"""Provide credentials for admin user."""
|
"""Provide credentials for admin user."""
|
||||||
return Credentials(
|
return Credentials(
|
||||||
id="mock-credential-id",
|
id="mock-credential-id",
|
||||||
|
@ -522,7 +535,9 @@ async def hass_admin_credential(hass, local_auth):
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
async def hass_access_token(hass, hass_admin_user, hass_admin_credential):
|
async def hass_access_token(
|
||||||
|
hass: HomeAssistant, hass_admin_user: MockUser, hass_admin_credential: Credentials
|
||||||
|
) -> str:
|
||||||
"""Return an access token to access Home Assistant."""
|
"""Return an access token to access Home Assistant."""
|
||||||
await hass.auth.async_link_user(hass_admin_user, hass_admin_credential)
|
await hass.auth.async_link_user(hass_admin_user, hass_admin_credential)
|
||||||
|
|
||||||
|
@ -533,13 +548,17 @@ async def hass_access_token(hass, hass_admin_user, hass_admin_credential):
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def hass_owner_user(hass, local_auth):
|
def hass_owner_user(
|
||||||
|
hass: HomeAssistant, local_auth: homeassistant.HassAuthProvider
|
||||||
|
) -> MockUser:
|
||||||
"""Return a Home Assistant admin user."""
|
"""Return a Home Assistant admin user."""
|
||||||
return MockUser(is_owner=True).add_to_hass(hass)
|
return MockUser(is_owner=True).add_to_hass(hass)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def hass_admin_user(hass, local_auth):
|
def hass_admin_user(
|
||||||
|
hass: HomeAssistant, local_auth: homeassistant.HassAuthProvider
|
||||||
|
) -> MockUser:
|
||||||
"""Return a Home Assistant admin user."""
|
"""Return a Home Assistant admin user."""
|
||||||
admin_group = hass.loop.run_until_complete(
|
admin_group = hass.loop.run_until_complete(
|
||||||
hass.auth.async_get_group(GROUP_ID_ADMIN)
|
hass.auth.async_get_group(GROUP_ID_ADMIN)
|
||||||
|
@ -548,7 +567,9 @@ def hass_admin_user(hass, local_auth):
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def hass_read_only_user(hass, local_auth):
|
def hass_read_only_user(
|
||||||
|
hass: HomeAssistant, local_auth: homeassistant.HassAuthProvider
|
||||||
|
) -> MockUser:
|
||||||
"""Return a Home Assistant read only user."""
|
"""Return a Home Assistant read only user."""
|
||||||
read_only_group = hass.loop.run_until_complete(
|
read_only_group = hass.loop.run_until_complete(
|
||||||
hass.auth.async_get_group(GROUP_ID_READ_ONLY)
|
hass.auth.async_get_group(GROUP_ID_READ_ONLY)
|
||||||
|
@ -557,7 +578,11 @@ def hass_read_only_user(hass, local_auth):
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def hass_read_only_access_token(hass, hass_read_only_user, local_auth):
|
def hass_read_only_access_token(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
hass_read_only_user: MockUser,
|
||||||
|
local_auth: homeassistant.HassAuthProvider,
|
||||||
|
) -> str:
|
||||||
"""Return a Home Assistant read only user."""
|
"""Return a Home Assistant read only user."""
|
||||||
credential = Credentials(
|
credential = Credentials(
|
||||||
id="mock-readonly-credential-id",
|
id="mock-readonly-credential-id",
|
||||||
|
@ -577,7 +602,9 @@ def hass_read_only_access_token(hass, hass_read_only_user, local_auth):
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def hass_supervisor_user(hass, local_auth):
|
def hass_supervisor_user(
|
||||||
|
hass: HomeAssistant, local_auth: homeassistant.HassAuthProvider
|
||||||
|
) -> MockUser:
|
||||||
"""Return the Home Assistant Supervisor user."""
|
"""Return the Home Assistant Supervisor user."""
|
||||||
admin_group = hass.loop.run_until_complete(
|
admin_group = hass.loop.run_until_complete(
|
||||||
hass.auth.async_get_group(GROUP_ID_ADMIN)
|
hass.auth.async_get_group(GROUP_ID_ADMIN)
|
||||||
|
@ -588,7 +615,11 @@ def hass_supervisor_user(hass, local_auth):
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def hass_supervisor_access_token(hass, hass_supervisor_user, local_auth):
|
def hass_supervisor_access_token(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
hass_supervisor_user,
|
||||||
|
local_auth: homeassistant.HassAuthProvider,
|
||||||
|
) -> str:
|
||||||
"""Return a Home Assistant Supervisor access token."""
|
"""Return a Home Assistant Supervisor access token."""
|
||||||
refresh_token = hass.loop.run_until_complete(
|
refresh_token = hass.loop.run_until_complete(
|
||||||
hass.auth.async_create_refresh_token(hass_supervisor_user)
|
hass.auth.async_create_refresh_token(hass_supervisor_user)
|
||||||
|
@ -597,7 +628,9 @@ def hass_supervisor_access_token(hass, hass_supervisor_user, local_auth):
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def legacy_auth(hass):
|
def legacy_auth(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
) -> legacy_api_password.LegacyApiPasswordAuthProvider:
|
||||||
"""Load legacy API password provider."""
|
"""Load legacy API password provider."""
|
||||||
prv = legacy_api_password.LegacyApiPasswordAuthProvider(
|
prv = legacy_api_password.LegacyApiPasswordAuthProvider(
|
||||||
hass,
|
hass,
|
||||||
|
@ -609,7 +642,7 @@ def legacy_auth(hass):
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def local_auth(hass):
|
def local_auth(hass: HomeAssistant) -> homeassistant.HassAuthProvider:
|
||||||
"""Load local auth provider."""
|
"""Load local auth provider."""
|
||||||
prv = homeassistant.HassAuthProvider(
|
prv = homeassistant.HassAuthProvider(
|
||||||
hass, hass.auth._store, {"type": "homeassistant"}
|
hass, hass.auth._store, {"type": "homeassistant"}
|
||||||
|
@ -793,7 +826,7 @@ async def _mqtt_mock_entry(
|
||||||
"""Fixture to mock a delayed setup of the MQTT config entry."""
|
"""Fixture to mock a delayed setup of the MQTT config entry."""
|
||||||
# Local import to avoid processing MQTT modules when running a testcase
|
# Local import to avoid processing MQTT modules when running a testcase
|
||||||
# which does not use MQTT.
|
# which does not use MQTT.
|
||||||
from homeassistant.components import mqtt
|
from homeassistant.components import mqtt # pylint: disable=import-outside-toplevel
|
||||||
|
|
||||||
if mqtt_config_entry_data is None:
|
if mqtt_config_entry_data is None:
|
||||||
mqtt_config_entry_data = {
|
mqtt_config_entry_data = {
|
||||||
|
|
Loading…
Add table
Reference in a new issue