mirror of
https://github.com/rennf93/roboco.git
synced 2026-08-03 07:23:24 +02:00
64 lines
2.5 KiB
Python
64 lines
2.5 KiB
Python
"""Verify journaling-scope consumers derive from foundation."""
|
|||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from roboco.enforcement import journal_perms
|
||
|
|
from roboco.enforcement.journal_perms import can_read_journal
|
||
|
|
from roboco.foundation.policy import journaling
|
||
|
|
from roboco.services.gateway import content_actions
|
||
|
|
from roboco.services.journal import _SCOPE_TO_TYPE
|
||
|
|
|
||
|
|
|
||
|
|
def test_content_actions_valid_scopes_match_foundation() -> None:
|
||
|
|
foundation_values = {s.value for s in journaling.Scope}
|
||
|
|
config_values = set(content_actions._VALID_NOTE_SCOPES)
|
||
|
|
assert config_values == foundation_values, (
|
||
|
|
f"_VALID_NOTE_SCOPES drift: {config_values ^ foundation_values}"
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def test_journal_service_scope_to_type_matches_foundation() -> None:
|
||
|
|
# Service uses string keys; foundation uses Scope enum keys.
|
||
|
|
foundation_str_keys = {s.value: t for s, t in journaling.SCOPE_TO_TYPE.items()}
|
||
|
|
assert foundation_str_keys == _SCOPE_TO_TYPE, (
|
||
|
|
f"_SCOPE_TO_TYPE drift: "
|
||
|
|
f"foundation={foundation_str_keys}, service={_SCOPE_TO_TYPE}"
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def test_journal_perms_protected_journals_match_foundation() -> None:
|
||
|
|
assert journal_perms.PROTECTED_JOURNALS == journaling.PROTECTED_JOURNALS
|
||
|
|
|
||
|
|
|
||
|
|
def test_journal_perms_validate_read_behavior_preserved() -> None:
|
||
|
|
"""Functional smoke: existing public surface still routes correctly.
|
||
|
|
|
||
|
|
Pre-Phase-2 behavior the foundation tiers must reproduce:
|
||
|
|
- CEO can read any journal (protected or not).
|
||
|
|
- Auditor can read protected journals (e.g. CEO's).
|
||
|
|
- Main PM can read any non-protected journal but NOT protected ones.
|
||
|
|
- A developer can read their own journal and same-cell members'.
|
||
|
|
- A developer cannot read another cell's journals.
|
||
|
|
"""
|
||
|
|
# CEO reads anything (including protected auditor journal)
|
||
|
|
can, _ = can_read_journal("ceo", "auditor")
|
||
|
|
assert can is True
|
||
|
|
# Auditor reads protected journals (CEO's)
|
||
|
|
can, _ = can_read_journal("auditor", "ceo")
|
||
|
|
assert can is True
|
||
|
|
# Main PM reads non-protected
|
||
|
|
can, _ = can_read_journal("main-pm", "be-dev-1")
|
||
|
|
assert can is True
|
||
|
|
# Main PM cannot read protected (CEO)
|
||
|
|
can, _ = can_read_journal("main-pm", "ceo")
|
||
|
|
assert can is False
|
||
|
|
# Developer can read own journal
|
||
|
|
can, _ = can_read_journal("be-dev-1", "be-dev-1")
|
||
|
|
assert can is True
|
||
|
|
# Developer can read same-cell QA
|
||
|
|
can, _ = can_read_journal("be-dev-1", "be-qa")
|
||
|
|
assert can is True
|
||
|
|
# Developer cannot read other cell's journals
|
||
|
|
can, _ = can_read_journal("be-dev-1", "fe-dev-1")
|
||
|
|
assert can is False
|