gateway/modules/features/commcoach/tests/test_mainCommcoach.py
2026-04-10 12:33:27 +02:00

104 lines
3.7 KiB
Python

# Copyright (c) 2025 Patrick Motsch
# All rights reserved.
"""
Tests for CommCoach feature registration module.
"""
import pytest
from ..mainCommcoach import (
FEATURE_CODE, FEATURE_LABEL, FEATURE_ICON,
UI_OBJECTS, DATA_OBJECTS, RESOURCE_OBJECTS, TEMPLATE_ROLES,
getFeatureDefinition, getUiObjects, getResourceObjects, getDataObjects, getTemplateRoles,
)
class TestFeatureMetadata:
def test_featureCode(self):
assert FEATURE_CODE == "commcoach"
def test_featureLabel(self):
assert isinstance(FEATURE_LABEL, str)
assert "Coach" in FEATURE_LABEL
def test_featureIcon(self):
assert FEATURE_ICON.startswith("mdi-")
class TestFeatureDefinition:
def test_structure(self):
defn = getFeatureDefinition()
assert defn["code"] == "commcoach"
assert "label" in defn
assert "icon" in defn
assert defn["autoCreateInstance"] is False
class TestRbacObjects:
def test_uiObjectsExist(self):
objs = getUiObjects()
assert len(objs) >= 3
keys = [o["objectKey"] for o in objs]
assert "ui.feature.commcoach.dashboard" in keys
assert "ui.feature.commcoach.coaching" in keys
assert "ui.feature.commcoach.settings" in keys
def test_uiObjectsHaveLabels(self):
for obj in getUiObjects():
assert "label" in obj
assert isinstance(obj["label"], str)
assert len(obj["label"]) > 0
def test_dataObjectsExist(self):
objs = getDataObjects()
assert len(objs) >= 7
keys = [o["objectKey"] for o in objs]
assert "data.feature.commcoach.CoachingContext" in keys
assert "data.feature.commcoach.CoachingSession" in keys
assert "data.feature.commcoach.CoachingMessage" in keys
assert "data.feature.commcoach.CoachingTask" in keys
assert "data.feature.commcoach.CoachingScore" in keys
assert "data.feature.commcoach.*" in keys
def test_resourceObjectsExist(self):
objs = getResourceObjects()
assert len(objs) >= 5
keys = [o["objectKey"] for o in objs]
assert "resource.feature.commcoach.context.create" in keys
assert "resource.feature.commcoach.session.start" in keys
assert "resource.feature.commcoach.task.manage" in keys
def test_resourceObjectsHaveMeta(self):
for obj in getResourceObjects():
assert "meta" in obj
assert "endpoint" in obj["meta"]
assert "method" in obj["meta"]
class TestTemplateRoles:
def test_rolesExist(self):
roles = getTemplateRoles()
assert len(roles) >= 1
labels = [r["roleLabel"] for r in roles]
assert "commcoach-user" in labels
def test_userRoleHasStrictOwnership(self):
"""Verify that commcoach-user role uses MY (m) access, not ALL (a)."""
roles = getTemplateRoles()
userRole = next(r for r in roles if r["roleLabel"] == "commcoach-user")
dataRules = [r for r in userRole["accessRules"] if r["context"] == "DATA"]
for rule in dataRules:
if rule.get("read"):
assert rule["read"] == "m", f"DATA rule for {rule.get('item')} uses '{rule['read']}' instead of 'm' (MY)"
def test_roleHasDescription(self):
for role in getTemplateRoles():
assert "description" in role
assert isinstance(role["description"], str) and len(role["description"].strip()) > 0
def test_roleHasAccessRules(self):
for role in getTemplateRoles():
assert len(role["accessRules"]) > 0
contexts = set(r["context"] for r in role["accessRules"])
assert "UI" in contexts
assert "DATA" in contexts
assert "RESOURCE" in contexts