diff --git a/homeassistant/components/diagnostics/util.py b/homeassistant/components/diagnostics/util.py index d849dc052e4..6154dd14bd2 100644 --- a/homeassistant/components/diagnostics/util.py +++ b/homeassistant/components/diagnostics/util.py @@ -2,19 +2,24 @@ from __future__ import annotations from collections.abc import Iterable, Mapping -from typing import Any +from typing import Any, TypeVar, cast from homeassistant.core import callback from .const import REDACTED +T = TypeVar("T") + @callback -def async_redact_data(data: Mapping, to_redact: Iterable[Any]) -> dict[str, Any]: +def async_redact_data(data: T, to_redact: Iterable[Any]) -> T: """Redact sensitive data in a dict.""" if not isinstance(data, (Mapping, list)): return data + if isinstance(data, list): + return cast(T, [async_redact_data(val, to_redact) for val in data]) + redacted = {**data} for key, value in redacted.items(): @@ -25,4 +30,4 @@ def async_redact_data(data: Mapping, to_redact: Iterable[Any]) -> dict[str, Any] elif isinstance(value, list): redacted[key] = [async_redact_data(item, to_redact) for item in value] - return redacted + return cast(T, redacted) diff --git a/tests/components/diagnostics/test_util.py b/tests/components/diagnostics/test_util.py new file mode 100644 index 00000000000..702b838334f --- /dev/null +++ b/tests/components/diagnostics/test_util.py @@ -0,0 +1,33 @@ +"""Test Diagnostics utils.""" +from homeassistant.components.diagnostics import REDACTED, async_redact_data + + +def test_redact(): + """Test the async_redact_data helper.""" + data = { + "key1": "value1", + "key2": ["value2_a", "value2_b"], + "key3": [["value_3a", "value_3b"], ["value_3c", "value_3d"]], + "key4": { + "key4_1": "value4_1", + "key4_2": ["value4_2a", "value4_2b"], + "key4_3": [["value4_3a", "value4_3b"], ["value4_3c", "value4_3d"]], + }, + } + + to_redact = { + "key1", + "key3", + "key4_1", + } + + assert async_redact_data(data, to_redact) == { + "key1": REDACTED, + "key2": ["value2_a", "value2_b"], + "key3": REDACTED, + "key4": { + "key4_1": REDACTED, + "key4_2": ["value4_2a", "value4_2b"], + "key4_3": [["value4_3a", "value4_3b"], ["value4_3c", "value4_3d"]], + }, + }