""" 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]"