48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
|
|
from dashboard_widget_entitlements import widget_id_allowed
|
||
|
|
|
||
|
|
|
||
|
|
def test_multi_feature_and_requires_all(monkeypatch):
|
||
|
|
wid = "nutrition_detail_charts"
|
||
|
|
|
||
|
|
def fake_check(pid, fid, conn):
|
||
|
|
return {"allowed": fid in ("a", "b")}
|
||
|
|
|
||
|
|
monkeypatch.setattr(
|
||
|
|
"dashboard_widget_entitlements.get_widget_required_feature_ids",
|
||
|
|
lambda w, conn: ["a", "b"] if w == wid else [],
|
||
|
|
)
|
||
|
|
monkeypatch.setattr("dashboard_widget_entitlements._check_feature_access", fake_check)
|
||
|
|
assert widget_id_allowed(wid, "p", object()) is True
|
||
|
|
|
||
|
|
def fake_check_one_denied(pid, fid, conn):
|
||
|
|
return {"allowed": fid == "a"}
|
||
|
|
|
||
|
|
monkeypatch.setattr("dashboard_widget_entitlements._check_feature_access", fake_check_one_denied)
|
||
|
|
assert widget_id_allowed(wid, "p", object()) is False
|
||
|
|
|
||
|
|
|
||
|
|
def test_no_features_required_always_allowed(monkeypatch):
|
||
|
|
monkeypatch.setattr(
|
||
|
|
"dashboard_widget_entitlements.get_widget_required_feature_ids",
|
||
|
|
lambda wid, conn: [],
|
||
|
|
)
|
||
|
|
assert widget_id_allowed("welcome", "p", object()) is True
|
||
|
|
|
||
|
|
|
||
|
|
def test_unknown_widget_not_allowed():
|
||
|
|
assert widget_id_allowed("not_in_catalog", "p", object()) is False
|
||
|
|
|
||
|
|
|
||
|
|
def test_get_widget_required_catalog_fallback(monkeypatch):
|
||
|
|
from widget_feature_requirements_db import get_widget_required_feature_ids
|
||
|
|
|
||
|
|
class _Cur:
|
||
|
|
def execute(self, *a, **k):
|
||
|
|
pass
|
||
|
|
|
||
|
|
def fetchone(self):
|
||
|
|
return None
|
||
|
|
|
||
|
|
monkeypatch.setattr("widget_feature_requirements_db.get_cursor", lambda _c: _Cur())
|
||
|
|
assert get_widget_required_feature_ids("quick_capture", object()) == ["weight_entries"]
|