Complete coverage for doorbird init (#122272)

This commit is contained in:
J. Nick Koston 2024-07-22 06:57:43 -05:00 committed by GitHub
parent d421525f1b
commit bd97a09cae
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 57 additions and 2 deletions

View File

@ -39,6 +39,7 @@ def get_mock_doorbird_api(
info: dict[str, Any] | None = None, info: dict[str, Any] | None = None,
info_side_effect: Exception | None = None, info_side_effect: Exception | None = None,
schedule: list[DoorBirdScheduleEntry] | None = None, schedule: list[DoorBirdScheduleEntry] | None = None,
favorites_side_effect: Exception | None = None,
) -> DoorBird: ) -> DoorBird:
"""Return a mock DoorBirdAPI object with return values.""" """Return a mock DoorBirdAPI object with return values."""
doorbirdapi_mock = MagicMock(spec_set=DoorBird) doorbirdapi_mock = MagicMock(spec_set=DoorBird)
@ -46,7 +47,8 @@ def get_mock_doorbird_api(
side_effect=info_side_effect, return_value=info side_effect=info_side_effect, return_value=info
) )
type(doorbirdapi_mock).favorites = AsyncMock( type(doorbirdapi_mock).favorites = AsyncMock(
return_value={"http": {"x": {"value": "http://webhook"}}} side_effect=favorites_side_effect,
return_value={"http": {"x": {"value": "http://webhook"}}},
) )
type(doorbirdapi_mock).change_favorite = AsyncMock(return_value=True) type(doorbirdapi_mock).change_favorite = AsyncMock(return_value=True)
type(doorbirdapi_mock).schedule = AsyncMock(return_value=schedule) type(doorbirdapi_mock).schedule = AsyncMock(return_value=schedule)

View File

@ -81,6 +81,7 @@ async def doorbird_mocker(
info: dict[str, Any] | None = None, info: dict[str, Any] | None = None,
info_side_effect: Exception | None = None, info_side_effect: Exception | None = None,
schedule: list[DoorBirdScheduleEntry] | None = None, schedule: list[DoorBirdScheduleEntry] | None = None,
favorites_side_effect: Exception | None = None,
) -> MockDoorbirdEntry: ) -> MockDoorbirdEntry:
"""Create a MockDoorbirdEntry from defaults or specific values.""" """Create a MockDoorbirdEntry from defaults or specific values."""
entry = entry or MockConfigEntry( entry = entry or MockConfigEntry(
@ -93,6 +94,7 @@ async def doorbird_mocker(
info=info or doorbird_info, info=info or doorbird_info,
info_side_effect=info_side_effect, info_side_effect=info_side_effect,
schedule=schedule or doorbird_schedule, schedule=schedule or doorbird_schedule,
favorites_side_effect=favorites_side_effect,
) )
entry.add_to_hass(hass) entry.add_to_hass(hass)
with patch_doorbird_api_entry_points(api): with patch_doorbird_api_entry_points(api):

View File

@ -1,10 +1,12 @@
"""Test DoorBird init.""" """Test DoorBird init."""
import pytest
from homeassistant.components.doorbird.const import DOMAIN from homeassistant.components.doorbird.const import DOMAIN
from homeassistant.config_entries import ConfigEntryState from homeassistant.config_entries import ConfigEntryState
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from . import mock_unauthorized_exception from . import mock_not_found_exception, mock_unauthorized_exception
from .conftest import DoorbirdMockerType from .conftest import DoorbirdMockerType
@ -30,3 +32,52 @@ async def test_auth_fails(
flows = hass.config_entries.flow.async_progress(DOMAIN) flows = hass.config_entries.flow.async_progress(DOMAIN)
assert len(flows) == 1 assert len(flows) == 1
assert flows[0]["step_id"] == "reauth_confirm" assert flows[0]["step_id"] == "reauth_confirm"
@pytest.mark.parametrize(
"side_effect",
[OSError, mock_not_found_exception()],
)
async def test_http_info_request_fails(
doorbird_mocker: DoorbirdMockerType, side_effect: Exception
) -> None:
"""Test basic setup with an http failure."""
doorbird_entry = await doorbird_mocker(info_side_effect=side_effect)
assert doorbird_entry.entry.state is ConfigEntryState.SETUP_RETRY
async def test_http_favorites_request_fails(
doorbird_mocker: DoorbirdMockerType,
) -> None:
"""Test basic setup with an http failure."""
doorbird_entry = await doorbird_mocker(
favorites_side_effect=mock_not_found_exception()
)
assert doorbird_entry.entry.state is ConfigEntryState.SETUP_RETRY
async def test_events_changed(
hass: HomeAssistant,
doorbird_mocker: DoorbirdMockerType,
) -> None:
"""Test basic setup."""
doorbird_entry = await doorbird_mocker()
entry = doorbird_entry.entry
assert entry.state is ConfigEntryState.LOADED
api = doorbird_entry.api
api.favorites.reset_mock()
api.change_favorite.reset_mock()
api.schedule.reset_mock()
hass.config_entries.async_update_entry(entry, options={"events": ["xyz"]})
await hass.async_block_till_done()
assert len(api.favorites.mock_calls) == 2
assert len(api.schedule.mock_calls) == 1
assert len(api.change_favorite.mock_calls) == 1
favorite_type, title, url = api.change_favorite.mock_calls[0][1]
assert favorite_type == "http"
assert title == "Home Assistant (mydoorbird_xyz)"
assert url == (
f"http://10.10.10.10:8123/api/doorbird/mydoorbird_xyz?token={entry.entry_id}"
)