Add admin-only versus open service policy registry
This commit was merged in pull request #99.
This commit is contained in:
@@ -0,0 +1,46 @@
|
|||||||
|
"""Explicit admin-only versus open service registry (Feature 09).
|
||||||
|
|
||||||
|
One mapping, one file: every registered ``nestquest`` service name is
|
||||||
|
either ``open`` or ``admin_only``. The permission decorator (later
|
||||||
|
Feature 09 tasks) reads this table; it does not take per-handler
|
||||||
|
policy arguments.
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from .const import (
|
||||||
|
DOMAIN_SERVICES,
|
||||||
|
SERVICE_COMPLETE_QUEST,
|
||||||
|
SERVICE_CREATE_PRESENCE_OVERRIDE,
|
||||||
|
SERVICE_CREATE_QUEST_DEFINITION,
|
||||||
|
SERVICE_DELETE_PRESENCE_OVERRIDE,
|
||||||
|
SERVICE_EXPORT_HISTORY_CSV,
|
||||||
|
SERVICE_MANAGE_CHILD,
|
||||||
|
SERVICE_REGENERATE,
|
||||||
|
SERVICE_SET_PRESENCE_PATTERN,
|
||||||
|
SERVICE_SET_QUEST_DEFINITION_ACTIVE,
|
||||||
|
SERVICE_UNCOMPLETE_QUEST,
|
||||||
|
SERVICE_UPDATE_QUEST_DEFINITION,
|
||||||
|
)
|
||||||
|
|
||||||
|
OPEN = "open"
|
||||||
|
ADMIN_ONLY = "admin_only"
|
||||||
|
|
||||||
|
SERVICE_POLICY: dict[str, str] = {
|
||||||
|
SERVICE_COMPLETE_QUEST: OPEN,
|
||||||
|
SERVICE_UNCOMPLETE_QUEST: ADMIN_ONLY,
|
||||||
|
SERVICE_CREATE_QUEST_DEFINITION: ADMIN_ONLY,
|
||||||
|
SERVICE_UPDATE_QUEST_DEFINITION: ADMIN_ONLY,
|
||||||
|
SERVICE_SET_QUEST_DEFINITION_ACTIVE: ADMIN_ONLY,
|
||||||
|
SERVICE_SET_PRESENCE_PATTERN: ADMIN_ONLY,
|
||||||
|
SERVICE_CREATE_PRESENCE_OVERRIDE: ADMIN_ONLY,
|
||||||
|
SERVICE_DELETE_PRESENCE_OVERRIDE: ADMIN_ONLY,
|
||||||
|
SERVICE_EXPORT_HISTORY_CSV: ADMIN_ONLY,
|
||||||
|
SERVICE_MANAGE_CHILD: ADMIN_ONLY,
|
||||||
|
SERVICE_REGENERATE: ADMIN_ONLY,
|
||||||
|
}
|
||||||
|
|
||||||
|
if frozenset(SERVICE_POLICY) != frozenset(DOMAIN_SERVICES):
|
||||||
|
raise RuntimeError(
|
||||||
|
"SERVICE_POLICY must name exactly the registered nestquest services, "
|
||||||
|
f"got {sorted(SERVICE_POLICY)} vs {list(DOMAIN_SERVICES)}"
|
||||||
|
)
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
"""Tests for the Feature 09 admin-only versus open service registry."""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from custom_components.nestquest.const import (
|
||||||
|
DOMAIN_SERVICES,
|
||||||
|
SERVICE_COMPLETE_QUEST,
|
||||||
|
)
|
||||||
|
from custom_components.nestquest.service_policy import (
|
||||||
|
ADMIN_ONLY,
|
||||||
|
OPEN,
|
||||||
|
SERVICE_POLICY,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_policy_covers_exactly_the_registered_services() -> None:
|
||||||
|
assert frozenset(SERVICE_POLICY) == frozenset(DOMAIN_SERVICES)
|
||||||
|
|
||||||
|
|
||||||
|
def test_only_complete_quest_is_open() -> None:
|
||||||
|
open_services = {
|
||||||
|
name for name, access in SERVICE_POLICY.items() if access == OPEN
|
||||||
|
}
|
||||||
|
assert open_services == {SERVICE_COMPLETE_QUEST}
|
||||||
|
assert all(
|
||||||
|
access == ADMIN_ONLY
|
||||||
|
for name, access in SERVICE_POLICY.items()
|
||||||
|
if name != SERVICE_COMPLETE_QUEST
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_policy_values_are_only_open_or_admin_only() -> None:
|
||||||
|
assert set(SERVICE_POLICY.values()) <= {OPEN, ADMIN_ONLY}
|
||||||
Reference in New Issue
Block a user