Fix issue when timestamp is None (#130133)

Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>
pull/130150/head
Shai Ungar 2024-11-08 17:15:28 +02:00 committed by GitHub
parent 14285973b8
commit c4762f3ff4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 86 additions and 14 deletions

View File

@ -1,8 +1,8 @@
"""Services for the seventeentrack integration."""
from typing import Final
from typing import Any, Final
from pyseventeentrack.package import PACKAGE_STATUS_MAP
from pyseventeentrack.package import PACKAGE_STATUS_MAP, Package
import voluptuous as vol
from homeassistant.config_entries import ConfigEntry, ConfigEntryState
@ -81,18 +81,7 @@ def setup_services(hass: HomeAssistant) -> None:
return {
"packages": [
{
ATTR_DESTINATION_COUNTRY: package.destination_country,
ATTR_ORIGIN_COUNTRY: package.origin_country,
ATTR_PACKAGE_TYPE: package.package_type,
ATTR_TRACKING_INFO_LANGUAGE: package.tracking_info_language,
ATTR_TRACKING_NUMBER: package.tracking_number,
ATTR_LOCATION: package.location,
ATTR_STATUS: package.status,
ATTR_TIMESTAMP: package.timestamp.isoformat(),
ATTR_INFO_TEXT: package.info_text,
ATTR_FRIENDLY_NAME: package.friendly_name,
}
package_to_dict(package)
for package in live_packages
if slugify(package.status) in package_states or package_states == []
]
@ -110,6 +99,22 @@ def setup_services(hass: HomeAssistant) -> None:
await seventeen_coordinator.client.profile.archive_package(tracking_number)
def package_to_dict(package: Package) -> dict[str, Any]:
result = {
ATTR_DESTINATION_COUNTRY: package.destination_country,
ATTR_ORIGIN_COUNTRY: package.origin_country,
ATTR_PACKAGE_TYPE: package.package_type,
ATTR_TRACKING_INFO_LANGUAGE: package.tracking_info_language,
ATTR_TRACKING_NUMBER: package.tracking_number,
ATTR_LOCATION: package.location,
ATTR_STATUS: package.status,
ATTR_INFO_TEXT: package.info_text,
ATTR_FRIENDLY_NAME: package.friendly_name,
}
if timestamp := package.timestamp:
result[ATTR_TIMESTAMP] = timestamp.isoformat()
return result
async def _validate_service(config_entry_id):
entry: ConfigEntry | None = hass.config_entries.async_get_entry(config_entry_id)
if not entry:

View File

@ -71,3 +71,32 @@
]),
})
# ---
# name: test_packages_with_none_timestamp
dict({
'packages': list([
dict({
'destination_country': 'Belgium',
'friendly_name': 'friendly name 1',
'info_text': 'info text 1',
'location': 'location 1',
'origin_country': 'Belgium',
'package_type': 'Registered Parcel',
'status': 'In Transit',
'tracking_info_language': 'Unknown',
'tracking_number': '456',
}),
dict({
'destination_country': 'Belgium',
'friendly_name': 'friendly name 2',
'info_text': 'info text 1',
'location': 'location 1',
'origin_country': 'Belgium',
'package_type': 'Registered Parcel',
'status': 'Delivered',
'timestamp': '2020-08-10T10:32:00+00:00',
'tracking_info_language': 'Unknown',
'tracking_number': '789',
}),
]),
})
# ---

View File

@ -150,6 +150,28 @@ async def test_archive_package(
)
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(
@ -167,3 +189,19 @@ async def _mock_packages(mock_seventeentrack):
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,
]