core/tests/components/seventeentrack/test_services.py

208 lines
5.8 KiB
Python
Raw Normal View History

"""Tests for the seventeentrack service."""
from unittest.mock import AsyncMock
import pytest
from syrupy import SnapshotAssertion
from homeassistant.components.seventeentrack import DOMAIN
from homeassistant.components.seventeentrack.const import (
SERVICE_ARCHIVE_PACKAGE,
SERVICE_GET_PACKAGES,
)
from homeassistant.config_entries import ConfigEntryState
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import device_registry as dr
from . import init_integration
from .conftest import (
ARCHIVE_PACKAGE_NUMBER,
CONFIG_ENTRY_ID_KEY,
PACKAGE_STATE_KEY,
PACKAGE_TRACKING_NUMBER_KEY,
get_package,
)
from tests.common import MockConfigEntry
async def test_get_packages_from_list(
hass: HomeAssistant,
mock_seventeentrack: AsyncMock,
mock_config_entry: MockConfigEntry,
snapshot: SnapshotAssertion,
) -> None:
"""Ensure service returns only the packages in the list."""
await _mock_packages(mock_seventeentrack)
await init_integration(hass, mock_config_entry)
service_response = await hass.services.async_call(
DOMAIN,
SERVICE_GET_PACKAGES,
{
CONFIG_ENTRY_ID_KEY: mock_config_entry.entry_id,
PACKAGE_STATE_KEY: ["in_transit", "delivered"],
},
blocking=True,
return_response=True,
)
assert service_response == snapshot
async def test_get_all_packages(
hass: HomeAssistant,
mock_seventeentrack: AsyncMock,
mock_config_entry: MockConfigEntry,
snapshot: SnapshotAssertion,
) -> None:
"""Ensure service returns all packages when non provided."""
await _mock_packages(mock_seventeentrack)
await init_integration(hass, mock_config_entry)
service_response = await hass.services.async_call(
DOMAIN,
SERVICE_GET_PACKAGES,
{
CONFIG_ENTRY_ID_KEY: mock_config_entry.entry_id,
},
blocking=True,
return_response=True,
)
assert service_response == snapshot
async def test_service_called_with_unloaded_entry(
hass: HomeAssistant,
mock_seventeentrack: AsyncMock,
mock_config_entry: MockConfigEntry,
snapshot: SnapshotAssertion,
) -> None:
"""Test service call with not ready config entry."""
await init_integration(hass, mock_config_entry)
mock_config_entry.mock_state(hass, ConfigEntryState.SETUP_ERROR)
with pytest.raises(HomeAssistantError):
await hass.services.async_call(
DOMAIN,
SERVICE_GET_PACKAGES,
{
CONFIG_ENTRY_ID_KEY: mock_config_entry.entry_id,
},
blocking=True,
return_response=True,
)
async def test_service_called_with_non_17track_device(
hass: HomeAssistant,
mock_seventeentrack: AsyncMock,
mock_config_entry: MockConfigEntry,
snapshot: SnapshotAssertion,
device_registry: dr.DeviceRegistry,
) -> None:
"""Test service calls with non 17Track device."""
await init_integration(hass, mock_config_entry)
other_domain = "Not17Track"
other_config_id = "555"
other_mock_config_entry = MockConfigEntry(
title="Not 17Track", domain=other_domain, entry_id=other_config_id
)
other_mock_config_entry.add_to_hass(hass)
device_entry = device_registry.async_get_or_create(
config_entry_id=other_config_id,
identifiers={(other_domain, "1")},
)
with pytest.raises(HomeAssistantError):
await hass.services.async_call(
DOMAIN,
SERVICE_GET_PACKAGES,
{
CONFIG_ENTRY_ID_KEY: device_entry.id,
},
blocking=True,
return_response=True,
)
async def test_archive_package(
hass: HomeAssistant,
mock_seventeentrack: AsyncMock,
mock_config_entry: MockConfigEntry,
snapshot: SnapshotAssertion,
) -> None:
"""Ensure service archives package."""
await _mock_packages(mock_seventeentrack)
await init_integration(hass, mock_config_entry)
await hass.services.async_call(
DOMAIN,
SERVICE_ARCHIVE_PACKAGE,
{
CONFIG_ENTRY_ID_KEY: mock_config_entry.entry_id,
PACKAGE_TRACKING_NUMBER_KEY: ARCHIVE_PACKAGE_NUMBER,
},
blocking=True,
)
mock_seventeentrack.return_value.profile.archive_package.assert_called_once_with(
ARCHIVE_PACKAGE_NUMBER
)
async def test_packages_with_none_timestamp(
hass: HomeAssistant,
mock_seventeentrack: AsyncMock,
mock_config_entry: MockConfigEntry,
snapshot: SnapshotAssertion,
) -> None:
"""Ensure service returns all packages when non provided."""
await _mock_invalid_packages(mock_seventeentrack)
await init_integration(hass, mock_config_entry)
service_response = await hass.services.async_call(
DOMAIN,
SERVICE_GET_PACKAGES,
{
CONFIG_ENTRY_ID_KEY: mock_config_entry.entry_id,
},
blocking=True,
return_response=True,
)
assert service_response == snapshot
async def _mock_packages(mock_seventeentrack):
package1 = get_package(status=10)
package2 = get_package(
tracking_number="789",
friendly_name="friendly name 2",
status=40,
)
package3 = get_package(
tracking_number="123",
friendly_name="friendly name 3",
status=20,
)
mock_seventeentrack.return_value.profile.packages.return_value = [
package1,
package2,
package3,
]
async def _mock_invalid_packages(mock_seventeentrack):
package1 = get_package(
status=10,
timestamp=None,
)
package2 = get_package(
tracking_number="789",
friendly_name="friendly name 2",
status=40,
)
mock_seventeentrack.return_value.profile.packages.return_value = [
package1,
package2,
]