117 lines
3.9 KiB
Python
117 lines
3.9 KiB
Python
"""Tests for the AHD-WW-TP1-22 range-hood profile."""
|
|
|
|
from custom_components.localthings.registry.adapter import flatten
|
|
from custom_components.localthings.registry.by_type import for_device_by_model
|
|
from custom_components.localthings.registry.capabilities import range_hood
|
|
from custom_components.localthings.registry.discovery import discover
|
|
from custom_components.localthings.registry.entities import FanDesc
|
|
from tests.conftest import _load_device
|
|
|
|
|
|
def _hood():
|
|
resources = _load_device('range_hood')
|
|
info = resources['/information/vs/0']
|
|
registry = for_device_by_model(
|
|
info['x.com.samsung.da.modelNum'],
|
|
info['x.com.samsung.da.description'],
|
|
)
|
|
return registry, resources
|
|
|
|
|
|
def _state():
|
|
registry, resources = _hood()
|
|
bound = discover(
|
|
resources, registry.capabilities, registry.pattern_capabilities,
|
|
)
|
|
return flatten(bound, resources)
|
|
|
|
|
|
def test_ahd_model_resolves_to_range_hood_registry():
|
|
registry, _ = _hood()
|
|
assert registry is not None
|
|
assert registry.name == 'range_hood'
|
|
|
|
|
|
def test_range_hood_has_no_unbound_hrefs():
|
|
registry, resources = _hood()
|
|
unbound = []
|
|
discover(
|
|
resources,
|
|
registry.capabilities,
|
|
registry.pattern_capabilities,
|
|
log=unbound.append,
|
|
)
|
|
assert unbound == []
|
|
|
|
|
|
def test_range_hood_fixture_values():
|
|
state = _state()
|
|
assert state['fan'] == '14'
|
|
assert state['alarm_code'] == 'none'
|
|
assert state['automatic_operation'] is False
|
|
assert state['lamp'] is False
|
|
assert state['lamp_brightness'] == '2'
|
|
assert state['hood_filter_usage'] == 100
|
|
assert state['hood_filter_status'] == 'wash'
|
|
assert state['energy_kwh'] == 165.62
|
|
assert state['clean_level'] == 2
|
|
assert state['dust'] == 18
|
|
assert state['fine_dust'] == 14
|
|
assert state['super_fine_dust'] == 9
|
|
assert state['periodic_air_sensing'] is False
|
|
assert state['air_sensing_state'] == 'NonProcessing'
|
|
assert state['last_air_sensing_level'] == 'Kr2'
|
|
|
|
|
|
def test_one_composite_fan_is_bound():
|
|
registry, resources = _hood()
|
|
bound = discover(
|
|
resources, registry.capabilities, registry.pattern_capabilities,
|
|
)
|
|
fans = [entity for entity in bound if isinstance(entity.desc, FanDesc)]
|
|
assert len(fans) == 1
|
|
assert fans[0].href == '/hood/fanspeed/vs/0'
|
|
|
|
|
|
def test_fan_write_contract():
|
|
desc = range_hood.HOOD_FAN.entities[0]
|
|
rep = {
|
|
'x.com.samsung.da.hood.supportedFanSpeed': ['14', '15', '16', '17'],
|
|
}
|
|
assert desc.write_fn(('power', True), rep) == (
|
|
['power', '0'], {'value': True},
|
|
)
|
|
assert desc.write_fn(('power', False), rep) == (
|
|
['power', '0'], {'value': False},
|
|
)
|
|
assert desc.write_fn(('power', True, '/power/vs/0'), rep) == (
|
|
['power', 'vs', '0'], {'x.com.samsung.da.power': 'On'},
|
|
)
|
|
assert desc.write_fn(('power', False, '/power/vs/0'), rep) == (
|
|
['power', 'vs', '0'], {'x.com.samsung.da.power': 'Off'},
|
|
)
|
|
assert desc.write_fn(('power', True, '/not-a-power-resource'), rep) is None
|
|
assert desc.write_fn(('speed', '16'), rep) == (
|
|
['hood', 'fanspeed', 'vs', '0'],
|
|
{'x.com.samsung.da.hood.fanSpeed': '16'},
|
|
)
|
|
assert desc.write_fn(('speed', '99'), rep) is None
|
|
|
|
|
|
def test_lamp_write_contract():
|
|
lamp, brightness = range_hood.HOOD_LAMP.entities
|
|
rep = {'x.com.samsung.lamp.range': ['1', '2']}
|
|
assert lamp.write_fn('On', rep) == (
|
|
['hood', 'lamp', 'vs', '0'], {'x.com.samsung.lamp.power': 'On'},
|
|
)
|
|
assert lamp.write_fn('Off', rep) == (
|
|
['hood', 'lamp', 'vs', '0'], {'x.com.samsung.lamp.power': 'Off'},
|
|
)
|
|
assert brightness.write_fn('1', rep) == (
|
|
['hood', 'lamp', 'vs', '0'], {'x.com.samsung.lamp.current': '1'},
|
|
)
|
|
assert brightness.write_fn('2', rep) == (
|
|
['hood', 'lamp', 'vs', '0'], {'x.com.samsung.lamp.current': '2'},
|
|
)
|
|
assert brightness.write_fn('Unsupported', rep) is None
|