from __future__ import annotations import asyncio import struct from pathlib import Path import pytest from lumaops_backend.config import Settings from lumaops_backend.connectors.base import DeviceState, RGBColor from lumaops_backend.connectors.openrgb.adapter import OpenRGBAdapter, expand_colors from lumaops_backend.connectors.openrgb.protocol import ( HEADER, ModeFlag, PacketId, pack_color, pack_header, pack_string, parse_header, ) def controller_packet( *, active_mode: int = 0, controller_colors: list[RGBColor] | None = None, static_color: RGBColor | None = None, ) -> bytes: color = static_color or RGBColor(red=16, green=32, blue=48) led_colors = controller_colors or [RGBColor(red=16, green=32, blue=48)] * 2 direct_mode = ( pack_string("Direct") + struct.pack(" None: color = RGBColor(red=86, green=96, blue=255) assert expand_colors([color] * 6, 23) == [color] * 23 @pytest.mark.asyncio async def test_real_adapter_handshake_inventory_and_write(tmp_path: Path) -> None: seen: list[tuple[int, bytes]] = [] update_received = asyncio.Event() effect_received = asyncio.Event() resize_received = asyncio.Event() active_mode = 0 fixture_colors = [RGBColor(red=16, green=32, blue=48)] * 2 fixture_static_color = RGBColor(red=16, green=32, blue=48) async def handle(reader: asyncio.StreamReader, writer: asyncio.StreamWriter) -> None: nonlocal active_mode, fixture_colors, fixture_static_color try: while True: header = parse_header(await reader.readexactly(HEADER.size)) payload = await reader.readexactly(header.payload_size) seen.append((header.packet_id, payload)) if header.packet_id == PacketId.UPDATE_LEDS: count = struct.unpack_from("