Pure function that assembles system prompt, cross-branch context, history, and images for _call_ai — no DB access, no LLM calls. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
86 lines
2.9 KiB
Python
86 lines
2.9 KiB
Python
"""Unit tests for BranchAwarePromptBuilder — pure function, no DB needed."""
|
|
import pytest
|
|
from app.services.branch_aware_prompt_builder import BranchAwarePromptBuilder
|
|
|
|
|
|
def test_build_basic():
|
|
"""Basic build with no cross-branch context."""
|
|
builder = BranchAwarePromptBuilder()
|
|
result = builder.build(
|
|
branch_messages=[
|
|
{"role": "user", "content": "DNS not resolving"},
|
|
{"role": "assistant", "content": "Let's check DNS config"},
|
|
],
|
|
sibling_summaries="",
|
|
session_context="Problem: DNS resolution failure. Domain: networking.",
|
|
attachments=[],
|
|
new_message="I ran nslookup and got timeout",
|
|
)
|
|
assert "system_base" in result
|
|
assert "rag_context" in result
|
|
assert "history" in result
|
|
assert "new_message" in result
|
|
assert "images" in result
|
|
assert result["new_message"] == "I ran nslookup and got timeout"
|
|
assert len(result["history"]) == 2
|
|
|
|
|
|
def test_build_with_cross_branch_context():
|
|
"""Cross-branch summaries go into rag_context, not system_base."""
|
|
builder = BranchAwarePromptBuilder()
|
|
sibling_ctx = "\n## Cross-Branch Context\n- **Network** [dead_end]: Network was fine."
|
|
result = builder.build(
|
|
branch_messages=[],
|
|
sibling_summaries=sibling_ctx,
|
|
session_context="Problem: test",
|
|
attachments=[],
|
|
new_message="test message",
|
|
)
|
|
assert "Cross-Branch Context" in result["rag_context"]
|
|
assert "Cross-Branch Context" not in result["system_base"]
|
|
|
|
|
|
def test_build_with_images():
|
|
"""Image attachments are passed through."""
|
|
builder = BranchAwarePromptBuilder()
|
|
result = builder.build(
|
|
branch_messages=[],
|
|
sibling_summaries="",
|
|
session_context="Problem: test",
|
|
attachments=[{"media_type": "image/png", "data": "base64data"}],
|
|
new_message="check this screenshot",
|
|
)
|
|
assert len(result["images"]) == 1
|
|
assert result["images"][0]["media_type"] == "image/png"
|
|
|
|
|
|
def test_build_with_revival_context():
|
|
"""Revival context is prepended to rag_context."""
|
|
builder = BranchAwarePromptBuilder()
|
|
result = builder.build(
|
|
branch_messages=[],
|
|
sibling_summaries="",
|
|
session_context="Problem: test",
|
|
attachments=[],
|
|
new_message="test",
|
|
revival_context="New evidence: the error appears when VPN is active",
|
|
)
|
|
assert "New evidence" in result["rag_context"]
|
|
|
|
|
|
def test_history_filters_to_user_assistant():
|
|
"""Only user and assistant messages appear in history."""
|
|
builder = BranchAwarePromptBuilder()
|
|
result = builder.build(
|
|
branch_messages=[
|
|
{"role": "user", "content": "first"},
|
|
{"role": "assistant", "content": "second"},
|
|
{"role": "system", "content": "should be excluded"},
|
|
],
|
|
sibling_summaries="",
|
|
session_context="Problem: test",
|
|
attachments=[],
|
|
new_message="third",
|
|
)
|
|
assert len(result["history"]) == 2
|