from __future__ import annotations import pytest from ha_deconz_bridge.groups import GroupMemberSpec, GroupSpec, derive_group_modes def test_group_modes_are_member_union(rgb_light_spec, ct_light_spec) -> None: group = GroupSpec( name="mixed", members=(rgb_light_spec.name, ct_light_spec.name), ) modes = derive_group_modes( group, { rgb_light_spec.name: rgb_light_spec, ct_light_spec.name: ct_light_spec, }, ) assert modes == ("rgb", "color_temp") def test_fixed_color_member_acts_as_brightness_mode(ct_light_spec) -> None: group = GroupSpec( name="fixed", members=(GroupMemberSpec(ct_light_spec.name, fixed_color=500),), ) assert derive_group_modes(group, {ct_light_spec.name: ct_light_spec}) == ("brightness",) def test_fixed_brightness_member_acts_as_onoff_mode(ct_light_spec) -> None: group = GroupSpec( name="fixed", members=(GroupMemberSpec(ct_light_spec.name, fixed_color=500, fixed_brightness=0.5),), ) assert derive_group_modes(group, {ct_light_spec.name: ct_light_spec}) == ("onoff",) def test_fixed_color_normalizes_mired_kelvin_rgb_and_xy() -> None: mired_member = GroupMemberSpec("a", fixed_color=500) kelvin_member = GroupMemberSpec("a", fixed_color=4000) rgb_member = GroupMemberSpec("a", fixed_color=(255, 128, 0)) xy_member = GroupMemberSpec("a", fixed_color=(0.31, 0.32)) assert mired_member.fixed_color is not None assert mired_member.fixed_color.kind == "color_temp" assert mired_member.fixed_color.color_temp == 500 assert kelvin_member.fixed_color is not None assert kelvin_member.fixed_color.color_temp == 250 assert rgb_member.fixed_color is not None assert rgb_member.fixed_color.kind == "rgb" assert max(rgb_member.fixed_color.rgb255) == 255 assert xy_member.fixed_color is not None assert xy_member.fixed_color.kind == "xy" def test_fixed_brightness_requires_fixed_color() -> None: with pytest.raises(ValueError, match="fixed_brightness requires fixed_color"): GroupMemberSpec("a", fixed_brightness=128) def test_fixed_brightness_normalizes_relative_and_ha_values() -> None: relative = GroupMemberSpec("a", fixed_color=500, fixed_brightness=0.5) ha_value = GroupMemberSpec("a", fixed_color=500, fixed_brightness=127) assert relative.fixed_brightness == 128 assert ha_value.fixed_brightness == 127 def test_example_groups_reference_existing_lights() -> None: from configs.example_groups import GROUPS from configs.example_lights import LIGHTS missing = { group_name: [ member.light_name for member in group.member_specs() if member.light_name not in LIGHTS ] for group_name, group in GROUPS.items() } assert {name: names for name, names in missing.items() if names} == {}