Add Diagnostics to PlayStation Network (#147607)

* Add Diagnostics support to PlayStation_Network

* Remove unused constant

* minor cleanup

* Redact additional data

* Redact additional data
This commit is contained in:
Jack Powell 2025-06-26 14:52:07 -04:00 committed by Franck Nijhof
parent 263823c92c
commit efb29d024e
No known key found for this signature in database
GPG Key ID: AB33ADACE7101952
4 changed files with 163 additions and 1 deletions

View File

@ -0,0 +1,55 @@
"""Diagnostics support for PlayStation Network."""
from __future__ import annotations
from dataclasses import asdict
from typing import Any
from psnawp_api.models.trophies import PlatformType
from homeassistant.components.diagnostics import async_redact_data
from homeassistant.core import HomeAssistant
from .coordinator import PlaystationNetworkConfigEntry, PlaystationNetworkCoordinator
TO_REDACT = {
"account_id",
"firstName",
"lastName",
"middleName",
"onlineId",
"url",
"username",
}
async def async_get_config_entry_diagnostics(
hass: HomeAssistant, entry: PlaystationNetworkConfigEntry
) -> dict[str, Any]:
"""Return diagnostics for a config entry."""
coordinator: PlaystationNetworkCoordinator = entry.runtime_data
return {
"data": async_redact_data(
_serialize_platform_types(asdict(coordinator.data)), TO_REDACT
),
}
def _serialize_platform_types(data: Any) -> Any:
"""Recursively convert PlatformType enums to strings in dicts and sets."""
if isinstance(data, dict):
return {
(
platform.value if isinstance(platform, PlatformType) else platform
): _serialize_platform_types(record)
for platform, record in data.items()
}
if isinstance(data, set):
return [
record.value if isinstance(record, PlatformType) else record
for record in data
]
if isinstance(data, PlatformType):
return data.value
return data

View File

@ -44,7 +44,7 @@ rules:
# Gold
devices: done
diagnostics: todo
diagnostics: done
discovery-update-info:
status: exempt
comment: Discovery flow is not applicable for this integration

View File

@ -0,0 +1,79 @@
# serializer version: 1
# name: test_diagnostics
dict({
'data': dict({
'account_id': '**REDACTED**',
'active_sessions': dict({
'PS5': dict({
'format': 'PS5',
'media_image_url': 'https://image.api.playstation.com/vulcan/ap/rnd/202211/2222/l8QTN7ThQK3lRBHhB3nX1s7h.png',
'platform': 'PS5',
'status': 'online',
'title_id': 'PPSA07784_00',
'title_name': 'STAR WARS Jedi: Survivor™',
}),
}),
'available': True,
'presence': dict({
'basicPresence': dict({
'availability': 'availableToPlay',
'gameTitleInfoList': list([
dict({
'conceptIconUrl': 'https://image.api.playstation.com/vulcan/ap/rnd/202211/2222/l8QTN7ThQK3lRBHhB3nX1s7h.png',
'format': 'PS5',
'launchPlatform': 'PS5',
'npTitleId': 'PPSA07784_00',
'titleName': 'STAR WARS Jedi: Survivor™',
}),
]),
'primaryPlatformInfo': dict({
'onlineStatus': 'online',
'platform': 'PS5',
}),
}),
}),
'profile': dict({
'aboutMe': 'Never Gonna Give You Up',
'avatars': list([
dict({
'size': 'xl',
'url': '**REDACTED**',
}),
]),
'isMe': True,
'isOfficiallyVerified': False,
'isPlus': True,
'languages': list([
'de-DE',
]),
'onlineId': '**REDACTED**',
'personalDetail': dict({
'firstName': '**REDACTED**',
'lastName': '**REDACTED**',
'profilePictures': list([
dict({
'size': 'xl',
'url': '**REDACTED**',
}),
]),
}),
}),
'registered_platforms': list([
'PS5',
]),
'trophy_summary': dict({
'account_id': '**REDACTED**',
'earned_trophies': dict({
'bronze': 14450,
'gold': 11754,
'platinum': 1398,
'silver': 8722,
}),
'progress': 19,
'tier': 10,
'trophy_level': 1079,
}),
'username': '**REDACTED**',
}),
})
# ---

View File

@ -0,0 +1,28 @@
"""Tests for PlayStation Network diagnostics."""
import pytest
from syrupy.assertion import SnapshotAssertion
from homeassistant.core import HomeAssistant
from tests.common import MockConfigEntry
from tests.components.diagnostics import get_diagnostics_for_config_entry
from tests.typing import ClientSessionGenerator
@pytest.mark.usefixtures("mock_psnawpapi")
async def test_diagnostics(
hass: HomeAssistant,
hass_client: ClientSessionGenerator,
config_entry: MockConfigEntry,
snapshot: SnapshotAssertion,
) -> None:
"""Test diagnostics."""
config_entry.add_to_hass(hass)
await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
assert (
await get_diagnostics_for_config_entry(hass, hass_client, config_entry)
== snapshot
)