From e2a34d209fe489ba84523852058ff7d9566f1199 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Fri, 21 Jun 2024 14:44:28 +0200 Subject: [PATCH] Improve type hints in Config entry oauth2 tests (#120090) --- .../helpers/test_config_entry_oauth2_flow.py | 90 +++++++++++++------ 1 file changed, 63 insertions(+), 27 deletions(-) diff --git a/tests/helpers/test_config_entry_oauth2_flow.py b/tests/helpers/test_config_entry_oauth2_flow.py index 18e1712f764..132a0b41707 100644 --- a/tests/helpers/test_config_entry_oauth2_flow.py +++ b/tests/helpers/test_config_entry_oauth2_flow.py @@ -8,6 +8,7 @@ from unittest.mock import patch import aiohttp import pytest +from typing_extensions import Generator from homeassistant import config_entries, data_entry_flow, setup from homeassistant.core import HomeAssistant @@ -29,7 +30,9 @@ TOKEN_URL = "https://example.como/auth/token" @pytest.fixture -async def local_impl(hass): +async def local_impl( + hass: HomeAssistant, +) -> config_entry_oauth2_flow.LocalOAuth2Implementation: """Local implementation.""" assert await setup.async_setup_component(hass, "auth", {}) return config_entry_oauth2_flow.LocalOAuth2Implementation( @@ -38,7 +41,9 @@ async def local_impl(hass): @pytest.fixture -def flow_handler(hass): +def flow_handler( + hass: HomeAssistant, +) -> Generator[type[config_entry_oauth2_flow.AbstractOAuth2FlowHandler]]: """Return a registered config flow.""" mock_platform(hass, f"{TEST_DOMAIN}.config_flow") @@ -111,7 +116,10 @@ def test_inherit_enforces_domain_set() -> None: TestFlowHandler() -async def test_abort_if_no_implementation(hass: HomeAssistant, flow_handler) -> None: +async def test_abort_if_no_implementation( + hass: HomeAssistant, + flow_handler: type[config_entry_oauth2_flow.AbstractOAuth2FlowHandler], +) -> None: """Check flow abort when no implementations.""" flow = flow_handler() flow.hass = hass @@ -121,7 +129,8 @@ async def test_abort_if_no_implementation(hass: HomeAssistant, flow_handler) -> async def test_missing_credentials_for_domain( - hass: HomeAssistant, flow_handler + hass: HomeAssistant, + flow_handler: type[config_entry_oauth2_flow.AbstractOAuth2FlowHandler], ) -> None: """Check flow abort for integration supporting application credentials.""" flow = flow_handler() @@ -135,7 +144,9 @@ async def test_missing_credentials_for_domain( @pytest.mark.usefixtures("current_request_with_host") async def test_abort_if_authorization_timeout( - hass: HomeAssistant, flow_handler, local_impl + hass: HomeAssistant, + flow_handler: type[config_entry_oauth2_flow.AbstractOAuth2FlowHandler], + local_impl: config_entry_oauth2_flow.LocalOAuth2Implementation, ) -> None: """Check timeout generating authorization url.""" flow_handler.async_register_implementation(hass, local_impl) @@ -155,7 +166,9 @@ async def test_abort_if_authorization_timeout( @pytest.mark.usefixtures("current_request_with_host") async def test_abort_if_no_url_available( - hass: HomeAssistant, flow_handler, local_impl + hass: HomeAssistant, + flow_handler: type[config_entry_oauth2_flow.AbstractOAuth2FlowHandler], + local_impl: config_entry_oauth2_flow.LocalOAuth2Implementation, ) -> None: """Check no_url_available generating authorization url.""" flow_handler.async_register_implementation(hass, local_impl) @@ -176,8 +189,8 @@ async def test_abort_if_no_url_available( @pytest.mark.usefixtures("current_request_with_host") async def test_abort_if_oauth_error( hass: HomeAssistant, - flow_handler, - local_impl, + flow_handler: type[config_entry_oauth2_flow.AbstractOAuth2FlowHandler], + local_impl: config_entry_oauth2_flow.LocalOAuth2Implementation, hass_client_no_auth: ClientSessionGenerator, aioclient_mock: AiohttpClientMocker, expires_in_dict: dict[str, str], @@ -239,8 +252,8 @@ async def test_abort_if_oauth_error( @pytest.mark.usefixtures("current_request_with_host") async def test_abort_if_oauth_rejected( hass: HomeAssistant, - flow_handler, - local_impl, + flow_handler: type[config_entry_oauth2_flow.AbstractOAuth2FlowHandler], + local_impl: config_entry_oauth2_flow.LocalOAuth2Implementation, hass_client_no_auth: ClientSessionGenerator, ) -> None: """Check bad oauth token.""" @@ -293,8 +306,8 @@ async def test_abort_if_oauth_rejected( @pytest.mark.usefixtures("current_request_with_host") async def test_abort_on_oauth_timeout_error( hass: HomeAssistant, - flow_handler, - local_impl, + flow_handler: type[config_entry_oauth2_flow.AbstractOAuth2FlowHandler], + local_impl: config_entry_oauth2_flow.LocalOAuth2Implementation, hass_client_no_auth: ClientSessionGenerator, aioclient_mock: AiohttpClientMocker, ) -> None: @@ -346,7 +359,11 @@ async def test_abort_on_oauth_timeout_error( assert result["reason"] == "oauth_timeout" -async def test_step_discovery(hass: HomeAssistant, flow_handler, local_impl) -> None: +async def test_step_discovery( + hass: HomeAssistant, + flow_handler: type[config_entry_oauth2_flow.AbstractOAuth2FlowHandler], + local_impl: config_entry_oauth2_flow.LocalOAuth2Implementation, +) -> None: """Check flow triggers from discovery.""" flow_handler.async_register_implementation(hass, local_impl) config_entry_oauth2_flow.async_register_implementation( @@ -364,7 +381,9 @@ async def test_step_discovery(hass: HomeAssistant, flow_handler, local_impl) -> async def test_abort_discovered_multiple( - hass: HomeAssistant, flow_handler, local_impl + hass: HomeAssistant, + flow_handler: type[config_entry_oauth2_flow.AbstractOAuth2FlowHandler], + local_impl: config_entry_oauth2_flow.LocalOAuth2Implementation, ) -> None: """Test if aborts when discovered multiple times.""" flow_handler.async_register_implementation(hass, local_impl) @@ -427,8 +446,8 @@ async def test_abort_discovered_multiple( @pytest.mark.usefixtures("current_request_with_host") async def test_abort_if_oauth_token_error( hass: HomeAssistant, - flow_handler, - local_impl, + flow_handler: type[config_entry_oauth2_flow.AbstractOAuth2FlowHandler], + local_impl: config_entry_oauth2_flow.LocalOAuth2Implementation, hass_client_no_auth: ClientSessionGenerator, aioclient_mock: AiohttpClientMocker, status_code: HTTPStatus, @@ -491,8 +510,8 @@ async def test_abort_if_oauth_token_error( @pytest.mark.usefixtures("current_request_with_host") async def test_abort_if_oauth_token_closing_error( hass: HomeAssistant, - flow_handler, - local_impl, + flow_handler: type[config_entry_oauth2_flow.AbstractOAuth2FlowHandler], + local_impl: config_entry_oauth2_flow.LocalOAuth2Implementation, hass_client_no_auth: ClientSessionGenerator, aioclient_mock: AiohttpClientMocker, caplog: pytest.LogCaptureFixture, @@ -550,7 +569,9 @@ async def test_abort_if_oauth_token_closing_error( async def test_abort_discovered_existing_entries( - hass: HomeAssistant, flow_handler, local_impl + hass: HomeAssistant, + flow_handler: type[config_entry_oauth2_flow.AbstractOAuth2FlowHandler], + local_impl: config_entry_oauth2_flow.LocalOAuth2Implementation, ) -> None: """Test if abort discovery when entries exists.""" flow_handler.async_register_implementation(hass, local_impl) @@ -577,8 +598,8 @@ async def test_abort_discovered_existing_entries( @pytest.mark.usefixtures("current_request_with_host") async def test_full_flow( hass: HomeAssistant, - flow_handler, - local_impl, + flow_handler: type[config_entry_oauth2_flow.AbstractOAuth2FlowHandler], + local_impl: config_entry_oauth2_flow.LocalOAuth2Implementation, hass_client_no_auth: ClientSessionGenerator, aioclient_mock: AiohttpClientMocker, ) -> None: @@ -653,7 +674,9 @@ async def test_full_flow( async def test_local_refresh_token( - hass: HomeAssistant, local_impl, aioclient_mock: AiohttpClientMocker + hass: HomeAssistant, + local_impl: config_entry_oauth2_flow.LocalOAuth2Implementation, + aioclient_mock: AiohttpClientMocker, ) -> None: """Test we can refresh token.""" aioclient_mock.post( @@ -687,7 +710,10 @@ async def test_local_refresh_token( async def test_oauth_session( - hass: HomeAssistant, flow_handler, local_impl, aioclient_mock: AiohttpClientMocker + hass: HomeAssistant, + flow_handler: type[config_entry_oauth2_flow.AbstractOAuth2FlowHandler], + local_impl: config_entry_oauth2_flow.LocalOAuth2Implementation, + aioclient_mock: AiohttpClientMocker, ) -> None: """Test the OAuth2 session helper.""" flow_handler.async_register_implementation(hass, local_impl) @@ -734,7 +760,10 @@ async def test_oauth_session( async def test_oauth_session_with_clock_slightly_out_of_sync( - hass: HomeAssistant, flow_handler, local_impl, aioclient_mock: AiohttpClientMocker + hass: HomeAssistant, + flow_handler: type[config_entry_oauth2_flow.AbstractOAuth2FlowHandler], + local_impl: config_entry_oauth2_flow.LocalOAuth2Implementation, + aioclient_mock: AiohttpClientMocker, ) -> None: """Test the OAuth2 session helper when the remote clock is slightly out of sync.""" flow_handler.async_register_implementation(hass, local_impl) @@ -781,7 +810,10 @@ async def test_oauth_session_with_clock_slightly_out_of_sync( async def test_oauth_session_no_token_refresh_needed( - hass: HomeAssistant, flow_handler, local_impl, aioclient_mock: AiohttpClientMocker + hass: HomeAssistant, + flow_handler: type[config_entry_oauth2_flow.AbstractOAuth2FlowHandler], + local_impl: config_entry_oauth2_flow.LocalOAuth2Implementation, + aioclient_mock: AiohttpClientMocker, ) -> None: """Test the OAuth2 session helper when no refresh is needed.""" flow_handler.async_register_implementation(hass, local_impl) @@ -879,7 +911,10 @@ async def test_implementation_provider(hass: HomeAssistant, local_impl) -> None: async def test_oauth_session_refresh_failure( - hass: HomeAssistant, flow_handler, local_impl, aioclient_mock: AiohttpClientMocker + hass: HomeAssistant, + flow_handler: type[config_entry_oauth2_flow.AbstractOAuth2FlowHandler], + local_impl: config_entry_oauth2_flow.LocalOAuth2Implementation, + aioclient_mock: AiohttpClientMocker, ) -> None: """Test the OAuth2 session helper when no refresh is needed.""" flow_handler.async_register_implementation(hass, local_impl) @@ -908,7 +943,8 @@ async def test_oauth_session_refresh_failure( async def test_oauth2_without_secret_init( - local_impl, hass_client_no_auth: ClientSessionGenerator + local_impl: config_entry_oauth2_flow.LocalOAuth2Implementation, + hass_client_no_auth: ClientSessionGenerator, ) -> None: """Check authorize callback without secret initalizated.""" client = await hass_client_no_auth()