Add tests for LitterRobot sensors (#78638)

This commit is contained in:
Robert Hillis 2022-09-19 00:12:38 -04:00 committed by GitHub
parent 9655f30146
commit aa0cbf0afe
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 191 additions and 9 deletions

View file

@ -4,26 +4,35 @@ from __future__ import annotations
from typing import Any
from unittest.mock import AsyncMock, MagicMock, patch
from pylitterbot import Account, LitterRobot3, Robot
from pylitterbot import Account, FeederRobot, LitterRobot3, LitterRobot4, Robot
from pylitterbot.exceptions import InvalidCommandException
import pytest
from homeassistant.components import litterrobot
from homeassistant.core import HomeAssistant
from .common import CONFIG, ROBOT_DATA
from .common import CONFIG, FEEDER_ROBOT_DATA, ROBOT_4_DATA, ROBOT_DATA
from tests.common import MockConfigEntry
def create_mock_robot(
robot_data: dict | None, account: Account, side_effect: Any | None = None
robot_data: dict | None,
account: Account,
v4: bool,
feeder: bool,
side_effect: Any | None = None,
) -> Robot:
"""Create a mock Litter-Robot device."""
if not robot_data:
robot_data = {}
robot = LitterRobot3(data={**ROBOT_DATA, **robot_data}, account=account)
if v4:
robot = LitterRobot4(data={**ROBOT_4_DATA, **robot_data}, account=account)
elif feeder:
robot = FeederRobot(data={**FEEDER_ROBOT_DATA, **robot_data}, account=account)
else:
robot = LitterRobot3(data={**ROBOT_DATA, **robot_data}, account=account)
robot.start_cleaning = AsyncMock(side_effect=side_effect)
robot.set_power_status = AsyncMock(side_effect=side_effect)
robot.reset_waste_drawer = AsyncMock(side_effect=side_effect)
@ -39,13 +48,17 @@ def create_mock_account(
robot_data: dict | None = None,
side_effect: Any | None = None,
skip_robots: bool = False,
v4: bool = False,
feeder: bool = False,
) -> MagicMock:
"""Create a mock Litter-Robot account."""
account = MagicMock(spec=Account)
account.connect = AsyncMock()
account.refresh_robots = AsyncMock()
account.robots = (
[] if skip_robots else [create_mock_robot(robot_data, account, side_effect)]
[]
if skip_robots
else [create_mock_robot(robot_data, account, v4, feeder, side_effect)]
)
return account
@ -56,6 +69,18 @@ def mock_account() -> MagicMock:
return create_mock_account()
@pytest.fixture
def mock_account_with_litterrobot_4() -> MagicMock:
"""Mock account with Litter-Robot 4."""
return create_mock_account(v4=True)
@pytest.fixture
def mock_account_with_feederrobot() -> MagicMock:
"""Mock account with Feeder-Robot."""
return create_mock_account(feeder=True)
@pytest.fixture
def mock_account_with_no_robots() -> MagicMock:
"""Mock a Litter-Robot account."""