mirror of https://github.com/home-assistant/core
208 lines
5.8 KiB
Python
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,
|
|
]
|