1
mirror of https://github.com/home-assistant/core synced 2024-09-15 17:29:45 +02:00
ha-core/tests/helpers/test_json.py

121 lines
3.1 KiB
Python

"""Test Home Assistant remote methods and classes."""
import datetime
import json
import time
from typing import NamedTuple
import pytest
from homeassistant import core
from homeassistant.helpers.json import (
ExtendedJSONEncoder,
JSONEncoder,
json_dumps,
json_dumps_sorted,
)
from homeassistant.util import dt as dt_util
from homeassistant.util.color import RGBColor
@pytest.mark.parametrize("encoder", (JSONEncoder, ExtendedJSONEncoder))
def test_json_encoder(hass, encoder):
"""Test the JSON encoders."""
ha_json_enc = encoder()
state = core.State("test.test", "hello")
# Test serializing a datetime
now = dt_util.utcnow()
assert ha_json_enc.default(now) == now.isoformat()
# Test serializing a set()
data = {"milk", "beer"}
assert sorted(ha_json_enc.default(data)) == sorted(data)
# Test serializing an object which implements as_dict
assert ha_json_enc.default(state) == state.as_dict()
def test_json_encoder_raises(hass):
"""Test the JSON encoder raises on unsupported types."""
ha_json_enc = JSONEncoder()
# Default method raises TypeError if non HA object
with pytest.raises(TypeError):
ha_json_enc.default(1)
def test_extended_json_encoder(hass):
"""Test the extended JSON encoder."""
ha_json_enc = ExtendedJSONEncoder()
# Test serializing a timedelta
data = datetime.timedelta(
days=50,
seconds=27,
microseconds=10,
milliseconds=29000,
minutes=5,
hours=8,
weeks=2,
)
assert ha_json_enc.default(data) == {
"__type": str(type(data)),
"total_seconds": data.total_seconds(),
}
# Test serializing a time
o = datetime.time(7, 20)
assert ha_json_enc.default(o) == {"__type": str(type(o)), "isoformat": "07:20:00"}
# Test serializing a date
o = datetime.date(2021, 12, 24)
assert ha_json_enc.default(o) == {"__type": str(type(o)), "isoformat": "2021-12-24"}
# Default method falls back to repr(o)
o = object()
assert ha_json_enc.default(o) == {"__type": str(type(o)), "repr": repr(o)}
def test_json_dumps_sorted():
"""Test the json dumps sorted function."""
data = {"c": 3, "a": 1, "b": 2}
assert json_dumps_sorted(data) == json.dumps(
data, sort_keys=True, separators=(",", ":")
)
def test_json_dumps_float_subclass():
"""Test the json dumps a float subclass."""
class FloatSubclass(float):
"""A float subclass."""
assert json_dumps({"c": FloatSubclass(1.2)}) == '{"c":1.2}'
def test_json_dumps_tuple_subclass():
"""Test the json dumps a tuple subclass."""
tt = time.struct_time((1999, 3, 17, 32, 44, 55, 2, 76, 0))
assert json_dumps(tt) == "[1999,3,17,32,44,55,2,76,0]"
def test_json_dumps_named_tuple_subclass():
"""Test the json dumps a tuple subclass."""
class NamedTupleSubclass(NamedTuple):
"""A NamedTuple subclass."""
name: str
nts = NamedTupleSubclass("a")
assert json_dumps(nts) == '["a"]'
def test_json_dumps_rgb_color_subclass():
"""Test the json dumps of RGBColor."""
rgb = RGBColor(4, 2, 1)
assert json_dumps(rgb) == "[4,2,1]"