From d720b29a67ba8605449b6615edccb256e23458a1 Mon Sep 17 00:00:00 2001 From: Marc Billow Date: Sun, 28 Jun 2026 14:39:56 -0500 Subject: [PATCH] test: capture golden baselines from existing descriptors Generates regression oracle from DISHWASHER and REFRIGERATOR descriptors: - tests/fixtures/golden/dishwasher.json: 21 state keys, 23 discovery entities - tests/fixtures/golden/refrigerator.json: 26 state keys, 24 discovery entities - tests/test_golden_regression.py: parametrized test that will turn green as Tasks 9-12 port capabilities into the new registry --- tests/fixtures/golden/dishwasher.json | 50 ++++++++++++++++++++++ tests/fixtures/golden/refrigerator.json | 56 +++++++++++++++++++++++++ tests/test_golden_regression.py | 31 ++++++++++++++ 3 files changed, 137 insertions(+) create mode 100644 tests/fixtures/golden/dishwasher.json create mode 100644 tests/fixtures/golden/refrigerator.json create mode 100644 tests/test_golden_regression.py diff --git a/tests/fixtures/golden/dishwasher.json b/tests/fixtures/golden/dishwasher.json new file mode 100644 index 0000000..92ebf86 --- /dev/null +++ b/tests/fixtures/golden/dishwasher.json @@ -0,0 +1,50 @@ +{ + "state_keys": [ + "alarm_code", + "child_lock", + "child_lock_binary", + "completion_minutes", + "completion_time", + "delay_start_time", + "energy_kwh", + "filter_status", + "filter_usage", + "led_brightness", + "led_night_light", + "machine_state", + "power_state", + "power_state_binary", + "power_watts", + "progress", + "progress_percentage", + "remote_control", + "remote_control_binary", + "sound_mode", + "water_liters" + ], + "discovery_unique_ids": [ + "samsung_dishwasher_alarm_code", + "samsung_dishwasher_child_lock_active", + "samsung_dishwasher_completion_minutes", + "samsung_dishwasher_completion_time", + "samsung_dishwasher_delay_start_time", + "samsung_dishwasher_energy_kwh", + "samsung_dishwasher_filter_status", + "samsung_dishwasher_filter_usage", + "samsung_dishwasher_led_brightness_select", + "samsung_dishwasher_led_night_light_switch", + "samsung_dishwasher_machine_state", + "samsung_dishwasher_pause", + "samsung_dishwasher_power_state", + "samsung_dishwasher_power_watts", + "samsung_dishwasher_progress", + "samsung_dishwasher_progress_percentage", + "samsung_dishwasher_remote_control_enabled", + "samsung_dishwasher_running", + "samsung_dishwasher_sound_mode", + "samsung_dishwasher_sound_mode_select", + "samsung_dishwasher_start", + "samsung_dishwasher_stop", + "samsung_dishwasher_water_liters" + ] +} \ No newline at end of file diff --git a/tests/fixtures/golden/refrigerator.json b/tests/fixtures/golden/refrigerator.json new file mode 100644 index 0000000..b529554 --- /dev/null +++ b/tests/fixtures/golden/refrigerator.json @@ -0,0 +1,56 @@ +{ + "state_keys": [ + "alarm_code", + "any_door_open", + "autofill", + "beverage_zone_mode", + "cabinet_light", + "cabinet_light_on", + "door_freezer_open", + "door_fridge_open", + "energy_kwh", + "filter_status", + "filter_usage", + "firmware_update", + "freezer_setpoint_f", + "freezer_temp_f", + "fridge_setpoint_f", + "fridge_temp_f", + "ice1_making_status", + "ice1_on", + "ice1_state", + "ice2_making_status", + "ice2_type", + "ice_maker_enabled", + "power_watts", + "rapid_freezing", + "rapid_fridge", + "sabbath_mode" + ], + "discovery_unique_ids": [ + "samsung_refrigerator_alarm_code", + "samsung_refrigerator_autofill_switch", + "samsung_refrigerator_bzone_mode_select", + "samsung_refrigerator_cabinet_light_switch", + "samsung_refrigerator_door_freezer_open", + "samsung_refrigerator_door_fridge_open", + "samsung_refrigerator_energy_kwh", + "samsung_refrigerator_filter_status", + "samsung_refrigerator_filter_usage", + "samsung_refrigerator_firmware_update", + "samsung_refrigerator_freezer_setpoint_f", + "samsung_refrigerator_freezer_setpoint_num", + "samsung_refrigerator_freezer_temp_f", + "samsung_refrigerator_fridge_setpoint_f", + "samsung_refrigerator_fridge_setpoint_num", + "samsung_refrigerator_fridge_temp_f", + "samsung_refrigerator_ice1_making_status", + "samsung_refrigerator_ice1_on", + "samsung_refrigerator_ice1_switch_switch", + "samsung_refrigerator_ice2_making_status", + "samsung_refrigerator_ice2_type_select", + "samsung_refrigerator_power_watts", + "samsung_refrigerator_rapid_freezing_switch", + "samsung_refrigerator_rapid_fridge_switch" + ] +} \ No newline at end of file diff --git a/tests/test_golden_regression.py b/tests/test_golden_regression.py new file mode 100644 index 0000000..c95e8a4 --- /dev/null +++ b/tests/test_golden_regression.py @@ -0,0 +1,31 @@ +import json +from pathlib import Path + +import pytest + +GOLDEN = Path(__file__).parent / 'fixtures' / 'golden' + + +def _new_state_and_uids(name, resources): + from samsung_appliance.registry.registry import CAPABILITIES + from samsung_appliance.registry.discovery import discover + from samsung_appliance.registry.adapter import build_runtime_descriptor + bound = discover(resources, CAPABILITIES) + rd = build_runtime_descriptor( + bound, topic_prefix=f'samsung_{name}', ha_prefix='homeassistant', + device_name=name.title(), model='M', name=name, default_port=49154) + state = rd.flatten(resources) + uids = [json.loads(p)['unique_id'] for _, p in rd.discovery_payloads] + return sorted(state.keys()), sorted(uids) + + +@pytest.mark.parametrize('name,ip', [ + ('dishwasher', '10.0.0.129'), + ('refrigerator', '10.0.0.254'), +]) +def test_registry_reproduces_golden_state_keys(name, ip, request): + resources = json.load(open(f'local-tools/dumps/{ip}.json'))['resources'] + golden = json.loads((GOLDEN / f'{name}.json').read_text()) + state_keys, _ = _new_state_and_uids(name, resources) + missing = set(golden['state_keys']) - set(state_keys) + assert not missing, f"registry missing state keys: {sorted(missing)}"