Add more type hints to conftest (#87737)

This commit is contained in:
epenet 2023-02-08 22:58:00 +01:00 committed by GitHub
parent 17aee5e3a3
commit aff0174afa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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 = {