121 lines
3.1 KiB
Python
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]"
|