test_s2_cron_template.py
1.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/usr/bin/env python3
"""S2 RED test: Verify cron_job.html dark terminal template."""
import subprocess, json, sys, os
os.chdir(os.path.expanduser("~/wechat-viewer"))
BASE = "http://127.0.0.1:5000"
FAIL = 0
def check(desc, test_fn):
global FAIL
ok = test_fn()
status = "PASS" if ok else "FAIL"
if not ok:
FAIL += 1
print(f"[{status}] {desc}")
# Get a job ID
r = subprocess.run(["curl", "-s", f"{BASE}/api/cron/list"], capture_output=True, text=True, timeout=10)
jobs = json.loads(r.stdout).get("data", [])
if not jobs:
print("SKIP: No cron jobs")
sys.exit(0)
job = jobs[0]
job_id = job["id"]
print(f"Testing with: {job['name']} (id={job_id})")
# Fetch page
r = subprocess.run(["curl", "-s", f"{BASE}/cron/{job_id}"], capture_output=True, text=True, timeout=10)
html = r.stdout
# 1. Job name present
check(f"Page contains job name", lambda: job["name"] in html)
# 2. Dark background
check("Dark background (#1e1e1e)", lambda: "#1e1e1e" in html or "1e1e1e" in html)
# 3. Green terminal text
check("Green text (#27ae60)", lambda: "#27ae60" in html or "27ae60" in html)
# 4. Return link to /cron
check("Return link to /cron", lambda: 'href="/cron"' in html)
# 5. JS loads logs via /api/cron/logs
check("JS fetches /api/cron/logs/<job_id>", lambda: "/api/cron/logs/" in html)
# 6. CSS class for log entries
check("Log entry CSS", lambda: "log-entry" in html or "timeline" in html.lower())
# 7. Jinja2 escape check
check("No Jinja2 backslash escape in onclick", lambda: 'onclick=\\"' not in html)
check("No triple-escaped quotes", lambda: '\\\\\\\\\\\\\\"' not in html)
check("No style backslash bug", lambda: "style=\\\\\\'" not in html)
# 8. Monospace font for logs
check("Monospace font-family", lambda: "monospace" in html)
sys.exit(min(FAIL, 1))