import json import pathlib import sys import time import urllib.parse import urllib.request import uuid import pytest sys.path.insert(0, str(pathlib.Path(__file__).parent.parent.parent)) _needs_server = pytest.mark.usefixtures("test_server") from tests._pytest_port import BASE _FULL_SECRET = "sk-" + ("B" * 24) def _get(path): with urllib.request.urlopen(BASE + path, timeout=10) as r: return json.loads(r.read()) def _write_session_with_secret_title(): from tests.conftest import TEST_STATE_DIR sid = "sec_summary_" + uuid.uuid4().hex[:8] sessions_dir = TEST_STATE_DIR / "sessions" sessions_dir.mkdir(parents=True, exist_ok=True) now = time.time() (sessions_dir / f"{sid}.json").write_text(json.dumps({ "session_id": sid, "title": f"session with {_FULL_SECRET}", "workspace": "/tmp", "model": "test", "created_at": now, "updated_at": now, "pinned": False, "archived": False, "project_id": None, "profile": "default", "input_tokens": 0, "output_tokens": 0, "estimated_cost": None, "personality": None, "messages": [], "tool_calls": [], })) return sid @_needs_server def test_api_sessions_search_redacts_titles(test_server): sid = _write_session_with_secret_title() data = _get("/api/sessions/search?q=" + urllib.parse.quote("B" * 24)) dump = json.dumps(data) assert sid in dump assert _FULL_SECRET not in dump @_needs_server def test_api_sessions_list_redacts_secret_titles(test_server): sid = _write_session_with_secret_title() data = _get("/api/sessions") dump = json.dumps(data) assert sid in dump assert _FULL_SECRET not in dump