AUTO_DOOR_SINGLE/KIMCHI/WINECELLAR were identical one-line no-entity Capability declarations differing only by href. Replaced with AUTO_DOOR_VARIANT, a pattern cap keyed on href_prefix='/autodoor/' and gated by match_fn (presence of ado.openOptions) rather than the prefix alone, so it only claims the variant-declaration hrefs and not /autodoor/timer/vs/0 -- which doesn't matter in practice anyway, since that href's own exact-href AUTO_DOOR_TIMER cap always wins first. Registry-scoped (refrigerator.py's own pattern_capabilities list), not global ignored.py -- the unknown-device-type fallback that motivates ignored.py's 'exact hrefs only' rule never reaches this registry, so the same constraint doesn't apply. A fourth fridge sub-type reporting this feature at a new href now needs no code change to stay covered.
81 lines
3.0 KiB
Python
81 lines
3.0 KiB
Python
"""Wine-cellar refrigerator variant (issue #328, x.com.st.d.winecellar
|
|
device type -- RW33C99B1TFG-class, TP1X_REF_21K board). Auto Door Open's
|
|
winecellar-specific declaration href, a deodorizing filter reported at a
|
|
different href than the regular AIR_FILTER, a multi-compartment pantry
|
|
select, and a table-revision info resource -- all new coverage this dump
|
|
surfaced.
|
|
"""
|
|
|
|
from custom_components.localthings.registry.adapter import flatten
|
|
from custom_components.localthings.registry.by_type import for_device_by_oic_type, resolve
|
|
from custom_components.localthings.registry.capabilities import fridge
|
|
from custom_components.localthings.registry.discovery import discover
|
|
from tests.conftest import _load_device
|
|
|
|
FIXTURE = "refrigerator_winecellar"
|
|
DEVICE_TYPES = ("oic.wk.d", "x.com.st.d.winecellar")
|
|
|
|
|
|
def _fridge():
|
|
resources = _load_device(FIXTURE)
|
|
reg = resolve(resources, device_types=DEVICE_TYPES)
|
|
return reg, resources
|
|
|
|
|
|
def _state():
|
|
reg, resources = _fridge()
|
|
bound = discover(resources, reg.capabilities, reg.pattern_capabilities)
|
|
return flatten(bound, resources)
|
|
|
|
|
|
def test_resolves_via_oic_type():
|
|
reg = for_device_by_oic_type(DEVICE_TYPES)
|
|
assert reg is not None and reg.name == "refrigerator"
|
|
|
|
|
|
def test_no_unbound_hrefs():
|
|
reg, resources = _fridge()
|
|
unbound = []
|
|
discover(resources, reg.capabilities, reg.pattern_capabilities, log=unbound.append)
|
|
assert unbound == []
|
|
|
|
|
|
def test_auto_door_sound_control_present_here_only():
|
|
"""This variant's dump is the only one that carries
|
|
ado.soundcontrol -- the other TP1X_REF_21K auto-door fixtures don't."""
|
|
state = _state()
|
|
assert state["auto_door_sound_control"] is True
|
|
assert state["auto_door_voice_control"] is False
|
|
|
|
|
|
def test_deodor_filter_reuses_air_filter_shape():
|
|
"""Same entities as fridge.AIR_FILTER (see its own already-confirmed
|
|
percentage-not-raw-count reasoning), bound at this variant's own href."""
|
|
assert fridge.DEODOR_FILTER.entities is fridge.AIR_FILTER.entities
|
|
state = _state()
|
|
assert state["air_filter_status"] == "normal"
|
|
# The device's own sentinel, relayed as-is -- not a real 0-100 reading
|
|
# on this unit, and no second dump to say what else -1 could mean.
|
|
assert state["air_filter_usage"] == -1
|
|
|
|
|
|
def test_winecellar_pantry_zone_mode_options_and_write():
|
|
desc = next(
|
|
e for e in fridge.WINECELLAR_PANTRY_ZONE.entities if e.key == "winecellar_pantry_zone_mode"
|
|
)
|
|
assert desc.options_field == "x.com.samsung.da.supportedOptions"
|
|
assert desc.write_fn is not None
|
|
assert desc.write_fn("Cheese", {}) == (
|
|
["status", "winecellar", "pantry", "one", "vs", "0"],
|
|
{"x.com.samsung.da.mode": "Cheese"},
|
|
)
|
|
state = _state()
|
|
assert state["winecellar_pantry_zone_mode"] == "Fruit"
|
|
|
|
|
|
def test_winecellar_variant_and_info_hrefs_bound_with_no_entities():
|
|
assert fridge.AUTO_DOOR_VARIANT.entities == ()
|
|
assert fridge.WINECELLAR_INFO.entities == ()
|
|
_reg, resources = _fridge()
|
|
assert fridge.AUTO_DOOR_VARIANT.match_fn(resources["/autodoor/winecellar/vs/0"], resources)
|