From d2787327fda3f2a256d56c98a4486ab3adba4a05 Mon Sep 17 00:00:00 2001 From: Marc Billow Date: Sun, 9 Aug 2026 01:25:23 +0000 Subject: [PATCH] Fix ty type-check failures in new tests (CI) My local ty runs only covered custom_components, not tests -- CI runs 'ty check custom_components tests', which this branch had been failing since the version-bump commit. All 13 diagnostics were the same two established idioms this test suite already uses elsewhere, just missing here: - desc.write_fn/options_field are SelectDesc-only fields, unresolved on the SamsungEntityDescription base a bare 'next(e for e in ... if e.key == ...)' infers -- needs 'and isinstance(e, SelectDesc)' in the filter, same as test_fridge_capabilities.py's existing selects. - rep_fn/match_fn are typed Optional even after narrowing to a concrete descriptor/capability, so calling one needs an explicit 'assert x.rep_fn is not None' first, same as test_common_capabilities.py's POWER_VS_FALLBACK.match_fn precedent. No behavior change -- test bodies are identical, just type-checkable. --- tests/test_airconditioner_capabilities.py | 1 + ...est_refrigerator_tp1x_ref_21k_autodoor_capabilities.py | 8 +++++++- .../test_refrigerator_tp1x_ref_21k_kimchi_capabilities.py | 1 + tests/test_refrigerator_winecellar_capabilities.py | 6 +++++- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/test_airconditioner_capabilities.py b/tests/test_airconditioner_capabilities.py index f0881d5..fd9b8c3 100644 --- a/tests/test_airconditioner_capabilities.py +++ b/tests/test_airconditioner_capabilities.py @@ -784,6 +784,7 @@ def test_air_filter_usage_hours_derived_from_percent_and_capacity(): for e in airconditioner.AIR_FILTER.entities if e.key == "air_filter_usage_hours" and isinstance(e, SensorDesc) ) + assert desc.rep_fn is not None assert ( desc.rep_fn( {"x.com.samsung.da.filterUsage": "91", "x.com.samsung.da.filterCapacity": "500"} diff --git a/tests/test_refrigerator_tp1x_ref_21k_autodoor_capabilities.py b/tests/test_refrigerator_tp1x_ref_21k_autodoor_capabilities.py index 345a715..b5560cf 100644 --- a/tests/test_refrigerator_tp1x_ref_21k_autodoor_capabilities.py +++ b/tests/test_refrigerator_tp1x_ref_21k_autodoor_capabilities.py @@ -10,6 +10,7 @@ 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 fridge from custom_components.localthings.registry.discovery import discover +from custom_components.localthings.registry.entities import SelectDesc from tests.conftest import _load_device FIXTURE = "refrigerator_tp1x_ref_21k_autodoor" @@ -51,7 +52,11 @@ def test_auto_door_voice_control_reads_status_lock(): def test_auto_door_timer_reads_its_own_options(): - desc = next(e for e in fridge.AUTO_DOOR_TIMER.entities if e.key == "auto_door_timer") + desc = next( + e + for e in fridge.AUTO_DOOR_TIMER.entities + if e.key == "auto_door_timer" and isinstance(e, SelectDesc) + ) rep = { "x.com.samsung.da.time.desired": "1", "x.com.samsung.da.time.supportedOptions": ["1", "2", "3", "4", "5", "6"], @@ -70,5 +75,6 @@ def test_auto_door_single_variant_href_bound_with_no_entities(): no paired current/desired field to expose, so it's coverage-only via the shared AUTO_DOOR_VARIANT pattern cap, not an entry of its own.""" assert fridge.AUTO_DOOR_VARIANT.entities == () + assert fridge.AUTO_DOOR_VARIANT.match_fn is not None _reg, resources = _fridge() assert fridge.AUTO_DOOR_VARIANT.match_fn(resources["/autodoor/single/vs/0"], resources) diff --git a/tests/test_refrigerator_tp1x_ref_21k_kimchi_capabilities.py b/tests/test_refrigerator_tp1x_ref_21k_kimchi_capabilities.py index 5961012..321a3e3 100644 --- a/tests/test_refrigerator_tp1x_ref_21k_kimchi_capabilities.py +++ b/tests/test_refrigerator_tp1x_ref_21k_kimchi_capabilities.py @@ -52,5 +52,6 @@ def test_auto_door_opener_present(): def test_auto_door_kimchi_variant_href_bound_with_no_entities(): assert fridge.AUTO_DOOR_VARIANT.entities == () + assert fridge.AUTO_DOOR_VARIANT.match_fn is not None _reg, resources = _fridge() assert fridge.AUTO_DOOR_VARIANT.match_fn(resources["/autodoor/kimchi/vs/0"], resources) diff --git a/tests/test_refrigerator_winecellar_capabilities.py b/tests/test_refrigerator_winecellar_capabilities.py index c6dabe4..5567d4a 100644 --- a/tests/test_refrigerator_winecellar_capabilities.py +++ b/tests/test_refrigerator_winecellar_capabilities.py @@ -10,6 +10,7 @@ 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 custom_components.localthings.registry.entities import SelectDesc from tests.conftest import _load_device FIXTURE = "refrigerator_winecellar" @@ -67,7 +68,9 @@ def test_deodor_filter_has_its_own_keys_not_air_filters(): 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" + e + for e in fridge.WINECELLAR_PANTRY_ZONE.entities + if e.key == "winecellar_pantry_zone_mode" and isinstance(e, SelectDesc) ) assert desc.options_field == "x.com.samsung.da.supportedOptions" assert desc.write_fn is not None @@ -82,5 +85,6 @@ def test_winecellar_pantry_zone_mode_options_and_write(): def test_winecellar_variant_and_info_hrefs_bound_with_no_entities(): assert fridge.AUTO_DOOR_VARIANT.entities == () assert fridge.WINECELLAR_INFO.entities == () + assert fridge.AUTO_DOOR_VARIANT.match_fn is not None _reg, resources = _fridge() assert fridge.AUTO_DOOR_VARIANT.match_fn(resources["/autodoor/winecellar/vs/0"], resources)