Convert app/schemas.py → app/schemas/__init__.py so the contextual module can live at app/schemas/contextual.py while keeping all existing 'from app.schemas import ...' calls unchanged. ContextualScope mirrors the renderer's camelCase payload via alias_generator=to_camel. render_scope_block produces a single-paragraph human-readable summary injected into the contextual agent system prompt. 4 tests, all passing.
53 lines
1.5 KiB
Python
53 lines
1.5 KiB
Python
import pytest
|
|
from app.schemas.contextual import ContextualScope, render_scope_block
|
|
|
|
|
|
def test_render_project_scope():
|
|
scope = ContextualScope(
|
|
page="project",
|
|
entity_type="project",
|
|
entity_id="p1",
|
|
entity_name="Acme Q3 launch",
|
|
counts={"tasks": 12, "notes": 4, "milestones": 3},
|
|
)
|
|
block = render_scope_block(scope)
|
|
assert "Acme Q3 launch" in block
|
|
assert "12 tasks" in block
|
|
assert "4 notes" in block
|
|
assert "3 milestones" in block
|
|
assert "p1" not in block
|
|
|
|
|
|
def test_render_list_scope_no_entity():
|
|
scope = ContextualScope(page="tasks", entity_type=None)
|
|
block = render_scope_block(scope)
|
|
assert "tasks" in block.lower()
|
|
assert "None" not in block
|
|
|
|
|
|
def test_render_note_scope_includes_char_count():
|
|
scope = ContextualScope(
|
|
page="note",
|
|
entity_type="note",
|
|
entity_id="n1",
|
|
entity_name="Meeting 14 May",
|
|
project_id="p1",
|
|
char_count=4280,
|
|
)
|
|
block = render_scope_block(scope)
|
|
assert "Meeting 14 May" in block
|
|
assert "4280" in block or "4,280" in block
|
|
|
|
|
|
def test_parses_camelcase_payload_from_renderer():
|
|
payload = {
|
|
"page": "project",
|
|
"entityType": "project",
|
|
"entityId": "p1",
|
|
"entityName": "Acme",
|
|
"counts": {"tasks": 5, "notes": 1, "milestones": 2},
|
|
}
|
|
scope = ContextualScope.model_validate(payload)
|
|
assert scope.entity_id == "p1"
|
|
assert scope.entity_name == "Acme"
|