"""GET /frame/config auto-deriving Frame.panel_type from the device's self-reported board (X-Frame-Board header) -- see routers/device.py's BOARD_PANEL_MAP. Panel type is a property of the hardware, never a user setting, so this mapping is the only thing that's allowed to change it.""" from __future__ import annotations from app.models import Frame from .conftest import claim_device def test_new_chip_qualified_board_names_map_to_the_right_panel(client, db_session): frame = db_session.get(Frame, 1) creds = claim_device(db_session, frame) resp = client.get(f"/frame/config?{creds}", headers={"X-Frame-Board": "ee02"}) assert resp.status_code == 200 db_session.refresh(frame) assert frame.device_board_variant == "ee02" assert frame.panel_type == "epd13in3e" def test_legacy_bare_board_names_still_map_correctly(client, db_session): """Already-flashed devices that haven't been OTA'd past the devkit/xiao -> devkit_esp32c6/xiao_esp32c6 rename must keep reporting their old bare name and still get mapped to the right panel -- fielded firmware can't be retroactively renamed.""" frame = db_session.get(Frame, 1) creds = claim_device(db_session, frame) resp = client.get(f"/frame/config?{creds}", headers={"X-Frame-Board": "xiao"}) assert resp.status_code == 200 db_session.refresh(frame) assert frame.device_board_variant == "xiao" assert frame.panel_type == "epd7in3e" def test_renamed_chip_qualified_board_names_map_correctly(client, db_session): frame = db_session.get(Frame, 1) creds = claim_device(db_session, frame) resp = client.get(f"/frame/config?{creds}", headers={"X-Frame-Board": "devkit_esp32c6"}) assert resp.status_code == 200 db_session.refresh(frame) assert frame.device_board_variant == "devkit_esp32c6" assert frame.panel_type == "epd7in3e" def test_unrecognized_board_name_leaves_panel_type_unchanged(client, db_session): """An unrecognized board string still gets recorded (same as today's device_board_variant behavior) but must never blow away whatever panel_type is already set -- an unknown value is more likely a typo or a not-yet-supported board than evidence the frame's actual panel changed.""" frame = db_session.get(Frame, 1) frame.panel_type = "epd13in3e" db_session.commit() creds = claim_device(db_session, frame) resp = client.get(f"/frame/config?{creds}", headers={"X-Frame-Board": "some_future_board"}) assert resp.status_code == 200 db_session.refresh(frame) assert frame.device_board_variant == "some_future_board" assert frame.panel_type == "epd13in3e" def test_no_board_header_leaves_panel_type_at_its_default(client, db_session): frame = db_session.get(Frame, 1) creds = claim_device(db_session, frame) resp = client.get(f"/frame/config?{creds}") assert resp.status_code == 200 db_session.refresh(frame) assert frame.panel_type == "epd7in3e"