mirror of
https://github.com/rennf93/roboco.git
synced 2026-08-03 07:23:24 +02:00
86 lines
2.6 KiB
Python
86 lines
2.6 KiB
Python
"""Tier 1 — validator self-tests.
|
|||
|
|
|
||
|
|
Each test temporarily corrupts a foundation table, runs the validator,
|
||
|
|
asserts it raises a clear error, then restores the table.
|
||
|
|
"""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from contextlib import contextmanager
|
||
|
|
from typing import TYPE_CHECKING
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
from roboco.foundation import _validate, identity
|
||
|
|
|
||
|
|
if TYPE_CHECKING:
|
||
|
|
from collections.abc import Iterator
|
||
|
|
|
||
|
|
|
||
|
|
@contextmanager
|
||
|
|
def _patched_agents(patch: dict[str, identity.AgentRow]) -> Iterator[None]:
|
||
|
|
original = dict(identity.AGENTS)
|
||
|
|
identity.AGENTS.update(patch)
|
||
|
|
try:
|
||
|
|
yield
|
||
|
|
finally:
|
||
|
|
identity.AGENTS.clear()
|
||
|
|
identity.AGENTS.update(original)
|
||
|
|
|
||
|
|
|
||
|
|
def test_validators_pass_on_pristine_state() -> None:
|
||
|
|
"""All validators pass against the real AGENTS table."""
|
||
|
|
_validate.run_all() # no exception
|
||
|
|
|
||
|
|
|
||
|
|
def test_duplicate_uuid_fails() -> None:
|
||
|
|
"""Two slugs sharing a UUID is rejected."""
|
||
|
|
duplicate = identity.AgentRow(
|
||
|
|
slug="rogue-1",
|
||
|
|
role=identity.Role.DEVELOPER,
|
||
|
|
team=identity.Team.BACKEND,
|
||
|
|
uuid=identity.AGENTS["be-dev-1"].uuid, # same UUID as be-dev-1
|
||
|
|
)
|
||
|
|
with _patched_agents({"rogue-1": duplicate}):
|
||
|
|
with pytest.raises(_validate.IdentityValidationError) as exc_info:
|
||
|
|
_validate.run_all()
|
||
|
|
assert "duplicate UUID" in str(exc_info.value)
|
||
|
|
|
||
|
|
|
||
|
|
def test_role_without_agent_fails_except_system() -> None:
|
||
|
|
"""Every Role except SYSTEM must have at least one agent."""
|
||
|
|
# All real roles have agents in pristine state, so this passes.
|
||
|
|
_validate.run_all()
|
||
|
|
# Removing all developers should fail:
|
||
|
|
no_devs = {
|
||
|
|
slug: row
|
||
|
|
for slug, row in identity.AGENTS.items()
|
||
|
|
if row.role != identity.Role.DEVELOPER
|
||
|
|
}
|
||
|
|
original = dict(identity.AGENTS)
|
||
|
|
identity.AGENTS.clear()
|
||
|
|
identity.AGENTS.update(no_devs)
|
||
|
|
try:
|
||
|
|
with pytest.raises(_validate.IdentityValidationError) as exc_info:
|
||
|
|
_validate.run_all()
|
||
|
|
assert "developer" in str(exc_info.value).lower()
|
||
|
|
finally:
|
||
|
|
identity.AGENTS.clear()
|
||
|
|
identity.AGENTS.update(original)
|
||
|
|
|
||
|
|
|
||
|
|
def test_role_level_covers_all_roles() -> None:
|
||
|
|
"""ROLE_LEVEL must cover every Role."""
|
||
|
|
_validate.run_all()
|
||
|
|
# Removing one role's level entry would fail:
|
||
|
|
original_entry = identity.ROLE_LEVEL.pop(identity.Role.DEVELOPER)
|
||
|
|
try:
|
||
|
|
with pytest.raises(_validate.IdentityValidationError):
|
||
|
|
_validate.run_all()
|
||
|
|
finally:
|
||
|
|
identity.ROLE_LEVEL[identity.Role.DEVELOPER] = original_entry
|
||
|
|
|
||
|
|
|
||
|
|
def test_pm_roles_consistent_with_agents() -> None:
|
||
|
|
"""PM_ROLES are populated by at least one agent each (CELL_PM and MAIN_PM)."""
|
||
|
|
_validate.run_all()
|