1
0
mirror of https://github.com/home-assistant/core.git synced 2026-06-30 03:06:10 +01:00
Files

135 lines
4.1 KiB
Python

"""Tests for switchbot_cloud service."""
from unittest.mock import AsyncMock, patch
import pytest
from switchbot_api import SwitchBotAPI
import voluptuous as vol
from homeassistant.components.switchbot_cloud.const import (
AI_ART_FRAME_UPLOAD_IMAGE_SERVICE,
DOMAIN,
)
from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ServiceValidationError
from homeassistant.helpers import device_registry as dr
from . import AI_ART_FRAME_DEVICE, configure_integration
async def _setup(
hass: HomeAssistant,
mock_list_devices,
mock_get_status,
device=AI_ART_FRAME_DEVICE,
):
"""Load default entry."""
mock_list_devices.return_value = [device]
mock_get_status.return_value = None
with patch("homeassistant.components.switchbot_cloud.PLATFORMS", [Platform.SWITCH]):
entry = await configure_integration(hass)
assert entry.state is ConfigEntryState.LOADED
return entry
async def test_upload_image_success(
hass: HomeAssistant,
device_registry: dr.DeviceRegistry,
mock_list_devices,
mock_get_status,
mock_setup_webhook,
) -> None:
"""Test successful image upload to AI Art Frame."""
entry = await _setup(hass, mock_list_devices, mock_get_status)
device = device_registry.async_get_or_create(
config_entry_id=entry.entry_id,
identifiers={(DOMAIN, "AABBCCDDEEFF")},
name="test-art-frame",
model="AI Art Frame",
)
with (
patch.object(SwitchBotAPI, "send_command") as mock_send_command,
):
await hass.services.async_call(
DOMAIN,
AI_ART_FRAME_UPLOAD_IMAGE_SERVICE,
{"device_id": device.id, "image_url": "https://example.com/img.jpg"},
blocking=True,
)
mock_send_command.assert_awaited_once_with(
device_id="AABBCCDDEEFF",
command="uploadImage",
command_type="command",
parameters={"imageUrl": "https://example.com/img.jpg"},
)
async def test_upload_image_no_device_id_raises(
hass: HomeAssistant,
mock_list_devices,
mock_get_status,
mock_setup_webhook,
) -> None:
"""Test service raises when no device_id is provided."""
await _setup(hass, mock_list_devices, mock_get_status)
with pytest.raises(vol.Invalid):
await hass.services.async_call(
DOMAIN,
AI_ART_FRAME_UPLOAD_IMAGE_SERVICE,
{"image_url": "https://example.com/img.jpg"},
blocking=True,
)
async def test_device_not_in_registry_skips(
hass: HomeAssistant,
mock_list_devices,
mock_get_status,
mock_setup_webhook,
) -> None:
"""Test service skips when device_id is not found in device registry."""
entry = await _setup(hass, mock_list_devices, mock_get_status)
with patch.object(
entry.runtime_data.api, "send_command", new_callable=AsyncMock
) as mock_send:
await hass.services.async_call(
DOMAIN,
AI_ART_FRAME_UPLOAD_IMAGE_SERVICE,
{
"device_id": "nonexistent-device-id",
"image_url": "https://example.com/img.jpg",
},
blocking=True,
)
mock_send.assert_not_awaited()
async def test_device_without_mac_raises_service_validation_error(
hass: HomeAssistant,
device_registry: dr.DeviceRegistry,
mock_list_devices,
mock_get_status,
mock_setup_webhook,
) -> None:
"""Test service device without mac."""
entry = await _setup(hass, mock_list_devices, mock_get_status)
device_no_mac = device_registry.async_get_or_create(
config_entry_id=entry.entry_id,
identifiers={("other_integration", "some-id")},
name="no-mac-device",
)
with pytest.raises(ServiceValidationError, match="No valid MAC address obtained"):
await hass.services.async_call(
DOMAIN,
AI_ART_FRAME_UPLOAD_IMAGE_SERVICE,
{
"device_id": [device_no_mac.id],
"image_url": "https://example.com/img.jpg",
},
blocking=True,
)