Surface short copy/paste operator prompts derived from canonical workflow
files with workflow path and SHA-256 citations. Adds /prompts, /prompts/{id},
and /api/prompts with one-click copy.
Closes #428
90 lines
2.9 KiB
Python
90 lines
2.9 KiB
Python
"""Tests for web UI prompt library (#428)."""
|
|
import json
|
|
import sys
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
|
|
|
|
from starlette.testclient import TestClient
|
|
|
|
from webui.app import create_app
|
|
from webui.prompt_library import find_prompt, library_to_dict, load_prompt_library, prompt_to_dict
|
|
|
|
REQUIRED_PROMPT_SLUGS = frozenset({
|
|
"review-pr",
|
|
"work-issue",
|
|
"create-issue",
|
|
"comment-issue",
|
|
"cleanup",
|
|
"audit",
|
|
"onboarding",
|
|
})
|
|
|
|
|
|
class TestPromptLibraryLoader(unittest.TestCase):
|
|
def test_library_loads_required_prompts(self):
|
|
entries = load_prompt_library()
|
|
slugs = {entry.slug for entry in entries}
|
|
self.assertEqual(slugs, REQUIRED_PROMPT_SLUGS)
|
|
|
|
def test_workflow_hashes_present(self):
|
|
review = find_prompt("review-pr")
|
|
self.assertIsNotNone(review)
|
|
assert review is not None
|
|
self.assertTrue(review.workflow_hash)
|
|
self.assertEqual(len(review.workflow_hash), 64)
|
|
|
|
def test_prompt_text_is_short(self):
|
|
for entry in load_prompt_library():
|
|
self.assertLess(len(entry.prompt_text), 400)
|
|
self.assertNotIn("Do not improvise around the gates", entry.prompt_text)
|
|
|
|
|
|
class TestPromptLibraryRoutes(unittest.TestCase):
|
|
def setUp(self):
|
|
self.client = TestClient(create_app())
|
|
|
|
def test_prompts_page_lists_all_entries(self):
|
|
response = self.client.get("/prompts")
|
|
self.assertEqual(response.status_code, 200)
|
|
for label in (
|
|
"Review PR",
|
|
"Work issue",
|
|
"Create issue",
|
|
"Comment on issue",
|
|
"Post-merge cleanup",
|
|
"Reconciliation audit",
|
|
"Project onboarding",
|
|
):
|
|
self.assertIn(label, response.text)
|
|
self.assertIn("Copy prompt", response.text)
|
|
self.assertIn("sha256:", response.text)
|
|
self.assertNotIn("child issue", response.text.lower())
|
|
|
|
def test_prompt_detail_route(self):
|
|
response = self.client.get("/prompts/work-issue")
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertIn("work-issue.md", response.text)
|
|
self.assertIn("Copy prompt", response.text)
|
|
|
|
def test_prompt_detail_404(self):
|
|
self.assertEqual(self.client.get("/prompts/missing").status_code, 404)
|
|
|
|
def test_api_prompts_json(self):
|
|
response = self.client.get("/api/prompts")
|
|
self.assertEqual(response.status_code, 200)
|
|
data = response.json()
|
|
self.assertEqual(data["count"], 7)
|
|
review = next(item for item in data["prompts"] if item["slug"] == "review-pr")
|
|
self.assertIn("workflow_hash", review)
|
|
self.assertIn("review-merge-pr.md", review["workflow_path"])
|
|
|
|
def test_prompt_to_dict_roundtrip(self):
|
|
entry = load_prompt_library()[0]
|
|
encoded = json.dumps(prompt_to_dict(entry))
|
|
self.assertIn("workflow_path", encoded)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main() |