from dashboard_layout_schema import DashboardLayoutPayload from dashboard_widget_entitlements import apply_entitlements_to_layout_dict, widget_id_allowed def test_apply_entitlements_disables_widget_without_access(monkeypatch): monkeypatch.setattr( "dashboard_widget_entitlements.widget_id_allowed", lambda wid, pid, conn: wid != "nutrition_detail_charts", ) raw = { "version": 1, "widgets": [ {"id": "welcome", "enabled": True}, {"id": "nutrition_detail_charts", "enabled": True}, ], } out = apply_entitlements_to_layout_dict(raw, "p", None) assert {w["id"]: w["enabled"] for w in out["widgets"]} == { "welcome": True, "nutrition_detail_charts": False, } def test_apply_entitlements_leaves_welcome_on_when_all_blocked(monkeypatch): monkeypatch.setattr( "dashboard_widget_entitlements.widget_id_allowed", lambda wid, pid, conn: False, ) raw = { "version": 1, "widgets": [ {"id": "welcome", "enabled": False}, {"id": "nutrition_detail_charts", "enabled": False}, ], } out = apply_entitlements_to_layout_dict(raw, "p", None) assert any(w["id"] == "welcome" and w["enabled"] for w in out["widgets"]) def test_widget_id_allowed_false_for_unknown_id(): assert widget_id_allowed("not-a-widget", "p", None) is False def test_full_default_layout_still_validates_after_entitlements(monkeypatch): monkeypatch.setattr( "dashboard_widget_entitlements.widget_id_allowed", lambda wid, pid, conn: wid != "ai_pipeline_insight", ) from dashboard_layout_schema import default_layout_dict d = default_layout_dict() d["widgets"] = [{**x, "enabled": x["id"] == "ai_pipeline_insight"} for x in d["widgets"]] adj = apply_entitlements_to_layout_dict(d, "p", None) p2 = DashboardLayoutPayload.model_validate(adj) ai = next(w for w in p2.widgets if w.id == "ai_pipeline_insight") assert ai.enabled is False assert any(w.enabled for w in p2.widgets)