Improve type hints in cloudflare tests (#120344)

This commit is contained in:
epenet 2024-06-24 18:55:36 +02:00 committed by GitHub
parent a4e22bcba6
commit 31157828e1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 41 additions and 37 deletions

View File

@ -3,7 +3,7 @@
from __future__ import annotations
from typing import Any
from unittest.mock import AsyncMock, patch
from unittest.mock import AsyncMock, Mock, patch
import pycfdns
@ -80,25 +80,20 @@ async def init_integration(
return entry
def _get_mock_client(
zone: pycfdns.ZoneModel | UndefinedType = UNDEFINED,
records: list[pycfdns.RecordModel] | UndefinedType = UNDEFINED,
):
client: pycfdns.Client = AsyncMock()
def get_mock_client() -> Mock:
"""Return of Mock of pycfdns.Client."""
client = Mock()
client.list_zones = AsyncMock(
return_value=[MOCK_ZONE if zone is UNDEFINED else zone]
)
client.list_dns_records = AsyncMock(
return_value=MOCK_ZONE_RECORDS if records is UNDEFINED else records
)
client.list_zones = AsyncMock(return_value=[MOCK_ZONE])
client.list_dns_records = AsyncMock(return_value=MOCK_ZONE_RECORDS)
client.update_dns_record = AsyncMock(return_value=None)
return client
def _patch_async_setup_entry(return_value=True):
def patch_async_setup_entry() -> AsyncMock:
"""Patch the async_setup_entry method and return a mock."""
return patch(
"homeassistant.components.cloudflare.async_setup_entry",
return_value=return_value,
return_value=True,
)

View File

@ -1,16 +1,17 @@
"""Define fixtures available for all tests."""
from unittest.mock import patch
from unittest.mock import MagicMock, patch
import pytest
from typing_extensions import Generator
from . import _get_mock_client
from . import get_mock_client
@pytest.fixture
def cfupdate(hass):
def cfupdate() -> Generator[MagicMock]:
"""Mock the CloudflareUpdater for easier testing."""
mock_cfupdate = _get_mock_client()
mock_cfupdate = get_mock_client()
with patch(
"homeassistant.components.cloudflare.pycfdns.Client",
return_value=mock_cfupdate,
@ -19,11 +20,11 @@ def cfupdate(hass):
@pytest.fixture
def cfupdate_flow(hass):
def cfupdate_flow() -> Generator[MagicMock]:
"""Mock the CloudflareUpdater for easier config flow testing."""
mock_cfupdate = _get_mock_client()
mock_cfupdate = get_mock_client()
with patch(
"homeassistant.components.cloudflare.pycfdns.Client",
"homeassistant.components.cloudflare.config_flow.pycfdns.Client",
return_value=mock_cfupdate,
) as mock_api:
yield mock_api

View File

@ -1,5 +1,7 @@
"""Test the Cloudflare config flow."""
from unittest.mock import MagicMock
import pycfdns
from homeassistant.components.cloudflare.const import CONF_RECORDS, DOMAIN
@ -13,13 +15,13 @@ from . import (
USER_INPUT,
USER_INPUT_RECORDS,
USER_INPUT_ZONE,
_patch_async_setup_entry,
patch_async_setup_entry,
)
from tests.common import MockConfigEntry
async def test_user_form(hass: HomeAssistant, cfupdate_flow) -> None:
async def test_user_form(hass: HomeAssistant, cfupdate_flow: MagicMock) -> None:
"""Test we get the user initiated form."""
result = await hass.config_entries.flow.async_init(
@ -49,7 +51,7 @@ async def test_user_form(hass: HomeAssistant, cfupdate_flow) -> None:
assert result["step_id"] == "records"
assert result["errors"] is None
with _patch_async_setup_entry() as mock_setup_entry:
with patch_async_setup_entry() as mock_setup_entry:
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
USER_INPUT_RECORDS,
@ -70,7 +72,9 @@ async def test_user_form(hass: HomeAssistant, cfupdate_flow) -> None:
assert len(mock_setup_entry.mock_calls) == 1
async def test_user_form_cannot_connect(hass: HomeAssistant, cfupdate_flow) -> None:
async def test_user_form_cannot_connect(
hass: HomeAssistant, cfupdate_flow: MagicMock
) -> None:
"""Test we handle cannot connect error."""
instance = cfupdate_flow.return_value
@ -88,7 +92,9 @@ async def test_user_form_cannot_connect(hass: HomeAssistant, cfupdate_flow) -> N
assert result["errors"] == {"base": "cannot_connect"}
async def test_user_form_invalid_auth(hass: HomeAssistant, cfupdate_flow) -> None:
async def test_user_form_invalid_auth(
hass: HomeAssistant, cfupdate_flow: MagicMock
) -> None:
"""Test we handle invalid auth error."""
instance = cfupdate_flow.return_value
@ -107,7 +113,7 @@ async def test_user_form_invalid_auth(hass: HomeAssistant, cfupdate_flow) -> Non
async def test_user_form_unexpected_exception(
hass: HomeAssistant, cfupdate_flow
hass: HomeAssistant, cfupdate_flow: MagicMock
) -> None:
"""Test we handle unexpected exception."""
instance = cfupdate_flow.return_value
@ -140,7 +146,7 @@ async def test_user_form_single_instance_allowed(hass: HomeAssistant) -> None:
assert result["reason"] == "single_instance_allowed"
async def test_reauth_flow(hass: HomeAssistant, cfupdate_flow) -> None:
async def test_reauth_flow(hass: HomeAssistant, cfupdate_flow: MagicMock) -> None:
"""Test the reauthentication configuration flow."""
entry = MockConfigEntry(domain=DOMAIN, data=ENTRY_CONFIG)
entry.add_to_hass(hass)
@ -157,7 +163,7 @@ async def test_reauth_flow(hass: HomeAssistant, cfupdate_flow) -> None:
assert result["type"] is FlowResultType.FORM
assert result["step_id"] == "reauth_confirm"
with _patch_async_setup_entry() as mock_setup_entry:
with patch_async_setup_entry() as mock_setup_entry:
result = await hass.config_entries.flow.async_configure(
result["flow_id"],
{CONF_API_TOKEN: "other_token"},

View File

@ -1,7 +1,7 @@
"""Test the Cloudflare integration."""
from datetime import timedelta
from unittest.mock import patch
from unittest.mock import MagicMock, patch
import pycfdns
import pytest
@ -23,7 +23,7 @@ from . import ENTRY_CONFIG, init_integration
from tests.common import MockConfigEntry, async_fire_time_changed
async def test_unload_entry(hass: HomeAssistant, cfupdate) -> None:
async def test_unload_entry(hass: HomeAssistant, cfupdate: MagicMock) -> None:
"""Test successful unload of entry."""
entry = await init_integration(hass)
@ -42,7 +42,7 @@ async def test_unload_entry(hass: HomeAssistant, cfupdate) -> None:
[pycfdns.ComunicationException()],
)
async def test_async_setup_raises_entry_not_ready(
hass: HomeAssistant, cfupdate, side_effect
hass: HomeAssistant, cfupdate: MagicMock, side_effect: Exception
) -> None:
"""Test that it throws ConfigEntryNotReady when exception occurs during setup."""
instance = cfupdate.return_value
@ -57,7 +57,7 @@ async def test_async_setup_raises_entry_not_ready(
async def test_async_setup_raises_entry_auth_failed(
hass: HomeAssistant, cfupdate
hass: HomeAssistant, cfupdate: MagicMock
) -> None:
"""Test that it throws ConfigEntryAuthFailed when exception occurs during setup."""
instance = cfupdate.return_value
@ -84,7 +84,7 @@ async def test_async_setup_raises_entry_auth_failed(
async def test_integration_services(
hass: HomeAssistant, cfupdate, caplog: pytest.LogCaptureFixture
hass: HomeAssistant, cfupdate: MagicMock, caplog: pytest.LogCaptureFixture
) -> None:
"""Test integration services."""
instance = cfupdate.return_value
@ -120,7 +120,9 @@ async def test_integration_services(
assert "All target records are up to date" not in caplog.text
async def test_integration_services_with_issue(hass: HomeAssistant, cfupdate) -> None:
async def test_integration_services_with_issue(
hass: HomeAssistant, cfupdate: MagicMock
) -> None:
"""Test integration services with issue."""
instance = cfupdate.return_value
@ -145,7 +147,7 @@ async def test_integration_services_with_issue(hass: HomeAssistant, cfupdate) ->
async def test_integration_services_with_nonexisting_record(
hass: HomeAssistant, cfupdate, caplog: pytest.LogCaptureFixture
hass: HomeAssistant, cfupdate: MagicMock, caplog: pytest.LogCaptureFixture
) -> None:
"""Test integration services."""
instance = cfupdate.return_value
@ -185,7 +187,7 @@ async def test_integration_services_with_nonexisting_record(
async def test_integration_update_interval(
hass: HomeAssistant,
cfupdate,
cfupdate: MagicMock,
caplog: pytest.LogCaptureFixture,
) -> None:
"""Test integration update interval."""