|
11 | 11 | START_MARKER = "<!-- TRACE_EXCERPT_START -->" |
12 | 12 | END_MARKER = "<!-- TRACE_EXCERPT_END -->" |
13 | 13 | DEFAULT_API_URL = os.environ.get("TRACE_API_URL", "http://localhost:8000") |
| 14 | +TRACE_USER_EMAIL = os.environ.get("TRACE_USER_EMAIL", "trace-demo@example.com") |
| 15 | +TRACE_USER_PASSWORD = os.environ.get("TRACE_USER_PASSWORD", "tracepass123") |
| 16 | +TRACE_USER_NAME = os.environ.get("TRACE_USER_NAME", "Trace Demo") |
14 | 17 |
|
15 | 18 |
|
16 | 19 | def run_command(command: list[str], timeout: int = 60, check: bool = True) -> subprocess.CompletedProcess[str]: |
@@ -48,20 +51,54 @@ def start_redis_monitor() -> subprocess.Popen[str]: |
48 | 51 | ) |
49 | 52 |
|
50 | 53 |
|
51 | | -def create_demo_course(base_url: str) -> None: |
| 54 | +def get_or_create_token(base_url: str) -> str: |
| 55 | + register_payload = { |
| 56 | + "email": TRACE_USER_EMAIL, |
| 57 | + "password": TRACE_USER_PASSWORD, |
| 58 | + "full_name": TRACE_USER_NAME, |
| 59 | + } |
| 60 | + register_response = requests.post( |
| 61 | + f"{base_url}/auth/register", |
| 62 | + json=register_payload, |
| 63 | + timeout=15, |
| 64 | + ) |
| 65 | + if register_response.status_code == 200: |
| 66 | + return register_response.json()["access_token"] |
| 67 | + |
| 68 | + login_payload = { |
| 69 | + "email": TRACE_USER_EMAIL, |
| 70 | + "password": TRACE_USER_PASSWORD, |
| 71 | + } |
| 72 | + login_response = requests.post( |
| 73 | + f"{base_url}/auth/login", |
| 74 | + json=login_payload, |
| 75 | + timeout=15, |
| 76 | + ) |
| 77 | + login_response.raise_for_status() |
| 78 | + return login_response.json()["access_token"] |
| 79 | + |
| 80 | + |
| 81 | +def create_demo_course(base_url: str, token: str) -> None: |
52 | 82 | payload = { |
53 | | - "title": "Trace Demo Course", |
| 83 | + "title": f"Trace Demo Course {int(time.time())}", |
54 | 84 | "content": "Short content created only to exercise Redis-backed flows.", |
55 | 85 | "is_public": True, |
56 | 86 | } |
57 | | - response = requests.post(f"{base_url}/courses", json=payload, timeout=15) |
| 87 | + response = requests.post( |
| 88 | + f"{base_url}/courses", |
| 89 | + json=payload, |
| 90 | + headers={"Authorization": f"Bearer {token}"}, |
| 91 | + timeout=15, |
| 92 | + ) |
58 | 93 | response.raise_for_status() |
59 | 94 |
|
60 | 95 |
|
61 | | -def trigger_api_activity(base_url: str) -> None: |
| 96 | +def trigger_api_activity(base_url: str, token: str) -> None: |
| 97 | + headers = {"Authorization": f"Bearer {token}"} |
62 | 98 | requests.get(f"{base_url}/courses", timeout=10).raise_for_status() |
63 | 99 | requests.get(f"{base_url}/courses/shared", timeout=10).raise_for_status() |
64 | | - requests.get(f"{base_url}/courses", timeout=10).raise_for_status() |
| 100 | + requests.get(f"{base_url}/me", headers=headers, timeout=10).raise_for_status() |
| 101 | + requests.get(f"{base_url}/courses/my", headers=headers, timeout=10).raise_for_status() |
65 | 102 |
|
66 | 103 |
|
67 | 104 | def trigger_worker_activity() -> str: |
@@ -103,24 +140,21 @@ def tail_lines(text: str, max_lines: int = 40) -> str: |
103 | 140 |
|
104 | 141 | def build_redis_trace_excerpt(base_url: str) -> str: |
105 | 142 | wait_for_api(base_url) |
| 143 | + token = get_or_create_token(base_url) |
106 | 144 | monitor_process = start_redis_monitor() |
107 | 145 |
|
108 | 146 | try: |
109 | 147 | time.sleep(2) |
110 | | - create_demo_course(base_url) |
111 | | - trigger_api_activity(base_url) |
| 148 | + create_demo_course(base_url, token) |
| 149 | + trigger_api_activity(base_url, token) |
112 | 150 | worker_output = trigger_worker_activity() |
113 | 151 | time.sleep(2) |
114 | 152 | finally: |
115 | 153 | monitor_stdout, monitor_stderr = stop_monitor(monitor_process) |
116 | 154 |
|
117 | 155 | monitor_block = tail_lines(monitor_stdout, max_lines=50) |
118 | 156 | worker_block = tail_lines(worker_output, max_lines=20) |
119 | | - |
120 | | - if monitor_stderr.strip(): |
121 | | - stderr_block = tail_lines(monitor_stderr, max_lines=20) |
122 | | - else: |
123 | | - stderr_block = "(empty)" |
| 157 | + stderr_block = tail_lines(monitor_stderr, max_lines=20) if monitor_stderr.strip() else "(empty)" |
124 | 158 |
|
125 | 159 | return ( |
126 | 160 | "```text\n" |
|
0 commit comments