68 lines
2.5 KiB
Python
68 lines
2.5 KiB
Python
"""
|
|
Prompt Versioning & Role Visibility Tests
|
|
PRD Section 21, 23, 25:
|
|
- Editing a prompt creates a new immutable version without mutating historical provenance.
|
|
- Non-admin users cannot view full system/user prompt templates.
|
|
"""
|
|
|
|
import pytest
|
|
from thinkstorm.database import init_db
|
|
from thinkstorm.prompts.catalog import (
|
|
get_all_prompts, get_prompt_version, update_prompt, duplicate_prompt
|
|
)
|
|
|
|
def test_prompt_versioning_immutability():
|
|
init_db()
|
|
prompt_id = "test-versioning-prompt"
|
|
|
|
# 1. Create a fresh test prompt definition
|
|
from thinkstorm.database import get_db
|
|
with get_db() as conn:
|
|
conn.execute("DELETE FROM prompt_versions WHERE prompt_definition_id = ?", (prompt_id,))
|
|
conn.execute("DELETE FROM prompt_definitions WHERE id = ?", (prompt_id,))
|
|
duplicate_prompt("normalize-idea", prompt_id, "Test Versioning Prompt", created_by="test_user")
|
|
|
|
# Verify baseline v1
|
|
v1 = get_prompt_version(prompt_id, version=1, is_admin=True)
|
|
assert v1 is not None
|
|
assert v1["version"] == 1
|
|
old_hash = v1["prompt_hash"]
|
|
|
|
# 2. Update prompt -> creates v2
|
|
new_version = update_prompt(
|
|
prompt_id=prompt_id,
|
|
system_prompt="Updated system prompt for normalizer v2.",
|
|
user_prompt_template="Analyze: {{submission_text}}",
|
|
model_policy="fast",
|
|
updated_by="admin_test"
|
|
)
|
|
assert new_version == 2
|
|
|
|
# 3. Check current is v2
|
|
current = get_prompt_version(prompt_id, is_admin=True)
|
|
assert current["version"] == 2
|
|
assert current["system_prompt"] == "Updated system prompt for normalizer v2."
|
|
assert current["prompt_hash"] != old_hash
|
|
|
|
# 4. Verify historical v1 remains unchanged and intact
|
|
v1_recheck = get_prompt_version(prompt_id, version=1, is_admin=True)
|
|
assert v1_recheck["version"] == 1
|
|
assert v1_recheck["prompt_hash"] == old_hash
|
|
assert "Updated system prompt" not in v1_recheck["system_prompt"]
|
|
|
|
def test_non_admin_prompt_masking():
|
|
init_db()
|
|
prompt_id = "prior-art-search"
|
|
|
|
# Non-admin retrieval
|
|
public_view = get_prompt_version(prompt_id, is_admin=False)
|
|
assert public_view["system_prompt"] == "[REDACTED: ADMIN ONLY]"
|
|
assert public_view["user_prompt_template"] == "[REDACTED: ADMIN ONLY]"
|
|
assert public_view["name"] is not None
|
|
assert public_view["model_policy"] is not None
|
|
|
|
# Admin retrieval
|
|
admin_view = get_prompt_version(prompt_id, is_admin=True)
|
|
assert admin_view["system_prompt"] != "[REDACTED: ADMIN ONLY]"
|
|
assert admin_view["user_prompt_template"] != "[REDACTED: ADMIN ONLY]"
|