Fix websocket_api _state_diff_event using json_encoder_default (#96905)

pull/96904/head^2
J. Nick Koston 2023-07-19 11:22:43 -05:00 committed by GitHub
parent c80085367d
commit dae264f79e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 1 deletions

View File

@ -180,7 +180,10 @@ def _state_diff(
if old_attributes.get(key) != value:
additions.setdefault(COMPRESSED_STATE_ATTRIBUTES, {})[key] = value
if removed := set(old_attributes).difference(new_attributes):
diff[STATE_DIFF_REMOVALS] = {COMPRESSED_STATE_ATTRIBUTES: removed}
# sets are not JSON serializable by default so we convert to list
# here if there are any values to avoid jumping into the json_encoder_default
# for every state diff with a removed attribute
diff[STATE_DIFF_REMOVALS] = {COMPRESSED_STATE_ATTRIBUTES: list(removed)}
return {ENTITY_EVENT_CHANGE: {new_state.entity_id: diff}}

View File

@ -222,6 +222,21 @@ async def test_state_diff_event(hass: HomeAssistant) -> None:
}
}
hass.states.async_set("light.window", "green", {}, context=new_context)
await hass.async_block_till_done()
last_state_event: Event = state_change_events[-1]
new_state: State = last_state_event.data["new_state"]
message = _state_diff_event(last_state_event)
assert message == {
"c": {
"light.window": {
"+": {"lc": new_state.last_changed.timestamp(), "s": "green"},
"-": {"a": ["new"]},
}
}
}
async def test_message_to_json(caplog: pytest.LogCaptureFixture) -> None:
"""Test we can serialize websocket messages."""