core/tests/components/seventeentrack/test_services.py

208 lines
5.8 KiB
Python

"""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,
]